From 3fb3058a30f6679225c38210537569772d720124 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Tue, 21 Oct 2025 03:27:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - максимально убрана зависимость от HAL - можно использовать и без него, чисто на cmsis - документирован uart - документирован spi - добавлены примеры использования в general_periph - всякие фиксы документации --- .gitignore | 2 + Doc/html/____general__flash_8c_source.html | 33 +- Doc/html/____general__flash_8h_source.html | 47 +- Doc/html/annotated.html | 26 +- Doc/html/annotated_dup.js | 4 +- Doc/html/bit__access_8h.html | 100 +- Doc/html/bit__access_8h__dep__incl.map | 8 +- Doc/html/bit__access_8h__dep__incl.md5 | 2 +- Doc/html/bit__access_8h__dep__incl.png | Bin 3486 -> 2910 bytes Doc/html/bit__access_8h__incl.map | 16 +- Doc/html/bit__access_8h__incl.md5 | 2 +- Doc/html/bit__access_8h__incl.png | Bin 4374 -> 4026 bytes Doc/html/bit__access_8h_source.html | 31 +- Doc/html/classes.html | 22 +- Doc/html/clipboard.js | 4 +- Doc/html/darkmode_toggle.js | 6 + Doc/html/dir_000002_000000.html | 35 +- .../dir_9c80311a018e1f8cfb6659b73d634be4.html | 59 +- .../dir_9c80311a018e1f8cfb6659b73d634be4.js | 6 +- ...r_9c80311a018e1f8cfb6659b73d634be4_dep.map | 4 +- ...r_9c80311a018e1f8cfb6659b73d634be4_dep.md5 | 2 +- ...r_9c80311a018e1f8cfb6659b73d634be4_dep.png | Bin 1992 -> 1989 bytes .../dir_9e11e9a41112194af3eee6cc728f9515.html | 53 +- ...r_9e11e9a41112194af3eee6cc728f9515_dep.map | 4 +- ...r_9e11e9a41112194af3eee6cc728f9515_dep.md5 | 2 +- ...r_9e11e9a41112194af3eee6cc728f9515_dep.png | Bin 1613 -> 1616 bytes .../dir_eb423fea8a9c4b9b32b922020ec391e1.html | 78 +- .../dir_eb423fea8a9c4b9b32b922020ec391e1.js | 4 +- ...r_eb423fea8a9c4b9b32b922020ec391e1_dep.map | 2 +- ...r_eb423fea8a9c4b9b32b922020ec391e1_dep.md5 | 2 +- Doc/html/doxygen.css | 1528 +++++++----- Doc/html/doxygen_crawl.html | 470 ++-- Doc/html/dynsections.js | 75 +- Doc/html/evolve__optimizer_8h.html | 104 +- Doc/html/evolve__optimizer_8h.js | 1 - Doc/html/evolve__optimizer_8h__dep__incl.map | 8 +- Doc/html/evolve__optimizer_8h__dep__incl.md5 | 2 +- Doc/html/evolve__optimizer_8h__dep__incl.png | Bin 3534 -> 2962 bytes Doc/html/evolve__optimizer_8h__incl.map | 24 +- Doc/html/evolve__optimizer_8h__incl.md5 | 2 +- Doc/html/evolve__optimizer_8h__incl.png | Bin 6465 -> 6256 bytes Doc/html/evolve__optimizer_8h_source.html | 516 ++-- Doc/html/files.html | 64 +- Doc/html/functions.html | 65 +- Doc/html/functions_vars.html | 65 +- Doc/html/general__gpio_8c.html | 74 +- Doc/html/general__gpio_8c__incl.map | 20 +- Doc/html/general__gpio_8c__incl.md5 | 2 +- Doc/html/general__gpio_8c__incl.png | Bin 5401 -> 5053 bytes Doc/html/general__gpio_8c_source.html | 74 +- Doc/html/general__gpio_8h.html | 129 +- Doc/html/general__gpio_8h.js | 1 - Doc/html/general__gpio_8h__dep__incl.map | 30 +- Doc/html/general__gpio_8h__dep__incl.md5 | 2 +- Doc/html/general__gpio_8h__dep__incl.png | Bin 21812 -> 16947 bytes Doc/html/general__gpio_8h__incl.map | 16 +- Doc/html/general__gpio_8h__incl.md5 | 2 +- Doc/html/general__gpio_8h__incl.png | Bin 4364 -> 4033 bytes Doc/html/general__gpio_8h_source.html | 425 ++-- Doc/html/general__tim_8c.html | 81 +- Doc/html/general__tim_8c__incl.map | 26 +- Doc/html/general__tim_8c__incl.md5 | 2 +- Doc/html/general__tim_8c__incl.png | Bin 8812 -> 8453 bytes Doc/html/general__tim_8c_source.html | 84 +- Doc/html/general__tim_8h.html | 166 +- Doc/html/general__tim_8h.js | 14 +- Doc/html/general__tim_8h__dep__incl.map | 12 +- Doc/html/general__tim_8h__dep__incl.md5 | 2 +- Doc/html/general__tim_8h__dep__incl.png | Bin 6891 -> 5296 bytes Doc/html/general__tim_8h__incl.map | 22 +- Doc/html/general__tim_8h__incl.md5 | 2 +- Doc/html/general__tim_8h__incl.png | Bin 7680 -> 7341 bytes Doc/html/general__tim_8h_source.html | 598 ++--- Doc/html/globals.html | 84 +- Doc/html/globals_defs.html | 73 +- Doc/html/globals_enum.html | 22 +- Doc/html/globals_eval.html | 22 +- Doc/html/globals_func.html | 51 +- Doc/html/graph_legend.html | 26 +- ...__b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html | 105 +- .../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html | 105 +- ...r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html | 120 +- .../group___e_v_o_l_v_e___c_o_n_f_i_g.html | 47 +- ...oup___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html | 133 +- ...group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.js | 3 +- Doc/html/group___g_p_i_o___i_n_i_t.html | 59 +- Doc/html/group___l_i_b_s___c_o_n_f_i_g.html | 103 +- Doc/html/group___l_i_b_s___c_o_n_f_i_g.js | 4 +- Doc/html/group___m_y___l_i_b_s___g_p_i_o.html | 51 +- Doc/html/group___m_y___l_i_b_s___t_i_m.html | 63 +- Doc/html/group___m_y___l_i_b_s___t_i_m.js | 6 +- Doc/html/group___m_y___l_i_b_s___t_i_m.map | 8 +- Doc/html/group___m_y___l_i_b_s___t_i_m.md5 | 2 +- Doc/html/group___m_y_l_i_b_s___a_l_l.html | 51 +- .../group___m_y_l_i_b_s___c_o_n_f_i_g.html | 51 +- .../group___m_y_l_i_b_s___d_e_f_i_n_e_s.html | 63 +- ...m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html | 89 +- ...__m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.js | 1 - ...oup___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html | 99 +- ...__m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html | 81 +- ...p___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.html | 62 +- ...oup___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.js | 4 +- ...up___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.map | 10 +- ...up___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.md5 | 2 +- ...up___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.png | Bin 2455 -> 5076 bytes ...oup___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html | 74 +- ...__m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html | 81 +- ...__m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html | 104 +- .../group___m_y_l_i_b_s___t_i_m___o_c.html | 72 +- Doc/html/group___t_i_m___i_n_i_t.html | 89 +- Doc/html/group___t_r_a_c_e.html | 54 +- Doc/html/group___t_r_a_c_e___c_o_n_f_i_g.html | 60 +- Doc/html/group___t_r_a_c_e___g_p_i_o.html | 71 +- ...group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html | 64 +- ...group___t_r_a_c_e___r_t_t___f_l_a_s_h.html | 74 +- Doc/html/group___t_r_a_c_e___s_e_r_i_a_l.html | 103 +- Doc/html/group___t_r_a_c_k_e_r_s.html | 246 +- .../group___u_t_i_l_s___d_e_f_i_n_e_s.html | 92 +- Doc/html/index.html | 108 +- Doc/html/jquery.js | 190 +- Doc/html/mainpage_8h_source.html | 143 +- Doc/html/menu.js | 17 +- Doc/html/menudata.js | 6 +- Doc/html/mylibs__config_8h.html | 168 +- Doc/html/mylibs__config_8h.js | 4 +- Doc/html/mylibs__config_8h__dep__incl.map | 83 +- Doc/html/mylibs__config_8h__dep__incl.md5 | 2 +- Doc/html/mylibs__config_8h__dep__incl.png | Bin 83154 -> 76761 bytes Doc/html/mylibs__config_8h__incl.map | 8 +- Doc/html/mylibs__config_8h__incl.md5 | 2 +- Doc/html/mylibs__config_8h__incl.png | Bin 2515 -> 2312 bytes Doc/html/mylibs__config_8h_source.html | 63 +- Doc/html/mylibs__defs_8h.html | 188 +- Doc/html/mylibs__defs_8h__dep__incl.map | 79 +- Doc/html/mylibs__defs_8h__dep__incl.md5 | 2 +- Doc/html/mylibs__defs_8h__dep__incl.png | Bin 78637 -> 73591 bytes Doc/html/mylibs__defs_8h__incl.map | 12 +- Doc/html/mylibs__defs_8h__incl.md5 | 2 +- Doc/html/mylibs__defs_8h__incl.png | Bin 3403 -> 3194 bytes Doc/html/mylibs__defs_8h_source.html | 265 ++- Doc/html/mylibs__include_8h.html | 121 +- Doc/html/mylibs__include_8h__incl.map | 79 +- Doc/html/mylibs__include_8h__incl.md5 | 2 +- Doc/html/mylibs__include_8h__incl.png | Bin 44435 -> 48489 bytes Doc/html/mylibs__include_8h_source.html | 43 +- Doc/html/navtree.css | 230 +- Doc/html/navtree.js | 589 ++++- Doc/html/navtreedata.js | 23 +- Doc/html/navtreeindex0.js | 208 +- Doc/html/navtreeindex1.js | 95 +- Doc/html/search/all_10.js | 60 +- Doc/html/search/all_11.js | 65 +- Doc/html/search/all_13.js | 2 +- Doc/html/search/all_14.js | 5 +- Doc/html/search/all_15.js | 5 +- Doc/html/search/all_16.js | 4 +- Doc/html/search/all_17.js | 4 +- Doc/html/search/all_18.js | 4 +- Doc/html/search/all_19.js | 4 +- Doc/html/search/all_2.js | 7 +- Doc/html/search/all_3.js | 6 +- Doc/html/search/all_5.js | 3 +- Doc/html/search/all_6.js | 64 +- Doc/html/search/all_7.js | 28 +- Doc/html/search/all_8.js | 2 +- Doc/html/search/all_9.js | 2 +- Doc/html/search/all_a.js | 38 +- Doc/html/search/all_e.js | 26 +- Doc/html/search/all_f.js | 45 +- Doc/html/search/files_2.js | 8 +- Doc/html/search/functions_4.js | 16 +- Doc/html/search/groups_10.js | 3 +- Doc/html/search/groups_3.js | 2 +- Doc/html/search/groups_8.js | 2 +- Doc/html/search/groups_e.js | 3 +- Doc/html/search/groups_f.js | 16 +- Doc/html/search/pages_0.js | 2 +- Doc/html/search/pages_1.js | 8 +- Doc/html/search/pages_2.js | 2 +- Doc/html/search/pages_3.js | 2 +- Doc/html/search/pages_4.js | 2 +- Doc/html/search/pages_5.js | 2 +- Doc/html/search/pages_6.js | 3 +- Doc/html/search/pages_7.js | 7 +- Doc/html/search/pages_8.js | 6 +- Doc/html/search/pages_9.js | 3 +- Doc/html/search/pages_a.js | 4 +- Doc/html/search/pages_b.js | 3 +- Doc/html/search/search.css | 177 +- Doc/html/search/search.js | 24 +- Doc/html/search/searchdata.js | 6 +- Doc/html/search/variables_0.js | 5 +- Doc/html/search/variables_1.js | 4 +- Doc/html/search/variables_3.js | 12 +- Doc/html/search/variables_4.js | 4 +- Doc/html/search/variables_6.js | 8 +- .../struct_evolve_optimizer__t-members.html | 24 +- Doc/html/struct_evolve_optimizer__t.html | 107 +- Doc/html/struct_evolve_optimizer__t.js | 2 + ...ruct_g_p_i_o___l_e_d_type_def-members.html | 22 +- Doc/html/struct_g_p_i_o___l_e_d_type_def.html | 62 +- ...uct_g_p_i_o___switch_type_def-members.html | 22 +- .../struct_g_p_i_o___switch_type_def.html | 62 +- .../struct_h_f___stack_frame__t-members.html | 22 +- Doc/html/struct_h_f___stack_frame__t.html | 68 +- ...truct_r_t_t___flash_header__t-members.html | 22 +- Doc/html/struct_r_t_t___flash_header__t.html | 53 +- ...uct_s_p_i___settings_type_def-members.html | 44 +- .../struct_s_p_i___settings_type_def.html | 155 +- ...ruct_t_i_m___encoder_type_def-members.html | 22 +- Doc/html/struct_t_i_m___encoder_type_def.html | 80 +- ..._t_i_m___encoder_type_def__coll__graph.map | 4 +- ..._t_i_m___encoder_type_def__coll__graph.md5 | 2 +- ..._t_i_m___encoder_type_def__coll__graph.png | Bin 1780 -> 1853 bytes ...uct_t_i_m___settings_type_def-members.html | 22 +- .../struct_t_i_m___settings_type_def.html | 86 +- ...t_u_a_r_t___settings_type_def-members.html | 34 +- .../struct_u_a_r_t___settings_type_def.html | 91 +- Doc/html/tabs.css | 2 +- Doc/html/topics.html | 52 +- Doc/html/trace_8h.html | 91 +- Doc/html/trace_8h__dep__incl.map | 8 +- Doc/html/trace_8h__dep__incl.md5 | 2 +- Doc/html/trace_8h__dep__incl.png | Bin 3376 -> 2854 bytes Doc/html/trace_8h__incl.map | 4 +- Doc/html/trace_8h__incl.md5 | 2 +- Doc/html/trace_8h__incl.png | Bin 7065 -> 6855 bytes Doc/html/trace_8h_source.html | 1198 +++++----- Doc/html/trackers_8h.html | 131 +- Doc/html/trackers_8h__dep__incl.map | 8 +- Doc/html/trackers_8h__dep__incl.md5 | 2 +- Doc/html/trackers_8h__dep__incl.png | Bin 3527 -> 2894 bytes Doc/html/trackers_8h__incl.map | 16 +- Doc/html/trackers_8h__incl.md5 | 2 +- Doc/html/trackers_8h__incl.png | Bin 4286 -> 4009 bytes Doc/html/trackers_8h_source.html | 31 +- .../unionuint16___bit_type_def-members.html | 22 +- Doc/html/unionuint16___bit_type_def.html | 97 +- .../unionuint32___bit_type_def-members.html | 22 +- Doc/html/unionuint32___bit_type_def.html | 145 +- .../unionuint64___bit_type_def-members.html | 22 +- Doc/html/unionuint64___bit_type_def.html | 241 +- .../unionuint8___bit_type_def-members.html | 22 +- Doc/html/unionuint8___bit_type_def.html | 73 +- Doc/latex/Makefile | 25 +- Doc/latex/____general__flash_8c_source.tex | 4 +- Doc/latex/____general__flash_8h_source.tex | 18 +- Doc/latex/annotated.tex | 4 +- Doc/latex/bit__access_8h.tex | 22 +- Doc/latex/bit__access_8h__dep__incl.md5 | 2 +- Doc/latex/bit__access_8h__dep__incl.pdf | Bin 21021 -> 20657 bytes Doc/latex/bit__access_8h__incl.md5 | 2 +- Doc/latex/bit__access_8h__incl.pdf | Bin 22104 -> 22134 bytes Doc/latex/bit__access_8h_source.tex | 2 +- Doc/latex/doxygen.sty | 85 +- Doc/latex/evolve__optimizer_8h.tex | 18 +- Doc/latex/evolve__optimizer_8h__dep__incl.md5 | 2 +- Doc/latex/evolve__optimizer_8h__dep__incl.pdf | Bin 22257 -> 22282 bytes Doc/latex/evolve__optimizer_8h__incl.md5 | 2 +- Doc/latex/evolve__optimizer_8h__incl.pdf | Bin 23527 -> 23565 bytes Doc/latex/evolve__optimizer_8h_source.tex | 459 ++-- Doc/latex/files.tex | 36 +- Doc/latex/general__gpio_8c.tex | 9 +- Doc/latex/general__gpio_8c__incl.md5 | 2 +- Doc/latex/general__gpio_8c__incl.pdf | Bin 22401 -> 22450 bytes Doc/latex/general__gpio_8c_source.tex | 10 +- Doc/latex/general__gpio_8h.tex | 16 +- Doc/latex/general__gpio_8h__dep__incl.md5 | 2 +- Doc/latex/general__gpio_8h__dep__incl.pdf | Bin 22865 -> 22810 bytes Doc/latex/general__gpio_8h__incl.md5 | 2 +- Doc/latex/general__gpio_8h__incl.pdf | Bin 22456 -> 22498 bytes Doc/latex/general__gpio_8h_source.tex | 354 +-- Doc/latex/general__tim_8c.tex | 9 +- Doc/latex/general__tim_8c__incl.md5 | 2 +- Doc/latex/general__tim_8c__incl.pdf | Bin 22698 -> 22734 bytes Doc/latex/general__tim_8c_source.tex | 10 +- Doc/latex/general__tim_8h.tex | 56 +- Doc/latex/general__tim_8h__dep__incl.md5 | 2 +- Doc/latex/general__tim_8h__dep__incl.pdf | Bin 21740 -> 21347 bytes Doc/latex/general__tim_8h__incl.md5 | 2 +- Doc/latex/general__tim_8h__incl.pdf | Bin 22755 -> 22787 bytes Doc/latex/general__tim_8h_source.tex | 495 ++-- ...___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.tex | 56 +- .../group___d_e_l_a_y_s___d_e_f_i_n_e_s.tex | 74 +- ..._r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.tex | 82 +- .../group___e_v_o_l_v_e___c_o_n_f_i_g.tex | 22 +- ...roup___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.tex | 83 +- Doc/latex/group___g_p_i_o___i_n_i_t.tex | 44 +- Doc/latex/group___l_i_b_s___c_o_n_f_i_g.tex | 83 +- Doc/latex/group___m_y___l_i_b_s___g_p_i_o.tex | 2 +- Doc/latex/group___m_y___l_i_b_s___t_i_m.md5 | 2 +- Doc/latex/group___m_y___l_i_b_s___t_i_m.pdf | Bin 18332 -> 18331 bytes Doc/latex/group___m_y___l_i_b_s___t_i_m.tex | 27 +- Doc/latex/group___m_y_l_i_b_s___a_l_l.tex | 2 +- .../group___m_y_l_i_b_s___c_o_n_f_i_g.tex | 2 +- .../group___m_y_l_i_b_s___d_e_f_i_n_e_s.tex | 2 +- ..._m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.tex | 42 +- ...roup___m_y_l_i_b_s___g_p_i_o___l_e_d_s.tex | 81 +- ...___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.tex | 40 +- ...up___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.md5 | 2 +- ...up___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.pdf | Bin 15516 -> 17699 bytes ...up___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.tex | 15 +- ...roup___m_y_l_i_b_s___t_i_m___d_e_l_a_y.tex | 46 +- ...___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.tex | 46 +- ...___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.tex | 72 +- .../group___m_y_l_i_b_s___t_i_m___o_c.tex | 36 +- Doc/latex/group___t_i_m___i_n_i_t.tex | 124 +- Doc/latex/group___t_r_a_c_e.tex | 2 +- Doc/latex/group___t_r_a_c_e___c_o_n_f_i_g.tex | 100 +- Doc/latex/group___t_r_a_c_e___g_p_i_o.tex | 37 +- .../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.tex | 20 +- .../group___t_r_a_c_e___r_t_t___f_l_a_s_h.tex | 36 +- Doc/latex/group___t_r_a_c_e___s_e_r_i_a_l.tex | 66 +- Doc/latex/group___t_r_a_c_k_e_r_s.tex | 260 +- .../group___u_t_i_l_s___d_e_f_i_n_e_s.tex | 64 +- Doc/latex/index.tex | 70 +- Doc/latex/longtable_doxygen.sty | 15 +- Doc/latex/mainpage_8h_source.tex | 114 +- Doc/latex/make.bat | 15 +- Doc/latex/mylibs__config_8h.tex | 18 +- Doc/latex/mylibs__config_8h__dep__incl.md5 | 2 +- Doc/latex/mylibs__config_8h__dep__incl.pdf | Bin 26116 -> 26907 bytes Doc/latex/mylibs__config_8h__incl.md5 | 2 +- Doc/latex/mylibs__config_8h__incl.pdf | Bin 21677 -> 21707 bytes Doc/latex/mylibs__config_8h_source.tex | 34 +- Doc/latex/mylibs__defs_8h.tex | 42 +- Doc/latex/mylibs__defs_8h__dep__incl.md5 | 2 +- Doc/latex/mylibs__defs_8h__dep__incl.pdf | Bin 25936 -> 26760 bytes Doc/latex/mylibs__defs_8h__incl.md5 | 2 +- Doc/latex/mylibs__defs_8h__incl.pdf | Bin 21974 -> 22009 bytes Doc/latex/mylibs__defs_8h_source.tex | 236 +- Doc/latex/mylibs__include_8h.tex | 9 +- Doc/latex/mylibs__include_8h__incl.md5 | 2 +- Doc/latex/mylibs__include_8h__incl.pdf | Bin 26404 -> 26565 bytes Doc/latex/mylibs__include_8h_source.tex | 12 +- Doc/latex/refman.tex | 60 +- Doc/latex/struct_evolve_optimizer__t.tex | 106 +- Doc/latex/struct_g_p_i_o___l_e_d_type_def.tex | 54 +- .../struct_g_p_i_o___switch_type_def.tex | 54 +- Doc/latex/struct_h_f___stack_frame__t.tex | 70 +- Doc/latex/struct_r_t_t___flash_header__t.tex | 30 +- .../struct_s_p_i___settings_type_def.tex | 189 +- Doc/latex/struct_t_i_m___encoder_type_def.tex | 81 +- ..._t_i_m___encoder_type_def__coll__graph.md5 | 2 +- ..._t_i_m___encoder_type_def__coll__graph.pdf | Bin 17047 -> 17027 bytes .../struct_t_i_m___settings_type_def.tex | 114 +- .../struct_u_a_r_t___settings_type_def.tex | 101 +- Doc/latex/topics.tex | 14 +- Doc/latex/trace_8h.tex | 20 +- Doc/latex/trace_8h__dep__incl.md5 | 2 +- Doc/latex/trace_8h__dep__incl.pdf | Bin 21021 -> 20652 bytes Doc/latex/trace_8h__incl.md5 | 2 +- Doc/latex/trace_8h__incl.pdf | Bin 22771 -> 22339 bytes Doc/latex/trace_8h_source.tex | 1107 ++++----- Doc/latex/trackers_8h.tex | 52 +- Doc/latex/trackers_8h__dep__incl.md5 | 2 +- Doc/latex/trackers_8h__dep__incl.pdf | Bin 21034 -> 21172 bytes Doc/latex/trackers_8h__incl.md5 | 2 +- Doc/latex/trackers_8h__incl.pdf | Bin 22097 -> 22652 bytes Doc/latex/trackers_8h_source.tex | 2 +- Doc/latex/unionuint16___bit_type_def.tex | 108 +- Doc/latex/unionuint32___bit_type_def.tex | 204 +- Doc/latex/unionuint64___bit_type_def.tex | 396 ++-- Doc/latex/unionuint8___bit_type_def.tex | 60 +- MyLibsGeneral/Inc/__general_flash.h | 44 + MyLibsGeneral/Inc/bit_access.h | 159 ++ MyLibsGeneral/Inc/evolve_optimizer.h | 338 +++ MyLibsGeneral/Inc/general_gpio.h | 237 ++ MyLibsGeneral/Inc/general_spi.h | 170 ++ MyLibsGeneral/Inc/general_tim.h | 301 +++ MyLibsGeneral/Inc/general_uart.h | 156 ++ MyLibsGeneral/Inc/mylibs_config.h | 96 + MyLibsGeneral/Inc/mylibs_defs.h | 206 ++ MyLibsGeneral/Inc/mylibs_include.h | 125 + MyLibsGeneral/Inc/trace.h | 591 +++++ MyLibsGeneral/Inc/trackers.h | 163 ++ MyLibsGeneral/Src/__general_flash.c | 192 ++ MyLibsGeneral/Src/general_gpio.c | 326 +++ MyLibsGeneral/Src/general_spi.c | 284 +++ MyLibsGeneral/Src/general_tim.c | 722 ++++++ MyLibsGeneral/Src/general_uart.c | 383 +++ MyLibsGeneral/mainpage.h | 74 + RTT/SEGGER_RTT.c | 2099 +++++++++++++++++ RTT/SEGGER_RTT.h | 513 ++++ RTT/SEGGER_RTT_ASM_ARMv7M.S | 242 ++ RTT/SEGGER_RTT_Conf.h | 429 ++++ RTT/SEGGER_RTT_Syscalls_KEIL.c | 394 ++++ RTT/SEGGER_RTT_printf.c | 508 ++++ 388 files changed, 20522 insertions(+), 9544 deletions(-) create mode 100644 .gitignore create mode 100644 MyLibsGeneral/Inc/__general_flash.h create mode 100644 MyLibsGeneral/Inc/bit_access.h create mode 100644 MyLibsGeneral/Inc/evolve_optimizer.h create mode 100644 MyLibsGeneral/Inc/general_gpio.h create mode 100644 MyLibsGeneral/Inc/general_spi.h create mode 100644 MyLibsGeneral/Inc/general_tim.h create mode 100644 MyLibsGeneral/Inc/general_uart.h create mode 100644 MyLibsGeneral/Inc/mylibs_config.h create mode 100644 MyLibsGeneral/Inc/mylibs_defs.h create mode 100644 MyLibsGeneral/Inc/mylibs_include.h create mode 100644 MyLibsGeneral/Inc/trace.h create mode 100644 MyLibsGeneral/Inc/trackers.h create mode 100644 MyLibsGeneral/Src/__general_flash.c create mode 100644 MyLibsGeneral/Src/general_gpio.c create mode 100644 MyLibsGeneral/Src/general_spi.c create mode 100644 MyLibsGeneral/Src/general_tim.c create mode 100644 MyLibsGeneral/Src/general_uart.c create mode 100644 MyLibsGeneral/mainpage.h create mode 100644 RTT/SEGGER_RTT.c create mode 100644 RTT/SEGGER_RTT.h create mode 100644 RTT/SEGGER_RTT_ASM_ARMv7M.S create mode 100644 RTT/SEGGER_RTT_Conf.h create mode 100644 RTT/SEGGER_RTT_Syscalls_KEIL.c create mode 100644 RTT/SEGGER_RTT_printf.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fdc4b61 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/MyLibsGeneral/.vscode/ +/Doc/ \ No newline at end of file diff --git a/Doc/html/____general__flash_8c_source.html b/Doc/html/____general__flash_8c_source.html index 35f7ff8..f97c936 100644 --- a/Doc/html/____general__flash_8c_source.html +++ b/Doc/html/____general__flash_8c_source.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Src/__general_flash.c Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Src/__general_flash.c Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({ - + + -
+
__general_flash.c
-
1#include "general_flash.h"
+
1#include "__general_flash.h"
2FLASH_EraseInitTypeDef EraseInitStruct;
3extern HAL_StatusTypeDef res_hal;
4unsigned CRC_Update;
@@ -302,11 +294,12 @@ $(function(){initNavTree('____general__flash_8c_source.html',''); initResizable(
192
+
diff --git a/Doc/html/____general__flash_8h_source.html b/Doc/html/____general__flash_8h_source.html index 4b017c4..463e16a 100644 --- a/Doc/html/____general__flash_8h_source.html +++ b/Doc/html/____general__flash_8h_source.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/__general_flash.h Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/__general_flash.h Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({ - + + -
+
7
8//////////////////////////////////////////////////////////////////////
9/////////////////////////---USER SETTINGS---/////////////////////////
-
10
+
10
11
12/////////////////////////---USER SETTINGS---/////////////////////////
-
13#include "mylibs_defs.h"
+
13#include "mylibs_defs.h"
14
15
16
17/////////////////////////////////////////////////////////////////////
18////////////////////////////---DEFINES---////////////////////////////
-
19
+
19
20////////////////////////////---DEFINES---////////////////////////////
-
21
+
21
22
23/////////////////////////////////////////////////////////////////////
24///////////////////////---STRUCTURES & ENUMS---//////////////////////
-
25
+
25
26///////////////////////---STRUCTURES & ENUMS---//////////////////////
-
27
+
27
28
29/////////////////////////////////////////////////////////////////////
30///////////////////////////---FUNCTIONS---///////////////////////////
-
31
+
31
32HAL_StatusTypeDef FLASH_Enable_DualBankMode(void);
33HAL_StatusTypeDef FLASH_WriteProtection(uint32_t BankN, uint32_t WriteProtection);
34/* functions for reading bytes/halswords/words */
@@ -150,16 +142,17 @@ $(function(){initNavTree('____general__flash_8h_source.html',''); initResizable(
40HAL_StatusTypeDef FLASH_Write_HalfWord(uint32_t Address, uint16_t Data);
41HAL_StatusTypeDef FLASH_Write_Word(uint32_t Address, uint32_t Data);
42///////////////////////////---FUNCTIONS---///////////////////////////
-
43
+
43
44#endif // __FLASH_GENERAL_H_
Заголочный файл для дефайнов библиотеки MyLibsGeneral.
+ diff --git a/Doc/html/annotated.html b/Doc/html/annotated.html index 9b3b980..1481365 100644 --- a/Doc/html/annotated.html +++ b/Doc/html/annotated.html @@ -3,7 +3,7 @@ - + MyLibs: Class List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
 CGPIO_SwitchTypeDefСтруктура кнопки  CHF_StackFrame_tКонтекст стек-фрейма процессора при HardFault  CRTT_FlashHeader_tСтруктура RTT, которая будет положена в Flash - CSPI_SettingsTypeDef + CSPI_SettingsTypeDefСтруктура настроек SPI  CTIM_EncoderTypeDefСтруктура инициализации енкодера  CTIM_SettingsTypeDefСтруктура инициализации таймера - CUART_SettingsTypeDef + CUART_SettingsTypeDefСтруктура настроек UART  Cuint16_BitTypeDef  Cuint32_BitTypeDef  Cuint64_BitTypeDef @@ -122,10 +119,11 @@ $(function(){initNavTree('annotated.html',''); initResizable(); });
+ diff --git a/Doc/html/annotated_dup.js b/Doc/html/annotated_dup.js index 74f25da..7e0e8ac 100644 --- a/Doc/html/annotated_dup.js +++ b/Doc/html/annotated_dup.js @@ -5,10 +5,10 @@ var annotated_dup = [ "GPIO_SwitchTypeDef", "struct_g_p_i_o___switch_type_def.html", "struct_g_p_i_o___switch_type_def" ], [ "HF_StackFrame_t", "struct_h_f___stack_frame__t.html", "struct_h_f___stack_frame__t" ], [ "RTT_FlashHeader_t", "struct_r_t_t___flash_header__t.html", "struct_r_t_t___flash_header__t" ], - [ "SPI_SettingsTypeDef", "struct_s_p_i___settings_type_def.html", null ], + [ "SPI_SettingsTypeDef", "struct_s_p_i___settings_type_def.html", "struct_s_p_i___settings_type_def" ], [ "TIM_EncoderTypeDef", "struct_t_i_m___encoder_type_def.html", "struct_t_i_m___encoder_type_def" ], [ "TIM_SettingsTypeDef", "struct_t_i_m___settings_type_def.html", "struct_t_i_m___settings_type_def" ], - [ "UART_SettingsTypeDef", "struct_u_a_r_t___settings_type_def.html", null ], + [ "UART_SettingsTypeDef", "struct_u_a_r_t___settings_type_def.html", "struct_u_a_r_t___settings_type_def" ], [ "uint16_BitTypeDef", "unionuint16___bit_type_def.html", null ], [ "uint32_BitTypeDef", "unionuint32___bit_type_def.html", null ], [ "uint64_BitTypeDef", "unionuint64___bit_type_def.html", null ], diff --git a/Doc/html/bit__access_8h.html b/Doc/html/bit__access_8h.html index f0e236e..eacf932 100644 --- a/Doc/html/bit__access_8h.html +++ b/Doc/html/bit__access_8h.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h File Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h File Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
-
bit_access.h File Reference
@@ -110,74 +104,72 @@ $(function(){initNavTree('bit__access_8h.html',''); initResizable(); });

Заголочный файл для дефайнов битового доступа. More...

#include "mylibs_defs.h"
-
- + Include dependency graph for bit_access.h:
+
Include dependency graph for bit_access.h:
-
- + This graph shows which files directly or indirectly include this file:
+
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

- - - - - - - - - + + + +

+

Classes

union  uint8_BitTypeDef
 
union  uint16_BitTypeDef
 
union  uint32_BitTypeDef
 
union  uint64_BitTypeDef
 
union  uint8_BitTypeDef
union  uint16_BitTypeDef
union  uint32_BitTypeDef
union  uint64_BitTypeDef
- - + - - + - - + - - + -

+

Macros

#define uint8_bit(_uint8_, _bit_)   (*(uint8_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
#define uint8_bit(_uint8_, _bit_)
 Получить n-й бит из uint8_t.
 
#define uint16_bit(_uint8_, _bit_)   (*(uint16_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
#define uint16_bit(_uint8_, _bit_)
 Получить n-й бит из uint16_t.
 
#define uint32_bit(_uint8_, _bit_)   (*(uint32_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
#define uint32_bit(_uint8_, _bit_)
 Получить n-й бит из uint32_t.
 
#define uint64_bit(_uint8_, _bit_)   (*(uint64_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
#define uint64_bit(_uint8_, _bit_)
 Получить n-й бит из uint64_t.
 
-

Detailed Description

+

Detailed Description

Заголочный файл для дефайнов битового доступа.

Definition in file bit_access.h.

+ +
diff --git a/Doc/html/bit__access_8h__dep__incl.map b/Doc/html/bit__access_8h__dep__incl.map index 5c825d5..11c4cbf 100644 --- a/Doc/html/bit__access_8h__dep__incl.map +++ b/Doc/html/bit__access_8h__dep__incl.map @@ -1,5 +1,5 @@ - - - - + + + + diff --git a/Doc/html/bit__access_8h__dep__incl.md5 b/Doc/html/bit__access_8h__dep__incl.md5 index 20054ed..2f7fcbf 100644 --- a/Doc/html/bit__access_8h__dep__incl.md5 +++ b/Doc/html/bit__access_8h__dep__incl.md5 @@ -1 +1 @@ -7a9fce78f461300acd0d2ab58815dc95 \ No newline at end of file +9d0f52ae67584f7f09caa88b8c7ab4e9 \ No newline at end of file diff --git a/Doc/html/bit__access_8h__dep__incl.png b/Doc/html/bit__access_8h__dep__incl.png index 3ef9c175d0f39ca29444ce89d477ed5307a2c660..79f6619c897b62c156eb065203a84350319b4e25 100644 GIT binary patch literal 2910 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 AHvj+t literal 3486 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 - - - - - - - + + + + + + + + diff --git a/Doc/html/bit__access_8h__incl.md5 b/Doc/html/bit__access_8h__incl.md5 index 78ce098..dd84ccf 100644 --- a/Doc/html/bit__access_8h__incl.md5 +++ b/Doc/html/bit__access_8h__incl.md5 @@ -1 +1 @@ -2dcaa807e109473ed5b8776ffa4971c6 \ No newline at end of file +4b8c2556090cdbb9271b9fbe97d7cf5b \ No newline at end of file diff --git a/Doc/html/bit__access_8h__incl.png b/Doc/html/bit__access_8h__incl.png index 62b90d70c077c18f27eab9d18fb2d3bd22017b78..6e25770119bfb439eb0d6be2ab61fa27cba69f31 100644 GIT binary patch literal 4026 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 literal 4374 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 diff --git a/Doc/html/bit__access_8h_source.html b/Doc/html/bit__access_8h_source.html index 9098471..37a5171 100644 --- a/Doc/html/bit__access_8h_source.html +++ b/Doc/html/bit__access_8h_source.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({
- + + -
+
+ diff --git a/Doc/html/classes.html b/Doc/html/classes.html index 23924c7..29c6937 100644 --- a/Doc/html/classes.html +++ b/Doc/html/classes.html @@ -3,7 +3,7 @@ - + MyLibs: Class Index @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
+
diff --git a/Doc/html/clipboard.js b/Doc/html/clipboard.js index 42c1fb0..9da9f3c 100644 --- a/Doc/html/clipboard.js +++ b/Doc/html/clipboard.js @@ -28,8 +28,8 @@ SOFTWARE. */ let clipboard_title = "Copy to clipboard" -let clipboard_icon = `` -let clipboard_successIcon = `` +let clipboard_icon = `` +let clipboard_successIcon = `` let clipboard_successDuration = 1000 $(function() { diff --git a/Doc/html/darkmode_toggle.js b/Doc/html/darkmode_toggle.js index b9c7364..9c1ca07 100644 --- a/Doc/html/darkmode_toggle.js +++ b/Doc/html/darkmode_toggle.js @@ -74,10 +74,15 @@ class DarkModeToggle extends HTMLElement { mainMenuVisible = menuStyle.display!=='none' } const searchBoxPos1 = document.getElementById("searchBoxPos1"); + const buttonLi = document.getElementById('toggle-dark-mode'); + if (buttonLi) { + buttonLi.parentNode.removeChild(buttonLi); + } if (searchBox) { // (1) search box visible searchBox.parentNode.appendChild(toggleButton) } else if (navRow1) { // (2) no search box, static menu bar const li = document.createElement('li'); + li.id = 'toggle-dark-mode'; li.style = 'float: right;' li.appendChild(toggleButton); toggleButton.style = 'width: 24px; height: 25px; padding-top: 11px; float: right;'; @@ -85,6 +90,7 @@ class DarkModeToggle extends HTMLElement { row.appendChild(li) } else if (mainMenu && mainMenuVisible) { // (3) no search box + dynamic menu bar expanded const li = document.createElement('li'); + li.id = 'toggle-dark-mode'; li.style = 'float: right;' li.appendChild(toggleButton); toggleButton.style = 'width: 14px; height: 36px; padding-top: 10px; float: right;'; diff --git a/Doc/html/dir_000002_000000.html b/Doc/html/dir_000002_000000.html index b7ab20a..fe40133 100644 --- a/Doc/html/dir_000002_000000.html +++ b/Doc/html/dir_000002_000000.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Src -> Inc Relation +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Src -> Inc Relation - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
-

Src → Inc Relation

File in MyLibsGeneral/SrcIncludes file in MyLibsGeneral/Inc
__general_spi.cgeneral_gpio.h
__general_uart.cgeneral_gpio.h
general_gpio.cgeneral_gpio.h
general_tim.cgeneral_tim.h
+

Src → Inc Relation

File in MyLibsGeneral/SrcIncludes file in MyLibsGeneral/Inc
general_gpio.cgeneral_gpio.h
general_spi.cgeneral_gpio.h
general_spi.cgeneral_spi.h
general_tim.cgeneral_tim.h
general_uart.cgeneral_gpio.h
general_uart.cgeneral_uart.h
+ +
diff --git a/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4.html b/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4.html index 4586fc7..958ae41 100644 --- a/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4.html +++ b/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Src Directory Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Src Directory Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
Src Directory Reference
-
- + Directory dependency graph for Src:
+
Directory dependency graph for Src:
- - - - - - - - + + - - + + + - + +

+

Files

 __general_flash.c
 
 __general_spi.c
 
 __general_uart.c
 
 general_gpio.c
 
__general_flash.c
 
general_gpio.c
 Модуль для инициализации портов и работы с ними.
 
 general_tim.c
 
general_spi.c
 Модуль для инициализации SPI.
 
general_tim.c
 Модуль для инициализации таймеров и работы с ними.
 
 
general_uart.c
 Модуль для инициализации UART.
+ + diff --git a/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4.js b/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4.js index 6df5d45..6f89d24 100644 --- a/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4.js +++ b/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4.js @@ -1,8 +1,8 @@ var dir_9c80311a018e1f8cfb6659b73d634be4 = [ [ "__general_flash.c", "____general__flash_8c_source.html", null ], - [ "__general_spi.c", "____general__spi_8c_source.html", null ], - [ "__general_uart.c", "____general__uart_8c_source.html", null ], [ "general_gpio.c", "general__gpio_8c.html", "general__gpio_8c" ], - [ "general_tim.c", "general__tim_8c.html", "general__tim_8c" ] + [ "general_spi.c", "general__spi_8c.html", "general__spi_8c" ], + [ "general_tim.c", "general__tim_8c.html", "general__tim_8c" ], + [ "general_uart.c", "general__uart_8c.html", "general__uart_8c" ] ]; \ No newline at end of file diff --git a/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4_dep.map b/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4_dep.map index 783d929..52c2821 100644 --- a/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4_dep.map +++ b/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4_dep.map @@ -1,7 +1,7 @@ - + - + diff --git a/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4_dep.md5 b/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4_dep.md5 index 1cbce3c..933f5ab 100644 --- a/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4_dep.md5 +++ b/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4_dep.md5 @@ -1 +1 @@ -84dda0250b351e30a8ed843193ca7a92 \ No newline at end of file +ffa428a4e7938b24bbf734d10d788ade \ No newline at end of file diff --git a/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4_dep.png b/Doc/html/dir_9c80311a018e1f8cfb6659b73d634be4_dep.png index 662c95b0c8b790c28ce27f436ae63d2c797fa6e6..41d2896be411c90a9c99bdce6d69878d40f641ac 100644 GIT binary patch delta 1957 zcmYLJcUaSD5{_UfQX-)k6tZ+VmhyuGMIc01qzQ^h4x~o}7NrUVjun2Qkidcn(n8+{ zVOf=`5K0IH12(`=OlXFpOK*W}2uG1ibkCcAzIo>Ro|*aPecyQl>w#sS0^{tg&bh=E zud*D2<@}XI*nw?O_p?F8P$9S(9mLEdptQF zH(4-t&>?YD=5GW4J}(r`1kPt=W%=d#OC7q4MQ~a@*Q$p}G#X75;$VhL+7*2cK3jF) zkSET}%%uHZU^$-uRxMkZx-i=EnUvNeRO|WWeFTaZcJO8RYL%0YUVIUKek$f;J#;Ej z(JXdhA@HOnZ&(s~BW_7Gm&oVe2yjJn7P?-!({&T_4E z%V?2(iT={ioIKZHu=bwUg!d?S_{qB24Cawkl`lW4_U{UD=jp_TUj|A_`}_02lF^WP z~&V%@y9NyhN5YWmm^1w(SJ^MtRv zf;kb9+dPg+E30k{=Y2T=^VgZ1^9~(Ce%F{z4dFHzA0doHMbS}y(b5EyO*2p1t*a&) zdI}OvMxt~$TEpb=C#NZJO}&hj`6s5y;yV27o_9?xidKXQ4<&6p9TQ%UGWqb-!26&; zXAKS2B-tRyqIHb@l2?(!RnfR*RSqG9q}Z#%e-P@w(;;@5k4vI4;nnh&bLEB__3uwN2sz zN5&k-Wf`gBv>c*2CA77qNb{YnEZ&Yxg>2c#zV$R|!$YStD;RclN5-M}E;fM+AQzO{ zxW=m_apw%HOPRdU{4Ha zk+x*6ax85yHcgyejnpcm8^ngF8}hIL?~A3$5?RNV=@)-}`e5$j!Ws6tQC3Q|+Yeal z*ONU1=bFN@;(uQ0uF0TmZ->_n;SQ-}ueweK3|t45i5(6KPknmZyzFO~l!Xpg^I)Y% zU%$_!Ws0E`9~qv*VC+Fph;f^hrVd$t@)qd zJlr56_#{&eaYor|wwQW_2g+f!xN?gT3$GSt(!{#=Q_9Pc*2}7k8=y$S!7rj@9p?(PB1{&{gfY>G#AIqC7|=Tck46J;r#sE zru?_kR-ewlaf4koLC46N<9OFOOymVU%YS{4W-ripAxBfGe`KamA=GEPQ`TVtz)EN} zhm%`JTf67nZm%YgivV$yWNJNM+&W8GQ;nb-QNc=rOE6WOJT6uYMc)fhL}W0`N9)eir@ zc~aI-#8eK!=K{j0#=~!J>=uQ(>VAy&r0-93f=?R%Y?;)XO1!4407T9i<5nk82eYp8 z9pU3^pH3gc*B)%ssxB?Jg1bB)T?HlHNwxnO@|$Cya&Tx%sjqOQ-8dVrT(ao^ literal 1992 zcmZ8idpy)xAD*&^!6dhF8@m&7_aj9#6e`t}5{=s!gIq(1nWh@KH6 z2Iv0$kdfkUX6GPaa_0QXT&gY!-Ip=dO&-Zzr&-dKFaQ>9MtcENE0+B!M z;_L>F8DMMJBL(&k8`ONjK`P+vDQC#mb}ebC{1*fwefzZYad%>&fZr9N9HJ#HT=;xK zsUd#4I{osQe#eA!Rcvl@t*lH-eoj3p6js{PT2euJ6@p?i{mz(+bct0ei)npGfmx_u z`hn7^sMIsZ4ePz~A25-$ey4=^y6(B|=n3A9n{*w|j=2vum0mGa#XB|E-i_0>hZ^rBZCus$Qc!`N2=a=3=yB0CN zjhNz+rZ4b*I%6+&*BK7qx2Q?YtA#mS?o&*c#wER*T!wDsRllHLD7f-k0+0(Fb=9P2 zWowO<^sz=SOg>g4i7KLgq(u@nz2Fc$c4zbtiFfE{$NT5k9C^vxQcfEKc4xY?{G;z?u1W z{u4c^|0qoym76tZ4!%t08ECPkHQ+S0W?ubpLg7S1IBVfsa3^uYr$_KF+7Lh%34&k7lpmw#ZYcvDxfAY__i#%rK)0$rBwaO={ z-$ALbri3+*p5^|9$y5@|;KMQgp|_^?YJj-+%;J?_(?VU{&C&1*X5n;vr=Y>>*)2Q+ z2vdW%kt2{zmmj{w?*idB^#40KAqfwB!=o~!Z7F6JA|UFByhD^Znj6kD2t;L^@-w>& z=R6(=M9E2J?ohA;!nuk$CjMjP;Ld4|-SAWrWQL{bH6mF>=4f zBtE#iP=N-`Qkz}ZJ27axe5m|u;=TlHq%qrv+FSbwxPDB43DQv?zD5hQws#n)tj9t+ zf(VAu2SaNW(24rc!Qv}?!}yP1H>SuKyQ^B+{|K=iv|VUzN5(#=7b!=>YNN|wwJpvTmzJC{#UMTnL)a&7$oXpe-t`ygt9orbadrn z_ee^7N&-m&?+WlwJ#X?wH(~3oJb2U-w!dVZE$NTSxa>aA&RpwUC8NmUV=IXqdI-Ya zuV_=S(0z!7TPxFS8`@vq7#ZX4t8;R;t$Lwe_^B96bhBU={%$2Vwv;j-(w{5Y{M+-4 zvS|C;Uwuay&(hg;Em-Zg;b2K^h!K04a^(qUX6LmS7runL9hJYs=H$>=V?U8Uo%E{e-h1gcFOi@JyXk}Yj+8)l_ zPT{Va-crFIg~zzqd#0umPNNopE~9Nsy!TKHu`QwT1&UQ_a$HA#6`VpQYyOH{tK-*4 zdBQIJ_wWz4lz&`6Y}MU2zLD)%vYu&9Ao4o`Lq_nbP9+!&-sVorPX(@XgxV$747rMmdyswf*o57 z0nQ1GlSg9Mk=+6f8(bU&^$u~qe{O}ql2%gU06J@>>|b^b{Ah2v| zxRAThW}*tE9*NT!Cd^T{CWhm1cBX{Ib*Pgyd2 - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral Directory Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral Directory Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
MyLibsGeneral Directory Reference
-
- + Directory dependency graph for MyLibsGeneral:
+
Directory dependency graph for MyLibsGeneral:
- - - - - + +

+

Directories

 Inc
 
 Src
 
 
Inc
 
Src
- - - +

+

Files

 mainpage.h
 
 
mainpage.h
+ + diff --git a/Doc/html/dir_9e11e9a41112194af3eee6cc728f9515_dep.map b/Doc/html/dir_9e11e9a41112194af3eee6cc728f9515_dep.map index 9406b23..65a89e3 100644 --- a/Doc/html/dir_9e11e9a41112194af3eee6cc728f9515_dep.map +++ b/Doc/html/dir_9e11e9a41112194af3eee6cc728f9515_dep.map @@ -1,7 +1,7 @@ - + - + diff --git a/Doc/html/dir_9e11e9a41112194af3eee6cc728f9515_dep.md5 b/Doc/html/dir_9e11e9a41112194af3eee6cc728f9515_dep.md5 index 9534313..13dbe4c 100644 --- a/Doc/html/dir_9e11e9a41112194af3eee6cc728f9515_dep.md5 +++ b/Doc/html/dir_9e11e9a41112194af3eee6cc728f9515_dep.md5 @@ -1 +1 @@ -9178b7f2911a2208010657da2be83ea6 \ No newline at end of file +8443f86a129039a222fea0f68a874d48 \ No newline at end of file diff --git a/Doc/html/dir_9e11e9a41112194af3eee6cc728f9515_dep.png b/Doc/html/dir_9e11e9a41112194af3eee6cc728f9515_dep.png index 755f4fd8a58864ee3aaf5cb47613663f851cd307..8bc91fcf3da0cd10302f94b48cf2df6fc58d586b 100644 GIT binary patch literal 1616 zcma)6X*3&H6sE;k(nV;dmLZ};2*;ol9XqiVZKal}O05|*v=l|O9coAk2`yEX+G*@m zOhvREB&k?BVo#|ul9pmndoVFGXU^2=k9qIB_r3ewbMATH`R=*cvraaL#AU?=1OyJ* z*;<|FuY%QE?du$`4T;>M%7G1Dt@7vx_oz8yIn z=ttt!>4M#LPB?j*p*zho;Np~&_FwOO4^|oMJ8Yd?b+7~`k*wr%09&X6l*1tikpeVc zfu*@m5y-#%K+r*D(Vbq=iSJP~3F$9!8T| zI0`;U`(V>_U-RQ4l#s&-lr4%doeBP`S1y1^X1^If-8%MzW6ak_DeSQe1WjzymnwgixdNc3Le(A@dpA``}-x(qKI@4FdS<()q3nKOC3 z;q7w0H1bsGK&@_V?Zins)W;kzdp#ttZG1fshIpONWTCbKBBnKJ7NL zg{!@q(1S22Yk5=|Q18POPZe*3`ANS-%U*6cBV?D%5GPmu*TM{Jic#%QLL0J=7_Tmb zMRaVOO5mojAdpFu9T-_V6OOm-m>F%Ztd3KheSjQOl#(PwaUQoDg=DM)_V>XTo8y0y zJU#qzF}L}=Aj&|0BG3@K^>| z8)#&zyCeg&CD7K-xGQ;=s1g}2y@9b^D-Ule7)Jn5!#{z&OCIlbF`JIiQhVcgE++3r z+LQR4n>`V;mYd8?Qp^swGBMiKG6e`Yov)i<@`_d0c6%aleb=l&D#mIcOrv1rWZ~h; zM$gDLH{0jYsg9z+!I)^;eGA4)F2kZo$HqN7J&)XjUAKZyxogGE1RI)cgSH=!tw$b05FqtKLZ|MvThtIVxEcy$-O$*V>~H z=N5wLS;zPl|0(<#EGQA06+_~PtJ3{o+u~A$Io@oCv_0}|5`*d2-jLq|$ox@L;@VmoUmt7?nO@qYqMMcvl` literal 1613 zcmb7Ec{mhk99D}4LrBU!G?V+RA?L=R8CPXplYKY%B+Rf8CDaUmClzQ~Gh^#KWzjsJTOZNaHMulj;GE6Z==UP%ZTc7K8CPoZzW3 z_>?R9ZS+)PMn*=Lfqv8j>M_9t&!LZ{ZUjqqk7LCa z*9?^3Q0_)_v91L&KNRC@bF9$*s;3H&E;e-g_@4H|ze7|#0j39&g~8teTxA+|5D~l^ zifjp?4WNz(w}rA%6r#T(+-H&2U+QCg$7N%TxUjG!0@i^#<`1F(^&e{3>+DS+-*Gc^ zygc_l@Jm$75Ue__TeR8sr#ICIPYdg4n?ls-me^IRIUiw0Wlw#o)2bpkH(A4niSa(ti}X_!@yU{LMp;9!^`_8XKW+1xb`ZoiSDC z_AZe%Bg{zkdNI;X#cPu_%{iTslk~=*h}bIm%Ihg!s{JobB(r~Pb>zwH_@lf zBs#T_WlHn^ZuRS!V<;2-%KUohx1aO)>s$8S2C1JRhG)jmetF)E64l^ zU_gUyfEv$v)NJPEhFL@jDe$i~+v4^}Oc_nXnf{DWUr4hJhGKF`)IW-QU#^~hwU92M zvp6Vm)cT2UKoum=A-5(Iu{xpC7upsVB-<6KANPx5XBRE3no{SNcn<|52e-r&`%#+O zJz6Ma8S27b;1emg8rhC&#|sxJu31_GsSwp+&4D2_;tn<-zCTn1EU%#H((r8+;TqQ# zyWO**ZuO%8kA=ZHd9%|%4`~T3_!DIp!7LzHqI;ihlgeg~#aXcnrgyZJ5L@#Drj_GN zhzac5cYfF#|A#DNxy9U6S&~0(fu2{zc;^B{wUR(1dU#`_N17VDg>0=WBA;8YOtV$X z(2ASyKB+5?M^R?9d=6UcRf;s+4%>^S?@DDQgP~JiO$Oeg;G(sqX^WlBn_8=FQdwz& zujOoH=HIFAjx@hK4#8AkA1!=T!0)j{=bxIX$AjQ!0(?Nj`6HW3#^((TFH?KZ4%baD zE-Q(ErFC7`9R;ok0fe${@R^b>h1hILrsT_~^Hdm^qR*ZOikF8SA*P936gOIU(^`v_ zj=5{7>-JzIsc+sl(DsA6GbG^-T?GdfJc@ktvjckQUVB(nQzmGpu}qQRxatTbmP0Gy7PBrqz?(Y*&K zhDDI{sTt9ACZekbx#Gg%k^~q9+hwge*zZ<$y#3-T5u@~jx6_;G$yg;O1duiImn{Kk4xA{dJigPLmV z%WQyX{y&>fY8zzD%0s%g8|P~K+?~3G6S#r$@cnSc*SD>JEo>+DRVzpVY{>G9P-v*W z>on_yJ+^e{X|!s;V+}s!xk=_^bBcuMP@ta9lJ@7Ce$j(e;tVN6=Gr2t#c8}nQXzci z6xfucOvYKY2g_Lh_|tA-;$8FEIO0DMV=%2mPKfpu)oq`wFCE5JIQL^wTPzfuI~C~o z*xw<4*J#P>KFR+(ufN8Cb|Bt$Lw4W}6>d;l#om^4QdQxmm - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc Directory Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc Directory Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
Inc Directory Reference
-
- + Directory dependency graph for Inc:
+
Directory dependency graph for Inc:
- - - - - - - - + + - - + - - + - - + + + - - + + + - - + - - + - - + - - + -

+

Files

 __general_flash.h
 
 __general_spi.h
 
 __general_uart.h
 
 bit_access.h
 
__general_flash.h
 
bit_access.h
 Заголочный файл для дефайнов битового доступа.
 
 evolve_optimizer.h
 
evolve_optimizer.h
 Заголовочный файл для адаптивного подбора параметров
 
 general_gpio.h
 
general_gpio.h
 Заголовочный файл для модуля инициализации портов и работы с ними.
 
 general_tim.h
 
general_spi.h
 Заголовочный файл для модуля инициализации SPI.
 
general_tim.h
 Заголовочный файл для модуля инициализации таймеров и работы с ними.
 
 mylibs_config.h
 
general_uart.h
 Заголовочный файл для модуля инициализации UART.
 
mylibs_config.h
 Конфигурации для библиотек MyLibs.
 
 mylibs_defs.h
 
mylibs_defs.h
 Заголочный файл для дефайнов библиотеки MyLibsGeneral.
 
 mylibs_include.h
 
mylibs_include.h
 Заголочный файл для всех библиотек
 
 trace.h
 
trace.h
 Заголочный файл для работы с трассировкой.
 
 trackers.h
 
trackers.h
 Заголочный файл для работы с трекерами Trackers defines.
 
+ + diff --git a/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1.js b/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1.js index 68cf10b..3cc106f 100644 --- a/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1.js +++ b/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1.js @@ -1,12 +1,12 @@ var dir_eb423fea8a9c4b9b32b922020ec391e1 = [ [ "__general_flash.h", "____general__flash_8h_source.html", null ], - [ "__general_spi.h", "____general__spi_8h_source.html", null ], - [ "__general_uart.h", "____general__uart_8h_source.html", null ], [ "bit_access.h", "bit__access_8h.html", "bit__access_8h" ], [ "evolve_optimizer.h", "evolve__optimizer_8h.html", "evolve__optimizer_8h" ], [ "general_gpio.h", "general__gpio_8h.html", "general__gpio_8h" ], + [ "general_spi.h", "general__spi_8h.html", "general__spi_8h" ], [ "general_tim.h", "general__tim_8h.html", "general__tim_8h" ], + [ "general_uart.h", "general__uart_8h.html", "general__uart_8h" ], [ "mylibs_config.h", "mylibs__config_8h.html", "mylibs__config_8h" ], [ "mylibs_defs.h", "mylibs__defs_8h.html", "mylibs__defs_8h" ], [ "mylibs_include.h", "mylibs__include_8h.html", null ], diff --git a/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1_dep.map b/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1_dep.map index e44b344..8f7cb36 100644 --- a/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1_dep.map +++ b/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1_dep.map @@ -1,4 +1,4 @@ - + diff --git a/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1_dep.md5 b/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1_dep.md5 index bb4da48..f594f8b 100644 --- a/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1_dep.md5 +++ b/Doc/html/dir_eb423fea8a9c4b9b32b922020ec391e1_dep.md5 @@ -1 +1 @@ -88eae9c3335ed0a89cb7c7066ad193a7 \ No newline at end of file +51bda8bf2e3b4eafeabf6cf3520068b7 \ No newline at end of file diff --git a/Doc/html/doxygen.css b/Doc/html/doxygen.css index 7dbff89..59138c1 100644 --- a/Doc/html/doxygen.css +++ b/Doc/html/doxygen.css @@ -1,11 +1,12 @@ -/* The standard CSS for doxygen 1.10.0*/ +/* The standard CSS for doxygen 1.14.0*/ html { /* page base colors */ --page-background-color: white; --page-foreground-color: black; --page-link-color: #3D578C; ---page-visited-link-color: #4665A2; +--page-visited-link-color: #3D578C; +--page-external-link-color: #334975; /* index */ --index-odd-item-bg-color: #F8F9FC; @@ -16,46 +17,50 @@ html { /* header */ --header-background-color: #F9FAFC; --header-separator-color: #C4CFE5; ---header-gradient-image: url('nav_h.png'); ---group-header-separator-color: #879ECB; +--group-header-separator-color: #D9E0EE; --group-header-color: #354C7B; --inherit-header-color: gray; --footer-foreground-color: #2A3D61; ---footer-logo-width: 104px; +--footer-logo-width: 75px; --citation-label-color: #334975; --glow-color: cyan; --title-background-color: white; ---title-separator-color: #5373B4; +--title-separator-color: #C4CFE5; --directory-separator-color: #9CAFD4; --separator-color: #4A6AAA; --blockquote-background-color: #F7F8FB; --blockquote-border-color: #9CAFD4; ---scrollbar-thumb-color: #9CAFD4; +--scrollbar-thumb-color: #C4CFE5; --scrollbar-background-color: #F9FAFC; --icon-background-color: #728DC1; --icon-foreground-color: white; +/* --icon-doc-image: url('doc.svg'); --icon-folder-open-image: url('folderopen.svg'); ---icon-folder-closed-image: url('folderclosed.svg'); +--icon-folder-closed-image: url('folderclosed.svg');*/ +--icon-folder-open-fill-color: #C4CFE5; +--icon-folder-fill-color: #D8DFEE; +--icon-folder-border-color: #4665A2; +--icon-doc-fill-color: #D8DFEE; +--icon-doc-border-color: #4665A2; /* brief member declaration list */ --memdecl-background-color: #F9FAFC; --memdecl-separator-color: #DEE4F0; --memdecl-foreground-color: #555; --memdecl-template-color: #4665A2; +--memdecl-border-color: #D5DDEC; /* detailed member list */ --memdef-border-color: #A8B8D9; --memdef-title-background-color: #E2E8F2; ---memdef-title-gradient-image: url('nav_f.png'); ---memdef-proto-background-color: #DFE5F1; +--memdef-proto-background-color: #EEF1F7; --memdef-proto-text-color: #253555; ---memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); --memdef-doc-background-color: white; --memdef-param-name-color: #602020; --memdef-template-color: #4665A2; @@ -74,29 +79,34 @@ html { /** navigation bar/tree/menu */ --nav-background-color: #F9FAFC; --nav-foreground-color: #364D7C; ---nav-gradient-image: url('tab_b.png'); ---nav-gradient-hover-image: url('tab_h.png'); ---nav-gradient-active-image: url('tab_a.png'); ---nav-gradient-active-image-parent: url("../tab_a.png"); ---nav-separator-image: url('tab_s.png'); ---nav-breadcrumb-image: url('bc_s.png'); ---nav-breadcrumb-border-color: #C2CDE4; ---nav-splitbar-image: url('splitbar.png'); +--nav-border-color: #C4CFE5; +--nav-breadcrumb-separator-color: #C4CFE5; +--nav-breadcrumb-active-bg: #EEF1F7; +--nav-breadcrumb-color: #354C7B; +--nav-breadcrumb-border-color: #E1E7F2; +--nav-splitbar-bg-color: #DCE2EF; +--nav-splitbar-handle-color: #9CAFD4; --nav-font-size-level1: 13px; --nav-font-size-level2: 10px; --nav-font-size-level3: 9px; --nav-text-normal-color: #283A5D; --nav-text-hover-color: white; --nav-text-active-color: white; ---nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); ---nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); ---nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); --nav-menu-button-color: #364D7C; --nav-menu-background-color: white; --nav-menu-foreground-color: #555555; +--nav-menu-active-bg: #DCE2EF; +--nav-menu-active-color: #9CAFD4; --nav-menu-toggle-color: rgba(255, 255, 255, 0.5); ---nav-arrow-color: #9CAFD4; ---nav-arrow-selected-color: #9CAFD4; +--nav-arrow-color: #B6C4DF; +--nav-arrow-selected-color: #90A5CE; + +/* sync icon */ +--sync-icon-border-color: #C4CFE5; +--sync-icon-background-color: #F9FAFC; +--sync-icon-selected-background-color: #EEF1F7; +--sync-icon-color: #C4CFE5; +--sync-icon-selected-color: #6884BD; /* table of contents */ --toc-background-color: #F4F6FA; @@ -107,18 +117,20 @@ html { /** search field */ --search-background-color: white; --search-foreground-color: #909090; ---search-magnification-image: url('mag.svg'); ---search-magnification-select-image: url('mag_sel.svg'); --search-active-color: black; ---search-filter-background-color: #F9FAFC; +--search-filter-background-color: rgba(255,255,255,.7); +--search-filter-backdrop-filter: blur(4px); --search-filter-foreground-color: black; ---search-filter-border-color: #90A5CE; +--search-filter-border-color: rgba(150,150,150,.4); --search-filter-highlight-text-color: white; --search-filter-highlight-bg-color: #3D578C; --search-results-foreground-color: #425E97; ---search-results-background-color: #EEF1F7; ---search-results-border-color: black; ---search-box-shadow: inset 0.5px 0.5px 3px 0px #555; +--search-results-background-color: rgba(255,255,255,.8); +--search-results-backdrop-filter: blur(4px); +--search-results-border-color: rgba(150,150,150,.4); +--search-box-border-color: #B6C4DF; +--search-close-icon-bg-color: #A0A0A0; +--search-close-icon-fg-color: white; /** code fragments */ --code-keyword-color: #008000; @@ -147,23 +159,21 @@ html { --fragment-lineno-link-hover-bg-color: #C8C8C8; --fragment-copy-ok-color: #2EC82E; --tooltip-foreground-color: black; ---tooltip-background-color: white; ---tooltip-border-color: gray; +--tooltip-background-color: rgba(255,255,255,0.8); +--tooltip-arrow-background-color: white; +--tooltip-border-color: rgba(150,150,150,0.7); +--tooltip-backdrop-filter: blur(3px); --tooltip-doc-color: grey; --tooltip-declaration-color: #006318; --tooltip-link-color: #4665A2; ---tooltip-shadow: 1px 1px 7px gray; +--tooltip-shadow: 0 4px 8px 0 rgba(0,0,0,.25); --fold-line-color: #808080; ---fold-minus-image: url('minus.svg'); ---fold-plus-image: url('plus.svg'); ---fold-minus-image-relpath: url('../../minus.svg'); ---fold-plus-image-relpath: url('../../plus.svg'); /** font-family */ ---font-family-normal: Roboto,sans-serif; +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; --font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; --font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; ---font-family-title: Tahoma,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; --font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; --font-family-search: Arial,Verdana,sans-serif; --font-family-icon: Arial,Helvetica; @@ -198,7 +208,8 @@ html.dark-mode { --page-background-color: black; --page-foreground-color: #C9D1D9; --page-link-color: #90A5CE; ---page-visited-link-color: #A3B4D7; +--page-visited-link-color: #90A5CE; +--page-external-link-color: #A3B4D7; /* index */ --index-odd-item-bg-color: #0B101A; @@ -209,8 +220,7 @@ html.dark-mode { /* header */ --header-background-color: #070B11; --header-separator-color: #141C2E; ---header-gradient-image: url('nav_hd.png'); ---group-header-separator-color: #283A5D; +--group-header-separator-color: #1D2A43; --group-header-color: #90A5CE; --inherit-header-color: #A0A0A0; @@ -220,35 +230,36 @@ html.dark-mode { --glow-color: cyan; --title-background-color: #090D16; ---title-separator-color: #354C79; +--title-separator-color: #212F4B; --directory-separator-color: #283A5D; --separator-color: #283A5D; --blockquote-background-color: #101826; --blockquote-border-color: #283A5D; ---scrollbar-thumb-color: #283A5D; +--scrollbar-thumb-color: #2C3F65; --scrollbar-background-color: #070B11; --icon-background-color: #334975; --icon-foreground-color: #C4CFE5; ---icon-doc-image: url('docd.svg'); ---icon-folder-open-image: url('folderopend.svg'); ---icon-folder-closed-image: url('folderclosedd.svg'); +--icon-folder-open-fill-color: #4665A2; +--icon-folder-fill-color: #5373B4; +--icon-folder-border-color: #C4CFE5; +--icon-doc-fill-color: #6884BD; +--icon-doc-border-color: #C4CFE5; /* brief member declaration list */ --memdecl-background-color: #0B101A; --memdecl-separator-color: #2C3F65; --memdecl-foreground-color: #BBB; --memdecl-template-color: #7C95C6; +--memdecl-border-color: #233250; /* detailed member list */ --memdef-border-color: #233250; --memdef-title-background-color: #1B2840; ---memdef-title-gradient-image: url('nav_fd.png'); --memdef-proto-background-color: #19243A; --memdef-proto-text-color: #9DB0D4; ---memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); --memdef-doc-background-color: black; --memdef-param-name-color: #D28757; --memdef-template-color: #7C95C6; @@ -267,29 +278,34 @@ html.dark-mode { /** navigation bar/tree/menu */ --nav-background-color: #101826; --nav-foreground-color: #364D7C; ---nav-gradient-image: url('tab_bd.png'); ---nav-gradient-hover-image: url('tab_hd.png'); ---nav-gradient-active-image: url('tab_ad.png'); ---nav-gradient-active-image-parent: url("../tab_ad.png"); ---nav-separator-image: url('tab_sd.png'); ---nav-breadcrumb-image: url('bc_sd.png'); +--nav-border-color: #212F4B; +--nav-breadcrumb-separator-color: #212F4B; +--nav-breadcrumb-active-bg: #1D2A43; +--nav-breadcrumb-color: #90A5CE; --nav-breadcrumb-border-color: #2A3D61; ---nav-splitbar-image: url('splitbard.png'); +--nav-splitbar-bg-color: #283A5D; +--nav-splitbar-handle-color: #4665A2; --nav-font-size-level1: 13px; --nav-font-size-level2: 10px; --nav-font-size-level3: 9px; --nav-text-normal-color: #B6C4DF; --nav-text-hover-color: #DCE2EF; --nav-text-active-color: #DCE2EF; ---nav-text-normal-shadow: 0px 1px 1px black; ---nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); ---nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); --nav-menu-button-color: #B6C4DF; --nav-menu-background-color: #05070C; --nav-menu-foreground-color: #BBBBBB; +--nav-menu-active-bg: #1D2A43; +--nav-menu-active-color: #C9D3E7; --nav-menu-toggle-color: rgba(255, 255, 255, 0.2); ---nav-arrow-color: #334975; ---nav-arrow-selected-color: #90A5CE; +--nav-arrow-color: #4665A2; +--nav-arrow-selected-color: #6884BD; + +/* sync icon */ +--sync-icon-border-color: #212F4B; +--sync-icon-background-color: #101826; +--sync-icon-selected-background-color: #1D2A43; +--sync-icon-color: #4665A2; +--sync-icon-selected-color: #5373B4; /* table of contents */ --toc-background-color: #151E30; @@ -300,18 +316,20 @@ html.dark-mode { /** search field */ --search-background-color: black; --search-foreground-color: #C5C5C5; ---search-magnification-image: url('mag_d.svg'); ---search-magnification-select-image: url('mag_seld.svg'); ---search-active-color: #C5C5C5; +--search-active-color: #F5F5F5; --search-filter-background-color: #101826; --search-filter-foreground-color: #90A5CE; +--search-filter-backdrop-filter: none; --search-filter-border-color: #7C95C6; --search-filter-highlight-text-color: #BCC9E2; --search-filter-highlight-bg-color: #283A5D; ---search-results-background-color: #101826; +--search-results-background-color: black; --search-results-foreground-color: #90A5CE; ---search-results-border-color: #7C95C6; ---search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; +--search-results-backdrop-filter: none; +--search-results-border-color: #334975; +--search-box-border-color: #334975; +--search-close-icon-bg-color: #909090; +--search-close-icon-fg-color: black; /** code fragments */ --code-keyword-color: #CC99CD; @@ -341,22 +359,20 @@ html.dark-mode { --fragment-copy-ok-color: #0EA80E; --tooltip-foreground-color: #C9D1D9; --tooltip-background-color: #202020; +--tooltip-arrow-background-color: #202020; +--tooltip-backdrop-filter: none; --tooltip-border-color: #C9D1D9; --tooltip-doc-color: #D9E1E9; --tooltip-declaration-color: #20C348; --tooltip-link-color: #79C0FF; --tooltip-shadow: none; --fold-line-color: #808080; ---fold-minus-image: url('minusd.svg'); ---fold-plus-image: url('plusd.svg'); ---fold-minus-image-relpath: url('../../minusd.svg'); ---fold-plus-image-relpath: url('../../plusd.svg'); /** font-family */ ---font-family-normal: Roboto,sans-serif; +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; --font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; --font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; ---font-family-title: Tahoma,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; --font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; --font-family-search: Arial,Verdana,sans-serif; --font-family-icon: Arial,Helvetica; @@ -387,8 +403,8 @@ html.dark-mode { } body { - background-color: var(--page-background-color); - color: var(--page-foreground-color); + background-color: var(--page-background-color); + color: var(--page-foreground-color); } body, table, div, p, dl { @@ -398,13 +414,22 @@ body, table, div, p, dl { line-height: 22px; } +body.resizing { + user-select: none; + -webkit-user-select: none; +} + +#doc-content { + scrollbar-width: thin; +} + /* @group Heading Levels */ .title { font-family: var(--font-family-normal); line-height: 28px; - font-size: 150%; - font-weight: bold; + font-size: 160%; + font-weight: 400; margin: 10px 2px; } @@ -413,7 +438,10 @@ h1.groupheader { } h2.groupheader { - border-bottom: 1px solid var(--group-header-separator-color); + box-shadow: 12px 0 var(--page-background-color), + -12px 0 var(--page-background-color), + 12px 1px var(--group-header-separator-color), + -12px 1px var(--group-header-separator-color); color: var(--group-header-color); font-size: 150%; font-weight: normal; @@ -423,6 +451,13 @@ h2.groupheader { width: 100%; } +td h2.groupheader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + h3.groupheader { font-size: 100%; } @@ -449,8 +484,8 @@ p.startli, p.startdd { } th p.starttd, th p.intertd, th p.endtd { - font-size: 100%; - font-weight: 700; + font-size: 100%; + font-weight: 700; } p.starttd { @@ -495,9 +530,11 @@ h3.version { } div.navtab { - padding-right: 15px; + margin-right: 6px; + padding-right: 6px; text-align: right; line-height: 110%; + background-color: var(--nav-background-color); } div.navtab table { @@ -510,19 +547,10 @@ td.navtab { } td.navtabHL { - background-image: var(--nav-gradient-active-image); - background-repeat:repeat-x; padding-right: 6px; padding-left: 6px; -} - -td.navtabHL a, td.navtabHL a:visited { - color: var(--nav-text-hover-color); - text-shadow: var(--nav-text-hover-shadow); -} - -a.navtab { - font-weight: bold; + border-radius: 0 6px 6px 0; + background-color: var(--nav-menu-active-bg); } div.qindex{ @@ -597,16 +625,11 @@ a { color: var(--page-visited-link-color); } -a:hover { +span.label a:hover { text-decoration: none; background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); } -a:hover > span.arrow { - text-decoration: none; - background : var(--nav-background-color); -} - a.el { font-weight: bold; } @@ -614,12 +637,12 @@ a.el { a.elRef { } -a.code, a.code:visited, a.line, a.line:visited { - color: var(--code-link-color); +a.el, a.el:visited, a.code, a.code:visited, a.line, a.line:visited { + color: var(--page-link-color); } a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: var(--code-external-link-color); + color: var(--page-external-link-color); } a.code.hl_class { /* style for links to class names in code snippets */ } @@ -655,103 +678,125 @@ dl.el { margin-left: -1cm; } +ul.check { + list-style:none; + text-indent: -16px; + padding-left: 38px; +} +li.unchecked:before { + content: "\2610\A0"; +} +li.checked:before { + content: "\2611\A0"; +} + +ol { + text-indent: 0px; +} + ul { - overflow: visible; + text-indent: 0px; + overflow: visible; } ul.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; - column-count: 3; - list-style-type: none; + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; } #side-nav ul { - overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ } #main-nav ul { - overflow: visible; /* reset ul rule for the navigation bar drop down lists */ + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ } .fragment { - text-align: left; - direction: ltr; - overflow-x: auto; - overflow-y: hidden; - position: relative; - min-height: 12px; - margin: 10px 0px; - padding: 10px 10px; - border: 1px solid var(--fragment-border-color); - border-radius: 4px; - background-color: var(--fragment-background-color); - color: var(--fragment-foreground-color); + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); } pre.fragment { - word-wrap: break-word; - font-size: 10pt; - line-height: 125%; - font-family: var(--font-family-monospace); + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +span.tt { + white-space: pre; + font-family: var(--font-family-monospace); } .clipboard { - width: 24px; - height: 24px; - right: 5px; - top: 5px; - opacity: 0; - position: absolute; - display: inline; - overflow: auto; - fill: var(--fragment-foreground-color); - justify-content: center; - align-items: center; - cursor: pointer; + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: hidden; + justify-content: center; + align-items: center; + cursor: pointer; } .clipboard.success { - border: 1px solid var(--fragment-foreground-color); - border-radius: 4px; + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; } .fragment:hover .clipboard, .clipboard.success { - opacity: .28; + opacity: .4; } .clipboard:hover, .clipboard.success { - opacity: 1 !important; + opacity: 1 !important; } .clipboard:active:not([class~=success]) svg { - transform: scale(.91); + transform: scale(.91); } .clipboard.success svg { - fill: var(--fragment-copy-ok-color); + fill: var(--fragment-copy-ok-color); } .clipboard.success { - border-color: var(--fragment-copy-ok-color); + border-color: var(--fragment-copy-ok-color); } div.line { font-family: var(--font-family-monospace); - font-size: 13px; + font-size: 13px; min-height: 13px; line-height: 1.2; - text-wrap: unrestricted; + text-wrap: wrap; + word-break: break-all; white-space: -moz-pre-wrap; /* Moz */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ white-space: pre-wrap; /* CSS3 */ word-wrap: break-word; /* IE 5.5+ */ - text-indent: -53px; - padding-left: 53px; + text-indent: -62px; + padding-left: 62px; padding-bottom: 0px; margin: 0px; -webkit-transition-property: background-color, box-shadow; @@ -767,8 +812,8 @@ div.line { } div.line:after { - content:"\000A"; - white-space: pre; + content:"\000A"; + white-space: pre; } div.line.glow { @@ -777,26 +822,67 @@ div.line.glow { } span.fold { - margin-left: 5px; - margin-right: 1px; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; display: inline-block; width: 12px; height: 12px; - background-repeat:no-repeat; - background-position:center; + margin-left: 4px; + margin-right: 1px; +} + +span.foldnone { + display: inline-block; + position: relative; + cursor: pointer; + user-select: none; +} + +span.fold.plus, span.fold.minus { + width: 10px; + height: 10px; + background-color: var(--fragment-background-color); + position: relative; + border: 1px solid var(--fold-line-color); + margin-right: 1px; +} + +span.fold.plus::before, span.fold.minus::before { + content: ''; + position: absolute; + background-color: var(--fold-line-color); +} + +span.fold.plus::before { + width: 2px; + height: 6px; + top: 2px; + left: 4px; +} + +span.fold.plus::after { + content: ''; + position: absolute; + width: 6px; + height: 2px; + top: 4px; + left: 2px; + background-color: var(--fold-line-color); +} + +span.fold.minus::before { + width: 6px; + height: 2px; + top: 4px; + left: 2px; } span.lineno { padding-right: 4px; - margin-right: 9px; + margin-right: 9px; text-align: right; border-right: 2px solid var(--fragment-lineno-border-color); color: var(--fragment-lineno-foreground-color); background-color: var(--fragment-lineno-background-color); - white-space: pre; + white-space: pre; } span.lineno a, span.lineno a:visited { color: var(--fragment-lineno-link-fg-color); @@ -818,18 +904,27 @@ span.lineno a:hover { } div.classindex ul { - list-style: none; - padding-left: 0; + list-style: none; + padding-left: 0; } div.classindex span.ai { - display: inline-block; + display: inline-block; } div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: bold; + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 110%; + font-weight: 500; + margin-left: 0px; + margin-top: 0em; + margin-bottom: 6px; + padding-top: 8px; + padding-bottom: 4px; } div.groupText { @@ -839,13 +934,13 @@ div.groupText { body { color: var(--page-foreground-color); - margin: 0; + margin: 0; } div.contents { margin-top: 10px; margin-left: 12px; - margin-right: 8px; + margin-right: 12px; } p.formulaDsp { @@ -865,9 +960,9 @@ img.formulaInl, img.inline { div.center { text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; } div.center img { @@ -942,10 +1037,10 @@ span.vhdllogic { } blockquote { - background-color: var(--blockquote-background-color); - border-left: 2px solid var(--blockquote-border-color); - margin: 0 24px 0 4px; - padding: 0 12px 0 16px; + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; } /* @end */ @@ -967,9 +1062,14 @@ th.dirtab { } hr { - height: 0px; border: none; - border-top: 1px solid var(--separator-color); + margin-top: 16px; + margin-bottom: 16px; + height: 1px; + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); } hr.footer { @@ -984,14 +1084,6 @@ table.memberdecls { } .memberdecls td, .fieldtable tr { - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; transition-property: background-color, box-shadow; transition-duration: 0.5s; } @@ -1001,13 +1093,23 @@ table.memberdecls { box-shadow: 0 0 15px var(--glow-color); } +.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); +} + .mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { +.memItemLeft, .memItemRight { + padding-top: 2px; + padding-bottom: 2px; +} + +.memTemplParams { + padding-left: 10px; + padding-top: 5px; +} + +.memItemLeft, .memItemRight, .memTemplParams { background-color: var(--memdecl-background-color); - border: none; - margin: 4px; - padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { @@ -1015,27 +1117,104 @@ table.memberdecls { color: var(--memdecl-foreground-color); } -.memSeparator { - border-bottom: 1px solid var(--memdecl-separator-color); - line-height: 1px; - margin: 0px; - padding: 0px; +tr[class^='memdesc'] { + box-shadow: inset 0px 1px 3px 0px rgba(0,0,0,.075); } -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; +.mdescLeft { + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); } -.memItemRight, .memTemplItemRight { - width: 100%; +.mdescRight { + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); } .memTemplParams { color: var(--memdecl-template-color); - white-space: nowrap; + white-space: nowrap; font-size: 80%; + border-left: 1px solid var(--memdecl-border-color); + border-right: 1px solid var(--memdecl-border-color); } +td.ititle { + border: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding-left: 10px; +} + +tr:not(:first-child) > td.ititle { + border-top: 0; + border-radius: 0; +} + +.memItemLeft { + white-space: nowrap; + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-left: 10px; + transition: none; +} + +.memItemRight { + width: 100%; + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-right: 10px; + transition: none; +} + +tr.heading + tr[class^='memitem'] td.memItemLeft, +tr.groupHeader + tr[class^='memitem'] td.memItemLeft, +tr.inherit_header + tr[class^='memitem'] td.memItemLeft { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memItemRight, +tr.groupHeader + tr[class^='memitem'] td.memItemRight, +tr.inherit_header + tr[class^='memitem'] td.memItemRight { + border-top: 1px solid var(--memdecl-border-color); + border-top-right-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memTemplParams, +tr.heading + tr td.ititle, +tr.groupHeader + tr[class^='memitem'] td.memTemplParams, +tr.groupHeader + tr td.ititle, +tr.inherit_header + tr[class^='memitem'] td.memTemplParams { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemLeft, +table.memberdecls tr:last-child td.mdescLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescLeft { + border-bottom-left-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemRight, +table.memberdecls tr:last-child td.mdescRight, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemRight, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescRight { + border-bottom-right-radius: 4px; +} + +tr.template .memItemLeft, tr.template .memItemRight { + border-top: none; + padding-top: 0; +} + + /* @end */ /* @group Member Details */ @@ -1050,24 +1229,43 @@ table.memberdecls { border-top-right-radius: 4px; border-top-left-radius: 4px; margin-bottom: -1px; - background-image: var(--memdef-title-gradient-image); - background-repeat: repeat-x; - background-color: var(--memdef-title-background-color); + background-color: var(--memdef-proto-background-color); line-height: 1.25; - font-weight: 300; + font-family: var(--font-family-monospace); + font-weight: 500; + font-size: 16px; float:left; + box-shadow: 0 10px 0 -1px var(--memdef-proto-background-color), + 0 2px 8px 0 rgba(0,0,0,.075); + position: relative; +} + +.memtitle:after { + content: ''; + display: block; + background: var(--memdef-proto-background-color); + height: 10px; + bottom: -10px; + left: 0px; + right: -14px; + position: absolute; + border-top-right-radius: 6px; } .permalink { - font-size: 65%; - display: inline-block; - vertical-align: middle; + font-family: var(--font-family-monospace); + font-weight: 500; + line-height: 1.25; + font-size: 16px; + display: inline-block; + vertical-align: middle; } .memtemplate { font-size: 80%; color: var(--memdef-template-color); + font-family: var(--font-family-monospace); font-weight: normal; margin-left: 9px; } @@ -1080,22 +1278,21 @@ table.memberdecls { padding: 0; margin-bottom: 10px; margin-right: 5px; - -webkit-transition: box-shadow 0.5s linear; - -moz-transition: box-shadow 0.5s linear; - -ms-transition: box-shadow 0.5s linear; - -o-transition: box-shadow 0.5s linear; - transition: box-shadow 0.5s linear; - display: table !important; - width: 100%; + display: table !important; + width: 100%; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + border-radius: 4px; } .memitem.glow { - box-shadow: 0 0 15px var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); } .memname { - font-weight: 400; - margin-left: 6px; + font-family: var(--font-family-monospace); + font-size: 13px; + font-weight: 400; + margin-left: 6px; } .memname td { @@ -1103,53 +1300,39 @@ table.memberdecls { } .memproto, dl.reflist dt { - border-top: 1px solid var(--memdef-border-color); - border-left: 1px solid var(--memdef-border-color); - border-right: 1px solid var(--memdef-border-color); - padding: 6px 0px 6px 0px; - color: var(--memdef-proto-text-color); - font-weight: bold; - text-shadow: var(--memdef-proto-text-shadow); - background-color: var(--memdef-proto-background-color); - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 4px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + background-color: var(--memdef-proto-background-color); + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); } .overload { - font-family: var(--font-family-monospace); + font-family: var(--font-family-monospace); font-size: 65%; } .memdoc, dl.reflist dd { - border-bottom: 1px solid var(--memdef-border-color); - border-left: 1px solid var(--memdef-border-color); - border-right: 1px solid var(--memdef-border-color); - padding: 6px 10px 2px 10px; - border-top-width: 0; - background-image:url('nav_g.png'); - background-repeat:repeat-x; - background-color: var(--memdef-doc-background-color); - /* opera specific markup */ - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - /* firefox specific markup */ - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - /* webkit specific markup */ - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; } dl.reflist dt { - padding: 5px; + padding: 5px; } dl.reflist dd { - margin: 0px 0px 10px 0px; - padding: 5px; + margin: 0px 0px 10px 0px; + padding: 5px; } .paramkey { @@ -1164,9 +1347,9 @@ dl.reflist dd { .paramname { white-space: nowrap; - padding: 0px; - padding-bottom: 1px; - margin-left: 2px; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; } .paramname em { @@ -1180,23 +1363,23 @@ dl.reflist dd { } .params, .retval, .exception, .tparams { - margin-left: 0px; - padding-left: 0px; + margin-left: 0px; + padding-left: 0px; } .params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { - font-weight: bold; - vertical-align: top; + font-weight: bold; + vertical-align: top; } .params .paramtype, .tparams .paramtype { - font-style: italic; - vertical-align: top; + font-style: italic; + vertical-align: top; } .params .paramdir, .tparams .paramdir { - font-family: var(--font-family-monospace); - vertical-align: top; + font-family: var(--font-family-monospace); + vertical-align: top; } table.mlabels { @@ -1215,15 +1398,15 @@ td.mlabels-right { } span.mlabels { - margin-left: 8px; + margin-left: 8px; } span.mlabel { - background-color: var(--label-background-color); - border-top:1px solid var(--label-left-top-border-color); - border-left:1px solid var(--label-left-top-border-color); - border-right:1px solid var(--label-right-bottom-border-color); - border-bottom:1px solid var(--label-right-bottom-border-color); + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); text-shadow: none; color: var(--label-foreground-color); margin-right: 4px; @@ -1241,39 +1424,37 @@ span.mlabel { /* these are for tree view inside a (index) page */ div.directory { - margin: 10px 0px; - border-top: 1px solid var(--directory-separator-color); - border-bottom: 1px solid var(--directory-separator-color); - width: 100%; + margin: 10px 0px; + width: 100%; } .directory table { - border-collapse:collapse; + border-collapse:collapse; } .directory td { - margin: 0px; - padding: 0px; + margin: 0px; + padding: 0px; vertical-align: top; } .directory td.entry { - white-space: nowrap; - padding-right: 6px; + white-space: nowrap; + padding-right: 6px; padding-top: 3px; } .directory td.entry a { - outline:none; + outline:none; } .directory td.entry a img { - border: none; + border: none; } .directory td.desc { - width: 100%; - padding-left: 6px; + width: 100%; + padding-left: 6px; padding-right: 6px; padding-top: 3px; border-left: 1px solid rgba(0,0,0,0.05); @@ -1294,90 +1475,178 @@ div.directory { } .directory .levels { - white-space: nowrap; - width: 100%; - text-align: right; - font-size: 9pt; + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; } .directory .levels span { - cursor: pointer; - padding-left: 2px; - padding-right: 2px; + cursor: pointer; + padding-left: 2px; + padding-right: 2px; color: var(--page-link-color); } .arrow { - color: var(--nav-arrow-color); - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: pointer; - font-size: 80%; - display: inline-block; - width: 16px; - height: 22px; + color: var(--nav-background-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 14px; + transition: opacity 0.3s ease; +} + +span.arrowhead { + position: relative; + padding: 0; + margin: 0 0 0 2px; + display: inline-block; + width: 5px; + height: 5px; + border-right: 2px solid var(--nav-arrow-color); + border-bottom: 2px solid var(--nav-arrow-color); + transform: rotate(-45deg); + transition: transform 0.3s ease; +} + +span.arrowhead.opened { + transform: rotate(45deg); +} + +.selected span.arrowhead { + border-right: 2px solid var(--nav-arrow-selected-color); + border-bottom: 2px solid var(--nav-arrow-selected-color); } .icon { - font-family: var(--font-family-icon); - line-height: normal; - font-weight: bold; - font-size: 12px; - height: 14px; - width: 16px; - display: inline-block; - background-color: var(--icon-background-color); - color: var(--icon-foreground-color); - text-align: center; - border-radius: 4px; - margin-left: 2px; - margin-right: 2px; + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; } .icona { - width: 24px; - height: 22px; - display: inline-block; + width: 24px; + height: 22px; + display: inline-block; } -.iconfopen { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:var(--icon-folder-open-image); - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.iconfclosed { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:var(--icon-folder-closed-image); - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; +.iconfolder { + width: 24px; + height: 18px; + margin-top: 6px; + vertical-align:top; + display: inline-block; + position: relative; } .icondoc { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:var(--icon-doc-image); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; + width: 24px; + height: 18px; + margin-top: 3px; + vertical-align:top; + display: inline-block; + position: relative; } +.folder-icon { + width: 16px; + height: 11px; + background-color: var(--icon-folder-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 0 2px 2px 2px; + position: relative; + box-sizing: content-box; +} + +.folder-icon::after { + content: ''; + position: absolute; + top: 2px; + left: -1px; + width: 16px; + height: 7px; + background-color: var(--icon-folder-open-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 7px 7px 2px 2px; + transform-origin: top left; + opacity: 0; + transition: all 0.3s linear; +} + +.folder-icon::before { + content: ''; + position: absolute; + top: -3px; + left: -1px; + width: 6px; + height: 2px; + background-color: var(--icon-folder-fill-color); + border-top: 1px solid var(--icon-folder-border-color); + border-left: 1px solid var(--icon-folder-border-color); + border-right: 1px solid var(--icon-folder-border-color); + border-radius: 2px 2px 0 0; +} + +.folder-icon.open::after { + top: 3px; + opacity: 1; +} + +.doc-icon { + left: 6px; + width: 12px; + height: 16px; + background-color: var(--icon-doc-border-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: relative; + display: inline-block; +} +.doc-icon::before { + content: ""; + left: 1px; + top: 1px; + width: 10px; + height: 14px; + background-color: var(--icon-doc-fill-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: absolute; + box-sizing: border-box; +} +.doc-icon::after { + content: ""; + left: 7px; + top: 0px; + width: 3px; + height: 3px; + background-color: transparent; + position: absolute; + border: 1px solid var(--icon-doc-border-color); +} + + + + /* @end */ div.dynheader { - margin-top: 8px; + margin-top: 8px; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; @@ -1386,6 +1655,13 @@ div.dynheader { user-select: none; } +span.dynarrow { + position: relative; + display: inline-block; + width: 12px; + bottom: 1px; +} + address { font-style: normal; color: var(--footer-foreground-color); @@ -1397,8 +1673,8 @@ table.doxtable caption { table.doxtable { border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; + margin-top: 4px; + margin-bottom: 4px; } table.doxtable td, table.doxtable th { @@ -1415,127 +1691,145 @@ table.doxtable th { } table.fieldtable { - margin-bottom: 10px; - border: 1px solid var(--memdef-border-color); - border-spacing: 0px; - border-radius: 4px; - box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); } .fieldtable td, .fieldtable th { - padding: 3px 7px 2px; + padding: 3px 7px 2px; } -.fieldtable td.fieldtype, .fieldtable td.fieldname { - white-space: nowrap; - border-right: 1px solid var(--memdef-border-color); - border-bottom: 1px solid var(--memdef-border-color); - vertical-align: top; +.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; } .fieldtable td.fieldname { - padding-top: 3px; + padding-top: 3px; } +.fieldtable td.fieldinit { + padding-top: 3px; + text-align: right; +} + + .fieldtable td.fielddoc { - border-bottom: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); } .fieldtable td.fielddoc p:first-child { - margin-top: 0px; + margin-top: 0px; } .fieldtable td.fielddoc p:last-child { - margin-bottom: 2px; + margin-bottom: 2px; } .fieldtable tr:last-child td { - border-bottom: none; + border-bottom: none; } .fieldtable th { - background-image: var(--memdef-title-gradient-image); - background-repeat:repeat-x; - background-color: var(--memdef-title-background-color); - font-size: 90%; - color: var(--memdef-proto-text-color); - padding-bottom: 4px; - padding-top: 5px; - text-align:left; - font-weight: 400; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: 1px solid var(--memdef-border-color); + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); } +/* ----------- navigation breadcrumb styling ----------- */ -.tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: var(--nav-gradient-image); - z-index: 101; +#nav-path ul { + height: 30px; + line-height: 30px; + color: var(--nav-text-normal-color); overflow: hidden; - font-size: 13px; + margin: 0px; + padding-left: 4px; + background-image: none; + background: var(--page-background-color); + border-bottom: 1px solid var(--nav-breadcrumb-separator-color); + font-size: var(--nav-font-size-level1); + font-family: var(--font-family-nav); + position: relative; + z-index: 100; } -.navpath ul -{ - font-size: 11px; - background-image: var(--nav-gradient-image); - background-repeat:repeat-x; - background-position: 0 -5px; - height:30px; - line-height:30px; - color:var(--nav-text-normal-color); - border:solid 1px var(--nav-breadcrumb-border-color); - overflow:hidden; - margin:0px; - padding:0px; +#main-nav { + border-bottom: 1px solid var(--nav-border-color); } -.navpath li -{ +.navpath li { list-style-type:none; float:left; - padding-left:10px; - padding-right:15px; - background-image:var(--nav-breadcrumb-image); - background-repeat:no-repeat; - background-position:right; color: var(--nav-foreground-color); } -.navpath li.navelem a -{ - height:32px; - display:block; - outline: none; - color: var(--nav-text-normal-color); - font-family: var(--font-family-nav); - text-shadow: var(--nav-text-normal-shadow); - text-decoration: none; +.navpath li.footer { + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + font-size: 8pt; + color: var(--footer-foreground-color); } -.navpath li.navelem a:hover -{ - color: var(--nav-text-hover-color); - text-shadow: var(--nav-text-hover-shadow); +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; + padding-left: 15px; } -.navpath li.footer -{ - list-style-type:none; - float:right; - padding-left:10px; - padding-right:15px; - background-image:none; - background-repeat:no-repeat; - background-position:right; - color: var(--footer-foreground-color); - font-size: 8pt; +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--nav-breadcrumb-color); + position: relative; + top: 0px; + height: 30px; + margin-right: -20px; } +#nav-path li.navelem:after { + content: ''; + display: inline-block; + position: relative; + top: 0; + right: -15px; + width: 30px; + height: 30px; + transform: scaleX(0.5) scale(0.707) rotate(45deg); + z-index: 10; + background: var(--page-background-color); + box-shadow: 2px -2px 0 2px var(--nav-breadcrumb-separator-color); + border-radius: 0 5px 0 50px; +} + +#nav-path li.navelem:first-child { + margin-left: -6px; +} + +#nav-path li.navelem:hover, +#nav-path li.navelem:hover:after { + background-color: var(--nav-breadcrumb-active-bg); +} + +/* ---------------------- */ div.summary { @@ -1553,14 +1847,14 @@ div.summary a table.classindex { - margin: 10px; - white-space: nowrap; - margin-left: 3%; - margin-right: 3%; - width: 94%; - border: 0; - border-spacing: 0; - padding: 0; + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; } div.ingroups @@ -1577,10 +1871,8 @@ div.ingroups a div.header { - background-image: var(--header-gradient-image); - background-repeat:repeat-x; - background-color: var(--header-background-color); margin: 0px; + background-color: var(--header-background-color); border-bottom: 1px solid var(--header-separator-color); } @@ -1589,166 +1881,105 @@ div.headertitle padding: 5px 5px 5px 10px; } -.PageDocRTL-title div.headertitle { - text-align: right; - direction: rtl; -} - dl { - padding: 0 0 0 0; + padding: 0 0 0 0; } -/* - -dl.section { - margin-left: 0px; - padding-left: 0px; -} - -dl.note { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #D0C000; -} - -dl.warning, dl.attention { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #FF0000; -} - -dl.pre, dl.post, dl.invariant { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #00D000; -} - -dl.deprecated { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #505050; -} - -dl.todo { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #00C0E0; -} - -dl.test { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #3030E0; -} - -dl.bug { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #C08050; -} - -*/ - dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { - font-weight: bold !important; + font-weight: bold !important; } -dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { - padding: 10px; - margin: 10px 0px; - overflow: hidden; - margin-left: 0; - border-radius: 4px; + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; } dl.section dd { - margin-bottom: 2px; + margin-bottom: 2px; } -dl.warning, dl.attention { - background: var(--warning-color-bg); - border-left: 8px solid var(--warning-color-hl); - color: var(--warning-color-text); +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); } -dl.warning dt, dl.attention dt { - color: var(--warning-color-hl); +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); } dl.note, dl.remark { - background: var(--note-color-bg); - border-left: 8px solid var(--note-color-hl); - color: var(--note-color-text); + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); } dl.note dt, dl.remark dt { - color: var(--note-color-hl); + color: var(--note-color-hl); } dl.todo { - background: var(--todo-color-bg); - border-left: 8px solid var(--todo-color-hl); - color: var(--todo-color-text); + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); } dl.todo dt { - color: var(--todo-color-hl); + color: var(--todo-color-hl); } dl.test { - background: var(--test-color-bg); - border-left: 8px solid var(--test-color-hl); - color: var(--test-color-text); + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); } dl.test dt { - color: var(--test-color-hl); + color: var(--test-color-hl); } dl.bug dt a { - color: var(--bug-color-hl) !important; + color: var(--bug-color-hl) !important; } dl.bug { - background: var(--bug-color-bg); - border-left: 8px solid var(--bug-color-hl); - color: var(--bug-color-text); + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); } dl.bug dt a { - color: var(--bug-color-hl) !important; + color: var(--bug-color-hl) !important; } dl.deprecated { - background: var(--deprecated-color-bg); - border-left: 8px solid var(--deprecated-color-hl); - color: var(--deprecated-color-text); + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); } dl.deprecated dt a { - color: var(--deprecated-color-hl) !important; + color: var(--deprecated-color-hl) !important; } -dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { - margin-inline-start: 0px; +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; } dl.invariant, dl.pre, dl.post { - background: var(--invariant-color-bg); - border-left: 8px solid var(--invariant-color-hl); - color: var(--invariant-color-text); + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); } dl.invariant dt, dl.pre dt, dl.post dt { - color: var(--invariant-color-hl); + color: var(--invariant-color-hl); } @@ -1771,22 +2002,27 @@ dl.invariant dt, dl.pre dt, dl.post dt { #projectalign { - vertical-align: middle; - padding-left: 0.5em; + vertical-align: middle; + padding-left: 0.5em; } #projectname { font-size: 200%; font-family: var(--font-family-title); - margin: 0px; - padding: 2px 0px; + margin: 0; + padding: 0; +} + +#side-nav #projectname +{ + font-size: 130%; } #projectbrief { font-size: 90%; - font-family: var(--font-family-title); + font-family: var(--font-family-title); margin: 0px; padding: 0px; } @@ -1794,43 +2030,42 @@ dl.invariant dt, dl.pre dt, dl.post dt { #projectnumber { font-size: 50%; - font-family: 50% var(--font-family-title); + font-family: var(--font-family-title); margin: 0px; padding: 0px; } #titlearea { - padding: 0px; + padding: 0 0 0 5px; margin: 0px; - width: 100%; border-bottom: 1px solid var(--title-separator-color); background-color: var(--title-background-color); } .image { - text-align: center; + text-align: center; } .dotgraph { - text-align: center; + text-align: center; } .mscgraph { - text-align: center; + text-align: center; } .plantumlgraph { - text-align: center; + text-align: center; } .diagraph { - text-align: center; + text-align: center; } .caption @@ -1839,70 +2074,67 @@ dl.invariant dt, dl.pre dt, dl.post dt { } dl.citelist { - margin-bottom:50px; + margin-bottom:50px; } dl.citelist dt { - color:var(--citation-label-color); - float:left; - font-weight:bold; - margin-right:10px; - padding:5px; - text-align:right; - width:52px; + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; } dl.citelist dd { - margin:2px 0 2px 72px; - padding:5px 0; + margin:2px 0 2px 72px; + padding:5px 0; } div.toc { - padding: 14px 25px; - background-color: var(--toc-background-color); - border: 1px solid var(--toc-border-color); - border-radius: 7px 7px 7px 7px; - float: right; - height: auto; - margin: 0 8px 10px 10px; - width: 200px; + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; } div.toc li { - background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; - font: 10px/1.2 var(--font-family-toc); - margin-top: 5px; - padding-left: 10px; - padding-top: 2px; + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; } div.toc h3 { - font: bold 12px/1.2 var(--font-family-toc); + font: bold 12px/1.2 var(--font-family-toc); color: var(--toc-header-color); - border-bottom: 0 none; - margin: 0; + border-bottom: 0 none; + margin: 0; } div.toc ul { - list-style: none outside none; - border: medium none; - padding: 0px; + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li[class^='level'] { + margin-left: 15px; } div.toc li.level1 { - margin-left: 0px; + margin-left: 0px; } -div.toc li.level2 { - margin-left: 15px; -} - -div.toc li.level3 { - margin-left: 15px; -} - -div.toc li.level4 { - margin-left: 15px; +div.toc li.empty { + background-image: none; + margin-top: 0px; } span.emoji { @@ -1912,13 +2144,12 @@ span.emoji { } span.obfuscator { - display: none; + display: none; } .inherit_header { - font-weight: bold; - color: var(--inherit-header-color); - cursor: pointer; + font-weight: 400; + cursor: pointer; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; @@ -1928,49 +2159,49 @@ span.obfuscator { } .inherit_header td { - padding: 6px 0px 2px 5px; + padding: 6px 0 2px 0; } .inherit { - display: none; + display: none; } tr.heading h2 { - margin-top: 12px; - margin-bottom: 4px; + margin-top: 12px; + margin-bottom: 12px; } /* tooltip related style info */ .ttc { - position: absolute; - display: none; + position: absolute; + display: none; } #powerTip { cursor: default; - /*white-space: nowrap;*/ - color: var(--tooltip-foreground-color); + color: var(--tooltip-foreground-color); background-color: var(--tooltip-background-color); + backdrop-filter: var(--tooltip-backdrop-filter); + -webkit-backdrop-filter: var(--tooltip-backdrop-filter); border: 1px solid var(--tooltip-border-color); - border-radius: 4px 4px 4px 4px; + border-radius: 4px; box-shadow: var(--tooltip-shadow); display: none; font-size: smaller; max-width: 80%; - opacity: 0.9; padding: 1ex 1em 1em; position: absolute; z-index: 2147483647; } #powerTip div.ttdoc { - color: var(--tooltip-doc-color); + color: var(--tooltip-doc-color); font-style: italic; } #powerTip div.ttname a { - font-weight: bold; + font-weight: bold; } #powerTip a { @@ -1978,18 +2209,18 @@ tr.heading h2 { } #powerTip div.ttname { - font-weight: bold; + font-weight: bold; } #powerTip div.ttdeci { - color: var(--tooltip-declaration-color); + color: var(--tooltip-declaration-color); } #powerTip div { - margin: 0px; - padding: 0px; - font-size: 12px; - font-family: var(--font-family-tooltip); + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); line-height: 16px; } @@ -2035,7 +2266,7 @@ tr.heading h2 { } #powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { - border-top-color: var(--tooltip-background-color); + border-top-color: var(--tooltip-arrow-background-color); border-width: 10px; margin: 0px -10px; } @@ -2063,7 +2294,7 @@ tr.heading h2 { } #powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { - border-bottom-color: var(--tooltip-background-color); + border-bottom-color: var(--tooltip-arrow-background-color); border-width: 10px; margin: 0px -10px; } @@ -2120,29 +2351,29 @@ tr.heading h2 { @media print { - #top { display: none; } - #side-nav { display: none; } - #nav-path { display: none; } - body { overflow:visible; } - h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } - .summary { display: none; } - .memitem { page-break-inside: avoid; } - #doc-content - { - margin-left:0 !important; - height:auto !important; - width:auto !important; - overflow:inherit; - display:inline; - } + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } } /* @group Markdown */ table.markdownTable { border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; + margin-top: 4px; + margin-bottom: 4px; } table.markdownTable td, table.markdownTable th { @@ -2173,9 +2404,13 @@ th.markdownTableHeadCenter, td.markdownTableBodyCenter { text-align: center } -tt, code, kbd, samp +tt, code, kbd { - display: inline-block; + display: inline-block; +} +tt, code, kbd +{ + vertical-align: top; } /* @end */ @@ -2184,26 +2419,27 @@ u { } details>summary { - list-style-type: none; + list-style-type: none; } details > summary::-webkit-details-marker { - display: none; + display: none; } details>summary::before { - content: "\25ba"; - padding-right:4px; - font-size: 80%; + content: "\25ba"; + padding-right:4px; + font-size: 80%; } details[open]>summary::before { - content: "\25bc"; - padding-right:4px; - font-size: 80%; + content: "\25bc"; + padding-right:4px; + font-size: 80%; } -body { +:root { + scrollbar-width: thin; scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); } diff --git a/Doc/html/doxygen_crawl.html b/Doc/html/doxygen_crawl.html index 19a05df..ddd0271 100644 --- a/Doc/html/doxygen_crawl.html +++ b/Doc/html/doxygen_crawl.html @@ -4,169 +4,357 @@ Validator / crawler helper - + - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/Doc/html/dynsections.js b/Doc/html/dynsections.js index 24dfe9c..d89724e 100644 --- a/Doc/html/dynsections.js +++ b/Doc/html/dynsections.js @@ -23,8 +23,11 @@ @licend The above is the entire license notice for the JavaScript code in this file */ -let dynsection = { +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} +let dynsection = { // helper function updateStripes : function() { $('table.directory tr'). @@ -40,15 +43,13 @@ let dynsection = { const trigger = $('#'+base+'-trigger'); const src=$(trigger).attr('src'); if (content.is(':visible')===true) { - content.hide(); + content.slideUp('fast'); summary.show(); - $(linkObj).addClass('closed').removeClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + $(linkObj).find('.arrowhead').addClass('closed').removeClass('opened'); } else { - content.show(); + content.slideDown('fast'); summary.hide(); - $(linkObj).removeClass('closed').addClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + $(linkObj).find('.arrowhead').removeClass('closed').addClass('opened'); } return false; }, @@ -59,12 +60,12 @@ let dynsection = { const i = $('#img'+this.id.substring(3)); const a = $('#arr'+this.id.substring(3)); if (l'); + $('span[class=lineno]:first').append(''); // add vertical lines to other rows $('span[class=lineno]').not(':eq(0)').append(''); // add toggle controls to lines with fold divs @@ -169,9 +167,8 @@ let codefold = { const start = $(this).attr('data-start'); const end = $(this).attr('data-end'); // replace normal fold span with controls for the first line of a foldable fragment - $(this).find('span[class=fold]:first').replaceWith(''); + $(this).find('span[class=fold]:first').replaceWith(''); // append div for folded (closed) representation $(this).after(''); // extract the first line from the "open" section to represent closed content @@ -183,7 +180,7 @@ let codefold = { $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); } // replace minus with plus symbol - $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); + $(line).find('span[class=fold]').addClass('plus').removeClass('minus'); // append ellipsis $(line).append(' '+start+''+end); // insert constructed line into closed div diff --git a/Doc/html/evolve__optimizer_8h.html b/Doc/html/evolve__optimizer_8h.html index 031520b..8b7d966 100644 --- a/Doc/html/evolve__optimizer_8h.html +++ b/Doc/html/evolve__optimizer_8h.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/evolve_optimizer.h File Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/evolve_optimizer.h File Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
-
evolve_optimizer.h File Reference
@@ -113,88 +106,83 @@ $(function(){initNavTree('evolve__optimizer_8h.html',''); initResizable(); });
#include "mylibs_defs.h"
#include <stdint.h>
#include <stdlib.h>
-
- + Include dependency graph for evolve_optimizer.h:
+
Include dependency graph for evolve_optimizer.h:
-
- + This graph shows which files directly or indirectly include this file:
+
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

- - + -

+

Classes

struct  EvolveOptimizer_t
struct  EvolveOptimizer_t
 Структура эволюционного оптимизатора More...
 
- - + - - + - - - - - - -

+

Macros

#define PARAM_SCALE(x, min_val, max_val)   (((float)(x) - (float)(min_val)) / ((float)(max_val) - (float)(min_val)))
#define PARAM_SCALE(x, min_val, max_val)
 Линейное масштабирование x из диапазона [min_val, max_val] в диапазон [0, 1)
 
#define PARAM_UNSCALE(val, min_val, max_val)   (((float)(val)) * ((float)(max_val) - (float)(min_val)) + (float)(min_val))
#define PARAM_UNSCALE(val, min_val, max_val)
 Обратное линейное масштабирование значения из [0, 1) в диапазон [min_val, max_val].
 
#define local_time()   HAL_GetTick()
 Локальное время
 
#define EVOLVE_MUTATION_MIN_PCT   10
 Минимальная мутация (в процентах от Loss)
 
#define EVOLVE_MUTATION_MAX_PCT   100
 Максимальная мутация (в процентах от Loss)
 
#define ELOVLE_N_ELITE_CANDIDATE   2
 Количество кандидатов, которые проходят в поколение без изменений (по умолчанию 2)
 
- - -

+

Functions

__STATIC_INLINE int EvolveOptimizer_Init (EvolveOptimizer_t *opt, uint16_t n_params, uint16_t n_cand, uint16_t n_best, float mutation_amp, float *start_params)
 Инициализация эволюционного оптимизатора.
 
__STATIC_INLINE int EvolveOptimizer_Step (EvolveOptimizer_t *opt, float *params, float loss)
 Один шаг эволюционного оптимизатора.
 
-

Detailed Description

+

Detailed Description

Заголовочный файл для адаптивного подбора параметров

Definition in file evolve_optimizer.h.

+ +
diff --git a/Doc/html/evolve__optimizer_8h.js b/Doc/html/evolve__optimizer_8h.js index 4382494..31f5538 100644 --- a/Doc/html/evolve__optimizer_8h.js +++ b/Doc/html/evolve__optimizer_8h.js @@ -2,7 +2,6 @@ var evolve__optimizer_8h = [ [ "PARAM_SCALE", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga83abbcabaff9111c03ae2475ee72ea3e", null ], [ "PARAM_UNSCALE", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#gaa1d5510fe5f0bd989473f3ebe324bde3", null ], - [ "local_time", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga9c853b02c22f26023c34d1d404b6d653", null ], [ "EVOLVE_MUTATION_MIN_PCT", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga2f2b1be34ad4eb1bf3267237200cd6c6", null ], [ "EVOLVE_MUTATION_MAX_PCT", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga861c1c6a503c21441abcec0d57b848bc", null ], [ "ELOVLE_N_ELITE_CANDIDATE", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga38607e23d9234524bc7de5869b15b8eb", null ], diff --git a/Doc/html/evolve__optimizer_8h__dep__incl.map b/Doc/html/evolve__optimizer_8h__dep__incl.map index 415f98a..2741c58 100644 --- a/Doc/html/evolve__optimizer_8h__dep__incl.map +++ b/Doc/html/evolve__optimizer_8h__dep__incl.map @@ -1,5 +1,5 @@ - - - - + + + + diff --git a/Doc/html/evolve__optimizer_8h__dep__incl.md5 b/Doc/html/evolve__optimizer_8h__dep__incl.md5 index 69e9dea..4ae7408 100644 --- a/Doc/html/evolve__optimizer_8h__dep__incl.md5 +++ b/Doc/html/evolve__optimizer_8h__dep__incl.md5 @@ -1 +1 @@ -f553378750fe54c08a141590bf28abc6 \ No newline at end of file +41a81c5527cb10d478e05e49562aedc3 \ No newline at end of file diff --git a/Doc/html/evolve__optimizer_8h__dep__incl.png b/Doc/html/evolve__optimizer_8h__dep__incl.png index 18e4a8e1668d27c8184d771b096e1f1ce5fd013c..02dd10484d1dab494e853af970ea4f13c2640266 100644 GIT binary patch literal 2962 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 rkUV3V2W>uB - - - - - - - - - - - + + + + + + + + + + + + diff --git a/Doc/html/evolve__optimizer_8h__incl.md5 b/Doc/html/evolve__optimizer_8h__incl.md5 index ab56a56..29bbece 100644 --- a/Doc/html/evolve__optimizer_8h__incl.md5 +++ b/Doc/html/evolve__optimizer_8h__incl.md5 @@ -1 +1 @@ -fd2e7c14c3afd7acdbec8e90d05455b4 \ No newline at end of file +4993f7378dc2ed7a2e950385e8313f89 \ No newline at end of file diff --git a/Doc/html/evolve__optimizer_8h__incl.png b/Doc/html/evolve__optimizer_8h__incl.png index b22e7b3a8e714a4abf99b4a095254354707ec144..09857dc982af6b57fa35d714b2e78eea0d20295d 100644 GIT binary patch literal 6256 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 ZP32$n>>Hg=yZVIyXsPRgQL0vm{{U@**NgxF literal 6465 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 diff --git a/Doc/html/evolve__optimizer_8h_source.html b/Doc/html/evolve__optimizer_8h_source.html index ac55157..1b2d3ba 100644 --- a/Doc/html/evolve__optimizer_8h_source.html +++ b/Doc/html/evolve__optimizer_8h_source.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/evolve_optimizer.h Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/evolve_optimizer.h Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({
- + + -
+
81
82#ifndef local_time
-
83#define local_time() HAL_GetTick() ///< Локальное время
+
83#define local_time() HAL_GetTick() ///< Локальное время
84#endif
85
86
@@ -216,261 +208,275 @@ $(function(){initNavTree('evolve__optimizer_8h_source.html',''); initResizable()
102typedef struct {
103 float stability; ///< Коэффициент насколько стабильная популяция (0..1)(@ref n_cand)
-
104 uint16_t n_params; ///< Количество параметров
-
105 uint16_t n_cand; ///< Количество кандидатов в популяции
-
106 uint16_t n_best; ///< Количество лучших, усредняемых
-
107 float mutation_amp; ///< Амплитуда мутации (0..1)
-
108 uint16_t cand_index; ///< Индекс кандидата для обработки
-
109 float loss[EVOLVE_MAX_CANDIDATES]; ///< Loss для каждого кандидата
-
110 float candidates[EVOLVE_MAX_CANDIDATES][EVOLVE_MAX_PARAMS]; ///< Параметры кандидатов
-
111 uint16_t sorted_idx[EVOLVE_MAX_CANDIDATES]; ///< Индексы отсортированных кандидатов
- +
104
+
105 uint16_t n_params; ///< Количество параметров
+
106 uint16_t n_cand; ///< Количество кандидатов в популяции
+
107 uint16_t n_best; ///< Количество лучших, усредняемых
+
108 float mutation_amp; ///< Амплитуда мутации (0..1)
+
109
+
110 uint16_t cand_index; ///< Индекс кандидата для обработки
+
111 uint16_t gen_index; ///< Индекс популяции
+
112
+
113 //INTERNAL
+
114 float gen_mut; ///< Амплитуда мутации у текущей популяции
+
115
+
116 float loss[EVOLVE_MAX_CANDIDATES]; ///< Loss для каждого кандидата
+
117 float candidates[EVOLVE_MAX_CANDIDATES][EVOLVE_MAX_PARAMS]; ///< Параметры кандидатов
+
118 uint16_t sorted_idx[EVOLVE_MAX_CANDIDATES]; ///< Индексы отсортированных кандидатов
+
-
113
-
114
-
115
-
116/**
-
117 * @cond EVOLVE_INTERNAL
-
118 */
-
119
-
120// Вспомогательный указатель для сортировки
-
121static EvolveOptimizer_t *g_sort_opt; // глобальный указатель на текущий оптимизатор
-
122
-
123// функция условия сортировки
-
124static int cmp_idx(const void *a, const void *b) {
-
125 if (g_sort_opt->loss[*(const uint16_t*)a] < g_sort_opt->loss[*(const uint16_t*)b])
-
126 return -1;
-
127 if (g_sort_opt->loss[*(const uint16_t*)a] > g_sort_opt->loss[*(const uint16_t*)b])
-
128 return 1;
-
129 return 0;
-
130}
-
131/** @endcond */
-
132
-
133
-
134
-
135
-
136
-
137/**
-
138 * @brief Инициализация эволюционного оптимизатора.
-
139 * @param opt Указатель на структуру оптимизатора
-
140 * @param n_params Количество параметров в одном кандидате
-
141 * @param n_cand Количество кандидатов
-
142 * @param n_best Количество лучших, усредняемых
-
143 * @param mutation_amp Амплитуда мутации (в диапазоне 0.0–1.0)
-
144 * @param start_params Начальные параметры (в диапазоне 0.0–1.0)
-
145 * @return 0 — если окей,
-
146 * -1 — если ошибка
-
147 */
-
- -
149 uint16_t n_params,
-
150 uint16_t n_cand,
-
151 uint16_t n_best,
-
152 float mutation_amp,
-
153 float* start_params)
-
154{
-
155 if((opt == NULL) || (start_params == NULL))
-
156 return -1;
-
157
-
158 if(n_params > EVOLVE_MAX_PARAMS)
-
159 return -1;
-
160 opt->n_params = n_params;
-
161
-
162 if(n_cand > EVOLVE_MAX_CANDIDATES)
-
163 return -1;
-
164 opt->n_cand = n_cand;
-
165
-
166 if(n_best > EVOLVE_MAX_CANDIDATES/2)
-
167 return -1;
-
168 opt->n_best = n_best;
-
169
-
170
-
171 if((mutation_amp > 1) || (mutation_amp < 0))
-
172 return -1;
-
173 if(mutation_amp <= 0.001f)
-
174 mutation_amp = 0.001f;
-
175 opt->mutation_amp = mutation_amp;
-
176
-
177 uint32_t seed = local_time();
-
178#ifdef ADC1
-
179 seed += (ADC1->DR & 0xFF);
-
180#endif
-
181 srand(seed);
-
182
-
183 for (uint16_t i = 0; i < n_cand; i++) {
-
184 for (uint16_t j = 0; j < n_params; j++) {
-
185 // Добавляем случайную мутацию вокруг стартового параметра
-
186 float base = start_params[j];
-
187 float inv_randmax = 1.0f / (float)RAND_MAX;
-
188 float noise = ((float)rand() * inv_randmax * 2.0f - 1.0f) * mutation_amp;
-
189 opt->candidates[i][j] = base + noise;
-
190 if (opt->candidates[i][j] < 0.0f) opt->candidates[i][j] = 0.0f;
-
191 if (opt->candidates[i][j] > 1.0f) opt->candidates[i][j] = 1.0f;
-
192 }
-
193 opt->loss[i] = 0.0f;
-
194 }
-
195
-
196 return 0;
-
197}
+
120
+
121
+
122
+
123/**
+
124 * @cond EVOLVE_INTERNAL
+
125 */
+
126
+
127// Вспомогательный указатель для сортировки
+
128static EvolveOptimizer_t *g_sort_opt; // глобальный указатель на текущий оптимизатор
+
129
+
130// функция условия сортировки
+
131static int cmp_idx(const void *a, const void *b) {
+
132 if (g_sort_opt->loss[*(const uint16_t*)a] < g_sort_opt->loss[*(const uint16_t*)b])
+
133 return -1;
+
134 if (g_sort_opt->loss[*(const uint16_t*)a] > g_sort_opt->loss[*(const uint16_t*)b])
+
135 return 1;
+
136 return 0;
+
137}
+
138/** @endcond */
+
139
+
140
+
141
+
142
+
143
+
144/**
+
145 * @brief Инициализация эволюционного оптимизатора.
+
146 * @param opt Указатель на структуру оптимизатора
+
147 * @param n_params Количество параметров в одном кандидате
+
148 * @param n_cand Количество кандидатов
+
149 * @param n_best Количество лучших, усредняемых
+
150 * @param mutation_amp Амплитуда мутации (в диапазоне 0.0–1.0)
+
151 * @param start_params Начальные параметры (в диапазоне 0.0–1.0)
+
152 * @return 0 — если окей,
+
153 * -1 — если ошибка
+
154 */
+
+ +
156 uint16_t n_params,
+
157 uint16_t n_cand,
+
158 uint16_t n_best,
+
159 float mutation_amp,
+
160 float* start_params)
+
161{
+
162 if((opt == NULL) || (start_params == NULL))
+
163 return -1;
+
164
+
165 if(n_params > EVOLVE_MAX_PARAMS)
+
166 return -1;
+
167 opt->n_params = n_params;
+
168
+
169 if(n_cand > EVOLVE_MAX_CANDIDATES)
+
170 return -1;
+
171 opt->n_cand = n_cand;
+
172
+
173 if(n_best > EVOLVE_MAX_CANDIDATES/2)
+
174 return -1;
+
175 opt->n_best = n_best;
+
176
+
177
+
178 if((mutation_amp > 1) || (mutation_amp < 0))
+
179 return -1;
+
180 if(mutation_amp <= 0.001f)
+
181 mutation_amp = 0.001f;
+
182 opt->mutation_amp = mutation_amp;
+
183
+
184 uint32_t seed = local_time();
+
185#ifdef ADC1
+
186 seed += (ADC1->DR & 0xFF);
+
187#endif
+
188 srand(seed);
+
189
+
190 for (uint16_t i = 0; i < n_cand; i++) {
+
191 for (uint16_t j = 0; j < n_params; j++) {
+
192 // Добавляем случайную мутацию вокруг стартового параметра
+
193 float base = start_params[j];
+
194 float inv_randmax = 1.0f / (float)RAND_MAX;
+
195 float noise = ((float)rand() * inv_randmax * 2.0f - 1.0f) * mutation_amp;
+
196 opt->candidates[i][j] = base + noise;
+
197 if (opt->candidates[i][j] < 0.0f) opt->candidates[i][j] = 0.0f;
+
198 if (opt->candidates[i][j] > 1.0f) opt->candidates[i][j] = 1.0f;
+
199 }
+
200 opt->loss[i] = 0.0f;
+
201 }
+
202
+
203 opt->cand_index = 0;
+
204 opt->gen_index = 0;
+
205 return 0;
+
206}
-
198
-
199
-
200/**
-
201 * @brief Один шаг эволюционного оптимизатора.
-
202 * @param opt Указатель на структуру оптимизатора
-
203 * @param params Массив параметров, которые будут обновлены (на выходе — новые параметры)
-
204 * @param loss Loss текущего кандидата
-
205 * @return 0 — если окей,
-
206 * -1 — если ошибка
-
207 * @details
-
208 * Сохраняет loss текущего кандидата и формирует параметры следующего кандидата.
-
209 * Если накоплено n_cand кандидатов, генерируется новое поколение.
-
210 * Новое поколение формируется случайным выбором из n_best лучших с добавлением мутации.
-
211 *
-
212 * На выходе params содержит параметры следующего кандидата для измерений.
-
213 * @note Функция использует глобальную внутреннюю переменную для сортировки.
-
214 * Надо убедится что только один экземпляр функции запущен в момент времени
-
215 */
-
- -
217 float* params,
-
218 float loss)
-
219{
-
220 if((opt == NULL) || (params == NULL))
-
221 return -1;
-
222
-
223 uint16_t n_params = opt->n_params;
-
224 if(n_params > EVOLVE_MAX_PARAMS)
-
225 return -1;
-
226
-
227 uint16_t n_cand = opt->n_cand;
-
228 if(n_cand > EVOLVE_MAX_CANDIDATES)
-
229 return -1;
-
230
-
231 uint16_t n_best = opt->n_best;
-
232 if(n_best > EVOLVE_MAX_CANDIDATES/2)
-
233 return -1;
-
234
-
235 float mut = opt->mutation_amp;
-
236 if((mut > 1) ||(mut < 0))
-
237 return -1;
-
238
-
239 // 1. Сохраняем loss текущего кандидата
-
240 opt->loss[opt->cand_index] = loss;
-
241 opt->cand_index++;
-
242
-
243 if (opt->cand_index >= n_cand) {
-
244 // 2. Сортируем текущее поколение по loss
-
245 for(uint16_t i = 0; i < opt->n_cand; i++)
-
246 opt->sorted_idx[i] = i;
-
247
-
248 g_sort_opt = opt;
-
249 qsort(opt->sorted_idx, opt->n_cand, sizeof(uint16_t), cmp_idx);
-
250 g_sort_opt = NULL;
+
207
+
208
+
209/**
+
210 * @brief Один шаг эволюционного оптимизатора.
+
211 * @param opt Указатель на структуру оптимизатора
+
212 * @param params Массив параметров, которые будут обновлены (на выходе — новые параметры)
+
213 * @param loss Loss текущего кандидата
+
214 * @return 0 — если окей,
+
215 * -1 — если ошибка
+
216 * @details
+
217 * Сохраняет loss текущего кандидата и формирует параметры следующего кандидата.
+
218 * Если накоплено n_cand кандидатов, генерируется новое поколение.
+
219 * Новое поколение формируется случайным выбором из n_best лучших с добавлением мутации.
+
220 *
+
221 * На выходе params содержит параметры следующего кандидата для измерений.
+
222 * @note Функция использует глобальную внутреннюю переменную для сортировки.
+
223 * Надо убедится что только один экземпляр функции запущен в момент времени
+
224 */
+
+ +
226 float* params,
+
227 float loss)
+
228{
+
229 if((opt == NULL) || (params == NULL))
+
230 return -1;
+
231
+
232 uint16_t n_params = opt->n_params;
+
233 if(n_params > EVOLVE_MAX_PARAMS)
+
234 return -1;
+
235
+
236 uint16_t n_cand = opt->n_cand;
+
237 if(n_cand > EVOLVE_MAX_CANDIDATES)
+
238 return -1;
+
239
+
240 uint16_t n_best = opt->n_best;
+
241 if(n_best > EVOLVE_MAX_CANDIDATES/2)
+
242 return -1;
+
243
+
244 float mut = opt->mutation_amp;
+
245 if((mut > 1) ||(mut < 0))
+
246 return -1;
+
247
+
248 // 1. Сохраняем loss текущего кандидата
+
249 opt->loss[opt->cand_index] = loss;
+
250 opt->cand_index++;
251
-
252 // --- Адаптивная мутация в зависимости от Loss ---
-
253 float best_loss = opt->loss[opt->sorted_idx[0]];
-
254 float worst_loss = opt->loss[opt->sorted_idx[opt->n_cand - 1]];
-
255 float diff = worst_loss - best_loss;
-
256
-
257 float sum_loss = 0.0f;
-
258 for (uint16_t i = 0; i < n_cand; i++)
-
259 sum_loss += opt->loss[i];
-
260 float avg_loss = sum_loss / (float)n_cand;
-
261
-
262
-
263 float loss_ratio = (diff > 0.0f) ? ((avg_loss - best_loss) / diff) : 0.5f;
-
264 if (loss_ratio < 0.0f) loss_ratio = 0.0f;
-
265 if (loss_ratio > 1.0f) loss_ratio = 1.0f;
-
266
-
267 // Записываем стабильность популяции в структуру
-
268 if(diff < 0.0f) diff = 0.0f;
-
269 if(diff > 1.0f) diff = 1.0f;
-
270 opt->stability = (1.0f - worst_loss) * (1.0f - (worst_loss - best_loss));
-
271 if(opt->stability < 0.0f) opt->stability = 0.0f;
-
272 if(opt->stability > 1.0f) opt->stability = 1.0f;
-
273
-
274 float mut_pct = EVOLVE_MUTATION_MIN_PCT +
- -
276 float adaptive_mut = mut * (mut_pct / 100.0f);
-
277 if (adaptive_mut < 0.0001f) adaptive_mut = 0.0001f;
-
278
-
279 // 3. Генерируем новое поколение
-
280 uint16_t n_elite = ELOVLE_N_ELITE_CANDIDATE;
-
281 for (uint16_t c = 0; c < n_cand; c++) {
-
282 if (c < n_elite) {
-
283 for (uint16_t i = 0; i < n_params; i++)
-
284 opt->candidates[c][i] = opt->candidates[opt->sorted_idx[c]][i];
-
285 opt->loss[c] = 0.0f;
-
286 } else {
-
287 for (uint16_t i = 0; i < n_params; i++) {
-
288 float inv_randmax = 1.0f / (float)RAND_MAX;
-
289 float noise = ((float)rand() * inv_randmax * 2.0f - 1.0f) * adaptive_mut;
-
290 uint16_t parent = opt->sorted_idx[rand() % opt->n_best];
-
291 opt->candidates[c][i] = opt->candidates[parent][i] + noise;
-
292 if (opt->candidates[c][i] < 0.0f) opt->candidates[c][i] = 0.0f;
-
293 if (opt->candidates[c][i] > 1.0f) opt->candidates[c][i] = 1.0f;
-
294 }
+
252 if (opt->cand_index >= n_cand) {
+
253 // 2. Сортируем текущее поколение по loss
+
254 for(uint16_t i = 0; i < opt->n_cand; i++)
+
255 opt->sorted_idx[i] = i;
+
256
+
257 g_sort_opt = opt;
+
258 qsort(opt->sorted_idx, opt->n_cand, sizeof(uint16_t), cmp_idx);
+
259 g_sort_opt = NULL;
+
260
+
261 // --- Адаптивная мутация в зависимости от Loss ---
+
262 float best_loss = opt->loss[opt->sorted_idx[0]];
+
263 float worst_loss = opt->loss[opt->sorted_idx[opt->n_cand - 1]];
+
264 float diff = worst_loss - best_loss;
+
265
+
266 float sum_loss = 0.0f;
+
267 for (uint16_t i = 0; i < n_cand; i++)
+
268 sum_loss += opt->loss[i];
+
269 float avg_loss = sum_loss / (float)n_cand;
+
270
+
271
+
272 float loss_ratio = (diff > 0.0f) ? ((avg_loss - best_loss) / diff) : 0.5f;
+
273 if (loss_ratio < 0.0f) loss_ratio = 0.0f;
+
274 if (loss_ratio > 1.0f) loss_ratio = 1.0f;
+
275
+
276 // Записываем стабильность популяции в структуру
+
277 if(diff < 0.0f) diff = 0.0f;
+
278 if(diff > 1.0f) diff = 1.0f;
+
279 opt->stability = (1.0f - worst_loss) * (1.0f - (worst_loss - best_loss));
+
280 if(opt->stability < 0.0f) opt->stability = 0.0f;
+
281 if(opt->stability > 1.0f) opt->stability = 1.0f;
+
282
+
283 float mut_pct = EVOLVE_MUTATION_MIN_PCT +
+ +
285 float adaptive_mut = mut * (mut_pct / 100.0f);
+
286 if (adaptive_mut < 0.0001f) adaptive_mut = 0.0001f;
+
287 opt->gen_mut = adaptive_mut;
+
288
+
289 // 3. Генерируем новое поколение
+
290 uint16_t n_elite = ELOVLE_N_ELITE_CANDIDATE;
+
291 for (uint16_t c = 0; c < n_cand; c++) {
+
292 if (c < n_elite) {
+
293 for (uint16_t i = 0; i < n_params; i++)
+
294 opt->candidates[c][i] = opt->candidates[opt->sorted_idx[c]][i];
295 opt->loss[c] = 0.0f;
-
296 }
-
297 }
-
298 opt->cand_index = 0;
-
299 }
-
300
-
301 // 4. Возвращаем параметры следующего кандидата
-
302 for (uint16_t i = 0; i < opt->n_params; i++)
-
303 params[i] = opt->candidates[opt->cand_index][i];
-
304
-
305 return 0;
-
306}
+
296 } else {
+
297 for (uint16_t i = 0; i < n_params; i++) {
+
298 float inv_randmax = 1.0f / (float)RAND_MAX;
+
299 float noise = ((float)rand() * inv_randmax * 2.0f - 1.0f) * adaptive_mut;
+
300 uint16_t parent = opt->sorted_idx[rand() % opt->n_best];
+
301 opt->candidates[c][i] = opt->candidates[parent][i] + noise;
+
302 if (opt->candidates[c][i] < 0.0f) opt->candidates[c][i] = 0.0f;
+
303 if (opt->candidates[c][i] > 1.0f) opt->candidates[c][i] = 1.0f;
+
304 }
+
305 opt->loss[c] = 0.0f;
+
306 }
+
307 }
+
308 opt->cand_index = 0;
+
309 opt->gen_index++;
+
310 }
+
311
+
312 // 4. Возвращаем параметры следующего кандидата
+
313 for (uint16_t i = 0; i < opt->n_params; i++)
+
314 params[i] = opt->candidates[opt->cand_index][i];
+
315
+
316 return 0;
+
317}
-
307#else // ENABLE_EVOLVE_OPTIMIZATION
-
308//заглушки
-
309typedef struct {
-
310 uint16_t n_params;
-
311 uint16_t n_cand;
-
312 uint16_t n_best;
-
313 float mutation_amp;
-
314 float loss[0];
-
315 float candidates[0][0];
- -
317#define EvolveOptimizer_Init(opt, n_params, n_cand, n_best, mutation_amp, start_params)
-
318#define EvolveOptimizer_Step(opt, params, LossFunc)
-
319#define PARAM_SCALE(x, min_val, max_val) (x)
-
320#define PARAM_UNSCALE(val, min_val, max_val) (val)
-
321#endif // ENABLE_EVOLVE_OPTIMIZATION
-
322
-
323#endif // __EVOLVE_OPTIMIZER_H_
-
324
-
325/** EVOLVE_OPTIMIZER
-
326 * @}
-
327 */
+
318#else // ENABLE_EVOLVE_OPTIMIZATION
+
319//заглушки
+
320typedef struct {
+
321 uint16_t n_params;
+
322 uint16_t n_cand;
+
323 uint16_t n_best;
+
324 float mutation_amp;
+
325 float loss[0];
+
326 float candidates[0][0];
+ +
328#define EvolveOptimizer_Init(opt, n_params, n_cand, n_best, mutation_amp, start_params)
+
329#define EvolveOptimizer_Step(opt, params, LossFunc)
+
330#define PARAM_SCALE(x, min_val, max_val) (x)
+
331#define PARAM_UNSCALE(val, min_val, max_val) (val)
+
332#endif // ENABLE_EVOLVE_OPTIMIZATION
+
333
+
334#endif // __EVOLVE_OPTIMIZER_H_
+
335
+
336/** EVOLVE_OPTIMIZER
+
337 * @}
+
338 */
#define EVOLVE_MAX_CANDIDATES
Максимальное количество кандидатов для обучения
#define EVOLVE_MAX_PARAMS
Максимальное количество параметров
#define EVOLVE_MUTATION_MIN_PCT
Минимальная мутация (в процентах от Loss)
#define ELOVLE_N_ELITE_CANDIDATE
Количество кандидатов, которые проходят в поколение без изменений (по умолчанию 2)
-
__STATIC_INLINE int EvolveOptimizer_Init(EvolveOptimizer_t *opt, uint16_t n_params, uint16_t n_cand, uint16_t n_best, float mutation_amp, float *start_params)
Инициализация эволюционного оптимизатора.
+
__STATIC_INLINE int EvolveOptimizer_Init(EvolveOptimizer_t *opt, uint16_t n_params, uint16_t n_cand, uint16_t n_best, float mutation_amp, float *start_params)
Инициализация эволюционного оптимизатора.
#define EVOLVE_MUTATION_MAX_PCT
Максимальная мутация (в процентах от Loss)
-
#define local_time()
Локальное время
-
__STATIC_INLINE int EvolveOptimizer_Step(EvolveOptimizer_t *opt, float *params, float loss)
Один шаг эволюционного оптимизатора.
+
__STATIC_INLINE int EvolveOptimizer_Step(EvolveOptimizer_t *opt, float *params, float loss)
Один шаг эволюционного оптимизатора.
+
#define local_time()
Локальное время
Заголочный файл для дефайнов библиотеки MyLibsGeneral.
Структура эволюционного оптимизатора
-
uint16_t cand_index
Индекс кандидата для обработки
-
uint16_t n_params
Количество параметров
-
uint16_t sorted_idx[100]
Индексы отсортированных кандидатов
+
uint16_t cand_index
Индекс кандидата для обработки
+
uint16_t n_params
Количество параметров
+
float gen_mut
Амплитуда мутации у текущей популяции
+
uint16_t sorted_idx[100]
Индексы отсортированных кандидатов
float stability
Коэффициент насколько стабильная популяция (0..1)(n_cand)
-
float loss[100]
Loss для каждого кандидата
-
uint16_t n_best
Количество лучших, усредняемых
-
uint16_t n_cand
Количество кандидатов в популяции
-
float candidates[100][20]
Параметры кандидатов
-
float mutation_amp
Амплитуда мутации (0..1)
+
float loss[100]
Loss для каждого кандидата
+
uint16_t n_best
Количество лучших, усредняемых
+
uint16_t n_cand
Количество кандидатов в популяции
+
uint16_t gen_index
Индекс популяции
+
float candidates[100][20]
Параметры кандидатов
+
float mutation_amp
Амплитуда мутации (0..1)
+
diff --git a/Doc/html/files.html b/Doc/html/files.html index a27bf8e..cda73dd 100644 --- a/Doc/html/files.html +++ b/Doc/html/files.html @@ -3,7 +3,7 @@ - + MyLibs: File List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
- + + @@ -73,10 +71,9 @@ $(function() { +
Here is a list of all documented files with brief descriptions:
[detail level 123]
- - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
  MyLibsGeneral
  Inc
 __general_flash.h
 __general_spi.h
 __general_uart.h
 bit_access.hЗаголочный файл для дефайнов битового доступа
 evolve_optimizer.hЗаголовочный файл для адаптивного подбора параметров
 general_gpio.hЗаголовочный файл для модуля инициализации портов и работы с ними
 general_tim.hЗаголовочный файл для модуля инициализации таймеров и работы с ними
 mylibs_config.hКонфигурации для библиотек MyLibs
 mylibs_defs.hЗаголочный файл для дефайнов библиотеки MyLibsGeneral
 mylibs_include.hЗаголочный файл для всех библиотек
 trace.hЗаголочный файл для работы с трассировкой
 trackers.hЗаголочный файл для работы с трекерами Trackers defines
  Src
 __general_flash.c
 __general_spi.c
 __general_uart.c
 general_gpio.cМодуль для инициализации портов и работы с ними
 general_tim.cМодуль для инициализации таймеров и работы с ними
 mainpage.h
 
MyLibsGeneral
 
Inc
 
__general_flash.h
 
bit_access.h
Заголочный файл для дефайнов битового доступа
 
evolve_optimizer.h
Заголовочный файл для адаптивного подбора параметров
 
general_gpio.h
Заголовочный файл для модуля инициализации портов и работы с ними
 
general_spi.h
Заголовочный файл для модуля инициализации SPI
 
general_tim.h
Заголовочный файл для модуля инициализации таймеров и работы с ними
 
general_uart.h
Заголовочный файл для модуля инициализации UART
 
mylibs_config.h
Конфигурации для библиотек MyLibs
 
mylibs_defs.h
Заголочный файл для дефайнов библиотеки MyLibsGeneral
 
mylibs_include.h
Заголочный файл для всех библиотек
 
trace.h
Заголочный файл для работы с трассировкой
 
trackers.h
Заголочный файл для работы с трекерами Trackers defines
 
Src
 
__general_flash.c
 
general_gpio.c
Модуль для инициализации портов и работы с ними
 
general_spi.c
Модуль для инициализации SPI
 
general_tim.c
Модуль для инициализации таймеров и работы с ними
 
general_uart.c
Модуль для инициализации UART
 
mainpage.h
+
diff --git a/Doc/html/functions.html b/Doc/html/functions.html index 4841303..998b50d 100644 --- a/Doc/html/functions.html +++ b/Doc/html/functions.html @@ -3,7 +3,7 @@ - + MyLibs: Class Members @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
Here is a list of all documented class members with links to the class documentation for each member:
-

- c -

+
diff --git a/Doc/html/functions_vars.html b/Doc/html/functions_vars.html index d9cec07..5b72a00 100644 --- a/Doc/html/functions_vars.html +++ b/Doc/html/functions_vars.html @@ -3,7 +3,7 @@ - + MyLibs: Class Members - Variables @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
Here is a list of all documented variables with links to the class documentation for each member:
-

- c -

+
diff --git a/Doc/html/general__gpio_8c.html b/Doc/html/general__gpio_8c.html index 82278a7..895b805 100644 --- a/Doc/html/general__gpio_8c.html +++ b/Doc/html/general__gpio_8c.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Src/general_gpio.c File Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Src/general_gpio.c File Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
-
general_gpio.c File Reference
@@ -109,61 +104,50 @@ $(function(){initNavTree('general__gpio_8c.html',''); initResizable(); });

Модуль для инициализации портов и работы с ними. More...

#include "general_gpio.h"
-
- + Include dependency graph for general_gpio.c:
+
Include dependency graph for general_gpio.c:

Go to the source code of this file.

- - - - - - - - - - -

+

Functions

HAL_StatusTypeDef GPIO_Clock_Enable (GPIO_TypeDef *GPIOx)
 Включить тактирование порта GPIO.
 
HAL_StatusTypeDef GPIO_LED_Init (GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_ActiveLevel)
 Инициализировать светодиод (структуру светодиода)
 
HAL_StatusTypeDef GPIO_LED_On (GPIO_LEDTypeDef *led)
 Включить светодиод
 
HAL_StatusTypeDef GPIO_LED_Off (GPIO_LEDTypeDef *led)
 Выключить светодиод
 
HAL_StatusTypeDef GPIO_LED_Set (GPIO_LEDTypeDef *led, uint8_t led_state)
 Выставить светодиод по переменной
 
HAL_StatusTypeDef GPIO_LED_Blink_Start (GPIO_LEDTypeDef *led, uint32_t period)
 Активировать моргание светодиодом
 
HAL_StatusTypeDef GPIO_LED_Fading_Start (GPIO_LEDTypeDef *led, uint32_t period)
 Активировать моргание светодиодом
 
void GPIO_LED_Dynamic_Handle (GPIO_LEDTypeDef *led)
 Управление динамическими режимами свечения светодиода
 
HAL_StatusTypeDef GPIO_Switch_Init (GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_ActiveLevel)
 Инициализировать кнопку (структуру кнопки)
 
int GPIO_Read_Switch (GPIO_SwitchTypeDef *sw)
 Считать состоянии кнопки
 
-

Detailed Description

+

Detailed Description

Модуль для инициализации портов и работы с ними.

Реализация функций для работы с GPIO:

  • Включение тактирования портов
  • @@ -175,11 +159,19 @@ Functions

    Definition in file general_gpio.c.

+ +
diff --git a/Doc/html/general__gpio_8c__incl.map b/Doc/html/general__gpio_8c__incl.map index 99ab50e..1d47388 100644 --- a/Doc/html/general__gpio_8c__incl.map +++ b/Doc/html/general__gpio_8c__incl.map @@ -1,11 +1,11 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/Doc/html/general__gpio_8c__incl.md5 b/Doc/html/general__gpio_8c__incl.md5 index 78771e7..958ccc2 100644 --- a/Doc/html/general__gpio_8c__incl.md5 +++ b/Doc/html/general__gpio_8c__incl.md5 @@ -1 +1 @@ -ef5806c364614a686ed2e7465f1e02dc \ No newline at end of file +6e517891df2cdbcb0824fafba9ac3005 \ No newline at end of file diff --git a/Doc/html/general__gpio_8c__incl.png b/Doc/html/general__gpio_8c__incl.png index e3e6c87e94446aee1b490642ac4468cf7f9758f7..f8a4a650cc1bf9365c667f77fd8ff3413523ca2d 100644 GIT binary patch literal 5053 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 - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Src/general_gpio.c Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Src/general_gpio.c Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({

- + + -
+
189 /* Режим моргания светодиода */
190 if(led->state == LED_IS_BLINKING)
191 {
-
192 uint32_t tickcurrent = HAL_GetTick();
+
192 uint32_t tickcurrent = local_time();
193 /* Ожидание истечения периода моргания */
194 if((tickcurrent - led->tickprev) > led->LED_Period)
195 {
@@ -329,7 +321,7 @@ $(function(){initNavTree('general__gpio_8c_source.html',''); initResizable(); })
204 {
205 static unsigned direction = 0;
206 static int duty = 0;
-
207 uint32_t tickcurrent = HAL_GetTick();
+
207 uint32_t tickcurrent = local_time();
208 /* Ожидание момента изменения яркости */
209 /* Период ШИМ 20 мс, поэтому менять яроксть надо 40 раз за период (туда обратно) */
210 if((tickcurrent - led->tickprev) > led->LED_Period/(LED_PWM_TICKS*2))
@@ -417,9 +409,9 @@ $(function(){initNavTree('general__gpio_8c_source.html',''); initResizable(); })
288 if(sw->Sw_FilterDelay) // если включена защита от дребезга
289 {
290 if(sw->tickprev == 0)
-
291 sw->tickprev = HAL_GetTick();
+
291 sw->tickprev = local_time();
292
-
293 if((HAL_GetTick() - sw->tickprev) >= sw->Sw_FilterDelay)
+
293 if((local_time() - sw->tickprev) >= sw->Sw_FilterDelay)
294 {
295 if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl)
296 {
@@ -457,7 +449,8 @@ $(function(){initNavTree('general__gpio_8c_source.html',''); initResizable(); })
Заголовочный файл для модуля инициализации портов и работы с ними.
#define check_null_ptr_1(p1)
Проверить один указатель на NULL.
Definition mylibs_defs.h:38
#define check_null_ptr_3(p1, p2, p3)
Проверить три указателя на NULL.
Definition mylibs_defs.h:44
-
#define LED_PWM_TICKS
Количество тиков в периоде ШИМ
+
#define LED_PWM_TICKS
Количество тиков в периоде ШИМ
+
#define local_time()
Локальное время
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx)
Включить тактирование порта GPIO.
HAL_StatusTypeDef GPIO_LED_On(GPIO_LEDTypeDef *led)
Включить светодиод
HAL_StatusTypeDef GPIO_LED_Fading_Start(GPIO_LEDTypeDef *led, uint32_t period)
Активировать моргание светодиодом
@@ -466,31 +459,32 @@ $(function(){initNavTree('general__gpio_8c_source.html',''); initResizable(); })
void GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led)
Управление динамическими режимами свечения светодиода
HAL_StatusTypeDef GPIO_LED_Set(GPIO_LEDTypeDef *led, uint8_t led_state)
Выставить светодиод по переменной
HAL_StatusTypeDef GPIO_LED_Blink_Start(GPIO_LEDTypeDef *led, uint32_t period)
Активировать моргание светодиодом
-
@ LED_IS_BLINKING
Моргание светодиодом
-
@ LED_IS_OFF
Светодиод выключен
-
@ LED_IS_FADING
Плавное моргание светодиодом
-
@ LED_IS_ON
Светодиод включен
+
@ LED_IS_BLINKING
Моргание светодиодом
+
@ LED_IS_OFF
Светодиод выключен
+
@ LED_IS_FADING
Плавное моргание светодиодом
+
@ LED_IS_ON
Светодиод включен
int GPIO_Read_Switch(GPIO_SwitchTypeDef *sw)
Считать состоянии кнопки
HAL_StatusTypeDef GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_ActiveLevel)
Инициализировать кнопку (структуру кнопки)
-
Структура светодиода
-
uint32_t LED_Pin
GPIO пин ножки светодиода
-
uint32_t LED_Period
Период моргания светодиода
-
GPIO_TypeDef * LED_Port
GPIO порт ножки светодиода
-
uint8_t LED_ActiveLvl
Активный уровень ножки (при котором светодиод горит)
-
GPIO_LEDStateTypeDef state
Текущий режим работы светодиода
-
Структура кнопки
-
uint32_t Sw_PrevState
Предыдущее состояние кнопки
-
uint32_t Sw_FilterDelay
Фильтр от дребезга (в мс)
-
uint8_t Sw_ActiveLvl
Активный уровень ножки (при котором кнопка нажата)
-
uint32_t Sw_Pin
GPIO пин ножки кнопки
-
GPIO_TypeDef * Sw_Port
GPIO порт ножки кнопки
+
Структура светодиода
+
uint32_t LED_Pin
GPIO пин ножки светодиода
+
uint32_t LED_Period
Период моргания светодиода
+
GPIO_TypeDef * LED_Port
GPIO порт ножки светодиода
+
uint8_t LED_ActiveLvl
Активный уровень ножки (при котором светодиод горит)
+
GPIO_LEDStateTypeDef state
Текущий режим работы светодиода
+
Структура кнопки
+
uint32_t Sw_PrevState
Предыдущее состояние кнопки
+
uint32_t Sw_FilterDelay
Фильтр от дребезга (в мс)
+
uint8_t Sw_ActiveLvl
Активный уровень ножки (при котором кнопка нажата)
+
uint32_t Sw_Pin
GPIO пин ножки кнопки
+
GPIO_TypeDef * Sw_Port
GPIO порт ножки кнопки
+ diff --git a/Doc/html/general__gpio_8h.html b/Doc/html/general__gpio_8h.html index b5bf390..014c240 100644 --- a/Doc/html/general__gpio_8h.html +++ b/Doc/html/general__gpio_8h.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_gpio.h File Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_gpio.h File Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
-
general_gpio.h File Reference
@@ -112,79 +104,67 @@ $(function(){initNavTree('general__gpio_8h.html',''); initResizable(); });

Заголовочный файл для модуля инициализации портов и работы с ними. More...

#include "mylibs_defs.h"
-
- + Include dependency graph for general_gpio.h:
+
Include dependency graph for general_gpio.h:
-
- + This graph shows which files directly or indirectly include this file:
+
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

- - + - - + -

+

Classes

struct  GPIO_LEDTypeDef
struct  GPIO_LEDTypeDef
 Структура светодиода More...
 
struct  GPIO_SwitchTypeDef
struct  GPIO_SwitchTypeDef
 Структура кнопки More...
 
- - - - - - - - -

+

Macros

#define LED_PWM_TICKS   15
 Количество тиков в периоде ШИМ
 
#define LED_ON   1
 Состояние пина для включения светодиода
 
#define LED_OFF   0
 Состояние пина для выключения светодиода
 
#define SW_ON   1
 Состояние пина при нажатой кнопке
 
#define SW_OFF   0
 Состояние пина при отжатой кнопке
 
#define GPIO_TIM_Alternate_Mapping(INSTANCE)
 Маппинг альтернативной функции TIM между GPIO.
 
- , LED_IS_FADING = 3 } -

+

Enumerations

enum  GPIO_LEDStateTypeDef { LED_IS_OFF = 0 , LED_IS_ON = 1 @@ -192,52 +172,49 @@ Enumerations
 Режимы работы светодиода More...
 
- - - - - - - - - - -

+

Functions

HAL_StatusTypeDef GPIO_Clock_Enable (GPIO_TypeDef *GPIOx)
 Включить тактирование порта GPIO.
 
HAL_StatusTypeDef GPIO_Switch_Init (GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State)
 Инициализировать кнопку (структуру кнопки)
 
int GPIO_Read_Switch (GPIO_SwitchTypeDef *swstart)
 Считать состоянии кнопки
 
HAL_StatusTypeDef GPIO_LED_Init (GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_On_State)
 Инициализировать светодиод (структуру светодиода)
 
HAL_StatusTypeDef GPIO_LED_On (GPIO_LEDTypeDef *led)
 Включить светодиод
 
HAL_StatusTypeDef GPIO_LED_Off (GPIO_LEDTypeDef *led)
 Выключить светодиод
 
HAL_StatusTypeDef GPIO_LED_Set (GPIO_LEDTypeDef *led, uint8_t led_state)
 Выставить светодиод по переменной
 
HAL_StatusTypeDef GPIO_LED_Blink_Start (GPIO_LEDTypeDef *led, uint32_t period)
 Активировать моргание светодиодом
 
HAL_StatusTypeDef GPIO_LED_Fading_Start (GPIO_LEDTypeDef *led, uint32_t period)
 Активировать моргание светодиодом
 
void GPIO_LED_Dynamic_Handle (GPIO_LEDTypeDef *led)
 Управление динамическими режимами свечения светодиода
 
-

Detailed Description

+

Detailed Description

Заголовочный файл для модуля инициализации портов и работы с ними.

Definition in file general_gpio.h.

+ +
diff --git a/Doc/html/general__gpio_8h.js b/Doc/html/general__gpio_8h.js index 20925fe..e739a8f 100644 --- a/Doc/html/general__gpio_8h.js +++ b/Doc/html/general__gpio_8h.js @@ -5,7 +5,6 @@ var general__gpio_8h = [ "LED_OFF", "group___g_p_i_o___i_n_i_t.html#ga80700bb63bd56ebabbb4728aa433fd29", null ], [ "SW_ON", "group___g_p_i_o___i_n_i_t.html#ga19d9e3aced311179a2914e0c9b13d0f9", null ], [ "SW_OFF", "group___g_p_i_o___i_n_i_t.html#gacd8900c9ec0efde1da3253b718574067", null ], - [ "GPIO_TIM_Alternate_Mapping", "group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html#ga580b842096340b066c28b24d6b315be6", null ], [ "GPIO_LEDStateTypeDef", "group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaac2b90d8b8c9579b6aa5d3bbda9b1ff1", [ [ "LED_IS_OFF", "group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#ggaac2b90d8b8c9579b6aa5d3bbda9b1ff1a74276cd2464314e422e8a144483f74ae", null ], [ "LED_IS_ON", "group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#ggaac2b90d8b8c9579b6aa5d3bbda9b1ff1af6abfb9c5b95abbdb239590f2cd245ea", null ], diff --git a/Doc/html/general__gpio_8h__dep__incl.map b/Doc/html/general__gpio_8h__dep__incl.map index 1ee50f3..4a3628e 100644 --- a/Doc/html/general__gpio_8h__dep__incl.map +++ b/Doc/html/general__gpio_8h__dep__incl.map @@ -1,16 +1,16 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/Doc/html/general__gpio_8h__dep__incl.md5 b/Doc/html/general__gpio_8h__dep__incl.md5 index b686327..4499c32 100644 --- a/Doc/html/general__gpio_8h__dep__incl.md5 +++ b/Doc/html/general__gpio_8h__dep__incl.md5 @@ -1 +1 @@ -f42bf5193afb062a9c95d3c96bb4e0cd \ No newline at end of file +f0505ab3694aaaff670ed9b2b0d44914 \ No newline at end of file diff --git a/Doc/html/general__gpio_8h__dep__incl.png b/Doc/html/general__gpio_8h__dep__incl.png index 8d29aae9270ddeb500ebcab4a8ba855553bb57e5..8c65085d12f8bd85b3e3cd5042910d3e2a5ad1f0 100644 GIT binary patch literal 16947 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 M-?)a?zw_vS0A+L$W&i*H literal 21812 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 diff --git a/Doc/html/general__gpio_8h__incl.map b/Doc/html/general__gpio_8h__incl.map index f3ddf1d..2a678e8 100644 --- a/Doc/html/general__gpio_8h__incl.map +++ b/Doc/html/general__gpio_8h__incl.map @@ -1,9 +1,9 @@ - - - - - - - - + + + + + + + + diff --git a/Doc/html/general__gpio_8h__incl.md5 b/Doc/html/general__gpio_8h__incl.md5 index 7a01ba7..e999f78 100644 --- a/Doc/html/general__gpio_8h__incl.md5 +++ b/Doc/html/general__gpio_8h__incl.md5 @@ -1 +1 @@ -21dce52570063c58c664fb8c26d4473d \ No newline at end of file +64dafee7a8d3ae5fb443763ec7bc3400 \ No newline at end of file diff --git a/Doc/html/general__gpio_8h__incl.png b/Doc/html/general__gpio_8h__incl.png index 0a47dfa0715d9e46e7aeb11ef904f6f7c60af761..04247fc3069caead3024a2a3d5fce8d3f08faf04 100644 GIT binary patch literal 4033 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 diff --git a/Doc/html/general__gpio_8h_source.html b/Doc/html/general__gpio_8h_source.html index 3ebec28..7f0a29f 100644 --- a/Doc/html/general__gpio_8h_source.html +++ b/Doc/html/general__gpio_8h_source.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_gpio.h Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_gpio.h Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({
- + + -
+
27 * @{
28 */
29
-
30#ifndef LED_PWM_TICKS
-
31#define LED_PWM_TICKS 15 ///< Количество тиков в периоде ШИМ
+
30#ifndef local_time
+
31#define local_time() HAL_GetTick() ///< Локальное время
32#endif
-
33
-
34#ifndef LED_ON
-
35#define LED_ON 1 ///< Состояние пина для включения светодиода
+
33
+
34#ifndef LED_PWM_TICKS
+
35#define LED_PWM_TICKS 15 ///< Количество тиков в периоде ШИМ
36#endif
-
37#ifndef LED_OFF
-
38#define LED_OFF 0 ///< Состояние пина для выключения светодиода
-
39#endif
-
40
-
41#ifndef SW_ON
-
42#define SW_ON 1 ///< Состояние пина при нажатой кнопке
+
37
+
38#ifndef LED_ON
+
39#define LED_ON 1 ///< Состояние пина для включения светодиода
+
40#endif
+
41#ifndef LED_OFF
+
42#define LED_OFF 0 ///< Состояние пина для выключения светодиода
43#endif
-
44#ifndef SW_OFF
-
45#define SW_OFF 0 ///< Состояние пина при отжатой кнопке
-
46#endif
-
47
-
48/** GPIO_INIT
-
49 * @}
-
50 */
-
51
-
52
-
53// /**
-
54// * @brief Маппинг альтернативной функции SPI между GPIO
-
55// * @ingroup MYLIBS_GPIO_GENERAL
-
56// */
-
57// #define SPI_Alternate_Mapping(INSTANCE) \
-
58// ((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \
-
59// (((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \
-
60// (((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \
-
61// (((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \
-
62// (0))
-
63
-
64
-
65/**
-
66 * @brief Маппинг альтернативной функции TIM между GPIO
-
67 * @ingroup MYLIBS_GPIO_GENERAL
-
68 */
-
-
69#define GPIO_TIM_Alternate_Mapping(INSTANCE) \
-
70((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \
-
71(((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \
-
72(((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \
-
73(((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \
-
74(0))
+
44
+
45#ifndef SW_ON
+
46#define SW_ON 1 ///< Состояние пина при нажатой кнопке
+
47#endif
+
48#ifndef SW_OFF
+
49#define SW_OFF 0 ///< Состояние пина при отжатой кнопке
+
50#endif
+
51
+
52/** GPIO_INIT
+
53 * @}
+
54 */
+
55
+
56
+
57/**
+
58 * @brief Режимы работы светодиода
+
59 * @ingroup MYLIBS_GPIO_LEDS
+
60 */
+
+
61typedef enum
+
62{
+
63 LED_IS_OFF = 0, ///< Светодиод выключен
+
64 LED_IS_ON = 1, ///< Светодиод включен
+
65 LED_IS_BLINKING = 2, ///< Моргание светодиодом
+
66 LED_IS_FADING = 3, ///< Плавное моргание светодиодом
+
-
75
-
76
-
77/**
-
78 * @brief Режимы работы светодиода
-
79 * @ingroup MYLIBS_GPIO_LEDS
-
80 */
-
-
81typedef enum
-
82{
-
83 LED_IS_OFF = 0, ///< Светодиод выключен
-
84 LED_IS_ON = 1, ///< Светодиод включен
-
85 LED_IS_BLINKING = 2, ///< Моргание светодиодом
-
86 LED_IS_FADING = 3, ///< Плавное моргание светодиодом
- +
68
+
69/**
+
70 * @brief Структура светодиода
+
71 * @ingroup MYLIBS_GPIO_LEDS
+
72 */
+
+
73typedef struct
+
74{
+
75 GPIO_LEDStateTypeDef state; ///< Текущий режим работы светодиода
+
76
+
77 GPIO_TypeDef *LED_Port; ///< GPIO порт ножки светодиода
+
78 uint32_t LED_Pin; ///< GPIO пин ножки светодиода
+
79
+
80 uint8_t LED_ActiveLvl; ///< Активный уровень ножки (при котором светодиод горит)
+
81 uint32_t LED_Period; ///< Период моргания светодиода
+
82
+
83 uint32_t tickprev;
+
-
88
-
89/**
-
90 * @brief Структура светодиода
-
91 * @ingroup MYLIBS_GPIO_LEDS
-
92 */
-
-
93typedef struct
-
94{
-
95 GPIO_LEDStateTypeDef state; ///< Текущий режим работы светодиода
-
96
-
97 GPIO_TypeDef *LED_Port; ///< GPIO порт ножки светодиода
-
98 uint32_t LED_Pin; ///< GPIO пин ножки светодиода
-
99
-
100 uint8_t LED_ActiveLvl; ///< Активный уровень ножки (при котором светодиод горит)
-
101 uint32_t LED_Period; ///< Период моргания светодиода
-
102
-
103 uint32_t tickprev;
- +
85
+
86/**
+
87 * @brief Структура кнопки
+
88 * @ingroup MYLIBS_GPIO_SWITCH
+
89 */
+
+
90typedef struct
+
91{
+
92 GPIO_TypeDef *Sw_Port; ///< GPIO порт ножки кнопки
+
93 uint32_t Sw_Pin; ///< GPIO пин ножки кнопки
+
94
+
95 uint8_t Sw_ActiveLvl; ///< Активный уровень ножки (при котором кнопка нажата)
+
96 uint32_t Sw_PrevState; ///< Предыдущее состояние кнопки
+
97 uint32_t Sw_FilterDelay; ///< Фильтр от дребезга (в мс)
+
98
+
99 uint32_t tickprev;
+
-
105
-
106/**
-
107 * @brief Структура кнопки
-
108 * @ingroup MYLIBS_GPIO_SWITCH
-
109 */
-
-
110typedef struct
-
111{
-
112 GPIO_TypeDef *Sw_Port; ///< GPIO порт ножки кнопки
-
113 uint32_t Sw_Pin; ///< GPIO пин ножки кнопки
-
114
-
115 uint8_t Sw_ActiveLvl; ///< Активный уровень ножки (при котором кнопка нажата)
-
116 uint32_t Sw_PrevState; ///< Предыдущее состояние кнопки
-
117 uint32_t Sw_FilterDelay; ///< Фильтр от дребезга (в мс)
-
118
-
119 uint32_t tickprev;
- -
-
121
+
101
+
102
+
103/////////////////////////////////////////////////////////////////////
+
104///////////////////////////---FUNCTIONS---///////////////////////////
+
105/**
+
106 * @addtogroup MYLIBS_GPIO_GENERAL General tools
+
107 * @ingroup MY_LIBS_GPIO
+
108 * @brief Общие функции/макросы для работы с GPIO
+
109 * @par Пример использования:
+
110 @code
+
111 // Включаем тактирование порта GPIOA
+
112 GPIO_Clock_Enable(GPIOA);
+
113 @endcode
+
114 * @{
+
115 */
+
116
+
117HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx);
+
118
+
119/** MYLIBS_GPIO_GENERAL
+
120 * @}
+
121 */
122
-
123/////////////////////////////////////////////////////////////////////
-
124///////////////////////////---FUNCTIONS---///////////////////////////
-
125/**
-
126 * @addtogroup MYLIBS_GPIO_GENERAL General tools
-
127 * @ingroup MY_LIBS_GPIO
-
128 * @brief Общие функции/макросы для работы с GPIO
-
129 * @{
-
130 */
-
131
-
132HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx);
-
133
-
134/** MYLIBS_GPIO_GENERAL
-
135 * @}
-
136 */
-
137
-
138/**
-
139* @addtogroup MYLIBS_GPIO_SWITCH Switch tools
-
140* @ingroup MY_LIBS_GPIO
-
141* @brief Функции для работы с GPIO, как с кнопкой
-
142* @{
-
143*/
-
144
-
145/* Инициализировать кнопку (структуру кнопки) */
-
146HAL_StatusTypeDef GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State);
-
147/* Считать состоянии кнопки запуска */
- -
149
-
150/** MYLIBS_GPIO_SWITCH
-
151 * @}
-
152 */
-
153
+
123/**
+
124 * @addtogroup MYLIBS_GPIO_SWITCH Switch tools
+
125 * @ingroup MY_LIBS_GPIO
+
126 * @brief Функции для работы с GPIO, как с кнопкой
+
127 * @par Пример использования:
+
128 @code
+
129 MX_GPIO_Init(); // инициализация пина аппаратная
+
130
+
131 // Инициализация кнопки на порте GPIOB, пин 0, активный уровень 1
+
132 GPIO_SwitchTypeDef sw1;
+
133 GPIO_Switch_Init(&sw1, GPIOB, GPIO_PIN_0, 1); // или дефайн SW_ON/SW_OFF
+
134
+
135 // Считываем состояние кнопки
+
136 if(GPIO_Read_Switch(&sw1))
+
137 {
+
138 // Кнопка нажата
+
139 LED_ON();
+
140 }
+
141 else
+
142 {
+
143 // Кнопка отжата
+
144 LED_OFF();
+
145 }
+
146 @endcode
+
147 * @{
+
148 */
+
149
+
150/* Инициализировать кнопку (структуру кнопки) */
+
151HAL_StatusTypeDef GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State);
+
152/* Считать состоянии кнопки запуска */
+
154
-
155/**
-
156 * @addtogroup MYLIBS_GPIO_LEDS LED tools
-
157 * @ingroup MY_LIBS_GPIO
-
158 * @brief Функции для работы с GPIO, для управления светодиодом
-
159 * @{
-
160 */
-
161
-
162/* Инициализировать светодиод (структуру светодиода) */
-
163HAL_StatusTypeDef GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_On_State);
-
164/* Включить светодиод */
-
165HAL_StatusTypeDef GPIO_LED_On (GPIO_LEDTypeDef *led);
-
166/* Выключить светодиод */
-
167HAL_StatusTypeDef GPIO_LED_Off (GPIO_LEDTypeDef *led);
-
168/* Выставить светодиод по переменной */
-
169HAL_StatusTypeDef GPIO_LED_Set (GPIO_LEDTypeDef *led, uint8_t led_state);
-
170/* Активировать моргание светодиодом */
-
171HAL_StatusTypeDef GPIO_LED_Blink_Start (GPIO_LEDTypeDef *led, uint32_t period);
-
172/* Активировать моргание светодиодом */
-
173HAL_StatusTypeDef GPIO_LED_Fading_Start(GPIO_LEDTypeDef *led, uint32_t period);
-
174/* Управление динамическими режимами свечения светодиода */
- -
176
-
177/** MYLIBS_GPIO_LEDS
-
178 * @}
-
179 */
-
180///////////////////////////---FUNCTIONS---///////////////////////////
-
181
-
182
-
183#endif // __GPIO_GENERAL_H_
+
155/** MYLIBS_GPIO_SWITCH
+
156 * @}
+
157 */
+
158
+
159
+
160/**
+
161 * @addtogroup MYLIBS_GPIO_LEDS LED tools
+
162 * @ingroup MY_LIBS_GPIO
+
163 * @brief Функции для работы с GPIO, для управления светодиодом
+
164 * @par Пример использования:
+
165 @code
+
166 MX_GPIO_Init(); // инициализация пина аппаратная
+
167
+
168 // Инициализация светодиода на порте GPIOA, пин 5, активный уровень 0
+
169 GPIO_LEDTypeDef led;
+
170 GPIO_LED_Init(&led, GPIOA, GPIO_PIN_5, 0); // или дефайн LED_ON/LED_OFF
+
171
+
172 // Включение светодиода
+
173 GPIO_LED_On(&led);
+
174
+
175 // Запуск моргания
+
176 GPIO_LED_Blink_Start(&led, 500); // Период 500 мс
+
177
+
178 // В основном цикле
+
179 while (1) {
+
180 GPIO_LED_Dynamic_Handle(&led);
+
181 }
+
182 @endcode
+
183 * @{
+
184 */
+
185
+
186/* Инициализировать светодиод (структуру светодиода) */
+
187HAL_StatusTypeDef GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_On_State);
+
188/* Включить светодиод */
+
189HAL_StatusTypeDef GPIO_LED_On (GPIO_LEDTypeDef *led);
+
190/* Выключить светодиод */
+
191HAL_StatusTypeDef GPIO_LED_Off (GPIO_LEDTypeDef *led);
+
192/* Выставить светодиод по переменной */
+
193HAL_StatusTypeDef GPIO_LED_Set (GPIO_LEDTypeDef *led, uint8_t led_state);
+
194/* Активировать моргание светодиодом */
+
195HAL_StatusTypeDef GPIO_LED_Blink_Start (GPIO_LEDTypeDef *led, uint32_t period);
+
196/* Активировать моргание светодиодом */
+
197HAL_StatusTypeDef GPIO_LED_Fading_Start(GPIO_LEDTypeDef *led, uint32_t period);
+
198/* Управление динамическими режимами свечения светодиода */
+ +
200
+
201/** MYLIBS_GPIO_LEDS
+
202 * @}
+
203 */
+
204///////////////////////////---FUNCTIONS---///////////////////////////
+
205
+
206
+
207/**
+
208 * @cond GPIO_INTERNAL
+
209 */
+
210
+
211// /**
+
212// * @brief Маппинг альтернативной функции SPI между GPIO
+
213// * @ingroup MYLIBS_GPIO_GENERAL
+
214// */
+
215// #define SPI_Alternate_Mapping(INSTANCE) \
+
216// ((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \
+
217// (((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \
+
218// (((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \
+
219// (((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \
+
220// (0))
+
221
+
222
+
223/**
+
224 * @brief Маппинг альтернативной функции TIM между GPIO
+
225 * @ingroup MYLIBS_GPIO_GENERAL
+
226 */
+
227#define GPIO_TIM_Alternate_Mapping(INSTANCE) \
+
228((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \
+
229(((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \
+
230(((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \
+
231(((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \
+
232(0))
+
233
+
234
+
235/** @endcond */
+
236
+
237#endif // __GPIO_GENERAL_H_
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx)
Включить тактирование порта GPIO.
HAL_StatusTypeDef GPIO_LED_On(GPIO_LEDTypeDef *led)
Включить светодиод
HAL_StatusTypeDef GPIO_LED_Fading_Start(GPIO_LEDTypeDef *led, uint32_t period)
Активировать моргание светодиодом
-
GPIO_LEDStateTypeDef
Режимы работы светодиода
+
GPIO_LEDStateTypeDef
Режимы работы светодиода
HAL_StatusTypeDef GPIO_LED_Off(GPIO_LEDTypeDef *led)
Выключить светодиод
HAL_StatusTypeDef GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_On_State)
Инициализировать светодиод (структуру светодиода)
void GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led)
Управление динамическими режимами свечения светодиода
HAL_StatusTypeDef GPIO_LED_Set(GPIO_LEDTypeDef *led, uint8_t led_state)
Выставить светодиод по переменной
HAL_StatusTypeDef GPIO_LED_Blink_Start(GPIO_LEDTypeDef *led, uint32_t period)
Активировать моргание светодиодом
-
@ LED_IS_BLINKING
Моргание светодиодом
-
@ LED_IS_OFF
Светодиод выключен
-
@ LED_IS_FADING
Плавное моргание светодиодом
-
@ LED_IS_ON
Светодиод включен
+
@ LED_IS_BLINKING
Моргание светодиодом
+
@ LED_IS_OFF
Светодиод выключен
+
@ LED_IS_FADING
Плавное моргание светодиодом
+
@ LED_IS_ON
Светодиод включен
int GPIO_Read_Switch(GPIO_SwitchTypeDef *swstart)
Считать состоянии кнопки
HAL_StatusTypeDef GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State)
Инициализировать кнопку (структуру кнопки)
Заголочный файл для дефайнов библиотеки MyLibsGeneral.
-
Структура светодиода
-
uint32_t LED_Pin
GPIO пин ножки светодиода
-
uint32_t LED_Period
Период моргания светодиода
-
GPIO_TypeDef * LED_Port
GPIO порт ножки светодиода
-
uint8_t LED_ActiveLvl
Активный уровень ножки (при котором светодиод горит)
-
GPIO_LEDStateTypeDef state
Текущий режим работы светодиода
-
Структура кнопки
-
uint32_t Sw_PrevState
Предыдущее состояние кнопки
-
uint32_t Sw_FilterDelay
Фильтр от дребезга (в мс)
-
uint8_t Sw_ActiveLvl
Активный уровень ножки (при котором кнопка нажата)
-
uint32_t Sw_Pin
GPIO пин ножки кнопки
-
GPIO_TypeDef * Sw_Port
GPIO порт ножки кнопки
+
Структура светодиода
+
uint32_t LED_Pin
GPIO пин ножки светодиода
+
uint32_t LED_Period
Период моргания светодиода
+
GPIO_TypeDef * LED_Port
GPIO порт ножки светодиода
+
uint8_t LED_ActiveLvl
Активный уровень ножки (при котором светодиод горит)
+
GPIO_LEDStateTypeDef state
Текущий режим работы светодиода
+
Структура кнопки
+
uint32_t Sw_PrevState
Предыдущее состояние кнопки
+
uint32_t Sw_FilterDelay
Фильтр от дребезга (в мс)
+
uint8_t Sw_ActiveLvl
Активный уровень ножки (при котором кнопка нажата)
+
uint32_t Sw_Pin
GPIO пин ножки кнопки
+
GPIO_TypeDef * Sw_Port
GPIO порт ножки кнопки
+
diff --git a/Doc/html/general__tim_8c.html b/Doc/html/general__tim_8c.html index bd4d793..bc889a7 100644 --- a/Doc/html/general__tim_8c.html +++ b/Doc/html/general__tim_8c.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Src/general_tim.c File Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Src/general_tim.c File Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
- + + @@ -73,10 +71,9 @@ $(function() { +
-
general_tim.c File Reference
@@ -109,67 +104,55 @@ $(function(){initNavTree('general__tim_8c.html',''); initResizable(); });

Модуль для инициализации таймеров и работы с ними. More...

#include "general_tim.h"
-
- + Include dependency graph for general_tim.c:
+
Include dependency graph for general_tim.c:

Go to the source code of this file.

- - - - - - - - - - - -

+

Functions

HAL_StatusTypeDef TIM_Base_Init (TIM_SettingsTypeDef *stim)
 Инициализация таймера.
 
HAL_StatusTypeDef TIM_Encoder_Init (TIM_EncoderTypeDef *henc, TIM_HandleTypeDef *htim)
 Инициализация режима энкодер у таймера.
 
HAL_StatusTypeDef TIM_Output_PWM_Init (TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN)
 Инициализация выхода ШИМ таймера.
 
HAL_StatusTypeDef TIM_OC_Comparator_Init (TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL)
 Инициализация OC компаратора таймера.
 
HAL_StatusTypeDef TIM_Encoder_Read (TIM_EncoderTypeDef *henc)
 Считать энкодер.
 
int TIM_Encoder_ReadSwitch (TIM_EncoderTypeDef *henc)
 Считать кнопку энкодера.
 
HAL_StatusTypeDef TIM_Delay (TIM_HandleTypeDef *htim, uint16_t delay)
 Задержка в тиках таймера (блокирующая).
 
HAL_StatusTypeDef TIM_Delay_Start (TIM_HandleTypeDef *htim)
 Начать отсчет неблокирующей задержки.
 
HAL_StatusTypeDef TIM_Delay_NonBlocking (TIM_HandleTypeDef *htim, uint16_t delay)
 Задержка в тиках таймера (неблокирующая).
 
void TIM_Base_MspInit (TIM_HandleTypeDef *htim, TIM_ITModeTypeDef it_mode)
 Инициализация CLK и NVIC таймеров.
 
void TIM_Base_MspDeInit (TIM_HandleTypeDef *htim)
 Деинициализация CLK и NVIC таймеров.
 
-

Detailed Description

+

Detailed Description

Модуль для инициализации таймеров и работы с ними.

Реализация функций для работы с TIM:

  • Инициализация таймера и его каналов
  • @@ -180,11 +163,19 @@ Functions

    Definition in file general_tim.c.

+ +
diff --git a/Doc/html/general__tim_8c__incl.map b/Doc/html/general__tim_8c__incl.map index c9dcd77..1096c09 100644 --- a/Doc/html/general__tim_8c__incl.map +++ b/Doc/html/general__tim_8c__incl.map @@ -1,14 +1,14 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/Doc/html/general__tim_8c__incl.md5 b/Doc/html/general__tim_8c__incl.md5 index 7a3d6eb..b3c8500 100644 --- a/Doc/html/general__tim_8c__incl.md5 +++ b/Doc/html/general__tim_8c__incl.md5 @@ -1 +1 @@ -eb15c46347f395057c20d321276b7d03 \ No newline at end of file +b9386d564e6b4fd6c35f93b0536b2339 \ No newline at end of file diff --git a/Doc/html/general__tim_8c__incl.png b/Doc/html/general__tim_8c__incl.png index d4ca6a672e6da494030df10e3bd1afadd50e6ec1..616abfe5664e201f7dbb808ac217117f039bb4dc 100644 GIT binary patch literal 8453 zcmcI~cRZWz+qY_~wMtQ{R%sQbw5S!Tjo3xe+N;#wD?!YvRa9+CsGz7-B1VGhu=flh zM%7Hj9x>nazVF}rdw-yumKG(U9^Ei+BJ+7E%+N$(4H)tp*DCpJIKziio zAO*!a^kpjYn>n9{J^4Xpt*Hv4IQw&dY${5optwn)4tnz3FMACKtvB}#TH4%)z&LJF z+bn#dRN0V%7hhB~#}Q7WpQ&G{l%+?)1*M-TFp1xS!IJJp}Bk8ubwqOg{vabPr5`g}m3gHTo#ER<6 z4`r%8FHfV5uDe!w+c#nr4xRY?Wcj!|Z@6qIfhGR=Pj;G$dn9^j7Qwa@ZpO zrLx0_-E#Vq93Wma>pL)IRE1N&Lj^+&M84*+$zLBs#ikfTDkeNt>O!K+-7b%E=w4k1 z#O|Sx-8G$(jL5)?J1J%M$HJK(M7kjAyHiMkr1qf z@ZCv4Yh~$GCM46ck$Hjqs%YtVZ4sZXBW(evi$b@*l-CZrm~nF`=kJ@a?-;BukDSWSSRcZGo=T1s#E>f(AdoD7}J4ylDSVZodcKW)j?Iyl2_mNDO)4iw)l8 zKgkKy$?r&bs;%DX-j#c|?E(!NU?6&%uy zd_?@+WW6`VV6c@}#6>F>wFwZeq$CT_(NG2QNhMh*) zt3|V10kE-&cR-YPuPC+CLTyx+E%FdG__Y-8?8^>wDy%T6wCP3=MaFCa+rB3D5`~I) zy7J4l(bsr!i3W<{1_pk@`}kMBGcN>u4e>j2^&(E9)|0}$C!n=5f;_mp>Tq@Ro5-+5 zaUyuN!WUuLgeiBjZ*Ii6Is!-f>g+5GS=;p%iDtKqM_~Kh)dmnz=R%n(M)>5uM!dF< zpq;k=Yvg$4=o4hyVYBMO2y-yn%V=_ zFjf{TxE{4Kc4S+vw|6Kvx($T~vD;<~;R_z{bTUj|-0uW$Q<7J{Q zVEmgOqY71DY}()P;TcyN8gWfu{HRcv_B}47@A0hvL=l?Gj=YO|(r4pF(v)c91 zebW6i46J$OC6!LAQ8Z$3ZeRxWz@~cLZyLSD31BQTDJft~?fBJu%3#+cVe@O?ar^z_ z0nMTr*yNbV7mTuy-n)-PvzXg$a-0zR*@2J&OVSOsFtMK%FLM5jn@$naYhe3)Z*6@k z5=fJjCJ5rMK4qG`=n{#2QXT%o-NZjp!NlR^(0kx>al0~a=+&fa9h#1Z(F6)_^ z+oqs$zV>lTFIuBVui|1$gQ%AfAI`b6UidLT2GI`cPP=!MfzG{werKhGxHM7c96}HW zW==E-8&(8{5ahN7c+jDZbaZrP!N;5Jxu-itiV9#MiRqL5nf@OPih;91|s4cQ|HRL8!U0r{>vy?jG(8*E>~pnroV~Qao{fMLA^eCHf3%S?ij6;`DCeVpc|mpCp*x ze^4xr|9~Bo&FILAvS=E__jl7|qYG z@HJ%&8b}nGnpK@|q_(+cmwBuwC+AcmyH3$}N-8x`c0b2EPH@d%TcJY4#7sUA8aQVQEb)iwkJW?ryl3L<>pM--MhJ=O0^C> zs?UW%pc1LT=U*h}dRu-J(RrC(T`T9dLjuk+WQ1AWHk$dc*^Vsm*RmqwOV~kwDP6U2 zyXo{T?KrmH54}(tNAF18Xqp~9XtyvT?UTejLDih6MqqdLM4kk5Sc-jD=q}cWodgZ#A zZt}8mQ{VktvI}M_%nC<;?7f&pQ03NdNu4oNtu8;L(S72Qq};;L#ySp5)FdfI6}a>8 zyfstpe-{0A*6sH3I}Q%(^y+}-6Po#xmaW9{;9x>PKp60OXyUzWe4j*e3Wqg@@{8U0 z*!e7VQV-d>Goo|c$RxGQdd(K`FLx<8CPB{k=N$8gFrribYMAqqZe~Hh(RLzzLo;f z$mv=1)+@6M$6r&o*G|U^B@uREIEui|S^d-mKJJDIOYoFPbC3^@dyJ7qi4aKEtNyyZ zGeOSe;fdg{=9A;ikcnS9#_~iS{yBhKqsT>b+_NZPN^%`;x&MNNgZloP<$?TY*x92C z046`Nf%b1-ZFaHsqp9QwAo<%lQ7N1CpH?JoR}A8}fnsO8q0A1ni`rr{ou$`*afB`W zxo))AuZ<6q3t7%f6UGB3<_WgWkor9-%!VwG|pJ?!7B-^R4q zJkIBNbLqk2wdV$g?-Yk7VONQXrt1Oxyn1eH{HHP+~fUhfXhP zxxP3FnDPK(@peqgT!^7l)ZaX0mNM9-j2 z?cL=$7WNzL`%4sx>e=Z!I52Lc+O}IIjA7Bls7;=|Wk_#&Ek_s<@+So$e&()lUK0P^ z=H2`4kmL#2?#)qvS`WgNP1yL6-b>n2Zc|2(Mgz0R9@+DLehbQb4uEZXdU~xK?><>_ z7vGtn{fC^DHgG!j>~pvfCsS-bqix5_z7geY@o+(qvADL>eAu|HS``aiL{^|+qxwi>~tz=%dy#g5*S?oy>!un72GRYvM|-BBZ6FIrsOk45$T zQ<;SjRKhC_-mZ?Ym~dVVroBa6S|-;axcoE?#%<{Ax7)bZhjGD*Oe^KfnFdvs*JSda zXyhbbh}65OKAvk2u!}_V9738rdo3_W5Wx0m0M{Y+2P9?{y7np)Hk2cH%W>u#)O9H4 zm*}c1L}}UQM@hC=cYNjaR<+x$N?Yw=au2(wsPO$^wz_wH;!}NrwhCd4vA~q8xi14>j9OM=5`3u4dl#cyY6D{8Mj{JTp0%yC_GMnf0A%cex32#H~LS5Z7-Yyg)2=n zD^VxfI&zW$47+U*6K~;lp*O&k#FC;T`F9e+{a{pislKLIW0b~fpKV7Rti;!S+!Pi=M47@IXPSe8CTm^0t3;@) zyqEeS=dZ!(3j4n9vKIu&UviKIp}}jbmPn@;?^12M6GFK6I&?nL_7^PV)dlaqb@3TV zhFW&cyTz5U*X~x~JAX{N@6jf|nUsHd`XScUnGn$RxE;j)0p&EuJu922+1dJ?{!zy5 zz#G>MLvspXdO8wJx1SBi=$1}(rZ;pRi z(e1p(0*^E9N(g0}od&dL5vBaUaO~#~M;?F(UR^4@T^X_v3LW#>%wZc$QflJ8xD3xc z_FI1pKUl$*EZZ)>9GYo4Gt@FT&}kwf=)r_bj|dx^RWB#G(K+H|QLP2%D7VRW*Ge7cryt$_F3c>8k)P$SQS&qYs9gp^$*7Y-z{&G1)7? zmWEqyFK82>mn!3~<*>o%lid?})D?N(PJ_jt6@~gMH}hMlj~F&i$B`*8U`qHYb@QdC z1BK=&VfQUI^!B4{#lvIUz1Z>Hzgkn%C+4XjDDNi(6YN8|Rdq`q;ZT6~2`kR~g$qco z>OFJRWEiHsBHvsQdTm|G-i^{;$DCGB%RwiFZ5}+^s{a+?6VYmV!oGMc+ot+=1~+_< z?Dcl|1FxwK2U{?s(+rHe1j3^3Tq4DeBYl`71Ob8N4ZTugW3P_vb_tnld#H$%`9>U+a0NO zo%m}l7y|}`C|ChUwiucGE|jcs(~E^iTEyv~W9iulV&i!U1yqp|+4~>fA&GB{K=-{Z z2qt&qr+)WSo~HlEEjPAOd~2>Ftsm`GyTvp)x1p5(${h9R5%m-T%El9Ku2H8SO=H#f zX{12}%r&gicGBBI$&}{a_l%u6R^jfJ{Z6&#x zO%Qa^Z)`A->)?erdx-n1HdTsT&R?I$kvlXI#T5EF9VDm(YipU!tJtq?uvWW9`!#vz z;}o!CCh$3Qb)b2|Cf2P7DR8eTLrp|S0v~vRq934c#%^-Pru9dFXQ$SvRYqo z242`e+tmCWjrAd@CEPy3HS1im7(}@DrQ=*S`(F)3qwh`paxdd9Q>9qad8HNnWCE%TdZyoh#F|M{nJY-UYcP`Hc3W8)!y%4#-sNFLI zGiD(3An)w(5Hr`0*46pqjy9R7C2?Oxz&Eg1HzY? z*)OU)C|_>)4)3B~6Px%QPd)F`_EpkeTD;--w061}8Bw^%!BM+L-8d+m>tI!H{1_rS z7gz?*a^SpgpZ*PR&|mkJM$pjYBct;D+7`FkHxO~I+XD0}eGQ)Hf*s7YXOC~L%omb* zxHoHEC`8VQs$QB>2eM>bVA2H4FgI*FeRRK@l8ZyerdKw01gELz4W)=4#Vn7wZ-$ZW zI3i5i2PI$+J_b&3Iat zk1_#7Yy-b$TDG-aVL+RyL~=V!yxYQKML5~LyuJ|Ue=;R3HcPAwnc*g>8%`0|h%?tY zIF9@Ya@8Z=IN86z?O1bFz#-&>vKc|slU4($bUm6HQA8~sd0hR%3%+W++Q6t~T4k+F zU@GX^TIjY(e^1NB{5QPy-{7Yd-qM5ePt#vx9nh(cfRd8v{lWNvJqUb!s+)x2=q;;3 z`UqM?e-eMcS1!T_7%I?t!>(F4;eDZ4&-+de3f zh($Flv$6qu*9yki0f|mEJd%h3KBt8FEMbl9;`Z#Be3#^&;m6_nRUt}4)UQ3T%-0Gm z(o2Sk&vygk+a8+OY6P70 zciq+e>-1yyC>G$1$dY1uqbDoe|3XCn#UgTS_=Led1-@ezopifFT5A|z=RU)YPO$>- zxYHH(qaC!j=1qy4O<%EW=p2#T>R#@I8`Ym^i!@wT>T@%{?=$-iekOqp2>}IC|0DPR ze_?|sFQSu-$nmCKubroLRC%&}{q_@yQXpL8$^&x-= z@16{bmIs$4Jm@ZY6e)(e+H9{a=*FfhjlhJjM(t8R{Y5uRM{z!7dX%^E&$$av+LroX9zIxIKJ4!%n*2MzQ4^|O+x=M!P zI^uoZcDSVI4t)$NvdQ?LM%01$#=*<;@dDsAJN@jp1y>`A-;DJk1bXVv$xwuPe(Y}u zp1)Qr?PjYN3w*98WTvniE?huY;Nkl_so+XPae+3+Z&s!&IiUOC9J!z6iJD1rWSsB@ z%%1t_S`g=$PE#7w9{^ClLiT{6BHrw+TDn(VqUV|FlrJ(U#&@^NxH*tiIwTqN2k}ek z3trSuGXLsFc8&fTNxyB#g`)#If}Gqa846@{{E*{h=PrLlK-i=wA(Cy_-e&=b_2H6Q z(&XIiX?MCJdqj!CThuf;PZ)~5@O^Fh}MTDH_67at-Dcmlk`rKmQ9}V)6Tv) z9LbC)j6WCng{4nsU&+7htIto3c4bxdD+4Da5}tqjRbJALUrsDFlSZ7 zd=&VV@2vUnbH`5=j0di)#dtld>>hK3R160C`&<=HH*N}CQ%E3FJVGb{3J6@pk_N>S zlBwgh<3^ykm8JKiOBl@&Sn{o6T1*amoq&_--}^Y%s~`CA;J>q|_wl z9@oBv{y{LMn90K#;#>2Ckxw@Nt_l7di2WZd=>Liif2Gl7%CGZ3>)-QK`qd*RIUv(E zXBNIbEB{DA<{>y&>Zf}`A0kGuwTqkzGqJPpHRnayyGpOm{wMqZLv!A*19SGZxlILn-lBj_^;tDCV)qZ9)u? zHaU_7Uaek_wfeFsV;`DQN?W1!;aRlCVok`RunYr+GjpS(0ykyhqC6Bw#`N>^(*nMa zK1BH(d5*a@e!ue%QlIkFODkR!XXRwZTzJz_?JINYNQd3mOY_FVm0Uz~i5|rL?F`?} z#2SIS!ZutUR;#1I5|4@~Qj^IVI@TUwWwp9s^~;O{!CgWYrjn{yf@K)b)23t0i|w_F zj9s-L@`f@uBT7PoMV)y6loqTXeS7%0s{rN2$7R|$p~#7*ax4?p@vJne`W4l(ZG+K$ zlk(<`B$!>9G)VS=mW=3V@NT>4M`raTx@^B+G1)#t>Q$PFaqC2T&c@pVv*eDDemcLoMY%8dwyE~c1~E4()W@pnymA8)Lv_J(=2$P#8kpB*-`13D7kg=4-TB1olkrU?I;1qOZm>X9t-OQDWd;!7T zh{r!)IC83q%2F4&@?oV5U}{)yf}GzO)=@l(ljw^!fBWiH`#Y|wpnV)f%p6sNH&~5Z z?u+^DsN%C^_d%syeD$@h4)5v{8jY$E81w(F&;2owsJ)-x$^=5cYwxw@Tys8iK6A%fm>KbL zpXFv@Vc|0|zGVrVnJg@<=wlqf)iHyV>%fWQnW@n&mcu{4PnePv7M61?Cbw=r49=kv zLvqC2pyb~JNLRz^_=}2d97j0b^wo-ST+MD*k2$@Pv=W?q)H&vP>@VZ93Bo*2Q!1BN zqD?lqrLR66e`7jme5^9u_!9rvW2x~r{-ejvU2kQZc`Nq1O}&G|CRxBlWs3k(m8zeB zLLTWpVuq8D>5f^eOJB*>#4RfM%hFfy@e}_zlCD%Uw5<^KA<3D!BA?Hk=uSgN1p4`H zxYg46@Sv{VepOW2J2}%^egW4i8@CgT-oX0*{_)-)X?SY`Gtticqrh!HhH#YdqHF|vL92Ou9VIHp_Ggo!G+sqZNhyq8qg@Ai) zRu(pg!XTly969WS;EFvRd5;K8iNN%RQ?O0!c=VXpSO)&3a= z=BAC$WemSBZR~}1MbXIYgnYp---IBlTBw%{t!p~$JKm+jwsz@)3i^)I=Uz401ZN3jC_PSYbZTZa{hvxnSzO1an=1AA{e3q{ z-(hWPiSgEI$ab-?<9H}B@7WkX51|A(c+zH=$7ybBwF03_*=%~_$_PO`J7zQPtlo@& zkI%Ficz{j`mX;_YmaNT%?i%82+^TXW4$(GdsNE*D7kD&%BPWoSH8OxNk9J%Ty%oi` zmaY4R=osc0fj&_A4Mqg|Y>qi1p024qIgfx06kvjo-ZJTCc!e?ozWf(yYb&rR?u_&H zj|{5%r}6>Fz_W21DoR}|5u3u-1e=1HEiG<_(#@vIo1iD<{BHd+vFk%z@AAZcm8EuH zx6$2ou``o%*^!n))}b56WE06+(Mpi7HSmGi37VtYQWeUgmXrnasAW%?q49OuuOS$$YlUOFRZpA?2%Cl|88ER4GmDKuln9^r^qq6#>(~55 z;?L3%9K>SunmRYMgG2t<>pH#9GZ^Clq0po*XF-P59yDITb+JCzOwWJSHH2F1avxI0 zqo?l~bm9(`WP>yi$&U%ej6U8D?1AR%t*JDhCFVz6RWw{A+in4~14Voo0SUWAI9^d{ zM*eL$TE0-7e>|D)@9+cf_hC+g0Y*5jy6%iEs?Ehq48=Atk_c%|x+Cl&faByO7*SZ`;D^me=NR#Ng~ zd%}tt-d7xmg5B0p^w(;9Tlz~Y$nUm`W9DU@O^ki}6gXpYDRymBi>9-Lux`2UR@G}p zUS7~)Fgn$jM(lKpABk5uz6L|W-i13de)ai}^!bH8%1ZICZt5z2K^!Jt*69O7zGm-M zi;W7a36}k&SzavS(hZoBO1*bFkjz{qy(k^)3BN73OtW+;x*kee=?2&T3RL!5gS;T! zDT^;0e_5LXZ7ug)obwF<88H!%QgYGN>aU8ZJna3OR6Qe~KnMT(7}Kdh4Q?2^GXRAo z^&xIk4}wcXEl{076IP(WkGmmX(tn7$GL<)e-crR6#Yhz2aof~#F~Sd-%6^0z>%P4c zcurBEPw!c>U+K3Jb!r0PVP9(u_MPG#ub&5JKVq<8_h3aqktj!LWp0eI^B-NS>VByA z#3L>&A5Z#A=fb8*@?>7|;z-NE7Sdo?ihZ43Mxx!_N9UuR!d?OuvmA-rGKM8fH)0O3 zMmb3`uYE>RK{8Qmm)0i(O{rn<<)mls`TyI)FaICB?|;1g|6&KH3h|d^ke#kx-F+uW z^unr2uxf{2jy!)%M9O4bCVV!8JTXLllHpNwj2n8?%4;h^>3OWkP|R8YZ@T~~Aez|d z-mV<>=);8~rL$8;=dLNV`$7!)4`0tr5N>dXUka#521V(y2^5E?O*mq!0)jIH#|Il-e$j&nn$dmDPGGp|Ex#iGR&Keg11(z{^LKQE?bd8p(j zeQ!*tRGRAsJh5vPGkI)(>8*A=(OhEY{nIPS$AuVgy&Ah*U-kI%vuKJbkyTEbmJ>Te zly3+zx}-Z!ouRStE)>1IP01>Jti`9HzFOy}U5}>Snoig%$a#}lpKHz$9m*KXXlyTG zyb6X^4*!YlLx3rubdy-Z!Zw^{PHHm@oW*`5F z?L1FhW5RkEj{acVg1u!jH3%D&NUhm6?D4dA)1YqIW^Wpn%q;Zw@(aX>veyKaPA&zZ zTF{xuU(}#U3{@w7w900Wx-fz;I2axhE+z0a;aP_Jt#7?uB2c#P-F{b;r&oC);gcuj zYON5XwVKjr=dRkE-ryeW^eHH^2aUI$W*;6RgI8}nW|9E^fbI>V)q1pu+K4$1MK<|a zP6+SK?^M$VSj8%4`9jbi0dIp%!| zkHz+MDn_q6?O!QN~Q06iModEn50%UjZM7Ozpn&aG!j*fQK$6KgzL(_{( zN=U3?!c7TgeL06MhXIs+AMg3Jdxw+1?;6RAnGEcr=!9I-K{It{F5T}c(r0LBh#rN2 zdju?Wv4|2@-I6xU^ImpD`+FN{&=46LiD&k~SsRj|kUXX`@@!G?M2V!ctX$+;fN1b5 zrffQ!z$GrpF02xl30%^`r(sH%t%q-PTluh<=9PGT?I_I0tE}Y;VM$s#3U;H#3TEkpUgUHTY-tt7W}w9uPOo${fo{O}g#Rm}%Kya(gx&A58G9L>`^uu-B>UQ|v0>>(18)-EfT~v9FTQ>0g>B9@qEQ&Dh7% zlIn?boeLugbAQIKHuuk<>=ddwXe%enR%St2H10B zWSeI?k#}lqK^7#xwk>T3NX+=8qrjy9pbq%TXUtYXIfN{E(yec!Pw(Na>|{Pb;+pne z{U1-7dNqCE=nKC*UvXx@q4EPnXt3B>A1=uvSG>R5>TkIrIf1u@V425uUbQ)uPcE3t zS9>q!>VsH#9Xa;{+AXyXgL2};Qa1FaWmdy$D0M{|+|ZFm(U(=)>284&-WmtnI)udE zr=Kjola09di)u<2V!RVYN2)~LHfb~1vt2f#nzqXD>G^fvJCM{LIiGuQQaAxOV zPI=F4+VTK*USwimj}3p``|{?a1+esff@roudNu3|lY5rfx-%98k_*rs%+Ysx`kbKI zo-1=n7XJpp{-nLso2@Q+BX&ePTpDQ40NOc(*+8;wxPzxE&EmmJy^6c9aYe?@xuH?l z?I|5(ef)h-=I-{%>49rg=x1dhl>prhV{Yi}3hb0QYhH>40(V5mT`z(!oD^r?3oE>Q z@iWePxW@NHd3=G{=xdEntnQP{t%oR<+zen&X-VuPWPZmLDd6VdQ%9~|(P&Y9{NT@M9&e=f z;i(1HGk4dBuj7z^D9DXsIWb<@i(u7rTd$hP?>LK|atfYg z!}@L>_c`|1F;$4c?WZa17Dmz1Qlk$&HsIWuJ*@7NtbO(qWc*Eo82pr5D-8LB8~USp z(Kh13x|iwKlZxa`YAooH}#}#*9_=>VZ<$^>ZRP zvm#89wC3@X356_xo`b)Qx7MrMzX&tH4}OU!Pb88he>|I}-I!Rv*@0_2-+#HL@~!OV zsbozzgWZ_zExo$$+ZB@YwXH>B+%V{lfOJRZ59`x1QP>MiqOr(=X z1bdD-5r%DlD~dd3W#T$ydGHd%#hdj`wlToCumb#(;+Cd$i@AHJi&FpSNT_+pG z1aVBok!8hh^HER~qR7c}0Odei@aO0t(bg>@+RPolqx45l@c{1=%S)tDW4S!TmCB#} znbp072|tyocaq$&$DPby=G=@ZXddx{sx$Z4g@g z=2r(C>cK?%I}da6l=Ul7a}7?>1tVf_{mYqei|-Y&kCDD6)G181yj`8p6hi$iw-Q-s zI%mA4w-`-fIdXuPVt))BYIHwGdXM{hoxpeZ^Dr*F}G2|6>m51!I5mU zw^UZS9in+TqOjaKCoOkeD9X-Cmp4aV>TqM6Z^0EC=d+>59%pFMqY<|`Uh6yg@htfB z#vt_3pa6Mz#z&f1b@k{-0&t&}@b`;X?j`#qnB2!txb(@kMFY6GphPcPUPXH{Y=r*I zf9NdH3FK2xs}1uyy^QfPK0Yh2n0UkL{M^>?Pix=hiPBRXrib~s=2qcdmkt<43=&_?P>%QvxB%Q&x4q#C5!%%u6Jr?KCt(+FII8W7 zR=(V-h3y0AmuKcS(GqcpOAy!gyK2g)3Zt){qh8rO^+D@U-T4FmZ`Dt;xV3SVTQIRH z@VZr+Jm^4V37D-L=Z~yGcGl-g zsk{#6cL4`6*6>|Id6tu-BnoknXGm(FZ@u+CE%TUzsaL=zR)2Eb{b5UqQ|*Y+gJAKF zhy%du2{+}9m6jmWa{1qvg)8|0BE9PoKKz8nxQ|v3(7k3!k^7#T3(N@YcAsJ!`mz5x zo90aG%_;Gww8wx`Q`YILk95DH^}S_|=RgNC6-6`3$F{;GfXM=_)!S@gt<&18IY4jl zy}QB6s^8B}r^!Hbm+aY9Uj>{)J`)3TIEptVfSH>`&BUA^Tsi7t@{vbB=V3kKvLnfT zuzm+Fxw^fRy}SN#0_AodBpwIz6=0PjcXk9n6t_3)1jy%BrzWyN26|@|_3;KHypTISd5;!RiJxGexgOwwMSOa*Pq>5+MQcSLi{y&rpML?ev& z?^DVy&$~{K%lT|tM#$Iok)f@>zR+Ueo=GvlLQ*BBdsWdz9Zry$};+P%rSB5nNN z+su89>G9QOb`@x?cQ>F@HPv=AAvlAT%9ueSbXKWxE|fd@11lwLr8p zzkZ~^*CV5vvh82V`rYzx(* zu-{x;Zf>vjHE24EKPT+Zua+y#ii@T{&Tw)`O#o&?=CWp0Je$374)mrf95v9sdsIp7 zx`%a4>CL7Bob_ai(az^~qGpdlO~fRd!aUC05~F)-Z%{W1`}d`^u^JJ)h01p)OuLcQ z-CfU)x?LG%_wPh2FbzLSs>m<=dMOIV(%^q;eg71JIa%d>fXxhR9GdpX!8=#&j}StN zwe5g$@p9nJ6gSZkbIV5$7tLl;SIehnq!uwc9l6YfyR1W+QmB-~?$7ZenkO@^kx$*F zF{@+`PZIjUpv{zrile}&_xeuv<&g9gof$qA`uZMNXH<-nm!DH&y7cZ@|Nd{rZt1$b z%>%i^Pf)Pruc24=3b?M>HI6tfc7UceJ1ojN`+Lb0SWA_wS2pP#ZFpjjw^%${>=M0X zzYWMi%t7A9zJSZP354~ouUiUVYfwY>H0$!~rUD8;91(Mgo;z>}Qg1MA|BYm#H;uGZ zA}$NS%>9&tee>6HE4V}_Rmj7Ly)7w~oY?wcf8S_6v-Q-n&bkm6Y`KanH}p|vh##Ae zSv-=3Gh6p+l+o5mf`6Jp*?TwsXOrpDIcV50cG%j^@))4V(L69`%t-~+vD+!rgn)?l zu<4H+w6hAL#eKW1L(Nb8hOuLA+Lp%w)r{snr{B}=d8MnVvNeQB%!6(5OR_qSy?D76 zt?h;NQB-t{z%mQ*>V?7FOqQ{RUa-pZ;h9%$CqN?eqhXXGw9Q?pqEGL1;lh66mMN9* zPi_(BfPDkU3B2vTPsnWb#B7T$@@gzU56*vi+6qN@BBtt=*j6^GSlhBxV9#X?Bqe~j zLQR9^{M#UduxL6sCth;Ou-F%y&-?qYZkHf`(vLezK>Cp>R$JT387XqEs)n97m7C6L zfbzMJKZ%MFuF&m-WtqSQW`EoZ&hVU?80J^l*&#tmr|xe-Wjy^8;&3D1fR zxkY-HktN!ciyvs1^8zz}La0-c)_*S}Cz)j_DJdWx2cuIjf=TC9w1;{T+zv(>(e!;W zY$JcKRggB4x-+~Y`EgNLfkQn;;WM`oz-`!|E(LH|x`l`91aN))3|KuS4Sve4i z!m^bwpf+41gntFeBvOltFN_*U6b~%QbtEz>*VJ|=4G;aPH4OZktgMBN5nh~` zTn#GQ%jPR1udW5{OnT%Q_LMsez$VrL={K4RW}y8ZF&KZ*04fz0^L?wwr*6fJ;PKE0 z<3PM3PzLLxy-UgvZJu2I z7Mh0>qXZ{V=@?BXUR41s9mKb0TKEg=i`0*ZMjr8-FUrIIoy7+a6L-W9;5}^1Tl$4XzP@#!Dum8i)3@pOJICqd${)*!oJYlOgKVUM0=F))>E%zKLp@okpO8zDF|F@JP#oCi|5=f$J zo}8Bx)c(5`_LugW+N^n`_QL92aS}S_k3nVrE%)*B<;@e1ug{Z=X984;Szq?H@rt#x zPKua4>726+yN`Qz5dtuYtxq4Ysc1@RO0`zD9aqwUDB%7lzc|t?M|2gID-Vg;Enk#z0=Ig&G>VJP^;fFpwELDHK~I3wp-!LY74&sVQm&Tz)$l-1ii3q)7keOHJx zx)jypW{!(YO%hTNuum4c3s3A#A^RTTis7FSLFcRHiyldrW`97DQmOi0oJl2$tM^T% zy#*w*kt)Z}Z2K5#dLl``fiRYOD7D)3Q&~Usm*^Qu$q4tX;x&E;qrAZ=^YDk&WHLPl zA!Tlo9R8v&OU(%|-f`X-g->yVs?g+2%y!L?8IQxAeluQ&8(?tb{OLheBHQK7Kq1EI zj?PYl^mDp{p7$?<7C&8|g&eQ3TDEn96ojBf81!nh!K`Sy z$XD@+e(%!S`aSWbQN@<=YHjbbk#K6-IHhWJs+wvzV6M0f(0S(ha7KLfxS^IXKLz}} zpW(~w#rv>mXF8o9hyiTZ;*agx6^a04&8Bj5x~6-uq%oRF0y_tOD(gDps--CmSU9)4 z`kS@DV3G$`CrHF2-KHfx-t1ig&aIGmv)PgVTcCfksRZYmt@vB7AT*wQzKm=>F|_W; zU2quuESH$wgUEq=4ku`bdkxGM;el0L(1K)P1U!KF+r$ zHQj${ZH3CL&M{3A1iGzXCNsV_w)C}2BAFmf13wT-OS(6xUqTqo%C_QGR+U%uy6g%+he)ttK&U=KdhwTmp79#GAf5p zD)=aU2fgwiPkZlm>3@;_-MrSSXZ{{AjhFjNNctwlpV1ZPy+u&UQ-%;`w)qNl*i{5< z(uIJG&?~Oz)oWBef5vZFc0C1dsI%AGd#zn7eIc>_E?uEOYyfq>G*A`6js=C$obd9s zYftm1|#?B+CG=gV6~~LBTf7Z z&1KZ?!m6iQ#iQ)^r{$L#^T5uH{Y-@iSq~_t3v~qWvU`?si4a4tZ|ie>=%g!sgp_~V zXVgoz^2M*u(LSf+CGg!fW}fcqR~7@I@6T3zzu`8w1=q9iulGSy>!P2QVSKwOa|bHBG}wOONPOszWG7PEAM$8{h~)-#~0cQ6)n`RDDnMk~@zTsYS^v0TC* zrDMkpm0Sq@HbJ=EeF0Yyy5ShQ8>FhE$VnZdyMr~I4mm!Qn0*_goY6-ynXY>z8^i-D zA~AFo09w7d6B|K2D>d{AzOl*K9zpf3ou}@>q?n-gJ;&(I_)t9Kbwpn=q@b>j0S_;8 z$9#1_T1g!fFYU?4UN7lr3S17#4d3XN$@lvy3pY)QTbZbRZ|8&A8hun|wRk(X=no39Zmz`a~J+~41PQm;1sI*{82r35cqtA#pJfxErkA)zy1sRL*B>$ diff --git a/Doc/html/general__tim_8c_source.html b/Doc/html/general__tim_8c_source.html index bc98ff1..9efe1e5 100644 --- a/Doc/html/general__tim_8c_source.html +++ b/Doc/html/general__tim_8c_source.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Src/general_tim.c Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Src/general_tim.c Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({
- + + -
+
195 GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
196 GPIO_InitStruct.Pull = GPIO_PULLUP;
197 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
-
198 GPIO_InitStruct.Alternate = GPIO_TIM_Alternate_Mapping(henc->htim->Instance);
+
198 GPIO_InitStruct.Alternate = GPIO_TIM_Alternate_Mapping(henc->htim->Instance);
199 if(GPIO_InitStruct.Alternate)
200 HAL_GPIO_Init(henc->GPIOx, &GPIO_InitStruct);
201
@@ -370,7 +362,7 @@ $(function(){initNavTree('general__tim_8c_source.html',''); initResizable(); });
255 else
256 GPIO_InitStruct.Pull = GPIO_PULLUP;
257 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
-
258 GPIO_InitStruct.Alternate = GPIO_TIM_Alternate_Mapping(htim->Instance);
+
258 GPIO_InitStruct.Alternate = GPIO_TIM_Alternate_Mapping(htim->Instance);
259 if(GPIO_InitStruct.Alternate)
260 HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
261
@@ -531,7 +523,7 @@ $(function(){initNavTree('general__tim_8c_source.html',''); initResizable(); });
403 * @brief Инициализация CLK и NVIC таймеров.
404 * @param htim Указатель на хендл таймера.
405 * @note Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров,
-
406 дефайнами в general_tim.h определяются используемые таймеры.
+
406 дефайнами @ref TIM_INIT в @ref general_tim.h определяются используемые таймеры.
407 */
408void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode)
@@ -742,7 +734,7 @@ $(function(){initNavTree('general__tim_8c_source.html',''); initResizable(); });
612 * @brief Деинициализация CLK и NVIC таймеров.
613 * @param htim Указатель на хендл таймера.
614 * @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров,
-
615 дефайнами в general_tim.h определяются используемые таймеры.
+
615 дефайнами @ref TIM_INIT в @ref general_tim.h определяются используемые таймеры.
616 */
617void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim)
@@ -857,7 +849,6 @@ $(function(){initNavTree('general__tim_8c_source.html',''); initResizable(); });
#define check_null_ptr_1(p1)
Проверить один указатель на NULL.
Definition mylibs_defs.h:38
#define check_null_ptr_3(p1, p2, p3)
Проверить три указателя на NULL.
Definition mylibs_defs.h:44
#define MyLibs_Error_Handler(params)
Error_Handler который будет вызыватся в библиотеке
Definition mylibs_defs.h:31
-
#define GPIO_TIM_Alternate_Mapping(INSTANCE)
Маппинг альтернативной функции TIM между GPIO.
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx)
Включить тактирование порта GPIO.
int GPIO_Read_Switch(GPIO_SwitchTypeDef *swstart)
Считать состоянии кнопки
HAL_StatusTypeDef GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State)
Инициализировать кнопку (структуру кнопки)
@@ -870,37 +861,38 @@ $(function(){initNavTree('general__tim_8c_source.html',''); initResizable(); });
HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef *stim)
Инициализация таймера.
Definition general_tim.c:34
void TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)
Деинициализация CLK и NVIC таймеров.
void TIM_Base_MspInit(TIM_HandleTypeDef *htim, TIM_ITModeTypeDef it_mode)
Инициализация CLK и NVIC таймеров.
-
TIM_ITModeTypeDef
Режим прерываний таймера
Definition general_tim.h:77
+
TIM_ITModeTypeDef
Режим прерываний таймера
Definition general_tim.h:78
HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN)
Инициализация выхода ШИМ таймера.
HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL)
Инициализация OC компаратора таймера.
-
Структура инициализации енкодера
-
TIM_Encoder_InitTypeDef sConfig
Указатель на структуру настройки энкодера
-
uint16_t Encoder_Shdw
Последние считанные тики
-
uint32_t GPIO_PIN_TI1
Пин, куда подключается канал TI1.
-
uint32_t GPIO_PIN_TI2
Пин, куда подключается канал TI2.
-
uint32_t GPIO_PIN_SW
Пин, куда кнопка энкодера (если есть)
-
int16_t Encoder_Diff
Считанная разница
-
GPIO_SwitchTypeDef Sw
Структура кнопки
-
GPIO_TypeDef * GPIOx
Порт, куда подключается энкодер
-
TIM_HandleTypeDef * htim
Указатель на HAL handle таймера
-
Структура инициализации таймера
-
uint8_t sTickBasePrescaler
Дополнительный делитель, для удобного деления sTickBaseUS.
-
TIM_MasterConfigTypeDef sMasterConfig
Настройки мастер режима таймера
-
TIM_ClockConfigTypeDef sClockSourceConfig
Настройки тактирования таймера
-
TIM_MHzTickBaseTypeDef sTickBaseUS
Длительность одного тика
-
float sTimAHBFreqMHz
Частота шины тактирования таймера
-
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig
Настройки дедтаймов таймера
-
TIM_SlaveConfigTypeDef sSlaveConfig
Настройки слейв режима таймера
-
TIM_ITModeTypeDef sTimMode
Настройки прерывания таймера
-
TIM_HandleTypeDef htim
HAL handle таймера
-
float sTimFreqHz
Желаемая частота таймера
+
Структура инициализации енкодера
+
TIM_Encoder_InitTypeDef sConfig
Указатель на структуру настройки энкодера
+
uint16_t Encoder_Shdw
Последние считанные тики
+
uint32_t GPIO_PIN_TI1
Пин, куда подключается канал TI1.
+
uint32_t GPIO_PIN_TI2
Пин, куда подключается канал TI2.
+
uint32_t GPIO_PIN_SW
Пин, куда кнопка энкодера (если есть)
+
int16_t Encoder_Diff
Считанная разница
+
GPIO_SwitchTypeDef Sw
Структура кнопки
+
GPIO_TypeDef * GPIOx
Порт, куда подключается энкодер
+
TIM_HandleTypeDef * htim
Указатель на HAL handle таймера
+
Структура инициализации таймера
+
uint8_t sTickBasePrescaler
Дополнительный делитель, для удобного деления sTickBaseUS.
+
TIM_MasterConfigTypeDef sMasterConfig
Настройки мастер режима таймера
+
TIM_ClockConfigTypeDef sClockSourceConfig
Настройки тактирования таймера
+
TIM_MHzTickBaseTypeDef sTickBaseUS
Длительность одного тика
+
float sTimAHBFreqMHz
Частота шины тактирования таймера
+
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig
Настройки дедтаймов таймера
+
TIM_SlaveConfigTypeDef sSlaveConfig
Настройки слейв режима таймера
+
TIM_ITModeTypeDef sTimMode
Настройки прерывания таймера
+
TIM_HandleTypeDef htim
HAL handle таймера
+
float sTimFreqHz
Желаемая частота таймера
+
diff --git a/Doc/html/general__tim_8h.html b/Doc/html/general__tim_8h.html index 02f3cb8..eb1d4bc 100644 --- a/Doc/html/general__tim_8h.html +++ b/Doc/html/general__tim_8h.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_tim.h File Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_tim.h File Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
-
general_tim.h File Reference
@@ -113,109 +105,87 @@ $(function(){initNavTree('general__tim_8h.html',''); initResizable(); }); More...

#include "mylibs_defs.h"
#include "general_gpio.h"
-
- + Include dependency graph for general_tim.h:
+
Include dependency graph for general_tim.h:
-
- + This graph shows which files directly or indirectly include this file:
+
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

- - + - - + -

+

Classes

struct  TIM_SettingsTypeDef
struct  TIM_SettingsTypeDef
 Структура инициализации таймера More...
 
struct  TIM_EncoderTypeDef
struct  TIM_EncoderTypeDef
 Структура инициализации енкодера More...
 
- - - - - - - - - - - - - - - - - -

+

Macros

#define HAL_TIM_MODULE_ENABLED
 
#define USE_TIM1
 Включить TIM1 в TIM_Base_MspInit.
 
#define USE_TIM2
 Включить TIM2 в TIM_Base_MspInit.
 
#define USE_TIM3
 Включить TIM3 в TIM_Base_MspInit.
 
#define USE_TIM4
 Включить TIM4 в TIM_Base_MspInit.
 
#define USE_TIM5
 Включить TIM5 в TIM_Base_MspInit.
 
#define USE_TIM6
 Включить TIM6 в TIM_Base_MspInit.
 
#define USE_TIM7
 Включить TIM7 в TIM_Base_MspInit.
 
#define USE_TIM8
 Включить TIM8 в TIM_Base_MspInit.
 
#define USE_TIM9
 Включить TIM9 в TIM_Base_MspInit.
 
#define USE_TIM10
 Включить TIM10 в TIM_Base_MspInit.
 
#define USE_TIM11
 Включить TIM11 в TIM_Base_MspInit.
 
#define USE_TIM12
 Включить TIM12 в TIM_Base_MspInit.
 
#define USE_TIM13
 Включить TIM13 в TIM_Base_MspInit.
 
#define USE_TIM14
 Включить TIM14 в TIM_Base_MspInit.
 
#define TIM_IT_CONF_Pos   0
 
#define TIM_IT_CONF   (1<<(TIM_IT_CONF_Pos))
 
- -
} -

+

Enumerations

enum  TIM_ITModeTypeDef { TIM_DEFAULT = 0 , TIM_IT_MODE = (1<<( 0 )) }
 Режим прерываний таймера More...
 
enum  TIM_MHzTickBaseTypeDef {
  TIM_Base_Disable = 0 , TIM_TickBase_1US = 1 @@ -228,49 +198,37 @@ Enumerations
 Длительность тика таймера (частота тактирования таймера) More...
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +

+

Functions

HAL_StatusTypeDef TIM_Output_PWM_Init (TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN)
 Инициализация выхода ШИМ таймера.
 
HAL_StatusTypeDef TIM_OC_Comparator_Init (TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL)
 Инициализация OC компаратора таймера.
 
HAL_StatusTypeDef TIM_Encoder_Init (TIM_EncoderTypeDef *henc1, TIM_HandleTypeDef *htim)
 Инициализация режима энкодер у таймера.
 
HAL_StatusTypeDef TIM_Encoder_Read (TIM_EncoderTypeDef *henc)
 Считать энкодер.
 
int TIM_Encoder_ReadSwitch (TIM_EncoderTypeDef *henc)
 Считать кнопку энкодера.
 
HAL_StatusTypeDef TIM_Delay_Start (TIM_HandleTypeDef *htim)
 Начать отсчет неблокирующей задержки.
 
HAL_StatusTypeDef TIM_Delay (TIM_HandleTypeDef *htim, uint16_t delay)
 Задержка в тиках таймера (блокирующая).
 
HAL_StatusTypeDef TIM_Delay_NonBlocking (TIM_HandleTypeDef *htim, uint16_t delay)
 Задержка в тиках таймера (неблокирующая).
 
HAL_StatusTypeDef TIM_Base_Init (TIM_SettingsTypeDef *stim)
 Инициализация таймера.
 
void TIM_Base_MspInit (TIM_HandleTypeDef *htim, TIM_ITModeTypeDef it_mode)
 Инициализация CLK и NVIC таймеров.
 
void TIM_Base_MspDeInit (TIM_HandleTypeDef *htim)
 Деинициализация CLK и NVIC таймеров.
 
HAL_StatusTypeDef TIM_Delay_Start (TIM_HandleTypeDef *htim)
 Начать отсчет неблокирующей задержки.
HAL_StatusTypeDef TIM_Delay (TIM_HandleTypeDef *htim, uint16_t delay)
 Задержка в тиках таймера (блокирующая).
HAL_StatusTypeDef TIM_Delay_NonBlocking (TIM_HandleTypeDef *htim, uint16_t delay)
 Задержка в тиках таймера (неблокирующая).
HAL_StatusTypeDef TIM_Output_PWM_Init (TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN)
 Инициализация выхода ШИМ таймера.
HAL_StatusTypeDef TIM_OC_Comparator_Init (TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL)
 Инициализация OC компаратора таймера.
HAL_StatusTypeDef TIM_Encoder_Init (TIM_EncoderTypeDef *henc1, TIM_HandleTypeDef *htim)
 Инициализация режима энкодер у таймера.
HAL_StatusTypeDef TIM_Encoder_Read (TIM_EncoderTypeDef *henc)
 Считать энкодер.
int TIM_Encoder_ReadSwitch (TIM_EncoderTypeDef *henc)
 Считать кнопку энкодера.
-

Detailed Description

+

Detailed Description

Заголовочный файл для модуля инициализации таймеров и работы с ними.

Definition in file general_tim.h.

-

Macro Definition Documentation

+

Macro Definition Documentation

◆ TIM_IT_CONF_Pos

@@ -283,7 +241,7 @@ Functions
-

Definition at line 56 of file general_tim.h.

+

Definition at line 57 of file general_tim.h.

@@ -299,17 +257,25 @@ Functions
-

Definition at line 63 of file general_tim.h.

+

Definition at line 64 of file general_tim.h.

+ + diff --git a/Doc/html/general__tim_8h.js b/Doc/html/general__tim_8h.js index babcffb..d72435a 100644 --- a/Doc/html/general__tim_8h.js +++ b/Doc/html/general__tim_8h.js @@ -27,15 +27,15 @@ var general__tim_8h = [ "TIM_TickBase_10MS", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a7421a08abd119e71aa99eea5ab5d6daa", null ], [ "TIM_TickBase_100MS", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a18527a2d781eb4365aecd9a3184fc1da", null ] ] ], + [ "TIM_Base_Init", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga7044214f24a9868ba7e1650b55e639ec", null ], + [ "TIM_Base_MspInit", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#gaad47337be7ba2f6c0777c40d7278c931", null ], + [ "TIM_Base_MspDeInit", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga879e3f1c919c02990736730275367115", null ], + [ "TIM_Delay_Start", "group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga4c0dfde4e15f677600605348b4e97834", null ], + [ "TIM_Delay", "group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga88c552a133cb6e3015453cccab74c07e", null ], + [ "TIM_Delay_NonBlocking", "group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga108637af414bff3373059273b815ce9b", null ], [ "TIM_Output_PWM_Init", "group___m_y_l_i_b_s___t_i_m___o_c.html#gadb2f465d89f609e035867e980c3a29c6", null ], [ "TIM_OC_Comparator_Init", "group___m_y_l_i_b_s___t_i_m___o_c.html#gae2608ca8023e9a0713af0b4fbfbc1889", null ], [ "TIM_Encoder_Init", "group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc", null ], [ "TIM_Encoder_Read", "group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#gac3bc6525f88c275e47eb864e6d567501", null ], - [ "TIM_Encoder_ReadSwitch", "group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#ga117b795017e9e3a357ddefe323412761", null ], - [ "TIM_Delay_Start", "group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga4c0dfde4e15f677600605348b4e97834", null ], - [ "TIM_Delay", "group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga88c552a133cb6e3015453cccab74c07e", null ], - [ "TIM_Delay_NonBlocking", "group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga108637af414bff3373059273b815ce9b", null ], - [ "TIM_Base_Init", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga7044214f24a9868ba7e1650b55e639ec", null ], - [ "TIM_Base_MspInit", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#gaad47337be7ba2f6c0777c40d7278c931", null ], - [ "TIM_Base_MspDeInit", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga879e3f1c919c02990736730275367115", null ] + [ "TIM_Encoder_ReadSwitch", "group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#ga117b795017e9e3a357ddefe323412761", null ] ]; \ No newline at end of file diff --git a/Doc/html/general__tim_8h__dep__incl.map b/Doc/html/general__tim_8h__dep__incl.map index 3dcd765..e76bc39 100644 --- a/Doc/html/general__tim_8h__dep__incl.map +++ b/Doc/html/general__tim_8h__dep__incl.map @@ -1,7 +1,7 @@ - - - - - - + + + + + + diff --git a/Doc/html/general__tim_8h__dep__incl.md5 b/Doc/html/general__tim_8h__dep__incl.md5 index 2434b2c..abe2711 100644 --- a/Doc/html/general__tim_8h__dep__incl.md5 +++ b/Doc/html/general__tim_8h__dep__incl.md5 @@ -1 +1 @@ -74541afe89b6c16b8591605dc764fc98 \ No newline at end of file +44714191f83fa51a72cbc1377ffdbdff \ No newline at end of file diff --git a/Doc/html/general__tim_8h__dep__incl.png b/Doc/html/general__tim_8h__dep__incl.png index 6bb7cd86bb3cbc2e24cb8628422ba8482fdbdac9..c7c1671659597a001b31542966a438f42e3cd9d9 100644 GIT binary patch literal 5296 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 diff --git a/Doc/html/general__tim_8h__incl.map b/Doc/html/general__tim_8h__incl.map index 21eca5a..ee3bd57 100644 --- a/Doc/html/general__tim_8h__incl.map +++ b/Doc/html/general__tim_8h__incl.map @@ -1,12 +1,12 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Doc/html/general__tim_8h__incl.md5 b/Doc/html/general__tim_8h__incl.md5 index d78e9c9..c5ffabb 100644 --- a/Doc/html/general__tim_8h__incl.md5 +++ b/Doc/html/general__tim_8h__incl.md5 @@ -1 +1 @@ -8ec1d8e42b4cabc9ae1262ea0306324b \ No newline at end of file +8d2ac3de78aaeedbad6de045ad16b161 \ No newline at end of file diff --git a/Doc/html/general__tim_8h__incl.png b/Doc/html/general__tim_8h__incl.png index 481c01cecb7b44c23399e184001d443963333866..ac28d97f201037167334aba7572792f6a0547bcd 100644 GIT binary patch literal 7341 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 - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_tim.h Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_tim.h Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({ - + + -
+
12 - @ref MYLIBS_TIM_DELAY — функции задержки через таймеры (blocking и non-blocking).
13 - @ref MYLIBS_TIM_OC — настройка каналов Output Compare и PWM.
14 - @ref MYLIBS_TIM_ENCODER — работа с энкодерами, чтение положения и кнопки.
-
15* @note Требуется подключение модуля TIM в библиотеке HAL
-
16@code
-
17#define HAL_TIM_MODULE_ENABLED
-
18@endcode
-
19*************************************************************************/
-
20#ifndef __TIM_GENERAL_H_
-
21#define __TIM_GENERAL_H_
-
22
-
23/////////////////////////////////////////////////////////////////////
-
24/////////////////////////---USER SETTINGS---/////////////////////////
-
25/**
-
26 * @addtogroup TIM_INIT Init defines
-
27 * @ingroup MYLIBS_TIM_GENERAL
-
28 * @brief Настройка таймеров
-
29 * @{
-
30 */
-
31#define HAL_TIM_MODULE_ENABLED
-
32
-
33#define USE_TIM1 ///< Включить TIM1 в @ref TIM_Base_MspInit
-
34#define USE_TIM2 ///< Включить TIM2 в @ref TIM_Base_MspInit
-
35#define USE_TIM3 ///< Включить TIM3 в @ref TIM_Base_MspInit
-
36#define USE_TIM4 ///< Включить TIM4 в @ref TIM_Base_MspInit
-
37#define USE_TIM5 ///< Включить TIM5 в @ref TIM_Base_MspInit
-
38#define USE_TIM6 ///< Включить TIM6 в @ref TIM_Base_MspInit
-
39#define USE_TIM7 ///< Включить TIM7 в @ref TIM_Base_MspInit
-
40#define USE_TIM8 ///< Включить TIM8 в @ref TIM_Base_MspInit
-
41#define USE_TIM9 ///< Включить TIM9 в @ref TIM_Base_MspInit
-
42#define USE_TIM10 ///< Включить TIM10 в @ref TIM_Base_MspInit
-
43#define USE_TIM11 ///< Включить TIM11 в @ref TIM_Base_MspInit
-
44#define USE_TIM12 ///< Включить TIM12 в @ref TIM_Base_MspInit
-
45#define USE_TIM13 ///< Включить TIM13 в @ref TIM_Base_MspInit
-
46#define USE_TIM14 ///< Включить TIM14 в @ref TIM_Base_MspInit
-
47/** TIM_INIT
-
48 * @}
-
49 */
-
50/////////////////////////---USER SETTINGS---/////////////////////////
-
51#include "mylibs_defs.h"
-
52#include "general_gpio.h"
-
53
-
54/////////////////////////////////////////////////////////////////////
-
55////////////////////////////---DEFINES---////////////////////////////
-
56#define TIM_IT_CONF_Pos 0
-
57//#define TIM_PWM_CONF_Pos 1
-
58//#define TIM_CLCK_SRC_CONF_Pos 2
-
59//#define TIM_SLAVE_CONF_Pos 3
-
60//#define TIM_MASTER_CONF_Pos 4
-
61//#define TIM_BDTR_CONF_Pos 5
-
62
-
63#define TIM_IT_CONF (1<<(TIM_IT_CONF_Pos))
-
64//#define TIM_PWM_CONF (1<<(TIM_PWM_Pos))
-
65
-
66////////////////////////////---DEFINES---////////////////////////////]
-
67
+
15
+
16* @note Требуется подключение модуля TIM в библиотеке HAL и GPIO (@ref MY_LIBS_GPIO) из MyLibs
+
17@code
+
18#define HAL_TIM_MODULE_ENABLED
+
19@endcode
+
20*************************************************************************/
+
21#ifndef __TIM_GENERAL_H_
+
22#define __TIM_GENERAL_H_
+
23
+
24/////////////////////////////////////////////////////////////////////
+
25/////////////////////////---USER SETTINGS---/////////////////////////
+
26/**
+
27 * @addtogroup TIM_INIT Init defines
+
28 * @ingroup MYLIBS_TIM_GENERAL
+
29 * @brief Настройка таймеров
+
30 * @{
+
31 */
+
32#define HAL_TIM_MODULE_ENABLED
+
33
+
34#define USE_TIM1 ///< Включить TIM1 в @ref TIM_Base_MspInit
+
35#define USE_TIM2 ///< Включить TIM2 в @ref TIM_Base_MspInit
+
36#define USE_TIM3 ///< Включить TIM3 в @ref TIM_Base_MspInit
+
37#define USE_TIM4 ///< Включить TIM4 в @ref TIM_Base_MspInit
+
38#define USE_TIM5 ///< Включить TIM5 в @ref TIM_Base_MspInit
+
39#define USE_TIM6 ///< Включить TIM6 в @ref TIM_Base_MspInit
+
40#define USE_TIM7 ///< Включить TIM7 в @ref TIM_Base_MspInit
+
41#define USE_TIM8 ///< Включить TIM8 в @ref TIM_Base_MspInit
+
42#define USE_TIM9 ///< Включить TIM9 в @ref TIM_Base_MspInit
+
43#define USE_TIM10 ///< Включить TIM10 в @ref TIM_Base_MspInit
+
44#define USE_TIM11 ///< Включить TIM11 в @ref TIM_Base_MspInit
+
45#define USE_TIM12 ///< Включить TIM12 в @ref TIM_Base_MspInit
+
46#define USE_TIM13 ///< Включить TIM13 в @ref TIM_Base_MspInit
+
47#define USE_TIM14 ///< Включить TIM14 в @ref TIM_Base_MspInit
+
48/** TIM_INIT
+
49 * @}
+
50 */
+
51/////////////////////////---USER SETTINGS---/////////////////////////
+
52#include "mylibs_defs.h"
+
53#include "general_gpio.h"
+
54
+
55/////////////////////////////////////////////////////////////////////
+
56////////////////////////////---DEFINES---////////////////////////////
+
57#define TIM_IT_CONF_Pos 0
+
58//#define TIM_PWM_CONF_Pos 1
+
59//#define TIM_CLCK_SRC_CONF_Pos 2
+
60//#define TIM_SLAVE_CONF_Pos 3
+
61//#define TIM_MASTER_CONF_Pos 4
+
62//#define TIM_BDTR_CONF_Pos 5
+
63
+
64#define TIM_IT_CONF (1<<(TIM_IT_CONF_Pos))
+
65//#define TIM_PWM_CONF (1<<(TIM_PWM_Pos))
+
66
+
67////////////////////////////---DEFINES---////////////////////////////]
68
-
69
-
70/////////////////////////////////////////////////////////////////////
-
71///////////////////////---STRUCTURES & ENUMS---//////////////////////
-
72/**
-
73 * @brief Режим прерываний таймера
-
74 * @ingroup MYLIBS_TIM_GENERAL
-
75 */
-
-
76typedef enum
-
77{
-
78 TIM_DEFAULT = 0, ///< Прерываний отключены
-
79 TIM_IT_MODE = TIM_IT_CONF, ///< Прерываний включены
-
80// TIM_PWM_MODE = TIM_PWM_ENABLE,
-
81// TIM_PWM_IT_MODE = TIM_PWM_ENABLE | TIM_IT_CONF,
- +
69
+
70
+
71/////////////////////////////////////////////////////////////////////
+
72///////////////////////---STRUCTURES & ENUMS---//////////////////////
+
73/**
+
74 * @brief Режим прерываний таймера
+
75 * @ingroup MYLIBS_TIM_GENERAL
+
76 */
+
+
77typedef enum
+
78{
+
79 TIM_DEFAULT = 0, ///< Прерываний отключены
+
80 TIM_IT_MODE = TIM_IT_CONF, ///< Прерываний включены
+
81// TIM_PWM_MODE = TIM_PWM_ENABLE,
+
82// TIM_PWM_IT_MODE = TIM_PWM_ENABLE | TIM_IT_CONF,
+
-
83
-
84/**
-
85 * @brief Длительность тика таймера (частота тактирования таймера)
-
86 * @ingroup MYLIBS_TIM_GENERAL
-
87 * @details enum дает базовые длительности, но можно выставить другие
-
88 * (напр 500 - 0.5 мс)
-
89 */
-
-
90typedef enum
-
91{
-
92 TIM_Base_Disable = 0, ///< Таймер отключен
-
93 TIM_TickBase_1US = 1, ///< Таймер тактируется с частотой 1 МГц
-
94 TIM_TickBase_10US = 10, ///< Таймер тактируется с частотой 100 кГц
-
95 TIM_TickBase_100US = 100, ///< Таймер тактируется с частотой 10 кГц
-
96 TIM_TickBase_1MS = 1000, ///< Таймер тактируется с частотой 1 кГц
-
97 TIM_TickBase_10MS = 10000, ///< Таймер тактируется с частотой 100 Гц
-
98 TIM_TickBase_100MS = 100000, ///< Таймер тактируется с частотой 10 Гц
- +
84
+
85/**
+
86 * @brief Длительность тика таймера (частота тактирования таймера)
+
87 * @ingroup MYLIBS_TIM_GENERAL
+
88 * @details enum дает базовые длительности, но можно выставить другие
+
89 * (напр 500 - 0.5 мс)
+
90 */
+
+
91typedef enum
+
92{
+
93 TIM_Base_Disable = 0, ///< Таймер отключен
+
94 TIM_TickBase_1US = 1, ///< Таймер тактируется с частотой 1 МГц
+
95 TIM_TickBase_10US = 10, ///< Таймер тактируется с частотой 100 кГц
+
96 TIM_TickBase_100US = 100, ///< Таймер тактируется с частотой 10 кГц
+
97 TIM_TickBase_1MS = 1000, ///< Таймер тактируется с частотой 1 кГц
+
98 TIM_TickBase_10MS = 10000, ///< Таймер тактируется с частотой 100 Гц
+
99 TIM_TickBase_100MS = 100000, ///< Таймер тактируется с частотой 10 Гц
+
-
100
-
101/**
-
102 * @brief Структура инициализации таймера
-
103 * @ingroup MYLIBS_TIM_GENERAL
-
104 * @details
-
105 * Содержит все базовые структуры, которые нужны для инициализации таймера.
-
106 * Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами
-
107 *
-
108 * Также высокоуровневые настройки частоты работы таймера.
-
109 * Если какая-либо высокоуровневая настройка не задана, то
-
110 * по возможности берется низкоуровневая настройка из структур
-
111 */
-
-
112typedef struct // struct with settings for custom function
-
113{
-
114 TIM_HandleTypeDef htim; ///< HAL handle таймера
-
115 TIM_ClockConfigTypeDef sClockSourceConfig; ///< Настройки тактирования таймера
-
116 TIM_SlaveConfigTypeDef sSlaveConfig; ///< Настройки слейв режима таймера
-
117 TIM_MasterConfigTypeDef sMasterConfig; ///< Настройки мастер режима таймера
-
118 TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; ///< Настройки дедтаймов таймера
-
119
-
120 TIM_ITModeTypeDef sTimMode; ///< Настройки прерывания таймера
-
121 TIM_MHzTickBaseTypeDef sTickBaseUS; ///< Длительность одного тика
-
122 uint8_t sTickBasePrescaler; ///< Дополнительный делитель, для удобного деления @ref sTickBaseUS
-
123 float sTimAHBFreqMHz; ///< Частота шины тактирования таймера
-
124 float sTimFreqHz; ///< Желаемая частота таймера
-
125
- +
101
+
102/**
+
103 * @brief Структура инициализации таймера
+
104 * @ingroup MYLIBS_TIM_GENERAL
+
105 * @details
+
106 * Содержит все базовые структуры, которые нужны для инициализации таймера.
+
107 * Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами
+
108 *
+
109 * Также высокоуровневые настройки частоты работы таймера.
+
110 * Если какая-либо высокоуровневая настройка не задана, то
+
111 * по возможности берется низкоуровневая настройка из структур
+
112 */
+
+
113typedef struct // struct with settings for custom function
+
114{
+
115 TIM_HandleTypeDef htim; ///< HAL handle таймера
+
116 TIM_ClockConfigTypeDef sClockSourceConfig; ///< Настройки тактирования таймера
+
117 TIM_SlaveConfigTypeDef sSlaveConfig; ///< Настройки слейв режима таймера
+
118 TIM_MasterConfigTypeDef sMasterConfig; ///< Настройки мастер режима таймера
+
119 TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; ///< Настройки дедтаймов таймера
+
120
+
121 TIM_ITModeTypeDef sTimMode; ///< Настройки прерывания таймера
+
122 TIM_MHzTickBaseTypeDef sTickBaseUS; ///< Длительность одного тика
+
123 uint8_t sTickBasePrescaler; ///< Дополнительный делитель, для удобного деления @ref sTickBaseUS
+
124 float sTimAHBFreqMHz; ///< Частота шины тактирования таймера
+
125 float sTimFreqHz; ///< Желаемая частота таймера
+
126
+
-
127
-
128
-
129/**
-
130 * @brief Структура инициализации енкодера
-
131 * @ingroup MYLIBS_TIM_ENCODER
-
132 * @details
-
133 * Содержит все базовые структуры, которые нужны для инициализации таймера.
-
134 * Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами
-
135 *
-
136 * Также высокоуровневые настройки частоты работы таймера.
-
137 * Если какая-либо высокоуровневая настройка не задана, то
-
138 * по возможности берется низкоуровневая настройка из структур
-
139 */
-
-
140typedef struct // struct with variables for encoder
-
141{
-
142 int16_t Encoder_Diff; ///< Считанная разница
-
143 uint16_t Encoder_Shdw; ///< Последние считанные тики
-
144
-
145 TIM_HandleTypeDef *htim; ///< Указатель на HAL handle таймера
-
146 TIM_Encoder_InitTypeDef sConfig; ///< Указатель на структуру настройки энкодера
-
147
-
148 GPIO_TypeDef *GPIOx; ///< Порт, куда подключается энкодер
-
149 uint32_t GPIO_PIN_TI1; ///< Пин, куда подключается канал TI1
-
150 uint32_t GPIO_PIN_TI2; ///< Пин, куда подключается канал TI2
-
151 uint32_t GPIO_PIN_SW; ///< Пин, куда кнопка энкодера (если есть)
-
152
-
153 GPIO_SwitchTypeDef Sw; ///< Структура кнопки
-
154
- +
128
+
129
+
130/**
+
131 * @brief Структура инициализации енкодера
+
132 * @ingroup MYLIBS_TIM_ENCODER
+
133 * @details
+
134 * Содержит все базовые структуры, которые нужны для инициализации таймера.
+
135 * Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами
+
136 *
+
137 * Также высокоуровневые настройки частоты работы таймера.
+
138 * Если какая-либо высокоуровневая настройка не задана, то
+
139 * по возможности берется низкоуровневая настройка из структур
+
140 */
+
+
141typedef struct // struct with variables for encoder
+
142{
+
143 int16_t Encoder_Diff; ///< Считанная разница
+
144 uint16_t Encoder_Shdw; ///< Последние считанные тики
+
145
+
146 TIM_HandleTypeDef *htim; ///< Указатель на HAL handle таймера
+
147 TIM_Encoder_InitTypeDef sConfig; ///< Указатель на структуру настройки энкодера
+
148
+
149 GPIO_TypeDef *GPIOx; ///< Порт, куда подключается энкодер
+
150 uint32_t GPIO_PIN_TI1; ///< Пин, куда подключается канал TI1
+
151 uint32_t GPIO_PIN_TI2; ///< Пин, куда подключается канал TI2
+
152 uint32_t GPIO_PIN_SW; ///< Пин, куда кнопка энкодера (если есть)
+
153
+
154 GPIO_SwitchTypeDef Sw; ///< Структура кнопки
+
155
+
-
156///////////////////////---STRUCTURES & ENUMS---//////////////////////
-
157
-
158/////////////////////////////////////////////////////////////////////
-
159///////////////////////////---FUNCTIONS---///////////////////////////
-
160/**
-
161 * @addtogroup MYLIBS_TIM_OC PWM/OC Channels tools
-
162 * @ingroup MY_LIBS_TIM
-
163 * @brief Функции для инициализации базовых функций каналов таймера
-
164 * @{
-
165 */
-
166/* Initialize PWM Channel and GPIO for output */
-
167HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN);
-
168/* Initialize OC Comparator */
-
169HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL);
-
170/** MYLIBS_TIM_ENCODER
-
171 * @}
-
172 */
-
173
-
174/**
-
175 * @addtogroup MYLIBS_TIM_ENCODER Encoder tools
-
176 * @ingroup MY_LIBS_TIM
-
177 * @brief Функции для считывания энкодера
-
178 * @{
-
179 */
-
180/* Initialize TIM Encoder functional */
-
181HAL_StatusTypeDef TIM_Encoder_Init(TIM_EncoderTypeDef *henc1, TIM_HandleTypeDef *htim);
-
182/* Считать энкодер */
-
183HAL_StatusTypeDef TIM_Encoder_Read(TIM_EncoderTypeDef *henc);
-
184/* Считать кнопку энкодера */
- -
186/** MYLIBS_TIM_ENCODER
-
187 * @}
-
188 */
-
189
-
190/**
-
191 * @addtogroup MYLIBS_TIM_DELAY Delay tools
-
192 * @ingroup MY_LIBS_TIM
-
193 * @brief Функции для формирования задержек с помощью таймеров
-
194 * @{
+
157///////////////////////---STRUCTURES & ENUMS---//////////////////////
+
158
+
159/////////////////////////////////////////////////////////////////////
+
160///////////////////////////---FUNCTIONS---///////////////////////////
+
161/**
+
162 * @addtogroup MYLIBS_TIM_GENERAL General tools
+
163 * @ingroup MY_LIBS_TIM
+
164 * @brief Функции для базовой инициализации таймеров
+
165 * @par Пример использования:
+
166 @code
+
167 TIM_SettingsTypeDef tim2Settings;
+
168
+
169 void TIM2_Init(void)
+
170 {
+
171 // Настройка таймера TIM2 на 1 кГц с прерываниями с шагом таймера 10 мкс
+
172 tim2Settings.htim.Instance = TIM2;
+
173 tim2Settings.sTimMode = TIM_IT_MODE;
+
174 tim2Settings.sTickBaseUS = TIM_TickBase_10US;
+
175 tim2Settings.sTickBasePrescaler = 1;
+
176 tim2Settings.sTimFreqHz = 1000; // 1 кГц
+
177 tim2Settings.sTimAHBFreqMHz = 72000000; // Hz
+
178
+
179 if(TIM_Base_Init(&tim2Settings) != HAL_OK)
+
180 {
+
181 Error_Handler();
+
182 }
+
183 }
+
184 @endcode
+
185 * @{
+
186 */
+
187/* Initialize TIM with TIM_SettingsTypeDef structure */
+
188HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef* stim);
+
189/* Initialize TIMs clock and interrupt */
+
190void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode);
+
191/* DeInitialize TIMs clock and interrupt */
+
192void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim);
+
193/** MYLIBS_TIM_GENERAL
+
194 * @}
195 */
-
196/* Start delay via TIM */
-
197HAL_StatusTypeDef TIM_Delay_Start(TIM_HandleTypeDef *htim);
-
198/* Delay via TIM */
-
199HAL_StatusTypeDef TIM_Delay(TIM_HandleTypeDef *htim, uint16_t delay);
-
200/* Wait Delay via TIM without blocking app */
-
201HAL_StatusTypeDef TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay);
-
202/** MYLIBS_TIM_DELAY
-
203 * @}
-
204 */
-
205
-
206/**
-
207 * @addtogroup MYLIBS_TIM_GENERAL General tools
-
208 * @ingroup MY_LIBS_TIM
-
209 * @brief Функции для базовой инициализации таймеров
-
210 * @{
-
211 */
-
212/* Initialize TIM with TIM_SettingsTypeDef structure */
-
213HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef* stim);
-
214/* Initialize TIMs clock and interrupt */
-
215void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode);
-
216/* DeInitialize TIMs clock and interrupt */
-
217void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim);
-
218/** MYLIBS_TIM_GENERAL
-
219 * @}
-
220 */
-
221///////////////////////////---FUNCTIONS---///////////////////////////
-
222
-
223
-
224#endif // __TIM_GENERAL_H_
+
196
+
197/**
+
198 * @addtogroup MYLIBS_TIM_DELAY Delay tools
+
199 * @ingroup MY_LIBS_TIM
+
200 * @brief Функции для формирования задержек с помощью таймеров
+
201 * @par Пример использования:
+
202 @code
+
203 TIM_HandleTypeDef htim2;
+
204
+
205 // блокирующая задержка 500 тиков таймера
+
206 LED_ON();
+
207 TIM_Delay(&htim2, 500);
+
208 LED_OFF();
+
209
+
210
+
211 while(1)
+
212 {
+
213 // не блокирующая задержка 200 тиков таймера
+
214 if(TIM_Delay_NonBlocking(&htim2, 200) == HAL_OK)
+
215 {
+
216 TIM_Delay_Start(&htim2);
+
217 LED_TOOGLE();
+
218 }
+
219 }
+
220 @endcode
+
221 * @{
+
222 */
+
223/* Start delay via TIM */
+
224HAL_StatusTypeDef TIM_Delay_Start(TIM_HandleTypeDef *htim);
+
225/* Delay via TIM */
+
226HAL_StatusTypeDef TIM_Delay(TIM_HandleTypeDef *htim, uint16_t delay);
+
227/* Wait Delay via TIM without blocking app */
+
228HAL_StatusTypeDef TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay);
+
229/** MYLIBS_TIM_DELAY
+
230 * @}
+
231 */
+
232
+
233/**
+
234 * @addtogroup MYLIBS_TIM_OC PWM/OC Channels tools
+
235 * @ingroup MY_LIBS_TIM
+
236 * @brief Функции для инициализации базовых функций каналов таймера
+
237 * @par Пример использования:
+
238 @code
+
239 void PWM_Channel_Init_Example(void)
+
240 {
+
241 TIM_HandleTypeDef htim3;
+
242 TIM_OC_InitTypeDef sConfigOC;
+
243 GPIO_TypeDef *GPIOx = GPIOB;
+
244 uint32_t PWM_PIN = GPIO_PIN_0;
+
245
+
246 // Настройка таймера и канала PWM
+
247 TIM_Output_PWM_Init(&htim3, &sConfigOC, TIM_CHANNEL_1, GPIOx, PWM_PIN);
+
248
+
249 // Настройка компаратора OC
+
250 TIM_OC_Comparator_Init(&htim3, TIM_CHANNEL_1);
+
251 }
+
252 @endcode
+
253 * @{
+
254 */
+
255/* Initialize PWM Channel and GPIO for output */
+
256HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN);
+
257/* Initialize OC Comparator */
+
258HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL);
+
259/** MYLIBS_TIM_ENCODER
+
260 * @}
+
261 */
+
262
+
263/**
+
264 * @addtogroup MYLIBS_TIM_ENCODER Encoder tools
+
265 * @ingroup MY_LIBS_TIM
+
266 * @brief Функции для считывания энкодера
+
267 * @par Пример использования:
+
268 @code
+
269 TIM_EncoderTypeDef henc1;
+
270 TIM_HandleTypeDef htim4;
+
271
+
272 // инициализация
+
273 henc1.htim = &htim4;
+
274 henc1.GPIOx = GPIOA;
+
275 henc1.GPIO_PIN_TI1 = GPIO_PIN_0;
+
276 henc1.GPIO_PIN_TI2 = GPIO_PIN_1;
+
277 TIM_Encoder_Init(&henc1, &htim4);
+
278
+
279 // считывание энкодера и кнопки
+
280 int16_t delta = TIM_Encoder_Read(&henc1);
+
281 setpoint_tmp += delta;
+
282 if(TIM_Encoder_ReadSwitch(&henc1))
+
283 {
+
284 setpoint = setpoint_tmp; // подтвердить новое значение
+
285 }
+
286 @endcode
+
287 * @{
+
288 */
+
289/* Initialize TIM Encoder functional */
+
290HAL_StatusTypeDef TIM_Encoder_Init(TIM_EncoderTypeDef *henc1, TIM_HandleTypeDef *htim);
+
291/* Считать энкодер */
+
292HAL_StatusTypeDef TIM_Encoder_Read(TIM_EncoderTypeDef *henc);
+
293/* Считать кнопку энкодера */
+ +
295/** MYLIBS_TIM_ENCODER
+
296 * @}
+
297 */
+
298///////////////////////////---FUNCTIONS---///////////////////////////
+
299
+
300
+
301#endif // __TIM_GENERAL_H_
Заголовочный файл для модуля инициализации портов и работы с ними.
HAL_StatusTypeDef TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay)
Задержка в тиках таймера (неблокирующая).
HAL_StatusTypeDef TIM_Delay_Start(TIM_HandleTypeDef *htim)
Начать отсчет неблокирующей задержки.
@@ -349,50 +418,51 @@ $(function(){initNavTree('general__tim_8h_source.html',''); initResizable(); });
HAL_StatusTypeDef TIM_Encoder_Read(TIM_EncoderTypeDef *henc)
Считать энкодер.
HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef *stim)
Инициализация таймера.
Definition general_tim.c:34
void TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)
Деинициализация CLK и NVIC таймеров.
-
TIM_MHzTickBaseTypeDef
Длительность тика таймера (частота тактирования таймера)
Definition general_tim.h:91
+
TIM_MHzTickBaseTypeDef
Длительность тика таймера (частота тактирования таймера)
Definition general_tim.h:92
void TIM_Base_MspInit(TIM_HandleTypeDef *htim, TIM_ITModeTypeDef it_mode)
Инициализация CLK и NVIC таймеров.
-
TIM_ITModeTypeDef
Режим прерываний таймера
Definition general_tim.h:77
-
@ TIM_TickBase_10US
Таймер тактируется с частотой 100 кГц
Definition general_tim.h:94
-
@ TIM_TickBase_100US
Таймер тактируется с частотой 10 кГц
Definition general_tim.h:95
-
@ TIM_TickBase_100MS
Таймер тактируется с частотой 10 Гц
Definition general_tim.h:98
-
@ TIM_TickBase_1US
Таймер тактируется с частотой 1 МГц
Definition general_tim.h:93
-
@ TIM_TickBase_1MS
Таймер тактируется с частотой 1 кГц
Definition general_tim.h:96
-
@ TIM_TickBase_10MS
Таймер тактируется с частотой 100 Гц
Definition general_tim.h:97
-
@ TIM_Base_Disable
Таймер отключен
Definition general_tim.h:92
-
@ TIM_IT_MODE
Прерываний включены
Definition general_tim.h:79
-
@ TIM_DEFAULT
Прерываний отключены
Definition general_tim.h:78
+
TIM_ITModeTypeDef
Режим прерываний таймера
Definition general_tim.h:78
+
@ TIM_TickBase_10US
Таймер тактируется с частотой 100 кГц
Definition general_tim.h:95
+
@ TIM_TickBase_100US
Таймер тактируется с частотой 10 кГц
Definition general_tim.h:96
+
@ TIM_TickBase_100MS
Таймер тактируется с частотой 10 Гц
Definition general_tim.h:99
+
@ TIM_TickBase_1US
Таймер тактируется с частотой 1 МГц
Definition general_tim.h:94
+
@ TIM_TickBase_1MS
Таймер тактируется с частотой 1 кГц
Definition general_tim.h:97
+
@ TIM_TickBase_10MS
Таймер тактируется с частотой 100 Гц
Definition general_tim.h:98
+
@ TIM_Base_Disable
Таймер отключен
Definition general_tim.h:93
+
@ TIM_IT_MODE
Прерываний включены
Definition general_tim.h:80
+
@ TIM_DEFAULT
Прерываний отключены
Definition general_tim.h:79
HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN)
Инициализация выхода ШИМ таймера.
HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL)
Инициализация OC компаратора таймера.
Заголочный файл для дефайнов библиотеки MyLibsGeneral.
-
Структура кнопки
-
Структура инициализации енкодера
-
TIM_Encoder_InitTypeDef sConfig
Указатель на структуру настройки энкодера
-
uint16_t Encoder_Shdw
Последние считанные тики
-
uint32_t GPIO_PIN_TI1
Пин, куда подключается канал TI1.
-
uint32_t GPIO_PIN_TI2
Пин, куда подключается канал TI2.
-
uint32_t GPIO_PIN_SW
Пин, куда кнопка энкодера (если есть)
-
int16_t Encoder_Diff
Считанная разница
-
GPIO_SwitchTypeDef Sw
Структура кнопки
-
GPIO_TypeDef * GPIOx
Порт, куда подключается энкодер
-
TIM_HandleTypeDef * htim
Указатель на HAL handle таймера
-
Структура инициализации таймера
-
uint8_t sTickBasePrescaler
Дополнительный делитель, для удобного деления sTickBaseUS.
-
TIM_MasterConfigTypeDef sMasterConfig
Настройки мастер режима таймера
-
TIM_ClockConfigTypeDef sClockSourceConfig
Настройки тактирования таймера
-
TIM_MHzTickBaseTypeDef sTickBaseUS
Длительность одного тика
-
float sTimAHBFreqMHz
Частота шины тактирования таймера
-
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig
Настройки дедтаймов таймера
-
TIM_SlaveConfigTypeDef sSlaveConfig
Настройки слейв режима таймера
-
TIM_ITModeTypeDef sTimMode
Настройки прерывания таймера
-
TIM_HandleTypeDef htim
HAL handle таймера
-
float sTimFreqHz
Желаемая частота таймера
+
Структура кнопки
+
Структура инициализации енкодера
+
TIM_Encoder_InitTypeDef sConfig
Указатель на структуру настройки энкодера
+
uint16_t Encoder_Shdw
Последние считанные тики
+
uint32_t GPIO_PIN_TI1
Пин, куда подключается канал TI1.
+
uint32_t GPIO_PIN_TI2
Пин, куда подключается канал TI2.
+
uint32_t GPIO_PIN_SW
Пин, куда кнопка энкодера (если есть)
+
int16_t Encoder_Diff
Считанная разница
+
GPIO_SwitchTypeDef Sw
Структура кнопки
+
GPIO_TypeDef * GPIOx
Порт, куда подключается энкодер
+
TIM_HandleTypeDef * htim
Указатель на HAL handle таймера
+
Структура инициализации таймера
+
uint8_t sTickBasePrescaler
Дополнительный делитель, для удобного деления sTickBaseUS.
+
TIM_MasterConfigTypeDef sMasterConfig
Настройки мастер режима таймера
+
TIM_ClockConfigTypeDef sClockSourceConfig
Настройки тактирования таймера
+
TIM_MHzTickBaseTypeDef sTickBaseUS
Длительность одного тика
+
float sTimAHBFreqMHz
Частота шины тактирования таймера
+
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig
Настройки дедтаймов таймера
+
TIM_SlaveConfigTypeDef sSlaveConfig
Настройки слейв режима таймера
+
TIM_ITModeTypeDef sTimMode
Настройки прерывания таймера
+
TIM_HandleTypeDef htim
HAL handle таймера
+
float sTimFreqHz
Желаемая частота таймера
+
diff --git a/Doc/html/globals.html b/Doc/html/globals.html index 66ad2d8..772cd86 100644 --- a/Doc/html/globals.html +++ b/Doc/html/globals.html @@ -3,7 +3,7 @@ - + MyLibs: File Members @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
- + +
@@ -73,10 +71,9 @@ $(function() { +
Here is a list of all documented file members with links to the documentation:
-

- a -

+
diff --git a/Doc/html/globals_defs.html b/Doc/html/globals_defs.html index 29ec4f2..0d6f81e 100644 --- a/Doc/html/globals_defs.html +++ b/Doc/html/globals_defs.html @@ -3,7 +3,7 @@ - + MyLibs: File Members @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
Here is a list of all documented macros with links to the documentation:
-

- a -

+
diff --git a/Doc/html/globals_enum.html b/Doc/html/globals_enum.html index 5e793c5..6f657c5 100644 --- a/Doc/html/globals_enum.html +++ b/Doc/html/globals_enum.html @@ -3,7 +3,7 @@ - + MyLibs: File Members @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
+
diff --git a/Doc/html/globals_eval.html b/Doc/html/globals_eval.html index 6328d76..0a9db7f 100644 --- a/Doc/html/globals_eval.html +++ b/Doc/html/globals_eval.html @@ -3,7 +3,7 @@ - + MyLibs: File Members @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
+
diff --git a/Doc/html/globals_func.html b/Doc/html/globals_func.html index fca3e0d..4f8749e 100644 --- a/Doc/html/globals_func.html +++ b/Doc/html/globals_func.html @@ -3,7 +3,7 @@ - + MyLibs: File Members @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
Here is a list of all documented functions with links to the documentation:
-

- e -

+
diff --git a/Doc/html/graph_legend.html b/Doc/html/graph_legend.html index dc6f4f9..141b423 100644 --- a/Doc/html/graph_legend.html +++ b/Doc/html/graph_legend.html @@ -3,7 +3,7 @@ - + MyLibs: Graph Legend @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
  • A dark red arrow is used for private inheritance.
  • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
  • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
    +
    diff --git a/Doc/html/group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html b/Doc/html/group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html index 08e7802..91e6dff 100644 --- a/Doc/html/group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html +++ b/Doc/html/group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html @@ -3,7 +3,7 @@ - + MyLibs: Bit access defines @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Bit access defines
    +
    Bit access defines

    Макросы и typedef'ы для работы с битами в unsigned типах. More...

    -
    - + Collaboration diagram for Bit access defines:
    +
    Collaboration diagram for Bit access defines:
    - - - - - - - - - + + + +

    +

    Classes

    union  uint8_BitTypeDef
     
    union  uint16_BitTypeDef
     
    union  uint32_BitTypeDef
     
    union  uint64_BitTypeDef
     
    union  uint8_BitTypeDef
    union  uint16_BitTypeDef
    union  uint32_BitTypeDef
    union  uint64_BitTypeDef
    - - + - - + - - + - - + -

    +

    Macros

    #define uint8_bit(_uint8_, _bit_)   (*(uint8_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
    #define uint8_bit(_uint8_, _bit_)
     Получить n-й бит из uint8_t.
     
    #define uint16_bit(_uint8_, _bit_)   (*(uint16_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
    #define uint16_bit(_uint8_, _bit_)
     Получить n-й бит из uint16_t.
     
    #define uint32_bit(_uint8_, _bit_)   (*(uint32_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
    #define uint32_bit(_uint8_, _bit_)
     Получить n-й бит из uint32_t.
     
    #define uint64_bit(_uint8_, _bit_)   (*(uint64_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
    #define uint64_bit(_uint8_, _bit_)
     Получить n-й бит из uint64_t.
     
    -

    Detailed Description

    +

    Detailed Description

    Макросы и typedef'ы для работы с битами в unsigned типах.

    В этом файле определены макросы для получения значения конкретного бита^

  • Макросы возвращают 0 или 1.
  • -
  • Доступ реализован через приведение к union с битовыми полями, поэтому это безопасный способ работы с отдельными битами без ручного сдвига и маскирования.
  • +
  • Доступ реализован через приведение к union с битовыми полями, поэтому это безопасный способ работы с отдельными битами без ручного сдвига и маскирования.
  • -

    Macro Definition Documentation

    +

    Macro Definition Documentation

    ◆ uint8_bit

    @@ -177,16 +162,18 @@ Macros #define uint8_bit ( - _uint8_, + _uint8_, - _bit_ )   (*(uint8_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_ + _bit_ )
    - +Value:
    (*(uint8_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
    + +

    Получить n-й бит из uint8_t.

    Parameters
    @@ -211,16 +198,18 @@ Macros - + - +
    #define uint16_bit ( _uint8_, _uint8_,
    _bit_ )   (*(uint16_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_ _bit_ )
    - +Value:
    (*(uint16_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
    + +

    Получить n-й бит из uint16_t.

    Parameters
    @@ -245,16 +234,18 @@ Macros - + - +
    #define uint32_bit ( _uint8_, _uint8_,
    _bit_ )   (*(uint32_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_ _bit_ )
    - +Value:
    (*(uint32_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
    + +

    Получить n-й бит из uint32_t.

    Parameters
    @@ -279,16 +270,18 @@ Macros - + - +
    #define uint64_bit ( _uint8_, _uint8_,
    _bit_ )   (*(uint64_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_ _bit_ )
    - +Value:
    (*(uint64_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
    + +

    Получить n-й бит из uint64_t.

    Parameters
    @@ -306,10 +299,18 @@ Macros + + diff --git a/Doc/html/group___d_e_l_a_y_s___d_e_f_i_n_e_s.html b/Doc/html/group___d_e_l_a_y_s___d_e_f_i_n_e_s.html index 0aa93d9..28dfdd1 100644 --- a/Doc/html/group___d_e_l_a_y_s___d_e_f_i_n_e_s.html +++ b/Doc/html/group___d_e_l_a_y_s___d_e_f_i_n_e_s.html @@ -3,7 +3,7 @@ - +MyLibs: Delays defines @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + +
    @@ -73,10 +71,9 @@ $(function() {
    +
    - -
    Delays defines
    +
    Delays defines

    Макросы и определения для работы с задержками в миллисекундах. More...

    -
    - + Collaboration diagram for Delays defines:
    +
    Collaboration diagram for Delays defines:
    - - - - - + + + - - + - - + -

    +

    Macros

    #define msDelay(_ms_)   HAL_Delay(_ms_)
     Задержка на указанное количество миллисекунд.
     
    #define msDelayStart(_pvar_)   *(_pvar_) = HAL_GetTick()
    #define msDelay(_ms_)
     Блокирующая задержка на указанное количество миллисекунд.
    #define msDelayStart(_pvar_)
     Начать отсчет задержки.
     
    #define msDelayWhileActive(_ms_, _pvar_)   (HAL_GetTick() - *(_pvar_) < _ms_)
    #define msDelayWhileActive(_ms_, _pvar_)
     Проверяет, активна ли задержка.
     
    #define msDelayWaitDone(_ms_, _pvar_)   (HAL_GetTick() - *(_pvar_) >= _ms_)
    #define msDelayWaitDone(_ms_, _pvar_)
     Проверяет, завершилась ли задержка.
     
    -

    Detailed Description

    +

    Detailed Description

    Макросы и определения для работы с задержками в миллисекундах.

    Этот блок содержит макросы для реализации задержек с использованием HAL или FreeRTOS:

    • msDelay — простая задержка заданной длительности;
    • @@ -143,7 +133,7 @@ Macros
    • msDelayWhileActive — проверка, активна ли задержка;
    • msDelayWaitDone — проверка, завершена ли задержка. Эти макросы удобны для реализации неблокирующих задержек.
    -

    Macro Definition Documentation

    +

    Macro Definition Documentation

    ◆ msDelay

    @@ -153,22 +143,23 @@ Macros #define msDelay ( - _ms_) -    HAL_Delay(_ms_) + _ms_) +
    - -

    Задержка на указанное количество миллисекунд.

    +Value:
    osDelay(_ms_)
    +
    +

    Блокирующая задержка на указанное количество миллисекунд.

    Parameters
    _ms_Время задержки в миллисекундах.
    -
    Note
    Использует HAL_Delay или osDelay в зависимости от FREERTOS_DELAY.
    +
    Note
    Использует задержку через local_time или osDelay в зависимости от FREERTOS_DELAY.
    -

    Definition at line 82 of file mylibs_defs.h.

    +

    Definition at line 80 of file mylibs_defs.h.

    @@ -181,12 +172,14 @@ Macros #define msDelayStart ( - _pvar_) -    *(_pvar_) = HAL_GetTick() + _pvar_) +
    - +Value:
    *(_pvar_) = local_time()
    +
    #define local_time()
    Локальное время
    +

    Начать отсчет задержки.

    Parameters
    @@ -194,10 +187,10 @@ Macros
    -

    После вызова этого макроса переменная pvar содержит текущее количество миллисекунд с момента запуска системы (HAL_GetTick).

    +

    После вызова этого макроса переменная pvar содержит текущее количество миллисекунд с момента запуска системы (local_time).

    Используется для реализации неблокирующих задержек.

    -

    Definition at line 94 of file mylibs_defs.h.

    +

    Definition at line 98 of file mylibs_defs.h.

    @@ -210,16 +203,17 @@ Macros #define msDelayWhileActive ( - _ms_, + _ms_, - _pvar_ )   (HAL_GetTick() - *(_pvar_) < _ms_) + _pvar_ )
    - +Value:
    (local_time() - *(_pvar_) < _ms_)
    +

    Проверяет, активна ли задержка.

    Parameters
    @@ -238,9 +232,9 @@ Macros

    Возвращает true, пока время задержки не истекло. Используется в проверках, когда нужно действовать, пока задержка выполняется. Пример:

    while(msDelayWhileActive(1000, &tick)) {
    // выполняем другие задачи, задержка не блокирует поток
    }
    -
    #define msDelayWhileActive(_ms_, _pvar_)
    Проверяет, активна ли задержка.
    +
    #define msDelayWhileActive(_ms_, _pvar_)
    Проверяет, активна ли задержка.
    -

    Definition at line 111 of file mylibs_defs.h.

    +

    Definition at line 115 of file mylibs_defs.h.

    @@ -253,16 +247,17 @@ Macros - + - +
    #define msDelayWaitDone ( _ms_, _ms_,
    _pvar_ )   (HAL_GetTick() - *(_pvar_) >= _ms_) _pvar_ )
    - +Value:
    (local_time() - *(_pvar_) >= _ms_)
    +

    Проверяет, завершилась ли задержка.

    Parameters
    @@ -281,18 +276,26 @@ Macros

    Возвращает true, когда задержка уже завершена. Используется в проверках, когда нужно выполнить действие только после окончания задержки. Пример:

    if(msDelayWaitDone(1000, &tick)) {
    // выполняем действие после завершения задержки
    }
    -
    #define msDelayWaitDone(_ms_, _pvar_)
    Проверяет, завершилась ли задержка.
    +
    #define msDelayWaitDone(_ms_, _pvar_)
    Проверяет, завершилась ли задержка.
    -

    Definition at line 128 of file mylibs_defs.h.

    +

    Definition at line 132 of file mylibs_defs.h.

    + + diff --git a/Doc/html/group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html b/Doc/html/group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html index a3931c8..02199b4 100644 --- a/Doc/html/group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html +++ b/Doc/html/group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html @@ -3,7 +3,7 @@ - +MyLibs: Error Handler defines @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Error Handler defines
    +
    Error Handler defines

    Дефайны для обработки ошибок More...

    -
    - + Collaboration diagram for Error Handler defines:
    +
    Collaboration diagram for Error Handler defines:
    - - + - - + - - + - - + - - + - - + -

    +

    Macros

    #define MyLibs_Error_Handler(params)   Error_Handler(params)
    #define MyLibs_Error_Handler(params)
     Error_Handler который будет вызыватся в библиотеке
     
    #define check_null_ptr_1(p1)   (p1 == NULL)
    #define check_null_ptr_1(p1)
     Проверить один указатель на NULL.
     
    #define check_null_ptr_2(p1, p2)   ((p1 == NULL) || (p1 != NULL && p2 == NULL))
    #define check_null_ptr_2(p1, p2)
     Проверить два указателя на NULL.
     
    #define check_null_ptr_3(p1, p2, p3)   ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && p3 == NULL))))
    #define check_null_ptr_3(p1, p2, p3)
     Проверить три указателя на NULL.
     
    #define check_null_ptr_4(p1, p2, p3, p4)   ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && p4 == NULL))))))
    #define check_null_ptr_4(p1, p2, p3, p4)
     Проверить четыре указателя на NULL.
     
    #define check_null_ptr_5(p1, p2, p3, p4, p5)   ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && ((p4 == NULL) || (p4 != NULL && p5 == NULL))))))))
    #define check_null_ptr_5(p1, p2, p3, p4, p5)
     Проверить пять указателей на NULL.
     
    - -

    +

    Functions

    void Error_Handler (void)
     
    -

    Detailed Description

    +

    Detailed Description

    Дефайны для обработки ошибок

    -

    Macro Definition Documentation

    +

    Macro Definition Documentation

    ◆ MyLibs_Error_Handler

    @@ -160,12 +146,13 @@ void Error_Handler (vo #define MyLibs_Error_Handler ( - params) -    Error_Handler(params) + params) +
    - +Value:
    Error_Handler(params)
    +

    Error_Handler который будет вызыватся в библиотеке

    Definition at line 31 of file mylibs_defs.h.

    @@ -181,12 +168,13 @@ void Error_Handler (vo #define check_null_ptr_1 ( - p1) -    (p1 == NULL) + p1) +
    - +Value:
    (p1 == NULL)
    +

    Проверить один указатель на NULL.

    Definition at line 38 of file mylibs_defs.h.

    @@ -202,16 +190,17 @@ void Error_Handler (vo #define check_null_ptr_2 ( - p1, + p1, - p2 )   ((p1 == NULL) || (p1 != NULL && p2 == NULL)) + p2 )
    - +Value:
    ((p1 == NULL) || (p1 != NULL && p2 == NULL))
    +

    Проверить два указателя на NULL.

    Definition at line 41 of file mylibs_defs.h.

    @@ -227,21 +216,22 @@ void Error_Handler (vo #define check_null_ptr_3 ( - p1, + p1, - p2, + p2, - p3 )   ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && p3 == NULL)))) + p3 )
    - +Value:
    ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && p3 == NULL))))
    +

    Проверить три указателя на NULL.

    Definition at line 44 of file mylibs_defs.h.

    @@ -257,26 +247,27 @@ void Error_Handler (vo #define check_null_ptr_4 ( - p1, + p1, - p2, + p2, - p3, + p3, - p4 )   ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && p4 == NULL)))))) + p4 )
    - +Value:
    ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && p4 == NULL))))))
    +

    Проверить четыре указателя на NULL.

    Definition at line 47 of file mylibs_defs.h.

    @@ -292,31 +283,32 @@ void Error_Handler (vo #define check_null_ptr_5 ( - p1, + p1, - p2, + p2, - p3, + p3, - p4, + p4, - p5 )   ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && ((p4 == NULL) || (p4 != NULL && p5 == NULL)))))))) + p5 )
    - +Value:
    ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && ((p4 == NULL) || (p4 != NULL && p5 == NULL))))))))
    +

    Проверить пять указателей на NULL.

    Definition at line 50 of file mylibs_defs.h.

    @@ -325,10 +317,18 @@ void Error_Handler (vo
    + +
    diff --git a/Doc/html/group___e_v_o_l_v_e___c_o_n_f_i_g.html b/Doc/html/group___e_v_o_l_v_e___c_o_n_f_i_g.html index 14d4da5..3581a16 100644 --- a/Doc/html/group___e_v_o_l_v_e___c_o_n_f_i_g.html +++ b/Doc/html/group___e_v_o_l_v_e___c_o_n_f_i_g.html @@ -3,7 +3,7 @@ - + MyLibs: Evolve configs @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Evolve configs
    +
    Evolve configs

    Конфигурация однослойного персептрона и алгоритма обучения More...

    -
    - + Collaboration diagram for Evolve configs:
    +
    Collaboration diagram for Evolve configs:
    - - - -

    +

    Macros

    #define ENABLE_EVOLVE_OPTIMIZATION
     Включить оптимизацию параметров
     
    #define EVOLVE_MAX_PARAMS   20
     Максимальное количество параметров
     
    #define EVOLVE_MAX_CANDIDATES   100
     Максимальное количество кандидатов для обучения
     
    -

    Detailed Description

    +

    Detailed Description

    Конфигурация однослойного персептрона и алгоритма обучения

    -

    Macro Definition Documentation

    +

    Macro Definition Documentation

    ◆ ENABLE_EVOLVE_OPTIMIZATION

    @@ -191,10 +182,18 @@ Macros
    + +
    diff --git a/Doc/html/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html b/Doc/html/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html index 89e1aeb..21f0c0c 100644 --- a/Doc/html/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html +++ b/Doc/html/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html @@ -3,7 +3,7 @@ - + MyLibs: Evolve optimizer @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Evolve optimizer
    +
    Evolve optimizer

    Библиотека для эволюционного подбора параметров More...

    -
    - + Collaboration diagram for Evolve optimizer:
    +
    Collaboration diagram for Evolve optimizer:
    - - + -

    +

    Classes

    struct  EvolveOptimizer_t
    struct  EvolveOptimizer_t
     Структура эволюционного оптимизатора More...
     
    - - + - - + - - - - - - -

    +

    Macros

    #define PARAM_SCALE(x, min_val, max_val)   (((float)(x) - (float)(min_val)) / ((float)(max_val) - (float)(min_val)))
    #define PARAM_SCALE(x, min_val, max_val)
     Линейное масштабирование x из диапазона [min_val, max_val] в диапазон [0, 1)
     
    #define PARAM_UNSCALE(val, min_val, max_val)   (((float)(val)) * ((float)(max_val) - (float)(min_val)) + (float)(min_val))
    #define PARAM_UNSCALE(val, min_val, max_val)
     Обратное линейное масштабирование значения из [0, 1) в диапазон [min_val, max_val].
     
    #define local_time()   HAL_GetTick()
     Локальное время
     
    #define EVOLVE_MUTATION_MIN_PCT   10
     Минимальная мутация (в процентах от Loss)
     
    #define EVOLVE_MUTATION_MAX_PCT   100
     Максимальная мутация (в процентах от Loss)
     
    #define ELOVLE_N_ELITE_CANDIDATE   2
     Количество кандидатов, которые проходят в поколение без изменений (по умолчанию 2)
     
    - - -

    +

    Functions

    __STATIC_INLINE int EvolveOptimizer_Init (EvolveOptimizer_t *opt, uint16_t n_params, uint16_t n_cand, uint16_t n_best, float mutation_amp, float *start_params)
     Инициализация эволюционного оптимизатора.
     
    __STATIC_INLINE int EvolveOptimizer_Step (EvolveOptimizer_t *opt, float *params, float loss)
     Один шаг эволюционного оптимизатора.
     
    -

    Detailed Description

    +

    Detailed Description

    Библиотека для эволюционного подбора параметров

    Поддерживает:

    • Любое количество параметров
    • @@ -205,14 +186,13 @@ Functions
      param_u8 = PARAM_UNSCALE(params[2], 10.0f, 100.0f);
      param_i16 = PARAM_UNSCALE(params[3], 500.0f, 5000.0f);
      Заголовочный файл для адаптивного подбора параметров
      -
      __STATIC_INLINE int EvolveOptimizer_Init(EvolveOptimizer_t *opt, uint16_t n_params, uint16_t n_cand, uint16_t n_best, float mutation_amp, float *start_params)
      Инициализация эволюционного оптимизатора.
      +
      __STATIC_INLINE int EvolveOptimizer_Init(EvolveOptimizer_t *opt, uint16_t n_params, uint16_t n_cand, uint16_t n_best, float mutation_amp, float *start_params)
      Инициализация эволюционного оптимизатора.
      #define PARAM_SCALE(x, min_val, max_val)
      Линейное масштабирование x из диапазона [min_val, max_val] в диапазон [0, 1)
      #define PARAM_UNSCALE(val, min_val, max_val)
      Обратное линейное масштабирование значения из [0, 1) в диапазон [min_val, max_val].
      -
      __STATIC_INLINE int EvolveOptimizer_Step(EvolveOptimizer_t *opt, float *params, float loss)
      Один шаг эволюционного оптимизатора.
      +
      __STATIC_INLINE int EvolveOptimizer_Step(EvolveOptimizer_t *opt, float *params, float loss)
      Один шаг эволюционного оптимизатора.
      Структура эволюционного оптимизатора
      -

    - -

    Macro Definition Documentation

    +
    +

    Macro Definition Documentation

    ◆ PARAM_SCALE

    @@ -222,21 +202,22 @@ Functions #define PARAM_SCALE ( - x, + x, - min_val, + min_val, - max_val )   (((float)(x) - (float)(min_val)) / ((float)(max_val) - (float)(min_val))) + max_val )
    - +Value:
    (((float)(x) - (float)(min_val)) / ((float)(max_val) - (float)(min_val)))
    +

    Линейное масштабирование x из диапазона [min_val, max_val] в диапазон [0, 1)

    Definition at line 73 of file evolve_optimizer.h.

    @@ -252,46 +233,26 @@ Functions #define PARAM_UNSCALE ( - val, + val, - min_val, + min_val, - max_val )   (((float)(val)) * ((float)(max_val) - (float)(min_val)) + (float)(min_val)) + max_val )
    - +Value:
    (((float)(val)) * ((float)(max_val) - (float)(min_val)) + (float)(min_val))
    +

    Обратное линейное масштабирование значения из [0, 1) в диапазон [min_val, max_val].

    Definition at line 79 of file evolve_optimizer.h.

    -
    -
    - -

    ◆ local_time

    - -
    -
    - - - - - - - -
    #define local_time()   HAL_GetTick()
    -
    - -

    Локальное время

    - -

    Definition at line 83 of file evolve_optimizer.h.

    -
    @@ -348,7 +309,7 @@ Functions -

    Function Documentation

    +

    Function Documentation

    ◆ EvolveOptimizer_Init()

    @@ -358,27 +319,27 @@ Functions __STATIC_INLINE int EvolveOptimizer_Init ( - EvolveOptimizer_t * opt, + EvolveOptimizer_t * opt, - uint16_t n_params, + uint16_t n_params, - uint16_t n_cand, + uint16_t n_cand, - uint16_t n_best, + uint16_t n_best, - float mutation_amp, + float mutation_amp, @@ -402,7 +363,7 @@ Functions
    Returns
    0 — если окей, -1 — если ошибка
    -

    Definition at line 148 of file evolve_optimizer.h.

    +

    Definition at line 155 of file evolve_optimizer.h.

    @@ -415,12 +376,12 @@ Functions __STATIC_INLINE int EvolveOptimizer_Step ( - EvolveOptimizer_t * opt, + EvolveOptimizer_t * opt, - float * params, + float * params, @@ -443,16 +404,24 @@ Functions

    Сохраняет loss текущего кандидата и формирует параметры следующего кандидата. Если накоплено n_cand кандидатов, генерируется новое поколение. Новое поколение формируется случайным выбором из n_best лучших с добавлением мутации.

    На выходе params содержит параметры следующего кандидата для измерений.

    Note
    Функция использует глобальную внутреннюю переменную для сортировки. Надо убедится что только один экземпляр функции запущен в момент времени
    -

    Definition at line 216 of file evolve_optimizer.h.

    +

    Definition at line 225 of file evolve_optimizer.h.

    + + diff --git a/Doc/html/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.js b/Doc/html/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.js index d3344de..df1c356 100644 --- a/Doc/html/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.js +++ b/Doc/html/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.js @@ -7,13 +7,14 @@ var group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r = [ "n_best", "struct_evolve_optimizer__t.html#a950cd70cb6bff33b78ad35ee58c729a6", null ], [ "mutation_amp", "struct_evolve_optimizer__t.html#af779c7aeba0053e36cee7aade160f1c8", null ], [ "cand_index", "struct_evolve_optimizer__t.html#a0ae0e63ba351335d4445d927991c64ae", null ], + [ "gen_index", "struct_evolve_optimizer__t.html#ad0f464d7048a9ed0753b61f76f563108", null ], + [ "gen_mut", "struct_evolve_optimizer__t.html#a3be8c0c34db8429210ff470497a56727", null ], [ "loss", "struct_evolve_optimizer__t.html#a93f628397c2f8d4027f2906752b650df", null ], [ "candidates", "struct_evolve_optimizer__t.html#aec67667fd1f1533e693e41c79bc28da4", null ], [ "sorted_idx", "struct_evolve_optimizer__t.html#a74b81df1c298c99162310f3f7d91735a", null ] ] ], [ "PARAM_SCALE", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga83abbcabaff9111c03ae2475ee72ea3e", null ], [ "PARAM_UNSCALE", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#gaa1d5510fe5f0bd989473f3ebe324bde3", null ], - [ "local_time", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga9c853b02c22f26023c34d1d404b6d653", null ], [ "EVOLVE_MUTATION_MIN_PCT", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga2f2b1be34ad4eb1bf3267237200cd6c6", null ], [ "EVOLVE_MUTATION_MAX_PCT", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga861c1c6a503c21441abcec0d57b848bc", null ], [ "ELOVLE_N_ELITE_CANDIDATE", "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga38607e23d9234524bc7de5869b15b8eb", null ], diff --git a/Doc/html/group___g_p_i_o___i_n_i_t.html b/Doc/html/group___g_p_i_o___i_n_i_t.html index e643f63..51ad3d1 100644 --- a/Doc/html/group___g_p_i_o___i_n_i_t.html +++ b/Doc/html/group___g_p_i_o___i_n_i_t.html @@ -3,7 +3,7 @@ - + MyLibs: Init defines @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - - +

    Настройка состояний кнопок и количества тиков в периоде ШИМ More...

    -
    - + Collaboration diagram for Init defines:
    +
    Collaboration diagram for Init defines:
    - - - - - -

    +

    Macros

    #define LED_PWM_TICKS   15
     Количество тиков в периоде ШИМ
     
    #define LED_ON   1
     Состояние пина для включения светодиода
     
    #define LED_OFF   0
     Состояние пина для выключения светодиода
     
    #define SW_ON   1
     Состояние пина при нажатой кнопке
     
    #define SW_OFF   0
     Состояние пина при отжатой кнопке
     
    -

    Detailed Description

    +

    Detailed Description

    Настройка состояний кнопок и количества тиков в периоде ШИМ

    -

    Macro Definition Documentation

    +

    Macro Definition Documentation

    ◆ LED_PWM_TICKS

    @@ -155,7 +144,7 @@ Macros

    Количество тиков в периоде ШИМ

    -

    Definition at line 31 of file general_gpio.h.

    +

    Definition at line 35 of file general_gpio.h.

    @@ -173,7 +162,7 @@ Macros

    Состояние пина для включения светодиода

    -

    Definition at line 35 of file general_gpio.h.

    +

    Definition at line 39 of file general_gpio.h.

    @@ -191,7 +180,7 @@ Macros

    Состояние пина для выключения светодиода

    -

    Definition at line 38 of file general_gpio.h.

    +

    Definition at line 42 of file general_gpio.h.

    @@ -209,7 +198,7 @@ Macros

    Состояние пина при нажатой кнопке

    -

    Definition at line 42 of file general_gpio.h.

    +

    Definition at line 46 of file general_gpio.h.

    @@ -227,16 +216,24 @@ Macros

    Состояние пина при отжатой кнопке

    -

    Definition at line 45 of file general_gpio.h.

    +

    Definition at line 49 of file general_gpio.h.

    + + diff --git a/Doc/html/group___l_i_b_s___c_o_n_f_i_g.html b/Doc/html/group___l_i_b_s___c_o_n_f_i_g.html index f0e726d..10024d9 100644 --- a/Doc/html/group___l_i_b_s___c_o_n_f_i_g.html +++ b/Doc/html/group___l_i_b_s___c_o_n_f_i_g.html @@ -3,7 +3,7 @@ - + MyLibs: Libraries configs @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Libraries configs
    +
    Libraries configs

    Подключение различных модулей библиотеки More...

    -
    - + Collaboration diagram for Libraries configs:
    +
    Collaboration diagram for Libraries configs:
    - + + - - - - - + +

    +

    Macros

    #define local_time()
     Локальное время
    #define INCLUDE_EVOLVE_OPTIMIZER
     Подключить библиотеку для оптимизации параметров
     
    #define INCLUDE_BIT_ACCESS_LIB
     Подключить библиотеку с typedef с битовыми полями
     
    #define INCLUDE_TRACKERS_LIB
     Подключить библиотеку с трекерами
     
    #define INCLUDE_TRACE_LIB
     Подключить библиотеку с трейсами
     
    #define INCLUDE_GENERAL_PERIPH_LIBS
     Подключить библиотеку с периферией
     
    #define FREERTOS_DELAY
     Использовать FreeRTOS задержку, вместо HAL.
    -

    Detailed Description

    +

    Detailed Description

    Подключение различных модулей библиотеки

    -

    Macro Definition Documentation

    +

    Macro Definition Documentation

    + +

    ◆ local_time

    + +
    +
    + + + + + + + +
    #define local_time()
    +
    +Value:
    uwTick
    +
    +

    Локальное время

    + +

    Definition at line 80 of file mylibs_config.h.

    + +
    +

    ◆ INCLUDE_EVOLVE_OPTIMIZER

    @@ -155,7 +170,7 @@ Macros

    Подключить библиотеку для оптимизации параметров

    -

    Definition at line 80 of file mylibs_config.h.

    +

    Definition at line 82 of file mylibs_config.h.

    @@ -173,7 +188,7 @@ Macros

    Подключить библиотеку с typedef с битовыми полями

    -

    Definition at line 81 of file mylibs_config.h.

    +

    Definition at line 83 of file mylibs_config.h.

    @@ -191,7 +206,7 @@ Macros

    Подключить библиотеку с трекерами

    -

    Definition at line 82 of file mylibs_config.h.

    +

    Definition at line 84 of file mylibs_config.h.

    @@ -209,7 +224,7 @@ Macros

    Подключить библиотеку с трейсами

    -

    Definition at line 83 of file mylibs_config.h.

    +

    Definition at line 85 of file mylibs_config.h.

    @@ -227,16 +242,42 @@ Macros

    Подключить библиотеку с периферией

    -

    Definition at line 84 of file mylibs_config.h.

    +

    Definition at line 86 of file mylibs_config.h.

    + + + + +

    ◆ FREERTOS_DELAY

    + +
    +
    + + + + +
    #define FREERTOS_DELAY
    +
    + +

    Использовать FreeRTOS задержку, вместо HAL.

    + +

    Definition at line 87 of file mylibs_config.h.

    + + diff --git a/Doc/html/group___l_i_b_s___c_o_n_f_i_g.js b/Doc/html/group___l_i_b_s___c_o_n_f_i_g.js index 7938549..e82ae27 100644 --- a/Doc/html/group___l_i_b_s___c_o_n_f_i_g.js +++ b/Doc/html/group___l_i_b_s___c_o_n_f_i_g.js @@ -1,8 +1,10 @@ var group___l_i_b_s___c_o_n_f_i_g = [ + [ "local_time", "group___l_i_b_s___c_o_n_f_i_g.html#ga9c853b02c22f26023c34d1d404b6d653", null ], [ "INCLUDE_EVOLVE_OPTIMIZER", "group___l_i_b_s___c_o_n_f_i_g.html#ga66560656d080d6551627a19dfb847c66", null ], [ "INCLUDE_BIT_ACCESS_LIB", "group___l_i_b_s___c_o_n_f_i_g.html#gaf4ddb2a71ec0d05c2480e197cd17c0be", null ], [ "INCLUDE_TRACKERS_LIB", "group___l_i_b_s___c_o_n_f_i_g.html#ga4403055986b70bb02b8d37073a122e32", null ], [ "INCLUDE_TRACE_LIB", "group___l_i_b_s___c_o_n_f_i_g.html#ga0a3ca94b616997069dd53e2c6c2687d7", null ], - [ "INCLUDE_GENERAL_PERIPH_LIBS", "group___l_i_b_s___c_o_n_f_i_g.html#ga181a46326e46b60afb160190832c7281", null ] + [ "INCLUDE_GENERAL_PERIPH_LIBS", "group___l_i_b_s___c_o_n_f_i_g.html#ga181a46326e46b60afb160190832c7281", null ], + [ "FREERTOS_DELAY", "group___l_i_b_s___c_o_n_f_i_g.html#ga57c369737d5c0cfdb7baeecba0a4b151", null ] ]; \ No newline at end of file diff --git a/Doc/html/group___m_y___l_i_b_s___g_p_i_o.html b/Doc/html/group___m_y___l_i_b_s___g_p_i_o.html index 7b2cede..b588aa0 100644 --- a/Doc/html/group___m_y___l_i_b_s___g_p_i_o.html +++ b/Doc/html/group___m_y___l_i_b_s___g_p_i_o.html @@ -3,7 +3,7 @@ - + MyLibs: GPIO Tools @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    GPIO Tools
    +
    GPIO Tools

    Функции и макросы для удобной работы с GPIO. More...

    -
    - + Collaboration diagram for GPIO Tools:
    +
    Collaboration diagram for GPIO Tools:
    - - + - - + - - + -

    +

    Topics

     General tools
     General tools
     Общие функции/макросы для работы с GPIO.
     
     Switch tools
     Switch tools
     Функции для работы с GPIO, как с кнопкой
     
     LED tools
     LED tools
     Функции для работы с GPIO, для управления светодиодом
     
    -

    Detailed Description

    +

    Detailed Description

    Функции и макросы для удобной работы с GPIO.

    Модуль предоставляет универсальные инструменты для работы с GPIO):

    • General tools — инициализация и общие функции работы с портами.
    • @@ -144,10 +135,18 @@ Topics
    + +
    diff --git a/Doc/html/group___m_y___l_i_b_s___t_i_m.html b/Doc/html/group___m_y___l_i_b_s___t_i_m.html index 4afff85..1c120f6 100644 --- a/Doc/html/group___m_y___l_i_b_s___t_i_m.html +++ b/Doc/html/group___m_y___l_i_b_s___t_i_m.html @@ -3,7 +3,7 @@ - + MyLibs: TIM Tools @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    TIM Tools
    +
    TIM Tools

    Функции и макросы для удобной работы с TIM. More...

    -
    - + Collaboration diagram for TIM Tools:
    +
    Collaboration diagram for TIM Tools:
    - - - - - - - - - - - + - + + + + + +

    +

    Topics

     PWM/OC Channels tools
     Функции для инициализации базовых функций каналов таймера
     
     Encoder tools
     Функции для считывания энкодера
     
     Delay tools
     Функции для формирования задержек с помощью таймеров
     
     General tools
     General tools
     Функции для базовой инициализации таймеров
     
     Delay tools
     Функции для формирования задержек с помощью таймеров
     PWM/OC Channels tools
     Функции для инициализации базовых функций каналов таймера
     Encoder tools
     Функции для считывания энкодера
    -

    Detailed Description

    +

    Detailed Description

    Функции и макросы для удобной работы с TIM.

    Модуль предоставляет универсальные инструменты для работы с TIM:

    • General tools — базовая инициализация таймеров и прерываний.
    • Delay tools — функции задержки через таймеры (blocking и non-blocking).
    • PWM/OC Channels tools — настройка каналов Output Compare и PWM.
    • -
    • Encoder tools — работа с энкодерами, чтение положения и кнопки.
      Note
      Требуется подключение модуля TIM в библиотеке HAL
      #define HAL_TIM_MODULE_ENABLED
      +
    • Encoder tools — работа с энкодерами, чтение положения и кнопки.

      +
      Note
      Требуется подключение модуля TIM в библиотеке HAL и GPIO (GPIO Tools) из MyLibs
      #define HAL_TIM_MODULE_ENABLED
    + +
    diff --git a/Doc/html/group___m_y___l_i_b_s___t_i_m.js b/Doc/html/group___m_y___l_i_b_s___t_i_m.js index 49958de..61cd824 100644 --- a/Doc/html/group___m_y___l_i_b_s___t_i_m.js +++ b/Doc/html/group___m_y___l_i_b_s___t_i_m.js @@ -1,7 +1,7 @@ var group___m_y___l_i_b_s___t_i_m = [ - [ "PWM/OC Channels tools", "group___m_y_l_i_b_s___t_i_m___o_c.html", "group___m_y_l_i_b_s___t_i_m___o_c" ], - [ "Encoder tools", "group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html", "group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r" ], + [ "General tools", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l" ], [ "Delay tools", "group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html", "group___m_y_l_i_b_s___t_i_m___d_e_l_a_y" ], - [ "General tools", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html", "group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l" ] + [ "PWM/OC Channels tools", "group___m_y_l_i_b_s___t_i_m___o_c.html", "group___m_y_l_i_b_s___t_i_m___o_c" ], + [ "Encoder tools", "group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html", "group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r" ] ]; \ No newline at end of file diff --git a/Doc/html/group___m_y___l_i_b_s___t_i_m.map b/Doc/html/group___m_y___l_i_b_s___t_i_m.map index b0bb8ef..0f14167 100644 --- a/Doc/html/group___m_y___l_i_b_s___t_i_m.map +++ b/Doc/html/group___m_y___l_i_b_s___t_i_m.map @@ -1,8 +1,8 @@ - - - - + + + + diff --git a/Doc/html/group___m_y___l_i_b_s___t_i_m.md5 b/Doc/html/group___m_y___l_i_b_s___t_i_m.md5 index 588e808..ab26041 100644 --- a/Doc/html/group___m_y___l_i_b_s___t_i_m.md5 +++ b/Doc/html/group___m_y___l_i_b_s___t_i_m.md5 @@ -1 +1 @@ -bddd90356fb04fa1e92560356c210866 \ No newline at end of file +936137dd7521a28e69e9d997087dab56 \ No newline at end of file diff --git a/Doc/html/group___m_y_l_i_b_s___a_l_l.html b/Doc/html/group___m_y_l_i_b_s___a_l_l.html index db4abd7..2edb3f9 100644 --- a/Doc/html/group___m_y_l_i_b_s___a_l_l.html +++ b/Doc/html/group___m_y_l_i_b_s___a_l_l.html @@ -3,7 +3,7 @@ - + MyLibs: My Libs @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    My Libs
    +
    My Libs

    Все используемые MyLibs библиотеки More...

    -
    - + Collaboration diagram for My Libs:
    +
    Collaboration diagram for My Libs:
    - - + - - + - - + -

    +

    Topics

     Configs
     Configs
     Конфигурации для библиотек MyLibs.
     
     General Tools
     General Tools
     Общие макросы и typedef'ы, используемые по всему проекту
     
     Peripheral
     Peripheral
     Модули для управления периферией
     
    -

    Detailed Description

    +

    Detailed Description

    Все используемые MyLibs библиотеки

    Для подключения библиотеки необходимо:

    • Сконфигурировать mylibs_config.h:
        @@ -147,10 +138,18 @@ Topics
    + +
    diff --git a/Doc/html/group___m_y_l_i_b_s___c_o_n_f_i_g.html b/Doc/html/group___m_y_l_i_b_s___c_o_n_f_i_g.html index 837c430..04d29e3 100644 --- a/Doc/html/group___m_y_l_i_b_s___c_o_n_f_i_g.html +++ b/Doc/html/group___m_y_l_i_b_s___c_o_n_f_i_g.html @@ -3,7 +3,7 @@ - + MyLibs: Configs @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Configs
    +
    Configs

    Конфигурации для библиотек MyLibs. More...

    -
    - + Collaboration diagram for Configs:
    +
    Collaboration diagram for Configs:
    - - + - - + - - + -

    +

    Topics

     Trace configs
     Trace configs
     Конфигурация трекеров и трассировки
     
     Evolve configs
     Evolve configs
     Конфигурация однослойного персептрона и алгоритма обучения
     
     Libraries configs
     Libraries configs
     Подключение различных модулей библиотеки
     
    -

    Detailed Description

    +

    Detailed Description

    Конфигурации для библиотек MyLibs.

    + +
    diff --git a/Doc/html/group___m_y_l_i_b_s___d_e_f_i_n_e_s.html b/Doc/html/group___m_y_l_i_b_s___d_e_f_i_n_e_s.html index cfa10db..093beb8 100644 --- a/Doc/html/group___m_y_l_i_b_s___d_e_f_i_n_e_s.html +++ b/Doc/html/group___m_y_l_i_b_s___d_e_f_i_n_e_s.html @@ -3,7 +3,7 @@ - + MyLibs: General Tools @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    General Tools
    +
    General Tools

    Общие макросы и typedef'ы, используемые по всему проекту More...

    -
    - + Collaboration diagram for General Tools:
    +
    Collaboration diagram for General Tools:
    - - + - - + - - + - - + - - + - - + - - + -

    +

    Topics

     Bit access defines
     Bit access defines
     Макросы и typedef'ы для работы с битами в unsigned типах.
     
     Evolve optimizer
     Evolve optimizer
     Библиотека для эволюционного подбора параметров
     
     Error Handler defines
     Error Handler defines
     Дефайны для обработки ошибок
     
     Delays defines
     Delays defines
     Макросы и определения для работы с задержками в миллисекундах.
     
     Utils defines
     Utils defines
     Общие вспомогательные макросы
     
     Trace defines
     Trace defines
     Дефайны для работы с трассировкой
     
     Trackers defines
     Trackers defines
     Дефайны для работы с трекерами
     
    -

    Detailed Description

    +

    Detailed Description

    Общие макросы и typedef'ы, используемые по всему проекту

    + +
    diff --git a/Doc/html/group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html b/Doc/html/group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html index 14b0ac7..c97b5d3 100644 --- a/Doc/html/group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html +++ b/Doc/html/group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html @@ -3,7 +3,7 @@ - + MyLibs: General tools @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    General tools
    +
    General tools

    Общие функции/макросы для работы с GPIO. More...

    -
    - + Collaboration diagram for General tools:
    +
    Collaboration diagram for General tools:
    - - + -

    +

    Topics

     Init defines
     Init defines
     Настройка состояний кнопок и количества тиков в периоде ШИМ
     
    - - - - -

    -Macros

    #define GPIO_TIM_Alternate_Mapping(INSTANCE)
     Маппинг альтернативной функции TIM между GPIO.
     
    - -

    +

    Functions

    HAL_StatusTypeDef GPIO_Clock_Enable (GPIO_TypeDef *GPIOx)
     Включить тактирование порта GPIO.
     
    -

    Detailed Description

    +

    Detailed Description

    Общие функции/макросы для работы с GPIO.

    -

    Macro Definition Documentation

    - -

    ◆ GPIO_TIM_Alternate_Mapping

    - -
    -
    - - - - - - - -
    #define GPIO_TIM_Alternate_Mapping( INSTANCE)
    -
    -Value:
    ((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \
    -
    (((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \
    -
    (((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \
    -
    (((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \
    -
    (0))
    -
    -

    Маппинг альтернативной функции TIM между GPIO.

    - -

    Definition at line 69 of file general_gpio.h.

    - -
    -
    -

    Function Documentation

    +
    Пример использования:
    // Включаем тактирование порта GPIOA
    + +
    HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx)
    Включить тактирование порта GPIO.
    +
    +

    Function Documentation

    ◆ GPIO_Clock_Enable()

    @@ -194,10 +155,18 @@ Functions
    + +
    diff --git a/Doc/html/group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.js b/Doc/html/group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.js index 64baa3b..18fd2e8 100644 --- a/Doc/html/group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.js +++ b/Doc/html/group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.js @@ -1,6 +1,5 @@ var group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l = [ [ "Init defines", "group___g_p_i_o___i_n_i_t.html", "group___g_p_i_o___i_n_i_t" ], - [ "GPIO_TIM_Alternate_Mapping", "group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html#ga580b842096340b066c28b24d6b315be6", null ], [ "GPIO_Clock_Enable", "group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html#ga962f010f783b81fcdd27eb6b53db28e6", null ] ]; \ No newline at end of file diff --git a/Doc/html/group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html b/Doc/html/group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html index d4c6383..9577120 100644 --- a/Doc/html/group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html +++ b/Doc/html/group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html @@ -3,7 +3,7 @@ - + MyLibs: LED tools @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +

    Функции для работы с GPIO, для управления светодиодом More...

    -
    - + Collaboration diagram for LED tools:
    +
    Collaboration diagram for LED tools:
    - - + -

    +

    Classes

    struct  GPIO_LEDTypeDef
    struct  GPIO_LEDTypeDef
     Структура светодиода More...
     
    - , LED_IS_FADING = 3 } -

    +

    Enumerations

    enum  GPIO_LEDStateTypeDef { LED_IS_OFF = 0 , LED_IS_ON = 1 @@ -136,35 +127,49 @@ Enumerations
     Режимы работы светодиода More...
     
    - - - - - - - -

    +

    Functions

    HAL_StatusTypeDef GPIO_LED_Init (GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_On_State)
     Инициализировать светодиод (структуру светодиода)
     
    HAL_StatusTypeDef GPIO_LED_On (GPIO_LEDTypeDef *led)
     Включить светодиод
     
    HAL_StatusTypeDef GPIO_LED_Off (GPIO_LEDTypeDef *led)
     Выключить светодиод
     
    HAL_StatusTypeDef GPIO_LED_Set (GPIO_LEDTypeDef *led, uint8_t led_state)
     Выставить светодиод по переменной
     
    HAL_StatusTypeDef GPIO_LED_Blink_Start (GPIO_LEDTypeDef *led, uint32_t period)
     Активировать моргание светодиодом
     
    HAL_StatusTypeDef GPIO_LED_Fading_Start (GPIO_LEDTypeDef *led, uint32_t period)
     Активировать моргание светодиодом
     
    void GPIO_LED_Dynamic_Handle (GPIO_LEDTypeDef *led)
     Управление динамическими режимами свечения светодиода
     
    -

    Detailed Description

    +

    Detailed Description

    Функции для работы с GPIO, для управления светодиодом

    -

    Enumeration Type Documentation

    +
    Пример использования:
    MX_GPIO_Init(); // инициализация пина аппаратная
    +
    +
    // Инициализация светодиода на порте GPIOA, пин 5, активный уровень 0
    + +
    GPIO_LED_Init(&led, GPIOA, GPIO_PIN_5, 0); // или дефайн LED_ON/LED_OFF
    +
    +
    // Включение светодиода
    + +
    +
    // Запуск моргания
    +
    GPIO_LED_Blink_Start(&led, 500); // Период 500 мс
    +
    +
    // В основном цикле
    +
    while (1) {
    + +
    }
    +
    HAL_StatusTypeDef GPIO_LED_On(GPIO_LEDTypeDef *led)
    Включить светодиод
    +
    HAL_StatusTypeDef GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_On_State)
    Инициализировать светодиод (структуру светодиода)
    +
    void GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led)
    Управление динамическими режимами свечения светодиода
    +
    HAL_StatusTypeDef GPIO_LED_Blink_Start(GPIO_LEDTypeDef *led, uint32_t period)
    Активировать моргание светодиодом
    +
    Структура светодиода
    +
    +

    Enumeration Type Documentation

    ◆ GPIO_LEDStateTypeDef

    @@ -189,11 +194,11 @@ Functions -

    Definition at line 81 of file general_gpio.h.

    +

    Definition at line 61 of file general_gpio.h.

    -

    Function Documentation

    +

    Function Documentation

    ◆ GPIO_LED_Init()

    @@ -203,17 +208,17 @@ Functions HAL_StatusTypeDef GPIO_LED_Init ( - GPIO_LEDTypeDef * led, + GPIO_LEDTypeDef * led, - GPIO_TypeDef * GPIOx, + GPIO_TypeDef * GPIOx, - uint32_t GPIO_PIN_X, + uint32_t GPIO_PIN_X, @@ -303,7 +308,7 @@ Functions HAL_StatusTypeDef GPIO_LED_Set ( - GPIO_LEDTypeDef * led, + GPIO_LEDTypeDef * led, @@ -336,7 +341,7 @@ Functions HAL_StatusTypeDef GPIO_LED_Blink_Start ( - GPIO_LEDTypeDef * led, + GPIO_LEDTypeDef * led, @@ -370,7 +375,7 @@ Functions HAL_StatusTypeDef GPIO_LED_Fading_Start ( - GPIO_LEDTypeDef * led, + GPIO_LEDTypeDef * led, @@ -425,10 +430,18 @@ Functions
    + + diff --git a/Doc/html/group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html b/Doc/html/group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html index 9c2d8b8..82cb8d5 100644 --- a/Doc/html/group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html +++ b/Doc/html/group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html @@ -3,7 +3,7 @@ - + MyLibs: Switch tools @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Switch tools
    +
    Switch tools

    Функции для работы с GPIO, как с кнопкой More...

    -
    - + Collaboration diagram for Switch tools:
    +
    Collaboration diagram for Switch tools:
    - - + -

    +

    Classes

    struct  GPIO_SwitchTypeDef
    struct  GPIO_SwitchTypeDef
     Структура кнопки More...
     
    - - -

    +

    Functions

    HAL_StatusTypeDef GPIO_Switch_Init (GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State)
     Инициализировать кнопку (структуру кнопки)
     
    int GPIO_Read_Switch (GPIO_SwitchTypeDef *swstart)
     Считать состоянии кнопки
     
    -

    Detailed Description

    +

    Detailed Description

    Функции для работы с GPIO, как с кнопкой

    -

    Function Documentation

    +
    Пример использования:
    MX_GPIO_Init(); // инициализация пина аппаратная
    +
    +
    // Инициализация кнопки на порте GPIOB, пин 0, активный уровень 1
    + +
    GPIO_Switch_Init(&sw1, GPIOB, GPIO_PIN_0, 1); // или дефайн SW_ON/SW_OFF
    +
    +
    // Считываем состояние кнопки
    + +
    {
    +
    // Кнопка нажата
    +
    LED_ON();
    +
    }
    +
    else
    +
    {
    +
    // Кнопка отжата
    + +
    }
    +
    #define LED_OFF
    Состояние пина для выключения светодиода
    +
    #define LED_ON
    Состояние пина для включения светодиода
    +
    int GPIO_Read_Switch(GPIO_SwitchTypeDef *swstart)
    Считать состоянии кнопки
    +
    HAL_StatusTypeDef GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State)
    Инициализировать кнопку (структуру кнопки)
    +
    Структура кнопки
    +
    +

    Function Documentation

    ◆ GPIO_Switch_Init()

    @@ -148,17 +161,17 @@ Functions HAL_StatusTypeDef GPIO_Switch_Init ( - GPIO_SwitchTypeDef * sw, + GPIO_SwitchTypeDef * sw, - GPIO_TypeDef * GPIOx, + GPIO_TypeDef * GPIOx, - uint32_t GPIO_PIN_X, + uint32_t GPIO_PIN_X, @@ -215,10 +228,18 @@ Functions
    + +
    diff --git a/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.html b/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.html index a0a8774..1131a7c 100644 --- a/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.html +++ b/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.html @@ -3,7 +3,7 @@ - + MyLibs: Peripheral @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Peripheral
    +
    Peripheral

    Модули для управления периферией More...

    -
    - + Collaboration diagram for Peripheral:
    +
    Collaboration diagram for Peripheral:
    - - + - - + + + - + +

    +

    Topics

     GPIO Tools
     GPIO Tools
     Функции и макросы для удобной работы с GPIO.
     
     TIM Tools
     SPI Tools
     Функции и макросы для удобной работы с SPI.
     TIM Tools
     Функции и макросы для удобной работы с TIM.
     
     UART Tools
     Функции и макросы для удобной работы с UART.
    -

    Detailed Description

    +

    Detailed Description

    Модули для управления периферией

    + +
    diff --git a/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.js b/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.js index 3fc66f5..d54fe32 100644 --- a/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.js +++ b/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.js @@ -1,5 +1,7 @@ var group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l = [ [ "GPIO Tools", "group___m_y___l_i_b_s___g_p_i_o.html", "group___m_y___l_i_b_s___g_p_i_o" ], - [ "TIM Tools", "group___m_y___l_i_b_s___t_i_m.html", "group___m_y___l_i_b_s___t_i_m" ] + [ "SPI Tools", "group___m_y___l_i_b_s___s_p_i.html", "group___m_y___l_i_b_s___s_p_i" ], + [ "TIM Tools", "group___m_y___l_i_b_s___t_i_m.html", "group___m_y___l_i_b_s___t_i_m" ], + [ "UART Tools", "group___m_y___l_i_b_s___u_a_r_t.html", "group___m_y___l_i_b_s___u_a_r_t" ] ]; \ No newline at end of file diff --git a/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.map b/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.map index fc698cf..0321692 100644 --- a/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.map +++ b/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.map @@ -1,6 +1,8 @@ - - - - + + + + + + diff --git a/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.md5 b/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.md5 index ee8c449..2e10e09 100644 --- a/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.md5 +++ b/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.md5 @@ -1 +1 @@ -9a24bce9b60d282ebbaf04d75a3cfad4 \ No newline at end of file +1044283365b108883d0b7a448ff91792 \ No newline at end of file diff --git a/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.png b/Doc/html/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.png index 756240e0912f61f220dcf42c41800943fbae8b59..f29ac65919ed0592ebdc32d3bff7a247ea3d53ab 100644 GIT binary patch literal 5076 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 Ov_Ovb&KQQRZ_>ZVN2726 diff --git a/Doc/html/group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html b/Doc/html/group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html index e0afecf..7c74916 100644 --- a/Doc/html/group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html +++ b/Doc/html/group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html @@ -3,7 +3,7 @@ - + MyLibs: Delay tools @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Delay tools
    +
    Delay tools

    Функции для формирования задержек с помощью таймеров More...

    -
    - + Collaboration diagram for Delay tools:
    +
    Collaboration diagram for Delay tools:
    - - - -

    +

    Functions

    HAL_StatusTypeDef TIM_Delay_Start (TIM_HandleTypeDef *htim)
     Начать отсчет неблокирующей задержки.
     
    HAL_StatusTypeDef TIM_Delay (TIM_HandleTypeDef *htim, uint16_t delay)
     Задержка в тиках таймера (блокирующая).
     
    HAL_StatusTypeDef TIM_Delay_NonBlocking (TIM_HandleTypeDef *htim, uint16_t delay)
     Задержка в тиках таймера (неблокирующая).
     
    -

    Detailed Description

    +

    Detailed Description

    Функции для формирования задержек с помощью таймеров

    -

    Function Documentation

    +
    Пример использования:
    TIM_HandleTypeDef htim2;
    +
    +
    // блокирующая задержка 500 тиков таймера
    + +
    TIM_Delay(&htim2, 500);
    + +
    +
    +
    while(1)
    +
    {
    +
    // не блокирующая задержка 200 тиков таймера
    +
    if(TIM_Delay_NonBlocking(&htim2, 200) == HAL_OK)
    +
    {
    +
    TIM_Delay_Start(&htim2);
    +
    LED_TOOGLE();
    +
    }
    +
    }
    +
    #define LED_OFF
    Состояние пина для выключения светодиода
    +
    #define LED_ON
    Состояние пина для включения светодиода
    +
    HAL_StatusTypeDef TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay)
    Задержка в тиках таймера (неблокирующая).
    +
    HAL_StatusTypeDef TIM_Delay_Start(TIM_HandleTypeDef *htim)
    Начать отсчет неблокирующей задержки.
    +
    HAL_StatusTypeDef TIM_Delay(TIM_HandleTypeDef *htim, uint16_t delay)
    Задержка в тиках таймера (блокирующая).
    +
    +

    Function Documentation

    ◆ TIM_Delay_Start()

    @@ -173,7 +187,7 @@ Functions HAL_StatusTypeDef TIM_Delay ( - TIM_HandleTypeDef * htim, + TIM_HandleTypeDef * htim, @@ -207,7 +221,7 @@ Functions HAL_StatusTypeDef TIM_Delay_NonBlocking ( - TIM_HandleTypeDef * htim, + TIM_HandleTypeDef * htim, @@ -234,10 +248,18 @@ Functions
    + +
    diff --git a/Doc/html/group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html b/Doc/html/group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html index e1af34d..ac2ffb9 100644 --- a/Doc/html/group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html +++ b/Doc/html/group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html @@ -3,7 +3,7 @@ - + MyLibs: Encoder tools @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Encoder tools
    +
    Encoder tools

    Функции для считывания энкодера More...

    -
    - + Collaboration diagram for Encoder tools:
    +
    Collaboration diagram for Encoder tools:
    - - + -

    +

    Classes

    struct  TIM_EncoderTypeDef
    struct  TIM_EncoderTypeDef
     Структура инициализации енкодера More...
     
    - - - -

    +

    Functions

    HAL_StatusTypeDef TIM_Encoder_Init (TIM_EncoderTypeDef *henc1, TIM_HandleTypeDef *htim)
     Инициализация режима энкодер у таймера.
     
    HAL_StatusTypeDef TIM_Encoder_Read (TIM_EncoderTypeDef *henc)
     Считать энкодер.
     
    int TIM_Encoder_ReadSwitch (TIM_EncoderTypeDef *henc)
     Считать кнопку энкодера.
     
    -

    Detailed Description

    +

    Detailed Description

    Функции для считывания энкодера

    -

    Function Documentation

    +
    Пример использования:
    +
    TIM_HandleTypeDef htim4;
    +
    +
    // инициализация
    +
    henc1.htim = &htim4;
    +
    henc1.GPIOx = GPIOA;
    +
    henc1.GPIO_PIN_TI1 = GPIO_PIN_0;
    +
    henc1.GPIO_PIN_TI2 = GPIO_PIN_1;
    +
    TIM_Encoder_Init(&henc1, &htim4);
    +
    +
    // считывание энкодера и кнопки
    +
    int16_t delta = TIM_Encoder_Read(&henc1);
    +
    setpoint_tmp += delta;
    + +
    {
    +
    setpoint = setpoint_tmp; // подтвердить новое значение
    +
    }
    +
    int TIM_Encoder_ReadSwitch(TIM_EncoderTypeDef *henc)
    Считать кнопку энкодера.
    +
    HAL_StatusTypeDef TIM_Encoder_Init(TIM_EncoderTypeDef *henc1, TIM_HandleTypeDef *htim)
    Инициализация режима энкодер у таймера.
    +
    HAL_StatusTypeDef TIM_Encoder_Read(TIM_EncoderTypeDef *henc)
    Считать энкодер.
    +
    Структура инициализации енкодера
    +
    uint32_t GPIO_PIN_TI1
    Пин, куда подключается канал TI1.
    +
    uint32_t GPIO_PIN_TI2
    Пин, куда подключается канал TI2.
    +
    GPIO_TypeDef * GPIOx
    Порт, куда подключается энкодер
    +
    TIM_HandleTypeDef * htim
    Указатель на HAL handle таймера
    +
    +

    Function Documentation

    ◆ TIM_Encoder_Init()

    @@ -151,7 +166,7 @@ Functions HAL_StatusTypeDef TIM_Encoder_Init ( - TIM_EncoderTypeDef * henc, + TIM_EncoderTypeDef * henc, @@ -235,10 +250,18 @@ Functions
    + +
    diff --git a/Doc/html/group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html b/Doc/html/group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html index ab492db..7e224ac 100644 --- a/Doc/html/group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html +++ b/Doc/html/group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html @@ -3,7 +3,7 @@ - + MyLibs: General tools @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    General tools
    +
    General tools

    Функции для базовой инициализации таймеров More...

    -
    - + Collaboration diagram for General tools:
    +
    Collaboration diagram for General tools:
    - - + -

    +

    Topics

     Init defines
     Init defines
     Настройка таймеров
     
    - - + -

    +

    Classes

    struct  TIM_SettingsTypeDef
    struct  TIM_SettingsTypeDef
     Структура инициализации таймера More...
     
    - -
    } -

    +

    Enumerations

    enum  TIM_ITModeTypeDef { TIM_DEFAULT = 0 , TIM_IT_MODE = (1<<( 0 )) }
     Режим прерываний таймера More...
     
    enum  TIM_MHzTickBaseTypeDef {
      TIM_Base_Disable = 0 , TIM_TickBase_1US = 1 @@ -155,23 +143,47 @@ Enumerations
     Длительность тика таймера (частота тактирования таймера) More...
     
    - - - -

    +

    Functions

    HAL_StatusTypeDef TIM_Base_Init (TIM_SettingsTypeDef *stim)
     Инициализация таймера.
     
    void TIM_Base_MspInit (TIM_HandleTypeDef *htim, TIM_ITModeTypeDef it_mode)
     Инициализация CLK и NVIC таймеров.
     
    void TIM_Base_MspDeInit (TIM_HandleTypeDef *htim)
     Деинициализация CLK и NVIC таймеров.
     
    -

    Detailed Description

    +

    Detailed Description

    Функции для базовой инициализации таймеров

    -

    Enumeration Type Documentation

    +
    Пример использования:
    TIM_SettingsTypeDef tim2Settings;
    +
    +
    void TIM2_Init(void)
    +
    {
    +
    // Настройка таймера TIM2 на 1 кГц с прерываниями с шагом таймера 10 мкс
    +
    tim2Settings.htim.Instance = TIM2;
    +
    tim2Settings.sTimMode = TIM_IT_MODE;
    + +
    tim2Settings.sTickBasePrescaler = 1;
    +
    tim2Settings.sTimFreqHz = 1000; // 1 кГц
    +
    tim2Settings.sTimAHBFreqMHz = 72000000; // Hz
    +
    +
    if(TIM_Base_Init(&tim2Settings) != HAL_OK)
    +
    {
    +
    Error_Handler();
    +
    }
    +
    }
    +
    HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef *stim)
    Инициализация таймера.
    Definition general_tim.c:34
    +
    @ TIM_TickBase_10US
    Таймер тактируется с частотой 100 кГц
    Definition general_tim.h:95
    +
    @ TIM_IT_MODE
    Прерываний включены
    Definition general_tim.h:80
    +
    Структура инициализации таймера
    +
    uint8_t sTickBasePrescaler
    Дополнительный делитель, для удобного деления sTickBaseUS.
    +
    TIM_MHzTickBaseTypeDef sTickBaseUS
    Длительность одного тика
    +
    float sTimAHBFreqMHz
    Частота шины тактирования таймера
    +
    TIM_ITModeTypeDef sTimMode
    Настройки прерывания таймера
    +
    TIM_HandleTypeDef htim
    HAL handle таймера
    +
    float sTimFreqHz
    Желаемая частота таймера
    +
    +

    Enumeration Type Documentation

    ◆ TIM_ITModeTypeDef

    @@ -192,7 +204,7 @@ Functions -

    Definition at line 76 of file general_tim.h.

    +

    Definition at line 77 of file general_tim.h.

    @@ -227,11 +239,11 @@ Functions -

    Definition at line 90 of file general_tim.h.

    +

    Definition at line 91 of file general_tim.h.

    -

    Function Documentation

    +

    Function Documentation

    ◆ TIM_Base_Init()

    @@ -278,7 +290,7 @@ Functions void TIM_Base_MspInit ( - TIM_HandleTypeDef * htim, + TIM_HandleTypeDef * htim, @@ -295,7 +307,7 @@ Functions -
    Note
    Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров, дефайнами в general_tim.h определяются используемые таймеры.
    +
    Note
    Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров, дефайнами Init defines в general_tim.h определяются используемые таймеры.

    Definition at line 408 of file general_tim.c.

    @@ -323,7 +335,7 @@ Functions -
    Note
    Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров, дефайнами в general_tim.h определяются используемые таймеры.
    +
    Note
    Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров, дефайнами Init defines в general_tim.h определяются используемые таймеры.

    Definition at line 617 of file general_tim.c.

    @@ -331,10 +343,18 @@ Functions + + diff --git a/Doc/html/group___m_y_l_i_b_s___t_i_m___o_c.html b/Doc/html/group___m_y_l_i_b_s___t_i_m___o_c.html index 29c0731..2f229a6 100644 --- a/Doc/html/group___m_y_l_i_b_s___t_i_m___o_c.html +++ b/Doc/html/group___m_y_l_i_b_s___t_i_m___o_c.html @@ -3,7 +3,7 @@ - + MyLibs: PWM/OC Channels tools @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    PWM/OC Channels tools
    +
    PWM/OC Channels tools

    Функции для инициализации базовых функций каналов таймера More...

    -
    - + Collaboration diagram for PWM/OC Channels tools:
    +
    Collaboration diagram for PWM/OC Channels tools:
    - - -

    +

    Functions

    HAL_StatusTypeDef TIM_Output_PWM_Init (TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN)
     Инициализация выхода ШИМ таймера.
     
    HAL_StatusTypeDef TIM_OC_Comparator_Init (TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL)
     Инициализация OC компаратора таймера.
     
    -

    Detailed Description

    +

    Detailed Description

    Функции для инициализации базовых функций каналов таймера

    -

    Function Documentation

    +
    Пример использования:
    void PWM_Channel_Init_Example(void)
    +
    {
    +
    TIM_HandleTypeDef htim3;
    +
    TIM_OC_InitTypeDef sConfigOC;
    +
    GPIO_TypeDef *GPIOx = GPIOB;
    +
    uint32_t PWM_PIN = GPIO_PIN_0;
    +
    +
    // Настройка таймера и канала PWM
    +
    TIM_Output_PWM_Init(&htim3, &sConfigOC, TIM_CHANNEL_1, GPIOx, PWM_PIN);
    +
    +
    // Настройка компаратора OC
    +
    TIM_OC_Comparator_Init(&htim3, TIM_CHANNEL_1);
    +
    }
    +
    HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN)
    Инициализация выхода ШИМ таймера.
    +
    HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL)
    Инициализация OC компаратора таймера.
    +
    +

    Function Documentation

    ◆ TIM_Output_PWM_Init()

    @@ -141,22 +149,22 @@ Functions HAL_StatusTypeDef TIM_Output_PWM_Init ( - TIM_HandleTypeDef * htim, + TIM_HandleTypeDef * htim, - TIM_OC_InitTypeDef * sConfigOC, + TIM_OC_InitTypeDef * sConfigOC, - uint32_t TIM_CHANNEL, + uint32_t TIM_CHANNEL, - GPIO_TypeDef * GPIOx, + GPIO_TypeDef * GPIOx, @@ -193,7 +201,7 @@ Functions HAL_StatusTypeDef TIM_OC_Comparator_Init ( - TIM_HandleTypeDef * htim, + TIM_HandleTypeDef * htim, @@ -220,10 +228,18 @@ Functions
    + +
    diff --git a/Doc/html/group___t_i_m___i_n_i_t.html b/Doc/html/group___t_i_m___i_n_i_t.html index 9130ced..5209e6b 100644 --- a/Doc/html/group___t_i_m___i_n_i_t.html +++ b/Doc/html/group___t_i_m___i_n_i_t.html @@ -3,7 +3,7 @@ - + MyLibs: Init defines @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - - +

    Настройка таймеров More...

    -
    - + Collaboration diagram for Init defines:
    +
    Collaboration diagram for Init defines:
    - - - - - - - - - - - - - - - -

    +

    Macros

    #define HAL_TIM_MODULE_ENABLED
     
    #define USE_TIM1
     Включить TIM1 в TIM_Base_MspInit.
     
    #define USE_TIM2
     Включить TIM2 в TIM_Base_MspInit.
     
    #define USE_TIM3
     Включить TIM3 в TIM_Base_MspInit.
     
    #define USE_TIM4
     Включить TIM4 в TIM_Base_MspInit.
     
    #define USE_TIM5
     Включить TIM5 в TIM_Base_MspInit.
     
    #define USE_TIM6
     Включить TIM6 в TIM_Base_MspInit.
     
    #define USE_TIM7
     Включить TIM7 в TIM_Base_MspInit.
     
    #define USE_TIM8
     Включить TIM8 в TIM_Base_MspInit.
     
    #define USE_TIM9
     Включить TIM9 в TIM_Base_MspInit.
     
    #define USE_TIM10
     Включить TIM10 в TIM_Base_MspInit.
     
    #define USE_TIM11
     Включить TIM11 в TIM_Base_MspInit.
     
    #define USE_TIM12
     Включить TIM12 в TIM_Base_MspInit.
     
    #define USE_TIM13
     Включить TIM13 в TIM_Base_MspInit.
     
    #define USE_TIM14
     Включить TIM14 в TIM_Base_MspInit.
     
    -

    Detailed Description

    +

    Detailed Description

    Настройка таймеров

    -

    Macro Definition Documentation

    +

    Macro Definition Documentation

    ◆ HAL_TIM_MODULE_ENABLED

    @@ -182,7 +161,7 @@ Macros
    -

    Definition at line 31 of file general_tim.h.

    +

    Definition at line 32 of file general_tim.h.

    @@ -200,7 +179,7 @@ Macros

    Включить TIM1 в TIM_Base_MspInit.

    -

    Definition at line 33 of file general_tim.h.

    +

    Definition at line 34 of file general_tim.h.

    @@ -218,7 +197,7 @@ Macros

    Включить TIM2 в TIM_Base_MspInit.

    -

    Definition at line 34 of file general_tim.h.

    +

    Definition at line 35 of file general_tim.h.

    @@ -236,7 +215,7 @@ Macros

    Включить TIM3 в TIM_Base_MspInit.

    -

    Definition at line 35 of file general_tim.h.

    +

    Definition at line 36 of file general_tim.h.

    @@ -254,7 +233,7 @@ Macros

    Включить TIM4 в TIM_Base_MspInit.

    -

    Definition at line 36 of file general_tim.h.

    +

    Definition at line 37 of file general_tim.h.

    @@ -272,7 +251,7 @@ Macros

    Включить TIM5 в TIM_Base_MspInit.

    -

    Definition at line 37 of file general_tim.h.

    +

    Definition at line 38 of file general_tim.h.

    @@ -290,7 +269,7 @@ Macros

    Включить TIM6 в TIM_Base_MspInit.

    -

    Definition at line 38 of file general_tim.h.

    +

    Definition at line 39 of file general_tim.h.

    @@ -308,7 +287,7 @@ Macros

    Включить TIM7 в TIM_Base_MspInit.

    -

    Definition at line 39 of file general_tim.h.

    +

    Definition at line 40 of file general_tim.h.

    @@ -326,7 +305,7 @@ Macros

    Включить TIM8 в TIM_Base_MspInit.

    -

    Definition at line 40 of file general_tim.h.

    +

    Definition at line 41 of file general_tim.h.

    @@ -344,7 +323,7 @@ Macros

    Включить TIM9 в TIM_Base_MspInit.

    -

    Definition at line 41 of file general_tim.h.

    +

    Definition at line 42 of file general_tim.h.

    @@ -362,7 +341,7 @@ Macros

    Включить TIM10 в TIM_Base_MspInit.

    -

    Definition at line 42 of file general_tim.h.

    +

    Definition at line 43 of file general_tim.h.

    @@ -380,7 +359,7 @@ Macros

    Включить TIM11 в TIM_Base_MspInit.

    -

    Definition at line 43 of file general_tim.h.

    +

    Definition at line 44 of file general_tim.h.

    @@ -398,7 +377,7 @@ Macros

    Включить TIM12 в TIM_Base_MspInit.

    -

    Definition at line 44 of file general_tim.h.

    +

    Definition at line 45 of file general_tim.h.

    @@ -416,7 +395,7 @@ Macros

    Включить TIM13 в TIM_Base_MspInit.

    -

    Definition at line 45 of file general_tim.h.

    +

    Definition at line 46 of file general_tim.h.

    @@ -434,16 +413,24 @@ Macros

    Включить TIM14 в TIM_Base_MspInit.

    -

    Definition at line 46 of file general_tim.h.

    +

    Definition at line 47 of file general_tim.h.

    + + diff --git a/Doc/html/group___t_r_a_c_e.html b/Doc/html/group___t_r_a_c_e.html index 2365c24..6941ffc 100644 --- a/Doc/html/group___t_r_a_c_e.html +++ b/Doc/html/group___t_r_a_c_e.html @@ -3,7 +3,7 @@ - + MyLibs: Trace defines @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Trace defines
    +
    Trace defines

    Дефайны для работы с трассировкой More...

    -
    - + Collaboration diagram for Trace defines:
    +
    Collaboration diagram for Trace defines:
    - - + - - + - - + - - + -

    +

    Topics

     Serial trace defines
     Serial trace defines
     Дефайны для работы с serial трассировкой (SWO, RTT)
     
     GPIO trace defines
     GPIO trace defines
     Дефайны для работы с GPIO трассировкой
     
     Flash RTT Buffer
     Flash RTT Buffer
     Макросы и функции для сохранения/чтения RTT буфера в Flash.
     
     Hardfault trace defines
     Hardfault trace defines
     Модуль трассировки HardFault с возможностью сохранения RTT буфера во Flash.
     
    -

    Detailed Description

    +

    Detailed Description

    Дефайны для работы с трассировкой

    + +
    diff --git a/Doc/html/group___t_r_a_c_e___c_o_n_f_i_g.html b/Doc/html/group___t_r_a_c_e___c_o_n_f_i_g.html index 99c9556..cd9e6da 100644 --- a/Doc/html/group___t_r_a_c_e___c_o_n_f_i_g.html +++ b/Doc/html/group___t_r_a_c_e___c_o_n_f_i_g.html @@ -3,7 +3,7 @@ - + MyLibs: Trace configs @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Trace configs
    +
    Trace configs

    Конфигурация трекеров и трассировки More...

    -
    - + Collaboration diagram for Trace configs:
    +
    Collaboration diagram for Trace configs:
    - - - - - - - - - - - - - - - - -

    +

    Macros

    #define TRACKERS_ENABLE
     Включить трекеры
     
    #define SERIAL_TRACE_ENABLE
     Включить serial трассировку
     
    #define RTT_TRACE_ENABLE
     Включить serial трассировку через RTT.
     
    #define SWO_TRACE_ENABLE
     Включить serial трассировку через SWO.
     
    #define LOG_LEVEL   1
     Уровень log serial трассировки log_printf.
     
    #define RTT_FLASH_BUFFER_SIZE   1024
     Размер буфера RTT в Flash.
     
    #define RTT_FLASH_SECTOR   FLASH_SECTOR_11
     Сектор FLASH куда положится RTT буфер
     
    #define RTT_FLASH_SECTOR_START   0x080E0000
     Начало сектора RTT_FLASH_SECTOR.
     
    #define RTT_FLASH_SECTOR_END   0x080FFFFF
     Конец сектора RTT_FLASH_SECTOR.
     
    #define HARDFAULT_SERIAL_TRACE
     Включить обработку и serial трассировку Hardfault.
     
    #define HF_RTT_TAG_BASE   0xDEAD0000
     базовый тег для HardFault
     
    #define HF_RTT_TAIL_SIZE   RTT_FLASH_BUFFER_SIZE
     Размер буфера RTT, который сохранится при Hardfault.
     
    #define HF_STACK_DUMP_WORDS   32
     Сколько слов стека будет проанализировано во время Hardfault.
     
    #define HF_FLASH_ADDR   ((uint32_t)0x080FF000)
     Адрес FLASH куда положится RTT буфер
     
    #define HF_RAM_END   0x20030000
     Конец RAM памяти (чтобы во время анализа стека не выйти за пределы)
     
    #define GPIO_TRACE_ENABLE
     Включить GPIO трассировку
     
    -

    Detailed Description

    +

    Detailed Description

    Конфигурация трекеров и трассировки

    -

    Macro Definition Documentation

    +

    Macro Definition Documentation

    ◆ TRACKERS_ENABLE

    @@ -469,10 +447,18 @@ Macros
    + +
    diff --git a/Doc/html/group___t_r_a_c_e___g_p_i_o.html b/Doc/html/group___t_r_a_c_e___g_p_i_o.html index b0b1874..647e041 100644 --- a/Doc/html/group___t_r_a_c_e___g_p_i_o.html +++ b/Doc/html/group___t_r_a_c_e___g_p_i_o.html @@ -3,7 +3,7 @@ - + MyLibs: GPIO trace defines @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    GPIO trace defines
    +
    GPIO trace defines

    Дефайны для работы с GPIO трассировкой More...

    -
    - + Collaboration diagram for GPIO trace defines:
    +
    Collaboration diagram for GPIO trace defines:
    - - + - - + -

    +

    Macros

    #define TRACE_GPIO_RESET(_gpio_, _pin_)   (_gpio_)->BSRR = ((_pin_)<<16)
    #define TRACE_GPIO_RESET(_gpio_, _pin_)
     Сбросить указанную ножку GPIO.
     
    #define TRACE_GPIO_SET(_gpio_, _pin_)   (_gpio_)->BSRR = (((_pin_)))
    #define TRACE_GPIO_SET(_gpio_, _pin_)
     Установить указанную ножку GPIO.
     
    -

    Detailed Description

    +

    Detailed Description

    Дефайны для работы с GPIO трассировкой

    Определяется дефайны для работы с GPIO трассировкой:

    • TRACE_GPIO_RESET() - для сброса ножки GPIO (через BSRR)
    • TRACE_GPIO_SET() - для выставления ножки GPIO (через BSRR)
    • -
    • Если трассировка GPIO_TRACE_ENABLE отключена, то все дефайны определяются как 'ничего' и на производительность кода не влияют
      -
    • +
    • Если трассировка GPIO_TRACE_ENABLE отключена, то все дефайны определяются как 'ничего' и на производительность кода не влияют
    -

    Macro Definition Documentation

    +

    Macro Definition Documentation

    ◆ TRACE_GPIO_RESET

    @@ -147,16 +138,17 @@ Macros #define TRACE_GPIO_RESET ( - _gpio_, + _gpio_, - _pin_ )   (_gpio_)->BSRR = ((_pin_)<<16) + _pin_ )
    - +Value:
    (_gpio_)->BSRR = ((_pin_)<<16)
    +

    Сбросить указанную ножку GPIO.

    Parameters
    @@ -170,7 +162,7 @@ Macros
  • GPIO_TRACE_ENABLE определён - устанавливает бит сброса через BSRR ((pin)<<16)
  • -

    Definition at line 142 of file trace.h.

    +

    Definition at line 155 of file trace.h.

    @@ -183,16 +175,17 @@ Macros - + - +
    #define TRACE_GPIO_SET ( _gpio_, _gpio_,
    _pin_ )   (_gpio_)->BSRR = (((_pin_))) _pin_ )
    - +Value:
    (_gpio_)->BSRR = (((_pin_)))
    +

    Установить указанную ножку GPIO.

    Parameters
    @@ -206,16 +199,24 @@ Macros
  • GPIO_TRACE_ENABLE определён - устанавливает бит установки через BSRR (pin)
  • -

    Definition at line 141 of file trace.h.

    +

    Definition at line 154 of file trace.h.

    + + diff --git a/Doc/html/group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html b/Doc/html/group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html index a75a57e..4f37553 100644 --- a/Doc/html/group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html +++ b/Doc/html/group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html @@ -3,7 +3,7 @@ - +MyLibs: Hardfault trace defines @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + +
    @@ -73,10 +71,9 @@ $(function() {
    +
    - -
    Hardfault trace defines
    +
    Hardfault trace defines

    Модуль трассировки HardFault с возможностью сохранения RTT буфера во Flash. More...

    -
    - + Collaboration diagram for Hardfault trace defines:
    +
    Collaboration diagram for Hardfault trace defines:
    - - + -

    +

    Classes

    struct  HF_StackFrame_t
    struct  HF_StackFrame_t
     Контекст стек-фрейма процессора при HardFault. More...
     
    - - -

    +

    Functions

    __STATIC_FORCEINLINE int HF_CheckRecovered (int erase)
     Проверка и вывод последнего HardFault-трейса из Flash.
     
    __STATIC_FORCEINLINE void HF_HandleFault (void)
     Обработчик HardFault.
     
    -

    Detailed Description

    +

    Detailed Description

    Модуль трассировки HardFault с возможностью сохранения RTT буфера во Flash.

    Этот модуль позволяет сохранять контекст процессора и последние символы RTT буфера при возникновении HardFault.

    Механизм работы:

      @@ -176,10 +166,10 @@ Functions
      RTT_EraseFlash(); // erase rtt flash after message readed
      }
      }
      -
      __STATIC_FORCEINLINE int HF_CheckRecovered(int erase)
      Проверка и вывод последнего HardFault-трейса из Flash.
      Definition trace.h:486
      -
      __STATIC_FORCEINLINE void HF_HandleFault(void)
      Обработчик HardFault.
      Definition trace.h:527
      -
      __STATIC_FORCEINLINE int RTT_EraseFlash(void)
      Стирание сектора Flash с RTT-буфером
      Definition trace.h:375
      -

    Function Documentation

    +
    __STATIC_FORCEINLINE int HF_CheckRecovered(int erase)
    Проверка и вывод последнего HardFault-трейса из Flash.
    Definition trace.h:499
    +
    __STATIC_FORCEINLINE void HF_HandleFault(void)
    Обработчик HardFault.
    Definition trace.h:540
    +
    __STATIC_FORCEINLINE int RTT_EraseFlash(void)
    Стирание сектора Flash с RTT-буфером
    Definition trace.h:388
    +

    Function Documentation

    ◆ HF_CheckRecovered()

    @@ -204,7 +194,7 @@ Functions
    Note
    Вызов рекомендуется при инициализации приложения для анализа предыдущего сбоя.
    -

    Definition at line 486 of file trace.h.

    +

    Definition at line 499 of file trace.h.

    @@ -217,7 +207,7 @@ Functions __STATIC_FORCEINLINE void HF_HandleFault ( - void ) + void ) @@ -234,16 +224,24 @@ Functions
    Note
    Функция защищена, так как вызывается в контексте сбоя — минимизирует использование вызовов HAL.
    -

    Definition at line 527 of file trace.h.

    +

    Definition at line 540 of file trace.h.

    + + diff --git a/Doc/html/group___t_r_a_c_e___r_t_t___f_l_a_s_h.html b/Doc/html/group___t_r_a_c_e___r_t_t___f_l_a_s_h.html index b401ff0..20cd2c9 100644 --- a/Doc/html/group___t_r_a_c_e___r_t_t___f_l_a_s_h.html +++ b/Doc/html/group___t_r_a_c_e___r_t_t___f_l_a_s_h.html @@ -3,7 +3,7 @@ - + MyLibs: Flash RTT Buffer @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Flash RTT Buffer
    +
    Flash RTT Buffer

    Макросы и функции для сохранения/чтения RTT буфера в Flash. More...

    -
    - + Collaboration diagram for Flash RTT Buffer:
    +
    Collaboration diagram for Flash RTT Buffer:
    - - + -

    +

    Classes

    struct  RTT_FlashHeader_t
    struct  RTT_FlashHeader_t
     Структура RTT, которая будет положена в Flash. More...
     
    - - - - -

    +

    Functions

    __STATIC_FORCEINLINE void RTT_FlashPrepare (void)
     Подготовка Flash к записи
     
    __STATIC_FORCEINLINE int RTT_SaveToFlash (uint32_t tag, uint32_t tail_size)
     Сохраняет последние символы RTT-буфера в Flash по тегу
     
    __STATIC_FORCEINLINE int RTT_ReadFromFlash (uint32_t tag, char *Buffer, uint32_t tail_size, uint32_t *read_size)
     Читает последние символы RTT-буфера из Flash по тегу
     
    __STATIC_FORCEINLINE int RTT_EraseFlash (void)
     Стирание сектора Flash с RTT-буфером
     
    -

    Detailed Description

    +

    Detailed Description

    Макросы и функции для сохранения/чтения RTT буфера в Flash.

    Модуль позволяет сохранять данные RTT буфера во Flash и читать их обратно по тегам.
    Теги работают следующим образом:
    @@ -163,7 +151,7 @@ Functions

  • RTT_FLASH_SECTOR_START - Начало сектора RTT_FLASH_SECTOR
  • RTT_FLASH_SECTOR_END - Конец сектора RTT_FLASH_SECTOR
  • -

    Function Documentation

    +

    Function Documentation

    ◆ RTT_FlashPrepare()

    @@ -173,7 +161,7 @@ Functions __STATIC_FORCEINLINE void RTT_FlashPrepare ( - void ) + void ) @@ -182,7 +170,7 @@ Functions

    Подготовка Flash к записи

    Сбрасывает ошибки Flash и ожидает готовности перед записью

    -

    Definition at line 190 of file trace.h.

    +

    Definition at line 203 of file trace.h.

    @@ -195,7 +183,7 @@ Functions __STATIC_FORCEINLINE int RTT_SaveToFlash ( - uint32_t tag, + uint32_t tag, @@ -220,7 +208,7 @@ Functions
  • Если конкретный (младший байт != 0) — запись выполняется только с этим тегом, иначе ошибка.
  • -

    Definition at line 214 of file trace.h.

    +

    Definition at line 227 of file trace.h.

    @@ -233,17 +221,17 @@ Functions __STATIC_FORCEINLINE int RTT_ReadFromFlash ( - uint32_t tag, + uint32_t tag, - char * Buffer, + char * Buffer, - uint32_t tail_size, + uint32_t tail_size, @@ -269,7 +257,7 @@ Functions
  • Если конкретный (младший байт != 0) — прочитывается именно эта запись.
  • -

    Definition at line 311 of file trace.h.

    +

    Definition at line 324 of file trace.h.

    @@ -282,7 +270,7 @@ Functions __STATIC_FORCEINLINE int RTT_EraseFlash ( - void ) + void ) @@ -290,16 +278,24 @@ Functions

    Стирание сектора Flash с RTT-буфером

    -

    Definition at line 375 of file trace.h.

    +

    Definition at line 388 of file trace.h.

    + + diff --git a/Doc/html/group___t_r_a_c_e___s_e_r_i_a_l.html b/Doc/html/group___t_r_a_c_e___s_e_r_i_a_l.html index a2019a0..ca0045f 100644 --- a/Doc/html/group___t_r_a_c_e___s_e_r_i_a_l.html +++ b/Doc/html/group___t_r_a_c_e___s_e_r_i_a_l.html @@ -3,7 +3,7 @@ - + MyLibs: Serial trace defines @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Serial trace defines
    +
    Serial trace defines

    Дефайны для работы с serial трассировкой (SWO, RTT) More...

    -
    - + Collaboration diagram for Serial trace defines:
    +
    Collaboration diagram for Serial trace defines:
    - - + - - - +

    +

    Macros

    #define my_printf(...)   SEGGER_RTT_printf(0, __VA_ARGS__)
    #define my_printf(...)
     Универсальный макрос для вывода трассировки
     
    #define log_printf(TAG, fmt, ...)
     Макрос логирования с поддержкой уровней LOG_LEVEL.
     
     Макрос логирования с поддержкой уровней LOG_LEVEL.
    -

    Detailed Description

    +

    Detailed Description

    Дефайны для работы с serial трассировкой (SWO, RTT)

    В зависимости от настроек определяется дефайн my_printf() и log_printf() для работы с трассировкой:

    • SERIAL_TRACE_ENABLE - Если трассировка отключена, то все дефайны определяются как 'ничего' и на производительность кода не влияют
    • -
    • RTT_TRACE_ENABLE - для RTT это будет вызов функции SEGGER_RTT_printf(), с подключением библиотеки SEGGER_RTT.h Предварительно надо подключить библиотеку SEGGER RTT и вызвать функцию SEGGER_RTT_Init()
    • +
    • RTT_TRACE_ENABLE - для RTT это будет вызов функции SEGGER_RTT_printf()

      +

      Предварительно надо подключить библиотеку SEGGER RTT (SEGGER_RTT.h) и вызвать функцию SEGGER_RTT_Init()

      +
    • SWO_TRACE_ENABLE для SWO это будет просто printf()

      -

      Но библиотеку STDOUT надо подключить самостоятельно:

      -
          Manage Run-Time Environment -> Compiler -> I/O -> STDOUT 

      Для SWO также надо включить трассировку:
      +

      Предварительно надо подключить библиотеку STDOUT и retarget под ITM:

      +
          Manage Run-Time Environment -> Compiler -> I/O -> STDOUT -> ITM
      +

      Для SWO также надо включить трассировку:

      -
          Options For Target -> Debug -> Debugger Settings

      В вкладке Debug:

        +
            Options For Target -> Debug -> Debugger Settings
        +

        В вкладке Debug:

        • Port = SW В вкладке Trace:
        • Указать Core Clock
        • Выставить Trace Port = SWO
        • -
        • ITM - выбрать нужный порт (для Keil нулевой порт)
          -
        • +
        • ITM - выбрать нужный порт (для Keil нулевой порт)
      -

      Macro Definition Documentation

      +

      Macro Definition Documentation

      ◆ my_printf

      @@ -157,20 +152,21 @@ Macros #define my_printf ( - ...) -    SEGGER_RTT_printf(0, __VA_ARGS__) + ...) +
    - +Value:
    SEGGER_RTT_printf(0, __VA_ARGS__)
    +

    Универсальный макрос для вывода трассировки

    Варианты реализации:

      -
    • RTT_TRACE_ENABLE SEGGER_RTT_printf(0, ...)
    • -
    • SWO_TRACE_ENABLE - printf(...)
    • +
    • RTT_TRACE_ENABLE SEGGER_RTT_printf(0, ...)
    • +
    • SWO_TRACE_ENABLE - printf(...)
    • NO_TRACE - пустой макрос
    -

    Definition at line 71 of file trace.h.

    +

    Definition at line 80 of file trace.h.

    @@ -183,25 +179,26 @@ Macros #define log_printf ( - TAG, + TAG, - fmt, + fmt, - ... ) + ... )
    Value:
    my_printf("\n[%lu] [%s] " fmt, \
    -
    (unsigned long)uwTick, TAG, ##__VA_ARGS__)
    -
    #define my_printf(...)
    Универсальный макрос для вывода трассировки
    Definition trace.h:71
    +
    (unsigned long)local_time(), TAG, ##__VA_ARGS__)
    +
    #define local_time()
    Локальное время
    +
    #define my_printf(...)
    Универсальный макрос для вывода трассировки
    Definition trace.h:80
    -

    Макрос логирования с поддержкой уровней LOG_LEVEL.

    +

    Макрос логирования с поддержкой уровней LOG_LEVEL.

    Parameters
    @@ -210,21 +207,33 @@ Macros

    Варианты реализации:

      -
    • LOG_LEVEL == 0 - логирование отключено (макрос пустой)
    • -
    • LOG_LEVEL == 1 - выводится время и TAG
    • -
    • LOG_LEVEL >= 2 - выводится время, TAG, имя файла и номер строки
    • +
    • LOG_LEVEL == 0 - логирование отключено (макрос пустой)
    • +
    • LOG_LEVEL == 1 - выводится время local_time и TAG
      [123] [ADC] Measure Done
      +
      [456] [ADC] Measure Err
      +
    • +
    • LOG_LEVEL >= 2 - выводится время, TAG, имя файла и номер строки
      [123] [ADC] (../Core/Src/adc.c:75) Measure Done
      +
      [456] [ADC] (../Core/Src/adc.c:80) Measure Err
      +
    -

    Definition at line 96 of file trace.h.

    +

    Definition at line 109 of file trace.h.

    + + diff --git a/Doc/html/group___t_r_a_c_k_e_r_s.html b/Doc/html/group___t_r_a_c_k_e_r_s.html index 09abab2..66db708 100644 --- a/Doc/html/group___t_r_a_c_k_e_r_s.html +++ b/Doc/html/group___t_r_a_c_k_e_r_s.html @@ -3,7 +3,7 @@ - +MyLibs: Trackers defines @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    TAGТэг лога
    - + +
    @@ -73,10 +71,9 @@ $(function() { +
    - -
    Trackers defines
    +
    Trackers defines

    Дефайны для работы с трекерами More...

    -
    - + Collaboration diagram for Trackers defines:
    +
    Collaboration diagram for Trackers defines:
    - - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + -

    +

    Macros

    #define TrackerTypeDef(num_user_vars)
     Структура для счетчиков отладки
     
    #define num_of_usercnts(_user_)   (sizeof(_user_) / sizeof(uint32_t))
    #define num_of_usercnts(_user_)
     Получить количетство пользовательских переменных
     
    #define assert_usertracker(_cntstruct_, _uservarnumb_)   ((_uservarnumb_) < num_of_usercnts((_cntstruct_).user))
    #define assert_usertracker(_cntstruct_, _uservarnumb_)
     Проверка существует ли указанная пользовательская переменная
     
    #define if_assert_usertracker(_cntstruct_, _uservarnumb_)   if(assert_usertracker(_cntstruct_, _uservarnumb_))
    #define if_assert_usertracker(_cntstruct_, _uservarnumb_)
     Условие для проверки существует ли указанная пользовательская переменная
     
    #define tern_assert_usertracker(_cntstruct_, _uservarnumb_)   (assert_usertracker(_cntstruct_, _uservarnumb_)) ? _uservarnumb_ : 0
    #define tern_assert_usertracker(_cntstruct_, _uservarnumb_)
     Тернарный оператор для проверки существует ли указанная пользовательская переменная
     
    #define TrackerGet_Ok(_cntstruct_)   (_cntstruct_).cnt_ok
    #define TrackerGet_Ok(_cntstruct_)
     Считать счетчик успешных событий
     
    #define TrackerGet_Err(_cntstruct_)   (_cntstruct_).cnt_err
    #define TrackerGet_Err(_cntstruct_)
     Считать счетчик ошибок
     
    #define TrackerGet_Warn(_cntstruct_)   (_cntstruct_).cnt_warn
    #define TrackerGet_Warn(_cntstruct_)
     Считать счетчик предупреждений
     
    #define TrackerGet_User(_cntstruct_, _uservarnumb_)   (_cntstruct_).user[tern_assert_usertracker(_cntstruct_, _uservarnumb_)]
    #define TrackerGet_User(_cntstruct_, _uservarnumb_)
     Считать пользовательскую переменную
     
    #define TrackerCnt_Ok(_cntstruct_)   (_cntstruct_).cnt_ok++
    #define TrackerCnt_Ok(_cntstruct_)
     Инкрементирование счетчика успешных событий
     
    #define TrackerCnt_Err(_cntstruct_)   (_cntstruct_).cnt_err++
    #define TrackerCnt_Err(_cntstruct_)
     Инкрементирование счетчика ошибок
     
    #define TrackerCnt_Warn(_cntstruct_)   (_cntstruct_).cnt_warn++
    #define TrackerCnt_Warn(_cntstruct_)
     Инкрементирование счетчика предупреждений
     
    #define TrackerCnt_User(_cntstruct_, _uservarnumb_)   if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_]++;
    #define TrackerCnt_User(_cntstruct_, _uservarnumb_)
     Инкрементирование пользовательской переменной
     
    #define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_)   if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = (_val_)
    #define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_)
     Запись числа в пользовательскую переменную
     
    #define TrackerClear_All(_cntstruct_)   memset(&(_cntstruct_), 0, sizeof(_cntstruct_))
    #define TrackerClear_All(_cntstruct_)
     Очистка всей структуры
     
    #define TrackerClear_Ok(_cntstruct_)   (_cntstruct_).cnt_ok = 0
    #define TrackerClear_Ok(_cntstruct_)
     Очистка счетчика успешных событий
     
    #define TrackerClear_Err(_cntstruct_)   (_cntstruct_).cnt_err = 0
    #define TrackerClear_Err(_cntstruct_)
     Очистка счетчика ошибок
     
    #define TrackerClear_Warn(_cntstruct_)   (_cntstruct_).cnt_warn = 0
    #define TrackerClear_Warn(_cntstruct_)
     Очистка счетчика предупреждений
     
    #define TrackerClear_User(_cntstruct_, _uservarnumb_)   if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = 0;
    #define TrackerClear_User(_cntstruct_, _uservarnumb_)
     Очистка пользовательской переменной
     
    #define TrackerClear_UserAll(_cntstruct_)   memset(&(_cntstruct_).user, 0, sizeof((_cntstruct_).user))
    #define TrackerClear_UserAll(_cntstruct_)
     Очистка всех пользовательских переменных
     
    -

    Detailed Description

    +

    Detailed Description

    Дефайны для работы с трекерами


    Есть дефайн для объявления структуры трекера: TrackerTypeDef(num_user_vars). Структура состоит из следующих элементов:

    -

    Macro Definition Documentation

    +

    Macro Definition Documentation

    ◆ TrackerTypeDef

    @@ -238,7 +211,7 @@ Macros #define TrackerTypeDef ( - num_user_vars) + num_user_vars) @@ -274,12 +247,13 @@ Macros #define num_of_usercnts ( - _user_) -    (sizeof(_user_) / sizeof(uint32_t)) + _user_) +
    - +Value:
    (sizeof(_user_) / sizeof(uint32_t))
    +

    Получить количетство пользовательских переменных

    Definition at line 80 of file trackers.h.

    @@ -295,16 +269,18 @@ Macros #define assert_usertracker ( - _cntstruct_, + _cntstruct_, - _uservarnumb_ )   ((_uservarnumb_) < num_of_usercnts((_cntstruct_).user)) + _uservarnumb_ )
    - +Value:
    ((_uservarnumb_) < num_of_usercnts((_cntstruct_).user))
    +
    #define num_of_usercnts(_user_)
    Получить количетство пользовательских переменных
    Definition trackers.h:80
    +

    Проверка существует ли указанная пользовательская переменная

    Definition at line 82 of file trackers.h.

    @@ -320,16 +296,18 @@ Macros #define if_assert_usertracker ( - _cntstruct_, + _cntstruct_, - _uservarnumb_ )   if(assert_usertracker(_cntstruct_, _uservarnumb_)) + _uservarnumb_ )
    - +Value:
    if(assert_usertracker(_cntstruct_, _uservarnumb_))
    +
    #define assert_usertracker(_cntstruct_, _uservarnumb_)
    Проверка существует ли указанная пользовательская переменная
    Definition trackers.h:82
    +

    Условие для проверки существует ли указанная пользовательская переменная

    Definition at line 84 of file trackers.h.

    @@ -345,16 +323,17 @@ Macros #define tern_assert_usertracker ( - _cntstruct_, + _cntstruct_, - _uservarnumb_ )   (assert_usertracker(_cntstruct_, _uservarnumb_)) ? _uservarnumb_ : 0 + _uservarnumb_ )
    - +Value:
    (assert_usertracker(_cntstruct_, _uservarnumb_)) ? _uservarnumb_ : 0
    +

    Тернарный оператор для проверки существует ли указанная пользовательская переменная

    Definition at line 86 of file trackers.h.

    @@ -370,12 +349,13 @@ Macros #define TrackerGet_Ok ( - _cntstruct_) -    (_cntstruct_).cnt_ok + _cntstruct_) +
    - +Value:
    (_cntstruct_).cnt_ok
    +

    Считать счетчик успешных событий

    Definition at line 90 of file trackers.h.

    @@ -391,12 +371,13 @@ Macros #define TrackerGet_Err ( - _cntstruct_) -    (_cntstruct_).cnt_err + _cntstruct_) +
    - +Value:
    (_cntstruct_).cnt_err
    +

    Считать счетчик ошибок

    Definition at line 92 of file trackers.h.

    @@ -412,12 +393,13 @@ Macros #define TrackerGet_Warn ( - _cntstruct_) -    (_cntstruct_).cnt_warn + _cntstruct_) +
    - +Value:
    (_cntstruct_).cnt_warn
    +

    Считать счетчик предупреждений

    Definition at line 94 of file trackers.h.

    @@ -433,16 +415,18 @@ Macros #define TrackerGet_User ( - _cntstruct_, + _cntstruct_, - _uservarnumb_ )   (_cntstruct_).user[tern_assert_usertracker(_cntstruct_, _uservarnumb_)] + _uservarnumb_ )
    - +Value:
    (_cntstruct_).user[tern_assert_usertracker(_cntstruct_, _uservarnumb_)]
    +
    #define tern_assert_usertracker(_cntstruct_, _uservarnumb_)
    Тернарный оператор для проверки существует ли указанная пользовательская переменная
    Definition trackers.h:86
    +

    Считать пользовательскую переменную

    Note
    Здесь нет проверки - существует ли пользовательская переменная! Есть возможность выйти за границы структуры!!! Чтобы этого избежать можно использовать дефайн #ref assert_usertracker()
      if(assert_usertracker(struct, 0)) {
           TrackerGet_User(struct, 0)
    @@ -462,12 +446,13 @@ Macros
             
               #define TrackerCnt_Ok
               (
    -                    _cntstruct_)
    -             (_cntstruct_).cnt_ok++
    +                    _cntstruct_)
    +          
             
           
     
    - +Value:
    (_cntstruct_).cnt_ok++
    +

    Инкрементирование счетчика успешных событий

    Definition at line 111 of file trackers.h.

    @@ -483,12 +468,13 @@ Macros #define TrackerCnt_Err ( - _cntstruct_) -    (_cntstruct_).cnt_err++ + _cntstruct_) +
    - +Value:
    (_cntstruct_).cnt_err++
    +

    Инкрементирование счетчика ошибок

    Definition at line 113 of file trackers.h.

    @@ -504,12 +490,13 @@ Macros #define TrackerCnt_Warn ( - _cntstruct_) -    (_cntstruct_).cnt_warn++ + _cntstruct_) +
    - +Value:
    (_cntstruct_).cnt_warn++
    +

    Инкрементирование счетчика предупреждений

    Definition at line 115 of file trackers.h.

    @@ -525,16 +512,18 @@ Macros #define TrackerCnt_User ( - _cntstruct_, + _cntstruct_, - _uservarnumb_ )   if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_]++; + _uservarnumb_ )
    - +Value:
    if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_]++;
    +
    #define if_assert_usertracker(_cntstruct_, _uservarnumb_)
    Условие для проверки существует ли указанная пользовательская переменная
    Definition trackers.h:84
    +

    Инкрементирование пользовательской переменной

    Definition at line 117 of file trackers.h.

    @@ -550,21 +539,22 @@ Macros #define TrackerWrite_User ( - _cntstruct_, + _cntstruct_, - _uservarnumb_, + _uservarnumb_, - _val_ )   if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = (_val_) + _val_ )
    - +Value:
    if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = (_val_)
    +

    Запись числа в пользовательскую переменную

    Definition at line 119 of file trackers.h.

    @@ -580,12 +570,13 @@ Macros #define TrackerClear_All ( - _cntstruct_) -    memset(&(_cntstruct_), 0, sizeof(_cntstruct_)) + _cntstruct_) +
    - +Value:
    memset(&(_cntstruct_), 0, sizeof(_cntstruct_))
    +

    Очистка всей структуры

    Definition at line 122 of file trackers.h.

    @@ -601,12 +592,13 @@ Macros #define TrackerClear_Ok ( - _cntstruct_) -    (_cntstruct_).cnt_ok = 0 + _cntstruct_) +
    - +Value:
    (_cntstruct_).cnt_ok = 0
    +

    Очистка счетчика успешных событий

    Definition at line 124 of file trackers.h.

    @@ -622,12 +614,13 @@ Macros #define TrackerClear_Err ( - _cntstruct_) -    (_cntstruct_).cnt_err = 0 + _cntstruct_) +
    - +Value:
    (_cntstruct_).cnt_err = 0
    +

    Очистка счетчика ошибок

    Definition at line 126 of file trackers.h.

    @@ -643,12 +636,13 @@ Macros #define TrackerClear_Warn ( - _cntstruct_) -    (_cntstruct_).cnt_warn = 0 + _cntstruct_) +
    - +Value:
    (_cntstruct_).cnt_warn = 0
    +

    Очистка счетчика предупреждений

    Definition at line 128 of file trackers.h.

    @@ -664,16 +658,17 @@ Macros #define TrackerClear_User ( - _cntstruct_, + _cntstruct_, - _uservarnumb_ )   if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = 0; + _uservarnumb_ )
    - +Value:
    if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = 0;
    +

    Очистка пользовательской переменной

    Definition at line 130 of file trackers.h.

    @@ -689,12 +684,13 @@ Macros #define TrackerClear_UserAll ( - _cntstruct_) -    memset(&(_cntstruct_).user, 0, sizeof((_cntstruct_).user)) + _cntstruct_) +
    - +Value:
    memset(&(_cntstruct_).user, 0, sizeof((_cntstruct_).user))
    +

    Очистка всех пользовательских переменных

    Definition at line 132 of file trackers.h.

    @@ -703,10 +699,18 @@ Macros
    + +
    diff --git a/Doc/html/group___u_t_i_l_s___d_e_f_i_n_e_s.html b/Doc/html/group___u_t_i_l_s___d_e_f_i_n_e_s.html index 847999e..72b22b5 100644 --- a/Doc/html/group___u_t_i_l_s___d_e_f_i_n_e_s.html +++ b/Doc/html/group___u_t_i_l_s___d_e_f_i_n_e_s.html @@ -3,7 +3,7 @@ - + MyLibs: Utils defines @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    Utils defines
    +
    Utils defines

    Общие вспомогательные макросы More...

    -
    - + Collaboration diagram for Utils defines:
    +
    Collaboration diagram for Utils defines:
    - - + - - + - - + - - + -

    +

    Macros

    #define ClearStruct(_struct_)   memset(&(_struct_), 0, sizeof(_struct_))
    #define ClearStruct(_struct_)
     Обнуление структуры.
     
    #define Divide_Up(_val_, _div_)   ((_val_ - 1) / _div_) + 1 /* через мат выражение */
    #define Divide_Up(_val_, _div_)
     Деление с округлением вверх
     
    #define ByteSwap16(v)   (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
    #define ByteSwap16(v)
     Swap between Little Endian and Big Endian.
     
    #define ABS(x)   ( ((x) > 0)? (x) : -(x))
    #define ABS(x)
     Абсолютное значение числа
     
    -

    Detailed Description

    +

    Detailed Description

    Общие вспомогательные макросы

    -

    Macro Definition Documentation

    +

    Macro Definition Documentation

    ◆ ClearStruct

    @@ -147,12 +137,13 @@ Macros #define ClearStruct ( - _struct_) -    memset(&(_struct_), 0, sizeof(_struct_)) + _struct_) +
    - +Value:
    memset(&(_struct_), 0, sizeof(_struct_))
    +

    Обнуление структуры.

    Parameters
    @@ -162,7 +153,7 @@ Macros

    Макрос использует memset для обнуления всей памяти структуры. Используется для быстрой и безопасной инициализации переменных структур до нуля.

    -

    Definition at line 151 of file mylibs_defs.h.

    +

    Definition at line 155 of file mylibs_defs.h.

    @@ -175,16 +166,17 @@ Macros - + - +
    #define Divide_Up ( _val_, _val_,
    _div_ )   ((_val_ - 1) / _div_) + 1 /* через мат выражение */ _div_ )
    - +Value:
    ((_val_ - 1) / _div_) + 1 /* через мат выражение */
    +

    Деление с округлением вверх

    Parameters
    @@ -196,7 +188,7 @@ Macros
    Returns
    Результат деления, округленный вверх.

    Если результат деления без остатка: он возвращается как есть Если с остатком - округляется вверх

    -

    Definition at line 162 of file mylibs_defs.h.

    +

    Definition at line 166 of file mylibs_defs.h.

    @@ -209,12 +201,13 @@ Macros - - + +
    #define ByteSwap16 ( v)   (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8))) v)
    - +Value:
    (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
    +

    Swap between Little Endian and Big Endian.

    Parameters
    @@ -225,7 +218,7 @@ Macros
    Returns
    Результат с поменяными местами старшим и младшим байтом.

    Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты.

    -

    Definition at line 170 of file mylibs_defs.h.

    +

    Definition at line 174 of file mylibs_defs.h.

    @@ -238,12 +231,13 @@ Macros - - + +
    #define ABS ( x)   ( ((x) > 0)? (x) : -(x)) x)
    - +Value:
    ( ((x) > 0)? (x) : -(x))
    +

    Абсолютное значение числа

    Parameters
    @@ -254,16 +248,24 @@ Macros
    Returns
    Абсолютное значение числа x.

    Берет число по модулю. Хз как работает библиотечный abs в stdlib.h, мб это быстрее, но вряд ли конечно.

    -

    Definition at line 178 of file mylibs_defs.h.

    +

    Definition at line 182 of file mylibs_defs.h.

    + + diff --git a/Doc/html/index.html b/Doc/html/index.html index 3916f2b..bea1476 100644 --- a/Doc/html/index.html +++ b/Doc/html/index.html @@ -3,7 +3,7 @@ - +MyLibs: MyLibs @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + +
    @@ -73,10 +71,9 @@ $(function() {
    +
    MyLibs
    -

    +

    Обзор

    -

    MyLibs - это набор библиотек для удобной работы с периферией микроконтроллеров STM32.

    -

    +

    MyLibs - это набор библиотек для удобной работы с STM32.

    +

    Основные возможности

    -

    +

    Общие утилиты (General Tools)

    • Макросы для задержек и утилит (Delays defines и Utils defines)
    • @@ -116,7 +113,7 @@ $(function(){initNavTree('index.html',''); initResizable(); });
    • Эволюционный алгоритм для оптимизации параметров (Evolve optimizer)
    • Битовый доступ к регистрам через union (Bit access defines)
    -

    +

    Трассировка Trace defines

    • Serial трассировка через SWO и RTT (Serial trace defines)
    • @@ -124,14 +121,14 @@ $(function(){initNavTree('index.html',''); initResizable(); });
    • Сохранение логов в Flash память (Flash RTT Buffer)
    • Обработка HardFault с сохранением контекста (Hardfault trace defines)
    -

    +

    Модуль GPIO GPIO Tools

    • Инициализация портов и тактирования (General tools)
    • Управление светодиодами (включение/выключение, моргание, плавное затухание) (LED tools)
    • Работа с кнопками (чтение состояния, фильтрация дребезга) (Switch tools)
    -

    +

    Модуль таймеров TIM Tools

    • Базовая инициализация таймеров (General tools)
    • @@ -139,21 +136,36 @@ $(function(){initNavTree('index.html',''); initResizable(); });
    • Работа с энкодерами (чтение положения, обработка кнопок) (Encoder tools)
    • Настройка ШИМ и Output Compare (PWM/OC Channels tools)
    -

    +

    +Модуль UART UART Tools

    +
      +
    • Базовая инициализация UART и его пинов одной функцией (UART_Base_Init)
    • +
    +

    +Модуль SPI SPI Tools

    +
      +
    • Базовая инициализация SPI и пинов одной функцией (SPI_Base_Init)
    • +
    +

    Структура проекта

    ├── inc/ # Заголовочные файлы
    │ ├── mylibs_include.h # Главный include файл
    │ ├── mylibs_config.h # Конфигурация библиотек
    │ ├── mylibs_defs.h # Общие определения и макросы
    │ ├── bit_access.h # Битовый доступ к регистрам
    +
    │ ├── evolve_optimizer.h # Оптимизатор (генетический алгоритм)
    │ ├── trackers.h # Трекеры для отладки
    │ ├── trace.h # Трассировка и логирование
    │ ├── general_gpio.h # Работа с GPIO
    +
    ├── general_spi.h # Работа с SPI
    │ └── general_tim.h # Работа с таймерами
    +
    ├── general_uart.h # Работа с UART
    └── src/ # Исходные файлы
    ├── general_gpio.c # Реализация GPIO
    +
    ├── general_spi.c # Реализация SPI
    └── general_tim.c # Реализация TIM
    -

    +
    ├── general_uart.c # Реализация UART
    +

    Использование

    Инструкция по подключению:

      @@ -161,65 +173,17 @@ $(function(){initNavTree('index.html',''); initResizable(); });
    1. Подключите главный заголовочный файл:
      #include "mylibs_include.h"
      Заголочный файл для всех библиотек
    2. -
    3. Используйте нужные модули в своем коде
    4. +
    5. Используйте нужные модули в своем коде. Примеры использования приведены в соответствующей теме
    -

    -Пример работы с GPIO

    -
    // Инициализация светодиода
    -
    MX_GPIO_Init();
    - -
    GPIO_LED_Init(&led, GPIOA, GPIO_PIN_5, 1);
    -
    -
    // Включение светодиода
    - -
    -
    // Запуск моргания
    -
    GPIO_LED_Blink_Start(&led, 500); // Период 500 мс
    -
    -
    // В основном цикле
    -
    while (1) {
    - -
    }
    -
    HAL_StatusTypeDef GPIO_LED_On(GPIO_LEDTypeDef *led)
    Включить светодиод
    -
    HAL_StatusTypeDef GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_On_State)
    Инициализировать светодиод (структуру светодиода)
    -
    void GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led)
    Управление динамическими режимами свечения светодиода
    -
    HAL_StatusTypeDef GPIO_LED_Blink_Start(GPIO_LEDTypeDef *led, uint32_t period)
    Активировать моргание светодиодом
    -
    Структура светодиода
    -

    -Пример работы с таймером

    -
    // Настройка таймера
    -
    TIM_SettingsTypeDef tim_settings = {0};
    -
    tim_settings.htim.Instance = TIM2;
    -
    tim_settings.sTimAHBFreqMHz = SystemCoreClock;
    - -
    tim_settings.sTimFreqHz = 1000; // 1 кГц
    -
    tim_settings.sTimMode = TIM_IT_CONF;
    -
    -
    TIM_Base_Init(&tim_settings);
    -
    HAL_TIM_Base_Start(&tim_settings.htim);
    -
    HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef *stim)
    Инициализация таймера.
    Definition general_tim.c:34
    -
    @ TIM_TickBase_1MS
    Таймер тактируется с частотой 1 кГц
    Definition general_tim.h:96
    -
    Структура инициализации таймера
    -
    TIM_MHzTickBaseTypeDef sTickBaseUS
    Длительность одного тика
    -
    float sTimAHBFreqMHz
    Частота шины тактирования таймера
    -
    TIM_ITModeTypeDef sTimMode
    Настройки прерывания таймера
    -
    TIM_HandleTypeDef htim
    HAL handle таймера
    -
    float sTimFreqHz
    Желаемая частота таймера
    -

    -Зависимости

    -
      -
    • HAL библиотека STM32
    • -
    • SEGGER RTT (опционально, для RTT трассировки)
    • -
    • FreeRTOS (опционально, для FreeRTOS задержек)
    • -
    - +
    + diff --git a/Doc/html/jquery.js b/Doc/html/jquery.js index 1dffb65..875ada7 100644 --- a/Doc/html/jquery.js +++ b/Doc/html/jquery.js @@ -1,17 +1,143 @@ /*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
    "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
    "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + */!function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 * http://www.smartmenus.org/ - * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/Doc/html/mainpage_8h_source.html b/Doc/html/mainpage_8h_source.html index 010d228..67363ab 100644 --- a/Doc/html/mainpage_8h_source.html +++ b/Doc/html/mainpage_8h_source.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/mainpage.h Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/mainpage.h Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({
    - + + -
    +
    3@mainpage
    4
    5@section overview Обзор
    -
    6MyLibs - это набор библиотек для удобной работы с периферией микроконтроллеров STM32.
    +
    6MyLibs - это набор библиотек для удобной работы с STM32.
    7
    8@subsection features Основные возможности
    9
    @@ -140,85 +132,56 @@ $(function(){initNavTree('mainpage_8h_source.html',''); initResizable(); });
    30- Работа с энкодерами (чтение положения, обработка кнопок) (@ref MYLIBS_TIM_ENCODER)
    31- Настройка ШИМ и Output Compare (@ref MYLIBS_TIM_OC)
    32
    -
    33
    -
    34@subsection structure Структура проекта
    +
    33@subsubsection uart_module Модуль UART @ref MY_LIBS_UART
    +
    34- Базовая инициализация UART и его пинов одной функцией (@ref UART_Base_Init)
    35
    -
    36@code
    -
    37├── inc/ # Заголовочные файлы
    -
    38│ ├── mylibs_include.h # Главный include файл
    -
    39│ ├── mylibs_config.h # Конфигурация библиотек
    -
    40│ ├── mylibs_defs.h # Общие определения и макросы
    -
    41│ ├── bit_access.h # Битовый доступ к регистрам
    -
    42│ ├── trackers.h # Трекеры для отладки
    -
    43│ ├── trace.h # Трассировка и логирование
    -
    44│ ├── general_gpio.h # Работа с GPIO
    -
    45│ └── general_tim.h # Работа с таймерами
    -
    46└── src/ # Исходные файлы
    -
    47 ├── general_gpio.c # Реализация GPIO
    -
    48 └── general_tim.c # Реализация TIM
    -
    49@endcode
    -
    50
    -
    51@subsection usage_basic Использование
    -
    52
    -
    53Инструкция по подключению:
    -
    54
    -
    551. Настройте конфигурацию @ref MYLIBS_CONFIG в @ref mylibs_config.h
    -
    56
    -
    572. Подключите главный заголовочный файл:
    -
    58@code
    -
    59#include "mylibs_include.h"
    -
    60@endcode
    -
    61
    -
    623. Используйте нужные модули в своем коде
    -
    63
    -
    64@subsubsection gpio_example Пример работы с GPIO
    -
    65
    -
    66@code
    -
    67// Инициализация светодиода
    -
    68MX_GPIO_Init();
    -
    69GPIO_LEDTypeDef led;
    -
    70GPIO_LED_Init(&led, GPIOA, GPIO_PIN_5, 1);
    +
    36@subsubsection spi_module Модуль SPI @ref MY_LIBS_SPI
    +
    37- Базовая инициализация SPI и пинов одной функцией (@ref SPI_Base_Init)
    +
    38
    +
    39@subsection structure Структура проекта
    +
    40
    +
    41@code
    +
    42├── inc/ # Заголовочные файлы
    +
    43│ ├── mylibs_include.h # Главный include файл
    +
    44│ ├── mylibs_config.h # Конфигурация библиотек
    +
    45│ ├── mylibs_defs.h # Общие определения и макросы
    +
    46│ ├── bit_access.h # Битовый доступ к регистрам
    +
    47│ ├── evolve_optimizer.h # Оптимизатор (генетический алгоритм)
    +
    48│ ├── trackers.h # Трекеры для отладки
    +
    49│ ├── trace.h # Трассировка и логирование
    +
    50│ ├── general_gpio.h # Работа с GPIO
    +
    51 ├── general_spi.h # Работа с SPI
    +
    52│ └── general_tim.h # Работа с таймерами
    +
    53 ├── general_uart.h # Работа с UART
    +
    54└── src/ # Исходные файлы
    +
    55 ├── general_gpio.c # Реализация GPIO
    +
    56 ├── general_spi.c # Реализация SPI
    +
    57 └── general_tim.c # Реализация TIM
    +
    58 ├── general_uart.c # Реализация UART
    +
    59@endcode
    +
    60
    +
    61@subsection usage_basic Использование
    +
    62
    +
    63Инструкция по подключению:
    +
    64
    +
    651. Настройте конфигурацию @ref MYLIBS_CONFIG в @ref mylibs_config.h
    +
    66
    +
    672. Подключите главный заголовочный файл:
    +
    68@code
    +
    69#include "mylibs_include.h"
    +
    70@endcode
    71
    -
    72// Включение светодиода
    -
    73GPIO_LED_On(&led);
    -
    74
    -
    75// Запуск моргания
    -
    76GPIO_LED_Blink_Start(&led, 500); // Период 500 мс
    -
    77
    -
    78// В основном цикле
    -
    79while (1) {
    -
    80GPIO_LED_Dynamic_Handle(&led);
    -
    81}
    -
    82@endcode
    -
    83
    -
    84@subsubsection tim_example Пример работы с таймером
    -
    85
    -
    86@code
    -
    87// Настройка таймера
    -
    88TIM_SettingsTypeDef tim_settings = {0};
    -
    89tim_settings.htim.Instance = TIM2;
    -
    90tim_settings.sTimAHBFreqMHz = SystemCoreClock;
    -
    91tim_settings.sTickBaseUS = TIM_TickBase_1MS;
    -
    92tim_settings.sTimFreqHz = 1000; // 1 кГц
    -
    93tim_settings.sTimMode = TIM_IT_CONF;
    -
    94
    -
    95TIM_Base_Init(&tim_settings);
    -
    96HAL_TIM_Base_Start(&tim_settings.htim);
    -
    97@endcode
    -
    98
    -
    99@subsection dependencies Зависимости
    -
    100
    -
    101- HAL библиотека STM32
    -
    102- SEGGER RTT (опционально, для RTT трассировки)
    -
    103- FreeRTOS (опционально, для FreeRTOS задержек)
    -
    104 */
    +
    723. Используйте нужные модули в своем коде. Примеры использования приведены в соответствующей теме
    +
    73
    +
    74 */
    + diff --git a/Doc/html/menu.js b/Doc/html/menu.js index 717761d..15f9c52 100644 --- a/Doc/html/menu.js +++ b/Doc/html/menu.js @@ -22,7 +22,7 @@ @licend The above is the entire license notice for the JavaScript code in this file */ -function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { +function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { function makeTree(data,relPath) { let result=''; if ('children' in data) { @@ -49,7 +49,7 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { searchBoxHtml='
    '+ '
    '+ '
     '+ + '" method="get">'+ ''+ @@ -60,8 +60,8 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { } else { searchBoxHtml='
    '+ ''+ - ' '+ + ''+ ''+ ''+ - ''+ + '
    '+ '
    '+ '
    '; } @@ -84,14 +83,12 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { '
    '); $('#main-nav').append(makeTree(menudata,relPath)); $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); - if (searchBoxHtml) { - $('#main-menu').append('
  • '); - } + $('#main-menu').append('
  • '); const $mainMenuState = $('#main-menu-state'); let prevWidth = 0; if ($mainMenuState.length) { const initResizableIfExists = function() { - if (typeof initResizable==='function') initResizable(); + if (typeof initResizable==='function') initResizable(treeview); } // animate mobile menu $mainMenuState.change(function() { diff --git a/Doc/html/menudata.js b/Doc/html/menudata.js index a1b4cb1..7938a54 100644 --- a/Doc/html/menudata.js +++ b/Doc/html/menudata.js @@ -64,6 +64,7 @@ var menudata={children:[ {text:"c",url:"globals.html#index_c"}, {text:"d",url:"globals.html#index_d"}, {text:"e",url:"globals.html#index_e"}, +{text:"f",url:"globals.html#index_f"}, {text:"g",url:"globals.html#index_g"}, {text:"h",url:"globals.html#index_h"}, {text:"i",url:"globals.html#index_i"}, @@ -80,7 +81,9 @@ var menudata={children:[ {text:"g",url:"globals_func.html#index_g"}, {text:"h",url:"globals_func.html#index_h"}, {text:"r",url:"globals_func.html#index_r"}, -{text:"t",url:"globals_func.html#index_t"}]}, +{text:"s",url:"globals_func.html#index_s"}, +{text:"t",url:"globals_func.html#index_t"}, +{text:"u",url:"globals_func.html#index_u"}]}, {text:"Enumerations",url:"globals_enum.html"}, {text:"Enumerator",url:"globals_eval.html"}, {text:"Macros",url:"globals_defs.html",children:[ @@ -89,6 +92,7 @@ var menudata={children:[ {text:"c",url:"globals_defs.html#index_c"}, {text:"d",url:"globals_defs.html#index_d"}, {text:"e",url:"globals_defs.html#index_e"}, +{text:"f",url:"globals_defs.html#index_f"}, {text:"g",url:"globals_defs.html#index_g"}, {text:"h",url:"globals_defs.html#index_h"}, {text:"i",url:"globals_defs.html#index_i"}, diff --git a/Doc/html/mylibs__config_8h.html b/Doc/html/mylibs__config_8h.html index c5c8870..c0e7444 100644 --- a/Doc/html/mylibs__config_8h.html +++ b/Doc/html/mylibs__config_8h.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_config.h File Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_config.h File Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    mylibs_config.h File Reference
    @@ -109,154 +104,145 @@ $(function(){initNavTree('mylibs__config_8h.html',''); initResizable(); });

    Конфигурации для библиотек MyLibs. More...

    #include "stm32f4xx_hal.h"
    -
    - + Include dependency graph for mylibs_config.h:
    +
    Include dependency graph for mylibs_config.h:
    -
    - + This graph shows which files directly or indirectly include this file:
    +
    This graph shows which files directly or indirectly include this file:

    Go to the source code of this file.

    - - - - - - - - - - - - - - - - - - - - + + - - - - - + +

    +

    Macros

    #define TRACKERS_ENABLE
     Включить трекеры
     
    #define SERIAL_TRACE_ENABLE
     Включить serial трассировку
     
    #define RTT_TRACE_ENABLE
     Включить serial трассировку через RTT.
     
    #define SWO_TRACE_ENABLE
     Включить serial трассировку через SWO.
     
    #define LOG_LEVEL   1
     Уровень log serial трассировки log_printf.
     
    #define RTT_FLASH_BUFFER_SIZE   1024
     Размер буфера RTT в Flash.
     
    #define RTT_FLASH_SECTOR   FLASH_SECTOR_11
     Сектор FLASH куда положится RTT буфер
     
    #define RTT_FLASH_SECTOR_START   0x080E0000
     Начало сектора RTT_FLASH_SECTOR.
     
    #define RTT_FLASH_SECTOR_END   0x080FFFFF
     Конец сектора RTT_FLASH_SECTOR.
     
    #define HARDFAULT_SERIAL_TRACE
     Включить обработку и serial трассировку Hardfault.
     
    #define HF_RTT_TAG_BASE   0xDEAD0000
     базовый тег для HardFault
     
    #define HF_RTT_TAIL_SIZE   RTT_FLASH_BUFFER_SIZE
     Размер буфера RTT, который сохранится при Hardfault.
     
    #define HF_STACK_DUMP_WORDS   32
     Сколько слов стека будет проанализировано во время Hardfault.
     
    #define HF_FLASH_ADDR   ((uint32_t)0x080FF000)
     Адрес FLASH куда положится RTT буфер
     
    #define HF_RAM_END   0x20030000
     Конец RAM памяти (чтобы во время анализа стека не выйти за пределы)
     
    #define GPIO_TRACE_ENABLE
     Включить GPIO трассировку
     
    #define ENABLE_EVOLVE_OPTIMIZATION
     Включить оптимизацию параметров
     
    #define EVOLVE_MAX_PARAMS   20
     Максимальное количество параметров
     
    #define EVOLVE_MAX_CANDIDATES   100
     Максимальное количество кандидатов для обучения
     
    #define local_time()
     Локальное время
    #define INCLUDE_EVOLVE_OPTIMIZER
     Подключить библиотеку для оптимизации параметров
     
    #define INCLUDE_BIT_ACCESS_LIB
     Подключить библиотеку с typedef с битовыми полями
     
    #define INCLUDE_TRACKERS_LIB
     Подключить библиотеку с трекерами
     
    #define INCLUDE_TRACE_LIB
     Подключить библиотеку с трейсами
     
    #define INCLUDE_GENERAL_PERIPH_LIBS
     Подключить библиотеку с периферией
     
    #define FREERTOS_DELAY
     Использовать FreeRTOS задержку, вместо HAL.
    -

    Detailed Description

    +

    Detailed Description

    Конфигурации для библиотек MyLibs.

    Definition in file mylibs_config.h.

    + +
    diff --git a/Doc/html/mylibs__config_8h.js b/Doc/html/mylibs__config_8h.js index 18173b2..522ab62 100644 --- a/Doc/html/mylibs__config_8h.js +++ b/Doc/html/mylibs__config_8h.js @@ -19,9 +19,11 @@ var mylibs__config_8h = [ "ENABLE_EVOLVE_OPTIMIZATION", "group___e_v_o_l_v_e___c_o_n_f_i_g.html#ga2cac097081444a7a9b040f4b11550e47", null ], [ "EVOLVE_MAX_PARAMS", "group___e_v_o_l_v_e___c_o_n_f_i_g.html#ga80d6162495fc3776d8902610657d4fee", null ], [ "EVOLVE_MAX_CANDIDATES", "group___e_v_o_l_v_e___c_o_n_f_i_g.html#ga7c1396e5c95c766afccdb45cbfcf5971", null ], + [ "local_time", "group___l_i_b_s___c_o_n_f_i_g.html#ga9c853b02c22f26023c34d1d404b6d653", null ], [ "INCLUDE_EVOLVE_OPTIMIZER", "group___l_i_b_s___c_o_n_f_i_g.html#ga66560656d080d6551627a19dfb847c66", null ], [ "INCLUDE_BIT_ACCESS_LIB", "group___l_i_b_s___c_o_n_f_i_g.html#gaf4ddb2a71ec0d05c2480e197cd17c0be", null ], [ "INCLUDE_TRACKERS_LIB", "group___l_i_b_s___c_o_n_f_i_g.html#ga4403055986b70bb02b8d37073a122e32", null ], [ "INCLUDE_TRACE_LIB", "group___l_i_b_s___c_o_n_f_i_g.html#ga0a3ca94b616997069dd53e2c6c2687d7", null ], - [ "INCLUDE_GENERAL_PERIPH_LIBS", "group___l_i_b_s___c_o_n_f_i_g.html#ga181a46326e46b60afb160190832c7281", null ] + [ "INCLUDE_GENERAL_PERIPH_LIBS", "group___l_i_b_s___c_o_n_f_i_g.html#ga181a46326e46b60afb160190832c7281", null ], + [ "FREERTOS_DELAY", "group___l_i_b_s___c_o_n_f_i_g.html#ga57c369737d5c0cfdb7baeecba0a4b151", null ] ]; \ No newline at end of file diff --git a/Doc/html/mylibs__config_8h__dep__incl.map b/Doc/html/mylibs__config_8h__dep__incl.map index 4efa19d..614dd43 100644 --- a/Doc/html/mylibs__config_8h__dep__incl.map +++ b/Doc/html/mylibs__config_8h__dep__incl.map @@ -1,40 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Doc/html/mylibs__config_8h__dep__incl.md5 b/Doc/html/mylibs__config_8h__dep__incl.md5 index a472a39..6fc3081 100644 --- a/Doc/html/mylibs__config_8h__dep__incl.md5 +++ b/Doc/html/mylibs__config_8h__dep__incl.md5 @@ -1 +1 @@ -ee8ba613c66132201fb932c77e0ad018 \ No newline at end of file +8d5bfdadc4587edbd964391d4cdcd645 \ No newline at end of file diff --git a/Doc/html/mylibs__config_8h__dep__incl.png b/Doc/html/mylibs__config_8h__dep__incl.png index 2b6edb9a546534f508e0018886b6417d672cdcdc..4ec6cddd6cb3b033e9e1068d3ee46dcb32c17c31 100644 GIT binary patch literal 76761 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 D@u@?J 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 - - - + + + + diff --git a/Doc/html/mylibs__config_8h__incl.md5 b/Doc/html/mylibs__config_8h__incl.md5 index d0ac3e6..f136b91 100644 --- a/Doc/html/mylibs__config_8h__incl.md5 +++ b/Doc/html/mylibs__config_8h__incl.md5 @@ -1 +1 @@ -7361bc4b175718270d049d00a1cbdbe2 \ No newline at end of file +fb457d2826e0abaa227e1adc840edd68 \ No newline at end of file diff --git a/Doc/html/mylibs__config_8h__incl.png b/Doc/html/mylibs__config_8h__incl.png index 021f13e02c34c4fff8e7d385b9d5913243b955fb..9c49be908aca5152d10ea831a868e47a4fdbbe48 100644 GIT binary patch literal 2312 zcmbtWdpOf=AD`-pl*pDs9wy~fBqOzZht2`1ZeB$dPJ#y00K!-91y>`MwQGnDH$qgmF^|B zS3UZTp_+!Y)2=4Zd^PFwxiq|-K9XoIbMRAuZbGN;E8jQ-$s=C0L}-U-p5DbLJ^0m0=&Fwca)NG#Xv=iMcjgLRt~q=Lu-sFrU(gMp$;>vF&Ss3iQ#x z{?*vHQiA2JL%KkumB}rRkk8%H+CQ%4JW~=q35&$GHN-jG@))ki@1!LJvifp$SROr=mLpTb2V(fyUYYJw6YAc|B< zWVI5SF*tzhg{$+73G^B@E*C3!qVvV4SY)jHF~snqGWj&fd%tU-dw%B4!aD75z-w+p z$>8>}rgVU<7KE+Cu%F$$Iu_9B?vu|?Ou7$kLUHxup&ne?Kp+$k$X8#1amY0E!3~I} z*p>UMOVg|u9oIb)=|2uGzaxMDIn#h)HcG~3elLB>d3>TJBbCmOSb zUeS@rmQQ@j72CKq9yM-T5Ps6C`&Zgdm06k}?tyiK65dgO=&y)idh{Z;bc5Z*02 zG&$)rPt6h5Q8yf^09lWl#l*L7U?LFjXsmSy*dqZ~ z0*%>*W?kU0v>0z#uR6j_>`dI$Pp=PFhg8=`i>rBRNkuBSqNCn<^e4Ua7AlI_9%Sgs z)O7^?E;lJaiMKhYW^dec z_hG&#>9)Uxb&v0M$sADLi#6(s&Rd>d*2Z+m9gjVxw5)s!CEsMQE|<7E|6uqgtbFqX zP-fjx3v8o;@e2H-A3zU`KOu}=E56aRHb8P0`}M6jhHu?~e~&qnXKCt2H>KP|H^&OE zFF=q&N65)EfT1-N>5CzwTj|zg~T$sG*rEk7T-vln3@ei{c1tW<{yJ zrfmPR^SGkRfdATb3NZc9T9p8pjO$*+3_SiIzE57w!atuck2%AQ;Xk$-I>!)q1~sIQ zJIAW;3&tQ{RD3jLCmH^3RXQOIXE7{(1w--IpFPm*d0^aA)O`-S|8L^HJoV#8)VtGh zy{EwyUH;+MNM7xLfX9UJAH9kd4*!Cif9X5wi`f`uipJtc_+P>;`#NZC&*ScVZ)a26 zayDBs+ixtM6bMH6kCX)eof(K^&{6oV!w3FJ_U$M5zgkOZsNs^>O0-hF#c-yKkw#Bx z;!r64UT$7~=|-(GJK{EPML4DF8>w1NP_RkRI{GX2 z-B@pB?sdR-DsGFY;ooGa{sM(&wXPWov2yZsynPa=jl#DY?=5lSZ}8- zRV!DK*0!l4$a)<4WKNCL(-AA`Gn=?qsgR@w&rxJYbiAyVJ%n$IpgEa!*X{93&@w8! zK4(U&;bk1LY7=BlDmJSbt0M|;@rk1P{K-6*^(B4}>Nb~QA~@yX_tYlYFoMRFIU6G{ z$QfH_!Rs}3_DCdXS*uRa7c|7|!n-KdJDj%7%qsN+xr%*E@+|5Y1zK;HJ@dql#%)&h z1&|rkED*GBPYk*g7y{sF_)jMQD2%)#4M-@+aAQ<(o?#oNmvA>6{)(4K=mXc<+{&p^Vg zawX3TxfWgF-qO+%AzGW)TB%J+>`r9B*x>NK7xH|Fv`^UufAUpu1+i*$j!pJsO&Qcd z+_v2bg9V7hW*)ZK6OJ6P99IspLiV00!m_{-d{QXg=~Af6v#2*sq#dKRjRUK!b@+7A zh>1RTEjOT$i&22;gq(iCS_&=3l-D=}Dr%!%kog{S1x|r|R}WN-hRuCtKkt;X|K><% z>x^8%3>egWoB-Drg|W`b5C(d^0omUpsjiV*^4MZLl1cLMAQ#yrCrKgchT}dec+Ky@ zLNAn0o&Ee^i3{~OdNgcnxg(jp)Y*xN1YSVkpIvsz47uMF4-LTn$7hB#R8K@LIA^4% zM?^&AkRgbfk~2teYt;w)vL36Nvn`9sQV4W1r2oQ5aR(|bhNut?f$)BZz4GK{Q Izx?Na02=6$*8l(j literal 2515 zcmbuBX;c#E8po|hCpC3+%-!s2E(B({mAT-);g|!;Q0nMljwzCbDY=qP=90MOnv&I| z=7NfexMJNgEECd9FcE2SNlh6+GF))1J7+%JbHCm5p7(vu^Zq})=e*DV`JE@*&(}ji zPD@ToN=m`Y(-pQGS-bnrewp3#VtJ8ZH^`u%9o`vRPiPPX1S_mbp$X zT=#>IRxK_}re=T~6G3O(Od8_}o=zZWTd25bs!6N?nkXvkMVPdY*bVJP^r5PoZx@87 z73`Ob%9xf3*MlkDzycxt6{{1sEi5{AAoWqr%eD^e+p+T#?3-D;Z%awRz}wO|{`7V! zc#f;`SPFWMloFqqxDk$fO_8|M%W(woX<>#mXj)gZ&T&z84hk1*$g1u06l}q_3~9 z5kAjmlQqI^S+dArb#=(5T!&SY zR8C1c_ojAIx}^#R!|OzE+CfVU$(FR&@jcuVJ6)e5K~PqSP1K@XFf z>V&vuA38XVef%3L{ zMQ5@a%_(0$OaQ`#d~OepqaiHL&J(UK(^BW>=TW3S;pf%&P>ZYt#CLwJ*_G;Dj4l!( z?l4)k!0(RgH>$h8o_@dPP4R*>W$Q{Myj~2uJ8$E%I&VGcq8FaL|G`WMzER&6c~9A33;ABeSeS zqK3fQvCIv=@X7Jn6nHpLIwdWi*z*d{-C>*`4g#<{;B$^YEDspYK_frLe3+v9$S-zS zeX8n`Oy!$(5d4d_!_8fc0U}`nVA3~E;ceoIS?$;w&vrg@c0vpThwKmQH^JuRf;R>B z2K6F`vMBsvU(p^k+W7u;+xurX4+*8(>15_5Nq55!AVL=u-sOH9XBA8W}cN zW*K(55kI;T2s!s*DzEDou&64734OpQo_}~ljP#Du-BX|@Bwx*K=u05`$6lyloA?`% zW-X!)lT`u(BLX?|&oW@&eYJVf5yS&Uoc)_qI0(4^S#D&^`QV&R7p1h)xuoOc)MFwV zj8Z13V$`G(YPO*?bb=f}&yQ%qmR*fHReJ*z?FSJRW)088@?`2>GAGTo&E6Y3W_6}qQ+Yq5fsly=YFJedWgLB2=>xT z%lC((!WLL(6hT~NjI^80!r~U*OHeff`)$f10I=|wE zS`=>4#;1>~F}~$kwfLAbMIX?;m1s^mqA8@^YFWY#jj|iOK!u<2>-E-vcdSER!Lu() zNzJNjvcUz4guQ@{ileWbQgAz{W_#G6%EREru;P2)Ks*x^W0UJ2Y`>q@m-L&^DKvk; z16|ztL;lg)4q?wnRuuLUm;r${A#E*~UmaLQ-q6nRD~c8Q(&zlg8S)C-Jdaj8s9k2` z=_W(sflkv^9hltS{{V&J#~r+fwWFk6Lf{D$_iYXn+ADL$*8K}?N}N7qeC3L2mOcIt0V9VVMUPq=wi zTV?j5(D}^ym3(^dosnMP1>c#66=GzdoB0CDf#vQe8Bc>wo*cdicX{nF+C#n%5@d{nF`^%IxNStmVR zhRTzA4fOTh9r(wr^&{%2!*$|&E(iD!yG-m^12Z2W%gY3MZ~)wDL2 z7(M`#VdW1rOa+EKt5`59J(wW6zC{c5%yL8ptdv2l%>sdVbN!atC2h@3W8R4!fUf$# zJ)5MD>+78X5|Cij%=?$Cp&Bpbjy(bz;IF`EN|eDd{ib-3u2QSkVD;0PRWAOhwtac?k4zRF3<_uH7<@{u4-J$37qBsS#*THhlfX* zG5l$JJ%gpNT2f03v#Mi|CW25R1>&EQjfplh%f)MxCZn<`o0Z=WvQ+A0Vzc8uyYp#G zL${aL-0uT^A1@%4Vq-A^ttGz=(M=z?PbMySOx)a`%yt1l;8dUKjs2FaITffu;q}Q} zUAJ!H=hhTc-CKod9q-4F7&-Nrc#eo*2Un@p4($IZPpWL#>~c1Es}|#X;LO^qEsy*| z+zysQU)&O6!LMK>wO>7Kn7FyluP(_8Z(x+9J1SNJrKv`jF|Oj;%z?8uMRfgDF^+Uy*f F{ue_B(Bc39 diff --git a/Doc/html/mylibs__config_8h_source.html b/Doc/html/mylibs__config_8h_source.html index e7e3ac5..325193d 100644 --- a/Doc/html/mylibs__config_8h_source.html +++ b/Doc/html/mylibs__config_8h_source.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_config.h Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_config.h Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({

    - + + -
    +
    77 * @{
    78 */
    79
    -
    80#define INCLUDE_EVOLVE_OPTIMIZER ///< Подключить библиотеку для оптимизации параметров
    -
    81#define INCLUDE_BIT_ACCESS_LIB ///< Подключить библиотеку с typedef с битовыми полями
    -
    82#define INCLUDE_TRACKERS_LIB ///< Подключить библиотеку с трекерами
    -
    83#define INCLUDE_TRACE_LIB ///< Подключить библиотеку с трейсами
    -
    84#define INCLUDE_GENERAL_PERIPH_LIBS ///< Подключить библиотеку с периферией
    -
    85//#define FREERTOS_DELAY ///< Использовать FreeRTOS задержку, вместо HAL
    -
    86
    -
    87/** LIBS_CONFIG
    -
    88 * @}
    -
    89 */
    -
    90
    -
    91/** MYLIBS_CONFIG
    -
    92 * @}
    -
    93 */
    -
    94#endif //__MYLIBS_CONFIG_H_
    +
    80#define local_time() uwTick ///< Локальное время
    +
    81
    +
    82#define INCLUDE_EVOLVE_OPTIMIZER ///< Подключить библиотеку для оптимизации параметров
    +
    83#define INCLUDE_BIT_ACCESS_LIB ///< Подключить библиотеку с typedef с битовыми полями
    +
    84#define INCLUDE_TRACKERS_LIB ///< Подключить библиотеку с трекерами
    +
    85#define INCLUDE_TRACE_LIB ///< Подключить библиотеку с трейсами
    +
    86#define INCLUDE_GENERAL_PERIPH_LIBS ///< Подключить библиотеку с периферией
    +
    87#define FREERTOS_DELAY ///< Использовать FreeRTOS задержку, вместо HAL
    +
    88
    +
    89/** LIBS_CONFIG
    +
    90 * @}
    +
    91 */
    +
    92
    +
    93/** MYLIBS_CONFIG
    +
    94 * @}
    +
    95 */
    +
    96#endif //__MYLIBS_CONFIG_H_
    + diff --git a/Doc/html/mylibs__defs_8h.html b/Doc/html/mylibs__defs_8h.html index 11b6fe0..44f1469 100644 --- a/Doc/html/mylibs__defs_8h.html +++ b/Doc/html/mylibs__defs_8h.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_defs.h File Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_defs.h File Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    mylibs_defs.h File Reference
    @@ -110,130 +104,126 @@ $(function(){initNavTree('mylibs__defs_8h.html',''); initResizable(); });

    Заголочный файл для дефайнов библиотеки MyLibsGeneral. More...

    #include "mylibs_config.h"
    -
    - + Include dependency graph for mylibs_defs.h:
    +
    Include dependency graph for mylibs_defs.h:
    -
    - + This graph shows which files directly or indirectly include this file:
    +
    This graph shows which files directly or indirectly include this file:

    Go to the source code of this file.

    - - + - - + - - + - - + - - + - - + - - - - - + + + - - + - - + - - + - - + - - + - - + -

    +

    Macros

    #define MyLibs_Error_Handler(params)   Error_Handler(params)
    #define MyLibs_Error_Handler(params)
     Error_Handler который будет вызыватся в библиотеке
     
    #define check_null_ptr_1(p1)   (p1 == NULL)
    #define check_null_ptr_1(p1)
     Проверить один указатель на NULL.
     
    #define check_null_ptr_2(p1, p2)   ((p1 == NULL) || (p1 != NULL && p2 == NULL))
    #define check_null_ptr_2(p1, p2)
     Проверить два указателя на NULL.
     
    #define check_null_ptr_3(p1, p2, p3)   ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && p3 == NULL))))
    #define check_null_ptr_3(p1, p2, p3)
     Проверить три указателя на NULL.
     
    #define check_null_ptr_4(p1, p2, p3, p4)   ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && p4 == NULL))))))
    #define check_null_ptr_4(p1, p2, p3, p4)
     Проверить четыре указателя на NULL.
     
    #define check_null_ptr_5(p1, p2, p3, p4, p5)   ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && ((p4 == NULL) || (p4 != NULL && p5 == NULL))))))))
    #define check_null_ptr_5(p1, p2, p3, p4, p5)
     Проверить пять указателей на NULL.
     
    #define msDelay(_ms_)   HAL_Delay(_ms_)
     Задержка на указанное количество миллисекунд.
     
    #define msDelayStart(_pvar_)   *(_pvar_) = HAL_GetTick()
    #define msDelay(_ms_)
     Блокирующая задержка на указанное количество миллисекунд.
    #define msDelayStart(_pvar_)
     Начать отсчет задержки.
     
    #define msDelayWhileActive(_ms_, _pvar_)   (HAL_GetTick() - *(_pvar_) < _ms_)
    #define msDelayWhileActive(_ms_, _pvar_)
     Проверяет, активна ли задержка.
     
    #define msDelayWaitDone(_ms_, _pvar_)   (HAL_GetTick() - *(_pvar_) >= _ms_)
    #define msDelayWaitDone(_ms_, _pvar_)
     Проверяет, завершилась ли задержка.
     
    #define ClearStruct(_struct_)   memset(&(_struct_), 0, sizeof(_struct_))
    #define ClearStruct(_struct_)
     Обнуление структуры.
     
    #define Divide_Up(_val_, _div_)   ((_val_ - 1) / _div_) + 1 /* через мат выражение */
    #define Divide_Up(_val_, _div_)
     Деление с округлением вверх
     
    #define ByteSwap16(v)   (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
    #define ByteSwap16(v)
     Swap between Little Endian and Big Endian.
     
    #define ABS(x)   ( ((x) > 0)? (x) : -(x))
    #define ABS(x)
     Абсолютное значение числа
     
    - -

    +

    Functions

    void Error_Handler (void)
     
    -

    Detailed Description

    +

    Detailed Description

    Заголочный файл для дефайнов библиотеки MyLibsGeneral.

    Definition in file mylibs_defs.h.

    + +
    diff --git a/Doc/html/mylibs__defs_8h__dep__incl.map b/Doc/html/mylibs__defs_8h__dep__incl.map index 8fa37fc..ce26d5a 100644 --- a/Doc/html/mylibs__defs_8h__dep__incl.map +++ b/Doc/html/mylibs__defs_8h__dep__incl.map @@ -1,38 +1,43 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Doc/html/mylibs__defs_8h__dep__incl.md5 b/Doc/html/mylibs__defs_8h__dep__incl.md5 index 3966021..f9d40e4 100644 --- a/Doc/html/mylibs__defs_8h__dep__incl.md5 +++ b/Doc/html/mylibs__defs_8h__dep__incl.md5 @@ -1 +1 @@ -0d52bcfe55773d72fc2fd1ffe571809c \ No newline at end of file +ffd75cfd03af0339ae80d27ad27b99ee \ No newline at end of file diff --git a/Doc/html/mylibs__defs_8h__dep__incl.png b/Doc/html/mylibs__defs_8h__dep__incl.png index 37c8c1a089901605f02ceb98ffa546d5516df4bd..c8452b841f2c62bad051f5e18765ccfc0a5432e4 100644 GIT binary patch literal 73591 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 literal 78637 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

    BHDe;8^f~hxxht?3mgw* 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 - - - - - + + + + + + diff --git a/Doc/html/mylibs__defs_8h__incl.md5 b/Doc/html/mylibs__defs_8h__incl.md5 index 9e01e49..9f55d02 100644 --- a/Doc/html/mylibs__defs_8h__incl.md5 +++ b/Doc/html/mylibs__defs_8h__incl.md5 @@ -1 +1 @@ -8a0ac3856fdf2caf22b43c3ac8597efe \ No newline at end of file +b9276a0f630657b77b3f0cee41c5de21 \ No newline at end of file diff --git a/Doc/html/mylibs__defs_8h__incl.png b/Doc/html/mylibs__defs_8h__incl.png index 274d9bd2b6b9b6b002c70c1d2a22a2ec4335b3da..4b2f8648b3c3963e095a0eb280922fe5b6b2be61 100644 GIT binary patch literal 3194 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 literal 3403 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 - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_defs.h Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_defs.h Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({

    - + + -
    +
    72
    73/**
    74 * @def msDelay(_ms_)
    -
    75 * @brief Задержка на указанное количество миллисекунд.
    +
    75 * @brief Блокирующая задержка на указанное количество миллисекунд.
    76 * @param _ms_ Время задержки в миллисекундах.
    -
    77 * @note Использует HAL_Delay или osDelay в зависимости от @ref FREERTOS_DELAY.
    +
    77 * @note Использует задержку через @ref local_time или osDelay в зависимости от @ref FREERTOS_DELAY.
    78 */
    79#ifdef FREERTOS_DELAY
    -
    80 #define msDelay(_ms_) osDelay(_ms_)
    +
    80 #define msDelay(_ms_) osDelay(_ms_)
    81#else
    -
    82 #define msDelay(_ms_) HAL_Delay(_ms_)
    -
    83#endif
    -
    84
    -
    85
    -
    86/**
    -
    87 * @brief Начать отсчет задержки.
    -
    88 * @param _pvar_ Указатель на переменную типа uint32_t для хранения времени старта.
    -
    89 * @details После вызова этого макроса переменная _pvar_ содержит текущее количество миллисекунд
    -
    90 * с момента запуска системы (HAL_GetTick).
    -
    91 *
    -
    92 * Используется для реализации неблокирующих задержек.
    -
    93 */
    -
    94#define msDelayStart(_pvar_) *(_pvar_) = HAL_GetTick()
    -
    95
    -
    96/**
    -
    97 * @brief Проверяет, активна ли задержка.
    -
    98 * @param _ms_ Длительность задержки в миллисекундах.
    -
    99 * @param _pvar_ Указатель на переменную, в которой сохранено время начала (@ref msDelayStart).
    -
    100 * @retval 1 Задержка еще активна.
    -
    101 * @retval 0 Задержка завершена.
    -
    102 * @details
    -
    103 * Возвращает true, пока время задержки не истекло. Используется в проверках,
    -
    104 * когда нужно **действовать, пока задержка выполняется**. Пример:
    -
    105 * @code
    -
    106 * while(msDelayWhileActive(1000, &tick)) {
    -
    107 * // выполняем другие задачи, задержка не блокирует поток
    -
    108 * }
    -
    109 * @endcode
    -
    110 */
    -
    111#define msDelayWhileActive(_ms_, _pvar_) (HAL_GetTick() - *(_pvar_) < _ms_)
    -
    112
    -
    113/**
    -
    114 * @brief Проверяет, завершилась ли задержка.
    -
    115 * @param _ms_ Длительность задержки в миллисекундах.
    -
    116 * @param _pvar_ Указатель на переменную, в которой сохранено время начала (msDelayStart).
    -
    117 * @retval 1 Задержка завершена.
    -
    118 * @retval 0 Задержка еще активна.
    -
    119 * @details
    -
    120 * Возвращает true, когда задержка уже завершена. Используется в проверках,
    -
    121 * когда нужно **выполнить действие только после окончания задержки**. Пример:
    -
    122 * @code
    -
    123 * if(msDelayWaitDone(1000, &tick)) {
    -
    124 * // выполняем действие после завершения задержки
    -
    125 * }
    -
    126 * @endcode
    -
    127 */
    -
    128#define msDelayWaitDone(_ms_, _pvar_) (HAL_GetTick() - *(_pvar_) >= _ms_)
    -
    129
    -
    130/** DELAYS_DEFINES
    -
    131 * @}
    -
    132 */
    -
    133
    -
    134
    -
    135/***************************************************************************
    -
    136*******************************UTIL_DEFINES********************************/
    -
    137static int dummy;
    -
    138/**
    -
    139 * @addtogroup UTILS_DEFINES Utils defines
    -
    140 * @ingroup MYLIBS_DEFINES
    -
    141 * @brief Общие вспомогательные макросы
    -
    142 * @{
    -
    143 */
    -
    144
    -
    145/**
    -
    146 * @brief Обнуление структуры.
    -
    147 * @param _struct_ Структура, которую нужно обнулить.
    -
    148 * @details Макрос использует memset для обнуления всей памяти структуры.
    -
    149 * Используется для быстрой и безопасной инициализации переменных структур до нуля.
    -
    150 */
    -
    151#define ClearStruct(_struct_) memset(&(_struct_), 0, sizeof(_struct_))
    -
    152
    -
    153/**
    -
    154 * @brief Деление с округлением вверх
    -
    155 * @param _val_ Делимое.
    -
    156 * @param _div_ Делитель.
    -
    157 * @return Результат деления, округленный вверх.
    -
    158 * @details Если результат деления без остатка: он возвращается как есть
    -
    159 Если с остатком - округляется вверх
    -
    160 */
    -
    161//#define Divide_Up(_val_, _div_) (((_val_)%(_div_))? (_val_)/(_div_)+1 : (_val_)/_div_) /* через тернарный оператор */
    -
    162#define Divide_Up(_val_, _div_) ((_val_ - 1) / _div_) + 1 /* через мат выражение */
    -
    163
    -
    164/**
    -
    165 * @brief Swap between Little Endian and Big Endian
    -
    166 * @param v Исходное 16-битное значение.
    -
    167 * @return Результат с поменяными местами старшим и младшим байтом.
    -
    168 * @details Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты.
    -
    169 */
    -
    170#define ByteSwap16(v) (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
    -
    171
    -
    172/**
    -
    173 * @brief Абсолютное значение числа
    -
    174 * @param x Число.
    -
    175 * @return Абсолютное значение числа x.
    -
    176 * @details Берет число по модулю. Хз как работает библиотечный abs в stdlib.h, мб это быстрее, но вряд ли конечно.
    -
    177 */
    -
    178#define ABS(x) ( ((x) > 0)? (x) : -(x))
    -
    179
    -
    180/** UTILS_DEFINES
    -
    181 * @}
    -
    182 */
    -
    183
    -
    184#endif //__MYLIBS_DEFINES_H_
    +
    82 #define msDelay(_ms_) \
    +
    83 do { \
    +
    84 uint32_t _start_ = local_time(); \
    +
    85 while (local_time() - _start_ < (_ms_)) {} \
    +
    86 } while(0)
    +
    87#endif
    +
    88
    +
    89
    +
    90/**
    +
    91 * @brief Начать отсчет задержки.
    +
    92 * @param _pvar_ Указатель на переменную типа uint32_t для хранения времени старта.
    +
    93 * @details После вызова этого макроса переменная _pvar_ содержит текущее количество миллисекунд
    +
    94 * с момента запуска системы (@ref local_time).
    +
    95 *
    +
    96 * Используется для реализации неблокирующих задержек.
    +
    97 */
    +
    98#define msDelayStart(_pvar_) *(_pvar_) = local_time()
    +
    99
    +
    100/**
    +
    101 * @brief Проверяет, активна ли задержка.
    +
    102 * @param _ms_ Длительность задержки в миллисекундах.
    +
    103 * @param _pvar_ Указатель на переменную, в которой сохранено время начала (@ref msDelayStart).
    +
    104 * @retval 1 Задержка еще активна.
    +
    105 * @retval 0 Задержка завершена.
    +
    106 * @details
    +
    107 * Возвращает true, пока время задержки не истекло. Используется в проверках,
    +
    108 * когда нужно **действовать, пока задержка выполняется**. Пример:
    +
    109 * @code
    +
    110 * while(msDelayWhileActive(1000, &tick)) {
    +
    111 * // выполняем другие задачи, задержка не блокирует поток
    +
    112 * }
    +
    113 * @endcode
    +
    114 */
    +
    115#define msDelayWhileActive(_ms_, _pvar_) (local_time() - *(_pvar_) < _ms_)
    +
    116
    +
    117/**
    +
    118 * @brief Проверяет, завершилась ли задержка.
    +
    119 * @param _ms_ Длительность задержки в миллисекундах.
    +
    120 * @param _pvar_ Указатель на переменную, в которой сохранено время начала (msDelayStart).
    +
    121 * @retval 1 Задержка завершена.
    +
    122 * @retval 0 Задержка еще активна.
    +
    123 * @details
    +
    124 * Возвращает true, когда задержка уже завершена. Используется в проверках,
    +
    125 * когда нужно **выполнить действие только после окончания задержки**. Пример:
    +
    126 * @code
    +
    127 * if(msDelayWaitDone(1000, &tick)) {
    +
    128 * // выполняем действие после завершения задержки
    +
    129 * }
    +
    130 * @endcode
    +
    131 */
    +
    132#define msDelayWaitDone(_ms_, _pvar_) (local_time() - *(_pvar_) >= _ms_)
    +
    133
    +
    134/** DELAYS_DEFINES
    +
    135 * @}
    +
    136 */
    +
    137
    +
    138
    +
    139/***************************************************************************
    +
    140*******************************UTIL_DEFINES********************************/
    +
    141static int dummy;
    +
    142/**
    +
    143 * @addtogroup UTILS_DEFINES Utils defines
    +
    144 * @ingroup MYLIBS_DEFINES
    +
    145 * @brief Общие вспомогательные макросы
    +
    146 * @{
    +
    147 */
    +
    148
    +
    149/**
    +
    150 * @brief Обнуление структуры.
    +
    151 * @param _struct_ Структура, которую нужно обнулить.
    +
    152 * @details Макрос использует memset для обнуления всей памяти структуры.
    +
    153 * Используется для быстрой и безопасной инициализации переменных структур до нуля.
    +
    154 */
    +
    155#define ClearStruct(_struct_) memset(&(_struct_), 0, sizeof(_struct_))
    +
    156
    +
    157/**
    +
    158 * @brief Деление с округлением вверх
    +
    159 * @param _val_ Делимое.
    +
    160 * @param _div_ Делитель.
    +
    161 * @return Результат деления, округленный вверх.
    +
    162 * @details Если результат деления без остатка: он возвращается как есть
    +
    163 Если с остатком - округляется вверх
    +
    164 */
    +
    165//#define Divide_Up(_val_, _div_) (((_val_)%(_div_))? (_val_)/(_div_)+1 : (_val_)/_div_) /* через тернарный оператор */
    +
    166#define Divide_Up(_val_, _div_) ((_val_ - 1) / _div_) + 1 /* через мат выражение */
    +
    167
    +
    168/**
    +
    169 * @brief Swap between Little Endian and Big Endian
    +
    170 * @param v Исходное 16-битное значение.
    +
    171 * @return Результат с поменяными местами старшим и младшим байтом.
    +
    172 * @details Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты.
    +
    173 */
    +
    174#define ByteSwap16(v) (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
    +
    175
    +
    176/**
    +
    177 * @brief Абсолютное значение числа
    +
    178 * @param x Число.
    +
    179 * @return Абсолютное значение числа x.
    +
    180 * @details Берет число по модулю. Хз как работает библиотечный abs в stdlib.h, мб это быстрее, но вряд ли конечно.
    +
    181 */
    +
    182#define ABS(x) ( ((x) > 0)? (x) : -(x))
    +
    183
    +
    184/** UTILS_DEFINES
    +
    185 * @}
    +
    186 */
    +
    187
    +
    188
    +
    189
    +
    190/**
    +
    191 * @cond LIBS_INTERNAL
    +
    192 */
    +
    193
    +
    194
    +
    195/**
    +
    196 * @brief Аналог HAL макроса для привязки DMA к UART.
    +
    197 * @note @ref __HAL_LINKDMA.
    +
    198 */
    +
    199#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \
    +
    200do{ \
    +
    201(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__); \
    +
    202(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U)
    +
    203
    +
    204
    +
    205/** @endcond */
    +
    206#endif //__MYLIBS_DEFINES_H_
    Конфигурации для библиотек MyLibs.
    + diff --git a/Doc/html/mylibs__include_8h.html b/Doc/html/mylibs__include_8h.html index be2ac76..1ca6082 100644 --- a/Doc/html/mylibs__include_8h.html +++ b/Doc/html/mylibs__include_8h.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_include.h File Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_include.h File Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    #include "trackers.h"
    #include "trace.h"
    #include "evolve_optimizer.h"
    -#include "general_flash.h"
    +#include "__general_flash.h"
    #include "general_gpio.h"
    #include "general_tim.h"
    -
    - + Include dependency graph for mylibs_include.h:
    +
    Include dependency graph for mylibs_include.h:

    Go to the source code of this file.

    -

    Detailed Description

    +

    Detailed Description

    Заголочный файл для всех библиотек

    Здесь нужно собрать библиотеки и дефайны, которые должны быть видны во всем проекте, чтобы не подключать 100 инклюдов в каждом ".c" файле

    Definition in file mylibs_include.h.

    + + diff --git a/Doc/html/mylibs__include_8h__incl.map b/Doc/html/mylibs__include_8h__incl.map index cbac04c..a466c9e 100644 --- a/Doc/html/mylibs__include_8h__incl.map +++ b/Doc/html/mylibs__include_8h__incl.map @@ -1,40 +1,41 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Doc/html/mylibs__include_8h__incl.md5 b/Doc/html/mylibs__include_8h__incl.md5 index fbafb1d..b5a412b 100644 --- a/Doc/html/mylibs__include_8h__incl.md5 +++ b/Doc/html/mylibs__include_8h__incl.md5 @@ -1 +1 @@ -eac9d1a6617c9c7d940c97bf6eaa8368 \ No newline at end of file +8e2530f35d180e53745360e22f4da2e4 \ No newline at end of file diff --git a/Doc/html/mylibs__include_8h__incl.png b/Doc/html/mylibs__include_8h__incl.png index 032dfecf3af1dcbd9fa887a2e0614cdb6ef7856e..e935326ba06d769c6ac868a53143c6ba33fb2f9a 100644 GIT binary patch literal 48489 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 W-X{#X;`|SPD$1(LRJ<^L|9=2Nwm6yq literal 44435 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

    jcRo$KVOW?#eNJ-^LN+=X6AoPA;M&^G$wZp- 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 VSoyWmr-BE(G*onyYZPst{TKhiNn-#2 diff --git a/Doc/html/mylibs__include_8h_source.html b/Doc/html/mylibs__include_8h_source.html index 5b3eb8f..4a8e2ca 100644 --- a/Doc/html/mylibs__include_8h_source.html +++ b/Doc/html/mylibs__include_8h_source.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_include.h Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/mylibs_include.h Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({ - + +

    -
    +
    98
    99#ifdef INCLUDE_GENERAL_PERIPH_LIBS
    100
    -
    101#include "general_flash.h"
    +
    101#include "__general_flash.h"
    102#include "general_gpio.h"
    103#ifdef HAL_SPI_MODULE_ENABLED
    -
    104#include "general_spi.h"
    +
    104#include "general_spi.h"
    105#endif
    106#ifdef HAL_UART_MODULE_ENABLED
    -
    107#include "general_uart.h"
    +
    107#include "general_uart.h"
    108#endif
    109#ifdef HAL_TIM_MODULE_ENABLED
    110#include "general_tim.h"
    @@ -226,28 +218,31 @@ $(function(){initNavTree('mylibs__include_8h_source.html',''); initResizable();
    116
    117
    118/////////////////////////---USER SETTINGS---/////////////////////////
    -
    119// user includes
    +
    119// user includes
    120
    121// user settings
    122/////////////////////////---USER SETTINGS---/////////////////////////
    -
    123
    +
    123
    124
    125#endif // __MYLIBS_INCLUDE_H_
    Заголочный файл для дефайнов битового доступа.
    Заголовочный файл для адаптивного подбора параметров
    Заголовочный файл для модуля инициализации портов и работы с ними.
    +
    Заголовочный файл для модуля инициализации SPI.
    Заголовочный файл для модуля инициализации таймеров и работы с ними.
    +
    Заголовочный файл для модуля инициализации UART.
    Заголочный файл для дефайнов библиотеки MyLibsGeneral.
    Структура эволюционного оптимизатора
    Заголочный файл для работы с трассировкой.
    Заголочный файл для работы с трекерами Trackers defines.
    + diff --git a/Doc/html/navtree.css b/Doc/html/navtree.css index 69211d4..0ea3a07 100644 --- a/Doc/html/navtree.css +++ b/Doc/html/navtree.css @@ -11,8 +11,8 @@ #nav-tree li { white-space:nowrap; - margin:0px; - padding:0px; + margin:0; + padding:0; } #nav-tree .plus { @@ -20,15 +20,10 @@ } #nav-tree .selected { - background-image: url('tab_a.png'); - background-repeat:repeat-x; - color: var(--nav-text-active-color); - text-shadow: var(--nav-text-active-shadow); -} - -#nav-tree .selected .arrow { - color: var(--nav-arrow-selected-color); - text-shadow: none; + position: relative; + background-color: var(--nav-menu-active-bg); + border-radius: 0 6px 6px 0; + /*margin-right: 5px;*/ } #nav-tree img { @@ -48,6 +43,7 @@ margin:0px; padding:0px; font: 12px var(--font-family-nav); + line-height: 22px; } #nav-tree .label a { @@ -56,7 +52,7 @@ #nav-tree .selected a { text-decoration:none; - color:var(--nav-text-active-color); + color:var(--page-link-color); } #nav-tree .children_ul { @@ -65,8 +61,9 @@ } #nav-tree .item { - margin:0px; - padding:0px; + margin: 0 6px 0 -5px; + padding: 0 0 0 5px; + height: 22px; } #nav-tree { @@ -89,7 +86,6 @@ display:block; position: absolute; left: 0px; - width: $width; overflow : hidden; } @@ -98,15 +94,31 @@ } .ui-resizable-e { - background-image:var(--nav-splitbar-image); - background-size:100%; - background-repeat:repeat-y; - background-attachment: scroll; - cursor:ew-resize; + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; height:100%; right:0; top:0; width:6px; + position: relative; +} + +.ui-resizable-e:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +.ui-resizable-e:hover { + opacity: 1; } .ui-resizable-handle { @@ -121,24 +133,97 @@ } #nav-tree { - background-repeat:repeat-x; background-color: var(--nav-background-color); -webkit-overflow-scrolling : touch; /* iOS 5+ */ + scrollbar-width: thin; + border-right: 1px solid var(--nav-border-color); + padding-left: 5px; } #nav-sync { position:absolute; - top:5px; - right:24px; - z-index:0; + top:0px; + right:0px; + z-index:1; } #nav-sync img { opacity:0.3; } -#nav-sync img:hover { - opacity:0.9; +div.nav-sync-icon { + position: relative; + width: 24px; + height: 17px; + left: -6px; + top: -1px; + opacity: 0.7; + display: inline-block; + background-color: var(--sync-icon-background-color); + border: 1px solid var(--sync-icon-border-color); + box-sizing: content-box; +} + +div.nav-sync-icon:hover { + background-color: var(--sync-icon-selected-background-color); + opacity: 1.0; +} + +div.nav-sync-icon.active:after { + content: ''; + background-color: var(--sync-icon-background-color); + border-top: 2px solid var(--sync-icon-color); + position: absolute; + width: 16px; + height: 0px; + top: 7px; + left: 4px; +} + +div.nav-sync-icon.active:hover:after { + border-top: 2px solid var(--sync-icon-selected-color); +} + +span.sync-icon-left { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 4px; + display: inline-block; + width: 8px; + height: 8px; + border-left: 2px solid var(--sync-icon-color); + border-top: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +span.sync-icon-right { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 10px; + display: inline-block; + width: 8px; + height: 8px; + border-right: 2px solid var(--sync-icon-color); + border-bottom: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +div.nav-sync-icon:hover span.sync-icon-left { + border-left: 2px solid var(--sync-icon-selected-color); + border-top: 2px solid var(--sync-icon-selected-color); +} + +div.nav-sync-icon:hover span.sync-icon-right { + border-right: 2px solid var(--sync-icon-selected-color); + border-bottom: 2px solid var(--sync-icon-selected-color); +} + +#nav-path ul { + border-top: 1px solid var(--nav-breadcrumb-separator-color); } @media print @@ -147,3 +232,96 @@ div.ui-resizable-handle { display: none; position: relative; } } +/*---------------------------*/ +#container { + display: grid; + grid-template-columns: auto auto; + overflow: hidden; +} + +#page-nav { + background: var(--nav-background-color); + display: block; + width: 250px; + box-sizing: content-box; + position: relative; + border-left: 1px solid var(--nav-border-color); +} + +#page-nav-tree { + display: inline-block; +} + +#page-nav-resize-handle { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; + z-index: 1; + user-select: none; +} + +#page-nav-resize-handle:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +#page-nav-resize-handle.dragging, +#page-nav-resize-handle:hover { + opacity: 1; +} + +#page-nav-contents { + padding: 0; + margin: 0; + display: block; + top: 0; + left: 0; + height: 100%; + width: 100%; + position: absolute; + overflow: auto; + scrollbar-width: thin; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +ul.page-outline, +ul.page-outline ul { + text-indent: 0; + list-style: none outside none; + padding: 0 0 0 4px; +} + +ul.page-outline { + margin: 0 4px 4px 6px; +} + +ul.page-outline div.item { + font: 12px var(--font-family-nav); + line-height: 22px; +} + +ul.page-outline li { + white-space: nowrap; +} + +ul.page-outline li.vis { + background-color: var(--nav-breadcrumb-active-bg); +} + +#container.resizing { + cursor: col-resize; + user-select: none; +} diff --git a/Doc/html/navtree.js b/Doc/html/navtree.js index 884b79b..4fcf6e3 100644 --- a/Doc/html/navtree.js +++ b/Doc/html/navtree.js @@ -23,16 +23,34 @@ @licend The above is the entire license notice for the JavaScript code in this file */ -function initNavTree(toroot,relpath) { +function initNavTree(toroot,relpath,allMembersFile) { let navTreeSubIndices = []; - const ARROW_DOWN = '▼'; - const ARROW_RIGHT = '►'; + const ARROW_DOWN = ''; + const ARROW_RIGHT = ''; const NAVPATH_COOKIE_NAME = ''+'navpath'; + const fullSidebar = typeof page_layout!=='undefined' && page_layout==1; + + function getScrollBarWidth () { + let outer = $('
    ').css({visibility: 'hidden', width: 100, overflow: 'scroll', scrollbarWidth: 'thin'}).appendTo('body'); + let widthWithScroll = $('
    ').css({width: '100%'}).appendTo(outer).outerWidth(); + outer.remove(); + return 100 - widthWithScroll; + } + const scrollbarWidth = getScrollBarWidth(); + + function adjustSyncIconPosition() { + if (!fullSidebar) { + const nt = document.getElementById("nav-tree"); + const hasVerticalScrollbar = nt.scrollHeight > nt.clientHeight; + $("#nav-sync").css({right:parseInt(hasVerticalScrollbar?scrollbarWidth:0)}); + } + } const getData = function(varName) { const i = varName.lastIndexOf('/'); const n = i>=0 ? varName.substring(i+1) : varName; - return eval(n.replace(/-/g,'_')); + const e = n.replace(/-/g,'_'); + return window[e]; } const stripPath = function(uri) { @@ -77,7 +95,7 @@ function initNavTree(toroot,relpath) { const script = document.createElement('script'); script.id = scriptName; script.type = 'text/javascript'; - script.onload = func; + script.onload = function() { func(); adjustSyncIconPosition(); } script.src = scriptName+'.js'; head.appendChild(script); } @@ -96,8 +114,8 @@ function initNavTree(toroot,relpath) { node.expandToggle.href = "javascript:void(0)"; node.expandToggle.onclick = function() { if (node.expanded) { - $(node.getChildrenUL()).slideUp("fast"); - node.plus_img.innerHTML=ARROW_RIGHT; + $(node.getChildrenUL()).slideUp("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).removeClass('opened').addClass('closed'); node.expanded = false; } else { expandNode(o, node, false, true); @@ -122,9 +140,9 @@ function initNavTree(toroot,relpath) { if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || ancParent.is(':header')) { - pos = ancParent.position().top; + pos = ancParent.offset().top; } else if (anchor.position()) { - pos = anchor.position().top; + pos = anchor.offset().top; } if (pos) { const dcOffset = docContent.offset().top; @@ -136,12 +154,33 @@ function initNavTree(toroot,relpath) { docContent.animate({ scrollTop: pos + dcScrTop - dcOffset },Math.max(50,Math.min(500,dist)),function() { - window.location.href=aname; animationInProgress=false; + if (anchor.parent().attr('class')=='memItemLeft') { + let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname') { + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype') { + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } }); } } + function htmlToNode(html) { + const template = document.createElement('template'); + template.innerHTML = html; + const nNodes = template.content.childNodes.length; + if (nNodes !== 1) { + throw new Error(`html parameter must represent a single node; got ${nNodes}. `); + } + return template.content.firstChild; + } + const newNode = function(o, po, text, link, childrenData, lastNode) { const node = { children : [], @@ -153,7 +192,6 @@ function initNavTree(toroot,relpath) { parentNode : po, itemDiv : document.createElement("div"), labelSpan : document.createElement("span"), - label : document.createTextNode(text), expanded : false, childrenUL : null, getChildrenUL : function() { @@ -176,7 +214,7 @@ function initNavTree(toroot,relpath) { const a = document.createElement("a"); node.labelSpan.appendChild(a); po.getChildrenUL().appendChild(node.li); - a.appendChild(node.label); + a.appendChild(htmlToNode(''+text+'')); if (link) { let url; if (link.substring(0,1)=='^') { @@ -241,8 +279,8 @@ function initNavTree(toroot,relpath) { if (!node.childrenVisited) { getNode(o, node); } - $(node.getChildrenUL()).slideDown("fast"); - node.plus_img.innerHTML = ARROW_DOWN; + $(node.getChildrenUL()).slideDown("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).addClass('opened').removeClass('closed'); node.expanded = true; if (setFocus) { $(node.expandToggle).focus(); @@ -260,18 +298,6 @@ function initNavTree(toroot,relpath) { const highlightAnchor = function() { const aname = hashUrl(); const anchor = $(aname); - if (anchor.parent().attr('class')=='memItemLeft') { - let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); - glowEffect(rows.children(),300); // member without details - } else if (anchor.parent().attr('class')=='fieldname') { - glowEffect(anchor.parent().parent(),1000); // enum value - } else if (anchor.parent().attr('class')=='fieldtype') { - glowEffect(anchor.parent().parent(),1000); // struct field - } else if (anchor.parent().is(":header")) { - glowEffect(anchor.parent(),1000); // section header - } else { - glowEffect(anchor.next(),1000); // normal member - } gotoAnchor(anchor,aname); } @@ -293,7 +319,6 @@ function initNavTree(toroot,relpath) { if ($('#nav-tree-contents .item:first').hasClass('selected')) { topOffset+=25; } - $('#nav-sync').css('top',topOffset+'px'); showRoot(); } @@ -310,7 +335,7 @@ function initNavTree(toroot,relpath) { getNode(o, node); } $(node.getChildrenUL()).css({'display':'block'}); - node.plus_img.innerHTML = ARROW_DOWN; + $(node.plus_img.childNodes[0]).removeClass('closed').addClass('opened'); node.expanded = true; const n = node.children[o.breadcrumbs[index]]; if (index+10) { // try root page without hash as fallback + gotoUrl(o,root,'',relpath); + } else { + o.breadcrumbs = $.extend(true, [], nti); + if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index + navTo(o,NAVTREE[0][1],"",relpath); + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + } + if (o.breadcrumbs) { + o.breadcrumbs.unshift(0); // add 0 for root node + showNode(o, o.node, 0, hash); + } } - if (o.breadcrumbs) { - o.breadcrumbs.unshift(0); // add 0 for root node - showNode(o, o.node, 0, hash); + } + + const gotoUrl = function(o,root,hash,relpath) { + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = window['NAVTREEINDEX'+i]; + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); } } @@ -385,28 +416,15 @@ function initNavTree(toroot,relpath) { glowEffect(anchor.parent(),1000); // line number hash=''; // strip line number anchors } - const url=root+hash; - let i=-1; - while (NAVTREEINDEX[i+1]<=url) i++; - if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index - if (navTreeSubIndices[i]) { - gotoNode(o,i,root,hash,relpath) - } else { - getScript(relpath+'navtreeindex'+i,function() { - navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); - if (navTreeSubIndices[i]) { - gotoNode(o,i,root,hash,relpath); - } - }); - } + gotoUrl(o,root,hash,relpath); } const showSyncOff = function(n,relpath) { - n.html(''); + n.html(''); } const showSyncOn = function(n,relpath) { - n.html(''); + n.html(''); } const o = { @@ -453,30 +471,429 @@ function initNavTree(toroot,relpath) { showRoot(); $(window).bind('hashchange', () => { - if (window.location.hash && window.location.hash.length>1) { - let a; - if ($(location).attr('hash')) { - const clslink=stripPath(pathName())+':'+hashValue(); - a=$('.item a[class$="'+clslink.replace(/1) { + let a; + if ($(location).attr('hash')) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ try to keep right panel width + const shrinkLeft = Math.min(deficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + const remainingDeficit = deficit - shrinkLeft; + const shrinkRight = Math.min(remainingDeficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + } else { // dragging right handle -> try to keep left panel width + const shrinkRight = Math.min(deficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + const remainingDeficit = deficit - shrinkRight; + const shrinkLeft = Math.min(remainingDeficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + } + } else { + rightPanelWidth = pagenav.length ? Math.max(minPanelWidth,rightPanelWidth) : 0; + leftPanelWidth = Math.max(minPanelWidth,leftPanelWidth); + } + return { leftPanelWidth, rightPanelWidth } + } + + function updateWidths(sidenavWidth,pagenavWidth,dragLeft) + { + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,dragLeft); + const widthStr = parseInt(widths.leftPanelWidth)+"px"; + content.css({marginLeft:widthStr}); + if (fullSidebar) { + footer.css({marginLeft:widthStr}); + if (mainnav) { + mainnav.css({marginLeft:widthStr}); + } + } + sidenav.css({width:widthStr}); + if (pagenav.length) { + container.css({gridTemplateColumns:'auto '+parseInt(widths.rightPanelWidth)+'px'}); + pagenav.css({width:parseInt(widths.rightPanelWidth-1)+'px'}); + } + return widths; + } + + function resizeWidth(dragLeft) { + const sidenavWidth = $(sidenav).outerWidth()-barWidth; + const pagenavWidth = pagenav.length ? $(pagenav).outerWidth() : 0; + const widths = updateWidths(sidenavWidth,pagenavWidth,dragLeft); + Cookie.writeSetting(RESIZE_COOKIE_NAME,widths.leftPanelWidth-barWidth); + if (pagenav.length) { + Cookie.writeSetting(PAGENAV_COOKIE_NAME,widths.rightPanelWidth); + } + } + + function restoreWidth(sidenavWidth,pagenavWidth) { + updateWidths(sidenavWidth,pagenavWidth,false); + showHideNavBar(); + } + + function resizeHeight() { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (!fullSidebar) { + contentHeight = windowHeight - headerHeight - footerHeight - 1; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (fullSidebar) { + contentHeight = windowHeight - footerHeight - 1; + navtreeHeight = windowHeight - headerHeight - 1; + sideNavHeight = windowHeight - 1; + if (mainnav) { + contentHeight -= mainnav.outerHeight(); + } + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + content.css({height:contentHeight + "px"}); + resizeWidth(false); + showHideNavBar(); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (document.getElementById('main-nav')) { + mainnav = $("#main-nav"); + } + navtree = $("#nav-tree"); + pagenav = $("#page-nav"); + container = $("#container"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(true); } }); + $(sidenav).resizable({ minWidth: 0 }); + if (pagenav.length) { + pagehandle = $("#page-nav-resize-handle"); + pagehandle.on('mousedown touchstart',function(e) { + $('body').addClass('resizing'); + pagehandle.addClass('dragging'); + $(document).on('mousemove touchmove',function(e) { + const clientX = e.clientX || e.originalEvent.touches[0].clientX; + let pagenavWidth = container[0].offsetWidth-clientX+barWidth/2; + const sidenavWidth = sidenav.width(); + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,false); + container.css({gridTemplateColumns:'auto '+parseInt(widths.rightPanelWidth)+'px'}); + pagenav.css({width:parseInt(widths.rightPanelWidth-1)+'px'}); + content.css({marginLeft:parseInt(widths.leftPanelWidth)+'px'}); + Cookie.writeSetting(PAGENAV_COOKIE_NAME,pagenavWidth); + }); + $(document).on('mouseup touchend', function(e) { + $('body').removeClass('resizing'); + pagehandle.removeClass('dragging'); + $(document).off('mousemove mouseup touchmove touchend'); + }); + }); + } else { + container.css({gridTemplateColumns:'auto'}); + } + const width = parseInt(Cookie.readSetting(RESIZE_COOKIE_NAME,250)); + const pagenavWidth = parseInt(Cookie.readSetting(PAGENAV_COOKIE_NAME,250)); + if (width) { restoreWidth(width+barWidth,pagenavWidth); } else { resizeWidth(); } + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(window).ready(function() { + let lastWidth = -1; + let lastHeight = -1; + $(window).resize(function() { + const newWidth = $(this).width(), newHeight = $(this).height(); + if (newWidth!=lastWidth || newHeight!=lastHeight) { + resizeHeight(); + navtree_trampoline.updateContentTop(); + lastWidth = newWidth; + lastHeight = newHeight; + } + }); + resizeHeight(); + lastWidth = $(window).width(); + lastHeight = $(window).height(); + content.scroll(function() { + navtree_trampoline.updateContentTop(); + }); + }); + } + + + function initPageToc() { + const topMapping = []; + const toc_contents = $('#page-nav-contents'); + const content=$('
      ').addClass('page-outline'); + + var entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/', + '`': '`', + '=': '=' + }; + function escapeHtml (string) { + return String(string).replace(/[&<>"'`=\/]/g, function (s) { + return entityMap[s]; + }); + } + + // for ClassDef/GroupDef/ModuleDef/ConceptDef/DirDef + const groupSections = []; + let currentGroup = null; + $('h2.groupheader, h2.memtitle').each(function(){ + const $element = $(this); + if ($element.hasClass('groupheader')) { + currentGroup = { groupHeader: $element, memTitles: [] }; + groupSections.push(currentGroup); + } else if ($element.hasClass('memtitle') && currentGroup) { + currentGroup.memTitles.push($element); + } + }); + groupSections.forEach(function(item){ + const title = item.groupHeader.text().trim(); + let id = item.groupHeader.attr('id'); + const table = item.groupHeader.parents('table.memberdecls'); + let rows = $(); + if (table.length>0) { + rows = table.find("tr[class^='memitem:'] td.memItemRight, tr[class^='memitem:'] td.memItemLeft.anon, tr[class=groupHeader] td"); + } + function hasSubItems() { + return item.memTitles.length>0 || rows.toArray().some(function(el) { return $(el).is(':visible'); }); + } + const li = $('
    • ').attr('id','nav-'+id); + const div = $('
      ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + if (hasSubItems()) { + span.append($('').addClass('arrowhead opened')); + } + const ahref = $('').attr('href','#'+id).append(title); + content.append(li.append(div.append(span).append(ahref))); + topMapping.push(id); + const ulStack = []; + ulStack.push(content); + if (hasSubItems()) { + let last_id = undefined; + let inMemberGroup = false; + // declaration sections have rows for items + rows.each(function(){ + let td = $(this); + let tr = $(td).parent(); + const is_anon_enum = td.contents().first().text().trim()=='{'; + if (tr.hasClass('template')) { + tr = tr.prev(); + } + id = $(tr).attr('id'); + const text = is_anon_enum ? 'anonymous enum' : $(this).find('a:first,b,div.groupHeader').text(); + let isMemberGroupHeader = $(tr).hasClass('groupHeader'); + if ($(tr).is(":visible") && last_id!=id && id!==undefined) { + if (isMemberGroupHeader && inMemberGroup) { + ulStack.pop(); + inMemberGroup=false; + } + const li2 = $('
    • ').attr('id','nav-'+id); + const div2 = $('
      ').addClass('item'); + const span2 = $('').addClass('arrow').css({ paddingLeft:parseInt(ulStack.length*16)+'px' }); + const ahref = $('').attr('href','#'+id).append(escapeHtml(text)); + li2.append(div2.append(span2).append(ahref)); + topMapping.push(id); + if (isMemberGroupHeader) { + span2.append($('').addClass('arrowhead opened')); + ulStack[ulStack.length-1].append(li2); + const ul2 = $('
        '); + ulStack.push(ul2); + li2.append(div2).append(ul2); + inMemberGroup=true; + } else { + ulStack[ulStack.length-1].append(li2); + } + last_id=id; + } + }); + // detailed documentation has h2.memtitle sections for items + item.memTitles.forEach(function(data) { + const text = $(data).contents().not($(data).children().first()).text(); + const name = text.replace(/\(\)(\s*\[\d+\/\d+\])?$/, '') // func() [2/8] -> func + id = $(data).find('span.permalink a').attr('href') + if (id!==undefined && name!==undefined) { + const li2 = $('
      • ').attr('id','nav-'+id.substring(1)); + const div2 = $('
      • '); + const div = $('
        ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + const ahref = $('').attr('href',srcBaseUrl+dstBaseUrl+pageName).addClass('noscroll'); + content.append(li.append(div.append(span).append(ahref.append(LISTOFALLMEMBERS)))); + } + + if (groupSections.length==0) { + // for PageDef + const sectionTree = [], sectionStack = []; + $('h1.doxsection, h2.doxsection, h3.doxsection, h4.doxsection, h5.doxsection, h6.doxsection').each(function(){ + const level = parseInt(this.tagName[1]); + const anchor = $(this).find('a.anchor').attr('id'); + const node = { text: $(this).html(), id: anchor, children: [] }; + while (sectionStack.length && sectionStack[sectionStack.length - 1].level >= level) sectionStack.pop(); + (sectionStack.length ? sectionStack[sectionStack.length - 1].children : sectionTree).push(node); + sectionStack.push({ ...node, level }); + }); + if (sectionTree.length>0) { + function render(nodes, level=0) { + nodes.map(n => { + const li = $('
      • ').attr('id','nav-'+n.id); + const div = $('
        ').addClass('item'); + const span = $('').addClass('arrow').attr('style','padding-left:'+parseInt(level*16)+'px;'); + if (n.children.length > 0) { span.append($('').addClass('arrowhead opened')); } + const url = $('').attr('href','#'+n.id); + content.append(li.append(div.append(span).append(url.append(n.text)))); + topMapping.push(n.id); + render(n.children,level+1); + }); + } + render(sectionTree); + } + } + + toc_contents.append(content); + + $(".page-outline a[href]:not(.noscroll)").click(function(e) { + e.preventDefault(); + const aname = $(this).attr("href"); + gotoAnchor($(aname),aname); + }); + + let lastScrollSourceOffset = -1; + let lastScrollTargetOffset = -1; + let lastScrollTargetId = ''; + + navtree_trampoline.updateContentTop = function() { + const pagenavcontents = $("#page-nav-contents"); + if (pagenavcontents.length) { + const content = $("#doc-content"); + const height = content.height(); + const navy = pagenavcontents.offset().top; + const yc = content.offset().top; + let offsets = [] + for (let i=0;imargin || ye>margin) && (yslastScrollTargetOffset) || + (!scrollDown && targetOffset { + navtree_trampoline.updateContentTop(); + },200); + } + $(document).ready(function() { initPageToc(); initResizable(); }); + } /* @license-end */ diff --git a/Doc/html/navtreedata.js b/Doc/html/navtreedata.js index b8330df..a65bea9 100644 --- a/Doc/html/navtreedata.js +++ b/Doc/html/navtreedata.js @@ -27,17 +27,15 @@ var NAVTREE = [ "MyLibs", "index.html", [ [ "Обзор", "index.html#overview", [ [ "Основные возможности", "index.html#features", [ - [ "Общие утилиты (General Tools)", "index.html#utils_module", null ], - [ "Трассировка Trace defines", "index.html#trace_module", null ], - [ "Модуль GPIO GPIO Tools", "index.html#gpio_module", null ], - [ "Модуль таймеров TIM Tools", "index.html#tim_module", null ] + [ "Общие утилиты (General Tools)", "index.html#utils_module", null ], + [ "Трассировка Trace defines", "index.html#trace_module", null ], + [ "Модуль GPIO GPIO Tools", "index.html#gpio_module", null ], + [ "Модуль таймеров TIM Tools", "index.html#tim_module", null ], + [ "Модуль UART UART Tools", "index.html#uart_module", null ], + [ "Модуль SPI SPI Tools", "index.html#spi_module", null ] ] ], [ "Структура проекта", "index.html#structure", null ], - [ "Использование", "index.html#usage_basic", [ - [ "Пример работы с GPIO", "index.html#gpio_example", null ], - [ "Пример работы с таймером", "index.html#tim_example", null ] - ] ], - [ "Зависимости", "index.html#dependencies", null ] + [ "Использование", "index.html#usage_basic", null ] ] ], [ "Topics", "topics.html", "topics" ], [ "Classes", "annotated.html", [ @@ -64,8 +62,9 @@ var NAVTREE = var NAVTREEINDEX = [ "____general__flash_8c_source.html", -"struct_r_t_t___flash_header__t.html#ae7276198385c8d6f6508f433d042d52a" +"struct_evolve_optimizer__t.html#a74b81df1c298c99162310f3f7d91735a" ]; -var SYNCONMSG = 'click to disable panel synchronisation'; -var SYNCOFFMSG = 'click to enable panel synchronisation'; \ No newline at end of file +var SYNCONMSG = 'click to disable panel synchronization'; +var SYNCOFFMSG = 'click to enable panel synchronization'; +var LISTOFALLMEMBERS = 'List of all members'; \ No newline at end of file diff --git a/Doc/html/navtreeindex0.js b/Doc/html/navtreeindex0.js index bc95142..ccfbfcc 100644 --- a/Doc/html/navtreeindex0.js +++ b/Doc/html/navtreeindex0.js @@ -2,30 +2,37 @@ var NAVTREEINDEX0 = { "____general__flash_8c_source.html":[3,0,0,1,0], "____general__flash_8h_source.html":[3,0,0,0,0], -"____general__spi_8c_source.html":[3,0,0,1,1], -"____general__spi_8h_source.html":[3,0,0,0,1], -"____general__uart_8c_source.html":[3,0,0,1,2], -"____general__uart_8h_source.html":[3,0,0,0,2], "annotated.html":[2,0], -"bit__access_8h.html":[3,0,0,0,3], -"bit__access_8h_source.html":[3,0,0,0,3], +"bit__access_8h.html":[3,0,0,0,1], +"bit__access_8h_source.html":[3,0,0,0,1], "classes.html":[2,1], "dir_9c80311a018e1f8cfb6659b73d634be4.html":[3,0,0,1], "dir_9e11e9a41112194af3eee6cc728f9515.html":[3,0,0], "dir_eb423fea8a9c4b9b32b922020ec391e1.html":[3,0,0,0], -"evolve__optimizer_8h.html":[3,0,0,0,4], -"evolve__optimizer_8h_source.html":[3,0,0,0,4], +"evolve__optimizer_8h.html":[3,0,0,0,2], +"evolve__optimizer_8h_source.html":[3,0,0,0,2], "files.html":[3,0], "functions.html":[2,2,0], "functions_vars.html":[2,2,1], -"general__gpio_8c.html":[3,0,0,1,3], -"general__gpio_8c_source.html":[3,0,0,1,3], -"general__gpio_8h.html":[3,0,0,0,5], -"general__gpio_8h_source.html":[3,0,0,0,5], -"general__tim_8c.html":[3,0,0,1,4], -"general__tim_8c_source.html":[3,0,0,1,4], -"general__tim_8h.html":[3,0,0,0,6], -"general__tim_8h_source.html":[3,0,0,0,6], +"general__gpio_8c.html":[3,0,0,1,1], +"general__gpio_8c_source.html":[3,0,0,1,1], +"general__gpio_8h.html":[3,0,0,0,3], +"general__gpio_8h_source.html":[3,0,0,0,3], +"general__spi_8c.html":[3,0,0,1,2], +"general__spi_8c.html#ae80d21e5cab86571709a2619442733b5":[3,0,0,1,2,1], +"general__spi_8c_source.html":[3,0,0,1,2], +"general__spi_8h.html":[3,0,0,0,4], +"general__spi_8h_source.html":[3,0,0,0,4], +"general__tim_8c.html":[3,0,0,1,3], +"general__tim_8c_source.html":[3,0,0,1,3], +"general__tim_8h.html":[3,0,0,0,5], +"general__tim_8h_source.html":[3,0,0,0,5], +"general__uart_8c.html":[3,0,0,1,4], +"general__uart_8c.html#a3abae05bbde5f3b402bf18ca13dc6a0b":[3,0,0,1,4,1], +"general__uart_8c.html#ad82d0cbd19151675135fd75dad315d05":[3,0,0,1,4,2], +"general__uart_8c_source.html":[3,0,0,1,4], +"general__uart_8h.html":[3,0,0,0,6], +"general__uart_8h_source.html":[3,0,0,0,6], "globals.html":[3,1,0], "globals_defs.html":[3,1,4], "globals_enum.html":[3,1,2], @@ -53,14 +60,13 @@ var NAVTREEINDEX0 = "group___e_v_o_l_v_e___c_o_n_f_i_g.html#ga7c1396e5c95c766afccdb45cbfcf5971":[1,0,0,1,2], "group___e_v_o_l_v_e___c_o_n_f_i_g.html#ga80d6162495fc3776d8902610657d4fee":[1,0,0,1,1], "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html":[1,0,1,1], -"group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga2f2b1be34ad4eb1bf3267237200cd6c6":[1,0,1,1,4], -"group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga38607e23d9234524bc7de5869b15b8eb":[1,0,1,1,6], -"group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga4e3ea118b5b9068619c57724a925ba21":[1,0,1,1,7], +"group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga2f2b1be34ad4eb1bf3267237200cd6c6":[1,0,1,1,3], +"group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga38607e23d9234524bc7de5869b15b8eb":[1,0,1,1,5], +"group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga4e3ea118b5b9068619c57724a925ba21":[1,0,1,1,6], "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga83abbcabaff9111c03ae2475ee72ea3e":[1,0,1,1,1], -"group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga861c1c6a503c21441abcec0d57b848bc":[1,0,1,1,5], -"group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga9c853b02c22f26023c34d1d404b6d653":[1,0,1,1,3], +"group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga861c1c6a503c21441abcec0d57b848bc":[1,0,1,1,4], "group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#gaa1d5510fe5f0bd989473f3ebe324bde3":[1,0,1,1,2], -"group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#gaef44a1f3298514569cc2b396a92101ef":[1,0,1,1,8], +"group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#gaef44a1f3298514569cc2b396a92101ef":[1,0,1,1,7], "group___g_p_i_o___i_n_i_t.html":[1,0,2,0,0,0], "group___g_p_i_o___i_n_i_t.html#ga19d9e3aced311179a2914e0c9b13d0f9":[1,0,2,0,0,0,3], "group___g_p_i_o___i_n_i_t.html#ga1d42e219765ec526d99e306638ac0023":[1,0,2,0,0,0,0], @@ -68,19 +74,30 @@ var NAVTREEINDEX0 = "group___g_p_i_o___i_n_i_t.html#gacd8900c9ec0efde1da3253b718574067":[1,0,2,0,0,0,4], "group___g_p_i_o___i_n_i_t.html#gaf2e697ac60e05813d45ea2c9c9e79c25":[1,0,2,0,0,0,1], "group___l_i_b_s___c_o_n_f_i_g.html":[1,0,0,2], -"group___l_i_b_s___c_o_n_f_i_g.html#ga0a3ca94b616997069dd53e2c6c2687d7":[1,0,0,2,3], -"group___l_i_b_s___c_o_n_f_i_g.html#ga181a46326e46b60afb160190832c7281":[1,0,0,2,4], -"group___l_i_b_s___c_o_n_f_i_g.html#ga4403055986b70bb02b8d37073a122e32":[1,0,0,2,2], -"group___l_i_b_s___c_o_n_f_i_g.html#ga66560656d080d6551627a19dfb847c66":[1,0,0,2,0], -"group___l_i_b_s___c_o_n_f_i_g.html#gaf4ddb2a71ec0d05c2480e197cd17c0be":[1,0,0,2,1], +"group___l_i_b_s___c_o_n_f_i_g.html#ga0a3ca94b616997069dd53e2c6c2687d7":[1,0,0,2,4], +"group___l_i_b_s___c_o_n_f_i_g.html#ga181a46326e46b60afb160190832c7281":[1,0,0,2,5], +"group___l_i_b_s___c_o_n_f_i_g.html#ga4403055986b70bb02b8d37073a122e32":[1,0,0,2,3], +"group___l_i_b_s___c_o_n_f_i_g.html#ga57c369737d5c0cfdb7baeecba0a4b151":[1,0,0,2,6], +"group___l_i_b_s___c_o_n_f_i_g.html#ga66560656d080d6551627a19dfb847c66":[1,0,0,2,1], +"group___l_i_b_s___c_o_n_f_i_g.html#ga9c853b02c22f26023c34d1d404b6d653":[1,0,0,2,0], +"group___l_i_b_s___c_o_n_f_i_g.html#gaf4ddb2a71ec0d05c2480e197cd17c0be":[1,0,0,2,2], "group___m_y___l_i_b_s___g_p_i_o.html":[1,0,2,0], -"group___m_y___l_i_b_s___t_i_m.html":[1,0,2,1], +"group___m_y___l_i_b_s___s_p_i.html":[1,0,2,1], +"group___m_y___l_i_b_s___s_p_i.html#ga0e177e3c57a8fcdc73b5602e72ec66ba":[1,0,2,1,2], +"group___m_y___l_i_b_s___s_p_i.html#ga333dd251bc878931086d48aa932b1a5f":[1,0,2,1,3], +"group___m_y___l_i_b_s___s_p_i.html#gab9f13318daf02bc5b5f302ae392dccac":[1,0,2,1,4], +"group___m_y___l_i_b_s___s_p_i.html#gac279cc3eaa35541edfe330a1844a85e4":[1,0,2,1,5], +"group___m_y___l_i_b_s___t_i_m.html":[1,0,2,2], +"group___m_y___l_i_b_s___u_a_r_t.html":[1,0,2,3], +"group___m_y___l_i_b_s___u_a_r_t.html#ga2a22e46ecb9e04b2ce197a0e9c09044a":[1,0,2,3,3], +"group___m_y___l_i_b_s___u_a_r_t.html#ga93ed6ceef4e3b5e7885786125cce93bc":[1,0,2,3,5], +"group___m_y___l_i_b_s___u_a_r_t.html#gab9313fd2f9fc6873ca6bfbc5b96edbbb":[1,0,2,3,4], +"group___m_y___l_i_b_s___u_a_r_t.html#gab9f07396b778505c934143e89953e154":[1,0,2,3,2], "group___m_y_l_i_b_s___a_l_l.html":[1,0], "group___m_y_l_i_b_s___c_o_n_f_i_g.html":[1,0,0], "group___m_y_l_i_b_s___d_e_f_i_n_e_s.html":[1,0,1], "group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html":[1,0,2,0,0], -"group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html#ga580b842096340b066c28b24d6b315be6":[1,0,2,0,0,1], -"group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html#ga962f010f783b81fcdd27eb6b53db28e6":[1,0,2,0,0,2], +"group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html#ga962f010f783b81fcdd27eb6b53db28e6":[1,0,2,0,0,1], "group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html":[1,0,2,0,2], "group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#ga4b9572949326b050694cd55d0a7e5f6c":[1,0,2,0,2,3], "group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaa00f20021781464af3dfe74aa3e59a0a":[1,0,2,0,2,7], @@ -98,47 +115,52 @@ var NAVTREEINDEX0 = "group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html#ga960b24335b2026abcad126ab8c422d70":[1,0,2,0,1,2], "group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html#gacafee0e68877f2b25df843356871d1f7":[1,0,2,0,1,1], "group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.html":[1,0,2], -"group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html":[1,0,2,1,2], -"group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga108637af414bff3373059273b815ce9b":[1,0,2,1,2,2], -"group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga4c0dfde4e15f677600605348b4e97834":[1,0,2,1,2,0], -"group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga88c552a133cb6e3015453cccab74c07e":[1,0,2,1,2,1], -"group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html":[1,0,2,1,1], -"group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#ga117b795017e9e3a357ddefe323412761":[1,0,2,1,1,3], -"group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc":[1,0,2,1,1,1], -"group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#gac3bc6525f88c275e47eb864e6d567501":[1,0,2,1,1,2], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html":[1,0,2,1,3], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga7044214f24a9868ba7e1650b55e639ec":[1,0,2,1,3,4], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga879e3f1c919c02990736730275367115":[1,0,2,1,3,6], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#gaa0a51c870325217ac099881f09dd0800":[1,0,2,1,3,3], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#gaad47337be7ba2f6c0777c40d7278c931":[1,0,2,1,3,5], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#gaeb611874216a4661fb83366b99b9e787":[1,0,2,1,3,2], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a060b01e890891fd17c8f95b55a94139f":[1,0,2,1,3,3,2], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a096ef0ab67788487f69d8877c6d89b30":[1,0,2,1,3,3,3], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a18527a2d781eb4365aecd9a3184fc1da":[1,0,2,1,3,3,6], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a63df3123d0ddc592b189ed1594456ea2":[1,0,2,1,3,3,1], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a6a66c5ed1d966c9e30f0219b664d2b25":[1,0,2,1,3,3,4], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a7421a08abd119e71aa99eea5ab5d6daa":[1,0,2,1,3,3,5], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800ae838122c0e83bc57ad31b546bf2f00e5":[1,0,2,1,3,3,0], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaeb611874216a4661fb83366b99b9e787a89ecf1ef6d45ead2efcb7dd30396114c":[1,0,2,1,3,2,1], -"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaeb611874216a4661fb83366b99b9e787ab0869828a4dfd62eaa44868ca27835f8":[1,0,2,1,3,2,0], -"group___m_y_l_i_b_s___t_i_m___o_c.html":[1,0,2,1,0], -"group___m_y_l_i_b_s___t_i_m___o_c.html#gadb2f465d89f609e035867e980c3a29c6":[1,0,2,1,0,0], -"group___m_y_l_i_b_s___t_i_m___o_c.html#gae2608ca8023e9a0713af0b4fbfbc1889":[1,0,2,1,0,1], -"group___t_i_m___i_n_i_t.html":[1,0,2,1,3,0], -"group___t_i_m___i_n_i_t.html#ga1493b39c9214501180b81b4c892f9be0":[1,0,2,1,3,0,3], -"group___t_i_m___i_n_i_t.html#ga176c97f06ebcf14e06e5c5bdbfac44c2":[1,0,2,1,3,0,10], -"group___t_i_m___i_n_i_t.html#ga252f4fba93fc265110e83760e0590af3":[1,0,2,1,3,0,4], -"group___t_i_m___i_n_i_t.html#ga28ba33d7c6bf22821dafa5bcee4854be":[1,0,2,1,3,0,7], -"group___t_i_m___i_n_i_t.html#ga4e2b0e6cdf9eed74581b575c3fd9516b":[1,0,2,1,3,0,11], -"group___t_i_m___i_n_i_t.html#ga54a98c21365e0bc45b81555d2b101f2b":[1,0,2,1,3,0,0], -"group___t_i_m___i_n_i_t.html#ga5b5685a43273b6e37242a4aba3ee0617":[1,0,2,1,3,0,2], -"group___t_i_m___i_n_i_t.html#ga72535a44955b43cbcd56e25039ab32eb":[1,0,2,1,3,0,1], -"group___t_i_m___i_n_i_t.html#ga7cdc54cc8cbbb6e9f60001f1e3e6ec67":[1,0,2,1,3,0,6], -"group___t_i_m___i_n_i_t.html#ga8fe31b98160627d19038222910be3f46":[1,0,2,1,3,0,5], -"group___t_i_m___i_n_i_t.html#ga98c0691052d1da2c4053dd3586ff7ce9":[1,0,2,1,3,0,9], -"group___t_i_m___i_n_i_t.html#ga9ae40be31d5271abe3e49f896d916d5c":[1,0,2,1,3,0,13], -"group___t_i_m___i_n_i_t.html#gaac627c0e98c9594cc41b1b46eb39e44a":[1,0,2,1,3,0,8], -"group___t_i_m___i_n_i_t.html#gaf48ef87650517652ddec039a189507ac":[1,0,2,1,3,0,12], +"group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html":[1,0,2,2,1], +"group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga108637af414bff3373059273b815ce9b":[1,0,2,2,1,2], +"group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga4c0dfde4e15f677600605348b4e97834":[1,0,2,2,1,0], +"group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga88c552a133cb6e3015453cccab74c07e":[1,0,2,2,1,1], +"group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html":[1,0,2,2,3], +"group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#ga117b795017e9e3a357ddefe323412761":[1,0,2,2,3,3], +"group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc":[1,0,2,2,3,1], +"group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#gac3bc6525f88c275e47eb864e6d567501":[1,0,2,2,3,2], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html":[1,0,2,2,0], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga7044214f24a9868ba7e1650b55e639ec":[1,0,2,2,0,4], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga879e3f1c919c02990736730275367115":[1,0,2,2,0,6], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#gaa0a51c870325217ac099881f09dd0800":[1,0,2,2,0,3], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#gaad47337be7ba2f6c0777c40d7278c931":[1,0,2,2,0,5], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#gaeb611874216a4661fb83366b99b9e787":[1,0,2,2,0,2], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a060b01e890891fd17c8f95b55a94139f":[1,0,2,2,0,3,2], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a096ef0ab67788487f69d8877c6d89b30":[1,0,2,2,0,3,3], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a18527a2d781eb4365aecd9a3184fc1da":[1,0,2,2,0,3,6], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a63df3123d0ddc592b189ed1594456ea2":[1,0,2,2,0,3,1], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a6a66c5ed1d966c9e30f0219b664d2b25":[1,0,2,2,0,3,4], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a7421a08abd119e71aa99eea5ab5d6daa":[1,0,2,2,0,3,5], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800ae838122c0e83bc57ad31b546bf2f00e5":[1,0,2,2,0,3,0], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaeb611874216a4661fb83366b99b9e787a89ecf1ef6d45ead2efcb7dd30396114c":[1,0,2,2,0,2,1], +"group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaeb611874216a4661fb83366b99b9e787ab0869828a4dfd62eaa44868ca27835f8":[1,0,2,2,0,2,0], +"group___m_y_l_i_b_s___t_i_m___o_c.html":[1,0,2,2,2], +"group___m_y_l_i_b_s___t_i_m___o_c.html#gadb2f465d89f609e035867e980c3a29c6":[1,0,2,2,2,0], +"group___m_y_l_i_b_s___t_i_m___o_c.html#gae2608ca8023e9a0713af0b4fbfbc1889":[1,0,2,2,2,1], +"group___s_p_i___i_n_i_t.html":[1,0,2,1,0], +"group___s_p_i___i_n_i_t.html#ga2fe0c8aeb2c61679f32836fef479eedf":[1,0,2,1,0,1], +"group___s_p_i___i_n_i_t.html#ga53687cddb8e39e76a79b8ffaa152fb2b":[1,0,2,1,0,2], +"group___s_p_i___i_n_i_t.html#ga5fdd6e5934a8005ef05b80f6d95883dc":[1,0,2,1,0,3], +"group___s_p_i___i_n_i_t.html#ga8ad4712bf4add56892d057778e826e0c":[1,0,2,1,0,0], +"group___t_i_m___i_n_i_t.html":[1,0,2,2,0,0], +"group___t_i_m___i_n_i_t.html#ga1493b39c9214501180b81b4c892f9be0":[1,0,2,2,0,0,3], +"group___t_i_m___i_n_i_t.html#ga176c97f06ebcf14e06e5c5bdbfac44c2":[1,0,2,2,0,0,10], +"group___t_i_m___i_n_i_t.html#ga252f4fba93fc265110e83760e0590af3":[1,0,2,2,0,0,4], +"group___t_i_m___i_n_i_t.html#ga28ba33d7c6bf22821dafa5bcee4854be":[1,0,2,2,0,0,7], +"group___t_i_m___i_n_i_t.html#ga4e2b0e6cdf9eed74581b575c3fd9516b":[1,0,2,2,0,0,11], +"group___t_i_m___i_n_i_t.html#ga54a98c21365e0bc45b81555d2b101f2b":[1,0,2,2,0,0,0], +"group___t_i_m___i_n_i_t.html#ga5b5685a43273b6e37242a4aba3ee0617":[1,0,2,2,0,0,2], +"group___t_i_m___i_n_i_t.html#ga72535a44955b43cbcd56e25039ab32eb":[1,0,2,2,0,0,1], +"group___t_i_m___i_n_i_t.html#ga7cdc54cc8cbbb6e9f60001f1e3e6ec67":[1,0,2,2,0,0,6], +"group___t_i_m___i_n_i_t.html#ga8fe31b98160627d19038222910be3f46":[1,0,2,2,0,0,5], +"group___t_i_m___i_n_i_t.html#ga98c0691052d1da2c4053dd3586ff7ce9":[1,0,2,2,0,0,9], +"group___t_i_m___i_n_i_t.html#ga9ae40be31d5271abe3e49f896d916d5c":[1,0,2,2,0,0,13], +"group___t_i_m___i_n_i_t.html#gaac627c0e98c9594cc41b1b46eb39e44a":[1,0,2,2,0,0,8], +"group___t_i_m___i_n_i_t.html#gaf48ef87650517652ddec039a189507ac":[1,0,2,2,0,0,12], "group___t_r_a_c_e.html":[1,0,1,5], "group___t_r_a_c_e___c_o_n_f_i_g.html":[1,0,0,0], "group___t_r_a_c_e___c_o_n_f_i_g.html#ga00ff2175bdc1fb11c8ec970ea3010dd8":[1,0,0,0,2], @@ -192,21 +214,28 @@ var NAVTREEINDEX0 = "group___t_r_a_c_k_e_r_s.html#gad91d8ca89074270fc040c0449e57cf07":[1,0,1,6,3], "group___t_r_a_c_k_e_r_s.html#gadd7fd2c6e3a4800f1d5ddab35fd4b43e":[1,0,1,6,2], "group___t_r_a_c_k_e_r_s.html#gae860b6947c6e317e14d40bd7b4b8eb74":[1,0,1,6,16], +"group___u_a_r_t___i_n_i_t.html":[1,0,2,3,0], +"group___u_a_r_t___i_n_i_t.html#ga167269406e73327b95c3bb7b9cfe6d89":[1,0,2,3,0,0], +"group___u_a_r_t___i_n_i_t.html#ga592c6bf4a6496d6806ba0838cdfa2340":[1,0,2,3,0,5], +"group___u_a_r_t___i_n_i_t.html#ga6dadd967b428aade24008ec060009976":[1,0,2,3,0,3], +"group___u_a_r_t___i_n_i_t.html#ga779530e93e7aa1f25eb13045ec42b8e7":[1,0,2,3,0,4], +"group___u_a_r_t___i_n_i_t.html#gaacb3968508217a0d8b3f64aa0c8aa07d":[1,0,2,3,0,2], +"group___u_a_r_t___i_n_i_t.html#gace54f148bb1d72f13bf397d096d38d1b":[1,0,2,3,0,1], +"group___u_a_r_t___i_n_i_t.html#gafaeb8bdd4aa7fb1987505530daa90868":[1,0,2,3,0,6], "group___u_t_i_l_s___d_e_f_i_n_e_s.html":[1,0,1,4], "group___u_t_i_l_s___d_e_f_i_n_e_s.html#ga0f22e895ac7781c3d1b68fee182c4291":[1,0,1,4,2], "group___u_t_i_l_s___d_e_f_i_n_e_s.html#ga996f7be338ccb40d1a2a5abc1ad61759":[1,0,1,4,3], "group___u_t_i_l_s___d_e_f_i_n_e_s.html#gabf45f2b60eedf80cf9d1dbe4302a741e":[1,0,1,4,1], "group___u_t_i_l_s___d_e_f_i_n_e_s.html#gaf5e598848326d48e86167e5099a029be":[1,0,1,4,0], "index.html":[], -"index.html#dependencies":[0,3], "index.html#features":[0,0], -"index.html#gpio_example":[0,2,0], "index.html#gpio_module":[0,0,2], "index.html#overview":[0], +"index.html#spi_module":[0,0,5], "index.html#structure":[0,1], -"index.html#tim_example":[0,2,1], "index.html#tim_module":[0,0,3], "index.html#trace_module":[0,0,1], +"index.html#uart_module":[0,0,4], "index.html#usage_basic":[0,2], "index.html#utils_module":[0,0,0], "mainpage_8h_source.html":[3,0,0,2], @@ -220,34 +249,5 @@ var NAVTREEINDEX0 = "struct_evolve_optimizer__t.html":[1,0,1,1,0], "struct_evolve_optimizer__t.html#a0ae0e63ba351335d4445d927991c64ae":[1,0,1,1,0,5], "struct_evolve_optimizer__t.html#a1c270fce82e0c97e6c88fd0971c1eed8":[1,0,1,1,0,1], -"struct_evolve_optimizer__t.html#a74b81df1c298c99162310f3f7d91735a":[1,0,1,1,0,8], -"struct_evolve_optimizer__t.html#a80eb0b8525b6bb838484f5922b9d8f7c":[1,0,1,1,0,0], -"struct_evolve_optimizer__t.html#a93f628397c2f8d4027f2906752b650df":[1,0,1,1,0,6], -"struct_evolve_optimizer__t.html#a950cd70cb6bff33b78ad35ee58c729a6":[1,0,1,1,0,3], -"struct_evolve_optimizer__t.html#ac35c7ca8cede4ab9c53a2845a91cd1b1":[1,0,1,1,0,2], -"struct_evolve_optimizer__t.html#aec67667fd1f1533e693e41c79bc28da4":[1,0,1,1,0,7], -"struct_evolve_optimizer__t.html#af779c7aeba0053e36cee7aade160f1c8":[1,0,1,1,0,4], -"struct_g_p_i_o___l_e_d_type_def.html":[1,0,2,0,2,0], -"struct_g_p_i_o___l_e_d_type_def.html#a684ff60e4c94daf2221524cdc6fcc978":[1,0,2,0,2,0,2], -"struct_g_p_i_o___l_e_d_type_def.html#a6cc026931a4681732f9a329ae03098ec":[1,0,2,0,2,0,4], -"struct_g_p_i_o___l_e_d_type_def.html#a831923d4d157267ecc2f1add1c49adcf":[1,0,2,0,2,0,1], -"struct_g_p_i_o___l_e_d_type_def.html#abe9aadc0b28d042267f7155e187a1816":[1,0,2,0,2,0,3], -"struct_g_p_i_o___l_e_d_type_def.html#ad28d93023a00e3c5669bd3deda122435":[1,0,2,0,2,0,0], -"struct_g_p_i_o___switch_type_def.html":[1,0,2,0,1,0], -"struct_g_p_i_o___switch_type_def.html#a245f1dc811279ce5d4598582db979a89":[1,0,2,0,1,0,3], -"struct_g_p_i_o___switch_type_def.html#a2600e599a961af2e280c721894df4c06":[1,0,2,0,1,0,4], -"struct_g_p_i_o___switch_type_def.html#a4fadf5ead3ebccad521a52c064eeb405":[1,0,2,0,1,0,2], -"struct_g_p_i_o___switch_type_def.html#a63d58d9cba49a5823175585ef2996032":[1,0,2,0,1,0,1], -"struct_g_p_i_o___switch_type_def.html#afb369df75a6065fd89ac4ba97d98ab1a":[1,0,2,0,1,0,0], -"struct_h_f___stack_frame__t.html":[1,0,1,5,3,0], -"struct_h_f___stack_frame__t.html#a16563896004751c90e41c81ae4570732":[1,0,1,5,3,0,6], -"struct_h_f___stack_frame__t.html#a286104d19185714940645a9df814ddea":[1,0,1,5,3,0,1], -"struct_h_f___stack_frame__t.html#a4146ed28926b5f234132b7112119a413":[1,0,1,5,3,0,0], -"struct_h_f___stack_frame__t.html#a453c7af42b6928a693af422e17c981d3":[1,0,1,5,3,0,3], -"struct_h_f___stack_frame__t.html#a5a52e5006dabcf68c0fa4cfb0e03335b":[1,0,1,5,3,0,2], -"struct_h_f___stack_frame__t.html#a6e51904297f7725e96d5b5fb291ef577":[1,0,1,5,3,0,5], -"struct_h_f___stack_frame__t.html#a819ee3bc518c460ece1b7c4079f8f80b":[1,0,1,5,3,0,4], -"struct_h_f___stack_frame__t.html#ae47cb051ee3c94471bfd4fe7e49c55f9":[1,0,1,5,3,0,7], -"struct_r_t_t___flash_header__t.html":[1,0,1,5,2,0], -"struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57":[1,0,1,5,2,0,0] +"struct_evolve_optimizer__t.html#a3be8c0c34db8429210ff470497a56727":[1,0,1,1,0,7] }; diff --git a/Doc/html/navtreeindex1.js b/Doc/html/navtreeindex1.js index d127260..c6bdd85 100644 --- a/Doc/html/navtreeindex1.js +++ b/Doc/html/navtreeindex1.js @@ -1,30 +1,79 @@ var NAVTREEINDEX1 = { +"struct_evolve_optimizer__t.html#a74b81df1c298c99162310f3f7d91735a":[1,0,1,1,0,10], +"struct_evolve_optimizer__t.html#a80eb0b8525b6bb838484f5922b9d8f7c":[1,0,1,1,0,0], +"struct_evolve_optimizer__t.html#a93f628397c2f8d4027f2906752b650df":[1,0,1,1,0,8], +"struct_evolve_optimizer__t.html#a950cd70cb6bff33b78ad35ee58c729a6":[1,0,1,1,0,3], +"struct_evolve_optimizer__t.html#ac35c7ca8cede4ab9c53a2845a91cd1b1":[1,0,1,1,0,2], +"struct_evolve_optimizer__t.html#ad0f464d7048a9ed0753b61f76f563108":[1,0,1,1,0,6], +"struct_evolve_optimizer__t.html#aec67667fd1f1533e693e41c79bc28da4":[1,0,1,1,0,9], +"struct_evolve_optimizer__t.html#af779c7aeba0053e36cee7aade160f1c8":[1,0,1,1,0,4], +"struct_g_p_i_o___l_e_d_type_def.html":[1,0,2,0,2,0], +"struct_g_p_i_o___l_e_d_type_def.html#a684ff60e4c94daf2221524cdc6fcc978":[1,0,2,0,2,0,2], +"struct_g_p_i_o___l_e_d_type_def.html#a6cc026931a4681732f9a329ae03098ec":[1,0,2,0,2,0,4], +"struct_g_p_i_o___l_e_d_type_def.html#a831923d4d157267ecc2f1add1c49adcf":[1,0,2,0,2,0,1], +"struct_g_p_i_o___l_e_d_type_def.html#abe9aadc0b28d042267f7155e187a1816":[1,0,2,0,2,0,3], +"struct_g_p_i_o___l_e_d_type_def.html#ad28d93023a00e3c5669bd3deda122435":[1,0,2,0,2,0,0], +"struct_g_p_i_o___switch_type_def.html":[1,0,2,0,1,0], +"struct_g_p_i_o___switch_type_def.html#a245f1dc811279ce5d4598582db979a89":[1,0,2,0,1,0,3], +"struct_g_p_i_o___switch_type_def.html#a2600e599a961af2e280c721894df4c06":[1,0,2,0,1,0,4], +"struct_g_p_i_o___switch_type_def.html#a4fadf5ead3ebccad521a52c064eeb405":[1,0,2,0,1,0,2], +"struct_g_p_i_o___switch_type_def.html#a63d58d9cba49a5823175585ef2996032":[1,0,2,0,1,0,1], +"struct_g_p_i_o___switch_type_def.html#afb369df75a6065fd89ac4ba97d98ab1a":[1,0,2,0,1,0,0], +"struct_h_f___stack_frame__t.html":[1,0,1,5,3,0], +"struct_h_f___stack_frame__t.html#a16563896004751c90e41c81ae4570732":[1,0,1,5,3,0,6], +"struct_h_f___stack_frame__t.html#a286104d19185714940645a9df814ddea":[1,0,1,5,3,0,1], +"struct_h_f___stack_frame__t.html#a4146ed28926b5f234132b7112119a413":[1,0,1,5,3,0,0], +"struct_h_f___stack_frame__t.html#a453c7af42b6928a693af422e17c981d3":[1,0,1,5,3,0,3], +"struct_h_f___stack_frame__t.html#a5a52e5006dabcf68c0fa4cfb0e03335b":[1,0,1,5,3,0,2], +"struct_h_f___stack_frame__t.html#a6e51904297f7725e96d5b5fb291ef577":[1,0,1,5,3,0,5], +"struct_h_f___stack_frame__t.html#a819ee3bc518c460ece1b7c4079f8f80b":[1,0,1,5,3,0,4], +"struct_h_f___stack_frame__t.html#ae47cb051ee3c94471bfd4fe7e49c55f9":[1,0,1,5,3,0,7], +"struct_r_t_t___flash_header__t.html":[1,0,1,5,2,0], +"struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57":[1,0,1,5,2,0,0], "struct_r_t_t___flash_header__t.html#ae7276198385c8d6f6508f433d042d52a":[1,0,1,5,2,0,2], "struct_r_t_t___flash_header__t.html#afd1a5c51af6f97d170c2ccbbe3e34699":[1,0,1,5,2,0,1], -"struct_s_p_i___settings_type_def.html":[2,0,5], -"struct_t_i_m___encoder_type_def.html":[1,0,2,1,1,0], -"struct_t_i_m___encoder_type_def.html#a021f0c585e9e62d68a4b09f630d8b6e5":[1,0,2,1,1,0,3], -"struct_t_i_m___encoder_type_def.html#a0dacce3dde7df3122583869d96a372a2":[1,0,2,1,1,0,1], -"struct_t_i_m___encoder_type_def.html#a4fc05ef011205a6702cb3d006bab677e":[1,0,2,1,1,0,5], -"struct_t_i_m___encoder_type_def.html#a67ad037b92162546763fc9c425b5e3c5":[1,0,2,1,1,0,6], -"struct_t_i_m___encoder_type_def.html#a6973108a83d2a3ea4fc3e0e8a501af80":[1,0,2,1,1,0,7], -"struct_t_i_m___encoder_type_def.html#a6f769f027b760a4b496e2b2b77bf54a3":[1,0,2,1,1,0,0], -"struct_t_i_m___encoder_type_def.html#a99295760ff8b27d1e6f1710f29383a45":[1,0,2,1,1,0,8], -"struct_t_i_m___encoder_type_def.html#ad29873fc8cdc71462e6d8744621120e9":[1,0,2,1,1,0,4], -"struct_t_i_m___encoder_type_def.html#adc80bd5a90444c31d84157f35c59b95c":[1,0,2,1,1,0,2], -"struct_t_i_m___settings_type_def.html":[1,0,2,1,3,1], -"struct_t_i_m___settings_type_def.html#a11151fe125960cb8e61328ffd06b7718":[1,0,2,1,3,1,7], -"struct_t_i_m___settings_type_def.html#a2d9d277dd395424b964445ec1bc65b21":[1,0,2,1,3,1,3], -"struct_t_i_m___settings_type_def.html#a3805f627567798c3cd1d79a0da42bea0":[1,0,2,1,3,1,1], -"struct_t_i_m___settings_type_def.html#a58da1b4c0f6d12d7d9fb2f170b9b9e6e":[1,0,2,1,3,1,6], -"struct_t_i_m___settings_type_def.html#a7073358fd3a722687eb85238ab570014":[1,0,2,1,3,1,8], -"struct_t_i_m___settings_type_def.html#a961f19f0e1672715c27bc94d7871dbb7":[1,0,2,1,3,1,4], -"struct_t_i_m___settings_type_def.html#a9694cf0910a69d48ff94f8aeac106969":[1,0,2,1,3,1,2], -"struct_t_i_m___settings_type_def.html#ab90e370c3edda88e76583293c250d2b0":[1,0,2,1,3,1,5], -"struct_t_i_m___settings_type_def.html#ada49efdbd35a8e442c3cff630d42f34c":[1,0,2,1,3,1,0], -"struct_t_i_m___settings_type_def.html#af6057ff3f60f5e01b41d4a347b79a5e4":[1,0,2,1,3,1,9], -"struct_u_a_r_t___settings_type_def.html":[2,0,8], +"struct_s_p_i___settings_type_def.html":[1,0,2,1,1], +"struct_s_p_i___settings_type_def.html#a0af3bdb273818ff97eb4ff3cff918820":[1,0,2,1,1,7], +"struct_s_p_i___settings_type_def.html#a0d55a2941854f61934487f3d209cfa95":[1,0,2,1,1,4], +"struct_s_p_i___settings_type_def.html#a3366c654d7ec6dd41c6a0b504dc8509a":[1,0,2,1,1,5], +"struct_s_p_i___settings_type_def.html#a3bcb1ed12da3544e02e6d36493669bdc":[1,0,2,1,1,2], +"struct_s_p_i___settings_type_def.html#a3cfd9469b0617a68bbd2a161ba06bb95":[1,0,2,1,1,10], +"struct_s_p_i___settings_type_def.html#a3f3748103a0b7861f6700042fd691ba1":[1,0,2,1,1,3], +"struct_s_p_i___settings_type_def.html#a6a15d48eccf92959de3a086031fdc979":[1,0,2,1,1,1], +"struct_s_p_i___settings_type_def.html#a961208869faf4a7369aaf4edde75f176":[1,0,2,1,1,8], +"struct_s_p_i___settings_type_def.html#aa0edaa145076d2383b3e0095d156d474":[1,0,2,1,1,11], +"struct_s_p_i___settings_type_def.html#ad203d8b8d67e4f477d002d15b03ba422":[1,0,2,1,1,0], +"struct_s_p_i___settings_type_def.html#aecd7a5c6e205335b8ed229d74cd35d14":[1,0,2,1,1,6], +"struct_s_p_i___settings_type_def.html#afbe75a1c36650a4a9b41fa706a4c7eab":[1,0,2,1,1,9], +"struct_t_i_m___encoder_type_def.html":[1,0,2,2,3,0], +"struct_t_i_m___encoder_type_def.html#a021f0c585e9e62d68a4b09f630d8b6e5":[1,0,2,2,3,0,3], +"struct_t_i_m___encoder_type_def.html#a0dacce3dde7df3122583869d96a372a2":[1,0,2,2,3,0,1], +"struct_t_i_m___encoder_type_def.html#a4fc05ef011205a6702cb3d006bab677e":[1,0,2,2,3,0,5], +"struct_t_i_m___encoder_type_def.html#a67ad037b92162546763fc9c425b5e3c5":[1,0,2,2,3,0,6], +"struct_t_i_m___encoder_type_def.html#a6973108a83d2a3ea4fc3e0e8a501af80":[1,0,2,2,3,0,7], +"struct_t_i_m___encoder_type_def.html#a6f769f027b760a4b496e2b2b77bf54a3":[1,0,2,2,3,0,0], +"struct_t_i_m___encoder_type_def.html#a99295760ff8b27d1e6f1710f29383a45":[1,0,2,2,3,0,8], +"struct_t_i_m___encoder_type_def.html#ad29873fc8cdc71462e6d8744621120e9":[1,0,2,2,3,0,4], +"struct_t_i_m___encoder_type_def.html#adc80bd5a90444c31d84157f35c59b95c":[1,0,2,2,3,0,2], +"struct_t_i_m___settings_type_def.html":[1,0,2,2,0,1], +"struct_t_i_m___settings_type_def.html#a11151fe125960cb8e61328ffd06b7718":[1,0,2,2,0,1,7], +"struct_t_i_m___settings_type_def.html#a2d9d277dd395424b964445ec1bc65b21":[1,0,2,2,0,1,3], +"struct_t_i_m___settings_type_def.html#a3805f627567798c3cd1d79a0da42bea0":[1,0,2,2,0,1,1], +"struct_t_i_m___settings_type_def.html#a58da1b4c0f6d12d7d9fb2f170b9b9e6e":[1,0,2,2,0,1,6], +"struct_t_i_m___settings_type_def.html#a7073358fd3a722687eb85238ab570014":[1,0,2,2,0,1,8], +"struct_t_i_m___settings_type_def.html#a961f19f0e1672715c27bc94d7871dbb7":[1,0,2,2,0,1,4], +"struct_t_i_m___settings_type_def.html#a9694cf0910a69d48ff94f8aeac106969":[1,0,2,2,0,1,2], +"struct_t_i_m___settings_type_def.html#ab90e370c3edda88e76583293c250d2b0":[1,0,2,2,0,1,5], +"struct_t_i_m___settings_type_def.html#ada49efdbd35a8e442c3cff630d42f34c":[1,0,2,2,0,1,0], +"struct_t_i_m___settings_type_def.html#af6057ff3f60f5e01b41d4a347b79a5e4":[1,0,2,2,0,1,9], +"struct_u_a_r_t___settings_type_def.html":[1,0,2,3,1], +"struct_u_a_r_t___settings_type_def.html#a15ce92b03f7f189bfbe1ab88a5f94d19":[1,0,2,3,1,5], +"struct_u_a_r_t___settings_type_def.html#a1ecc9ac6a1d2747ade56770cbab6a613":[1,0,2,3,1,4], +"struct_u_a_r_t___settings_type_def.html#a3fba2b52788fe453348b5d92ed52ba49":[1,0,2,3,1,2], +"struct_u_a_r_t___settings_type_def.html#a5f1babfcfb436cd77f5614253c0a5bef":[1,0,2,3,1,3], +"struct_u_a_r_t___settings_type_def.html#accf2c9448a3ea8eb3b8c25a569276fea":[1,0,2,3,1,0], +"struct_u_a_r_t___settings_type_def.html#af6f9910d065bae715cdb4a1024143a8f":[1,0,2,3,1,1], "topics.html":[1], "trace_8h.html":[3,0,0,0,10], "trace_8h_source.html":[3,0,0,0,10], diff --git a/Doc/html/search/all_10.js b/Doc/html/search/all_10.js index 6183e1d..91de365 100644 --- a/Doc/html/search/all_10.js +++ b/Doc/html/search/all_10.js @@ -27,36 +27,32 @@ var searchData= ['tim_5ftickbase_5f10us_24',['TIM_TickBase_10US',['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a060b01e890891fd17c8f95b55a94139f',1,'general_tim.h']]], ['tim_5ftickbase_5f1ms_25',['TIM_TickBase_1MS',['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a6a66c5ed1d966c9e30f0219b664d2b25',1,'general_tim.h']]], ['tim_5ftickbase_5f1us_26',['TIM_TickBase_1US',['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ggaa0a51c870325217ac099881f09dd0800a63df3123d0ddc592b189ed1594456ea2',1,'general_tim.h']]], - ['tools_27',['tools',['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html',1,'Delay tools'],['../group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html',1,'Encoder tools']]], - ['tools_28',['General Tools',['../group___m_y_l_i_b_s___d_e_f_i_n_e_s.html',1,'']]], - ['tools_29',['tools',['../group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html',1,'General tools'],['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html',1,'General tools']]], - ['tools_30',['GPIO Tools',['../group___m_y___l_i_b_s___g_p_i_o.html',1,'']]], - ['tools_31',['tools',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html',1,'LED tools'],['../group___m_y_l_i_b_s___t_i_m___o_c.html',1,'PWM/OC Channels tools'],['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html',1,'Switch tools']]], - ['tools_32',['TIM Tools',['../group___m_y___l_i_b_s___t_i_m.html',1,'']]], - ['trace_33',['Трассировка @ref TRACE',['../index.html#trace_module',1,'']]], - ['trace_20configs_34',['Trace configs',['../group___t_r_a_c_e___c_o_n_f_i_g.html',1,'']]], - ['trace_20defines_35',['trace defines',['../group___t_r_a_c_e___g_p_i_o.html',1,'GPIO trace defines'],['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html',1,'Hardfault trace defines'],['../group___t_r_a_c_e___s_e_r_i_a_l.html',1,'Serial trace defines']]], - ['trace_20defines_36',['Trace defines',['../group___t_r_a_c_e.html',1,'']]], - ['trace_2eh_37',['trace.h',['../trace_8h.html',1,'']]], - ['trace_5fgpio_5freset_38',['TRACE_GPIO_RESET',['../group___t_r_a_c_e___g_p_i_o.html#ga69741d88c991112e99fe7a62e025108a',1,'trace.h']]], - ['trace_5fgpio_5fset_39',['TRACE_GPIO_SET',['../group___t_r_a_c_e___g_p_i_o.html#ga02a6a7b273766121db8ad4a1371373eb',1,'trace.h']]], - ['trackerclear_5fall_40',['TrackerClear_All',['../group___t_r_a_c_k_e_r_s.html#ga704f7b9f8c65c9bcec48ce7cb77a2d3b',1,'trackers.h']]], - ['trackerclear_5ferr_41',['TrackerClear_Err',['../group___t_r_a_c_k_e_r_s.html#gae860b6947c6e317e14d40bd7b4b8eb74',1,'trackers.h']]], - ['trackerclear_5fok_42',['TrackerClear_Ok',['../group___t_r_a_c_k_e_r_s.html#ga5dd8bac8c7ab5832019d55d7a68371b9',1,'trackers.h']]], - ['trackerclear_5fuser_43',['TrackerClear_User',['../group___t_r_a_c_k_e_r_s.html#ga063dab1067005e1600ea32531fdf3f8d',1,'trackers.h']]], - ['trackerclear_5fuserall_44',['TrackerClear_UserAll',['../group___t_r_a_c_k_e_r_s.html#gaaec7ec19977bb26fa1919dfe920b82d5',1,'trackers.h']]], - ['trackerclear_5fwarn_45',['TrackerClear_Warn',['../group___t_r_a_c_k_e_r_s.html#ga365a8c60bd13b75154feda649dd21ead',1,'trackers.h']]], - ['trackercnt_5ferr_46',['TrackerCnt_Err',['../group___t_r_a_c_k_e_r_s.html#ga49af29ab3927cad105c1d2b018a767e9',1,'trackers.h']]], - ['trackercnt_5fok_47',['TrackerCnt_Ok',['../group___t_r_a_c_k_e_r_s.html#ga23de0006aa08984cfeddb6aa5e512fa1',1,'trackers.h']]], - ['trackercnt_5fuser_48',['TrackerCnt_User',['../group___t_r_a_c_k_e_r_s.html#ga1b7549afc4a1760b54a9b93b0f6d105e',1,'trackers.h']]], - ['trackercnt_5fwarn_49',['TrackerCnt_Warn',['../group___t_r_a_c_k_e_r_s.html#ga8017fb05a56a1b667244f1f786fa9c57',1,'trackers.h']]], - ['trackerget_5ferr_50',['TrackerGet_Err',['../group___t_r_a_c_k_e_r_s.html#ga9dc91e6b798a081f95f2ccef2c288e5e',1,'trackers.h']]], - ['trackerget_5fok_51',['TrackerGet_Ok',['../group___t_r_a_c_k_e_r_s.html#gab880911066605602a966641682090169',1,'trackers.h']]], - ['trackerget_5fuser_52',['TrackerGet_User',['../group___t_r_a_c_k_e_r_s.html#ga4b08632669043dfdbd219dda03502bdb',1,'trackers.h']]], - ['trackerget_5fwarn_53',['TrackerGet_Warn',['../group___t_r_a_c_k_e_r_s.html#ga47ac59a406ee74d4cd9fe0fbaf63a758',1,'trackers.h']]], - ['trackers_20defines_54',['Trackers defines',['../group___t_r_a_c_k_e_r_s.html',1,'']]], - ['trackers_2eh_55',['trackers.h',['../trackers_8h.html',1,'']]], - ['trackers_5fenable_56',['TRACKERS_ENABLE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gac9eaedc31ab023ce7d6403999216e496',1,'mylibs_config.h']]], - ['trackertypedef_57',['TrackerTypeDef',['../group___t_r_a_c_k_e_r_s.html#ga50ccb119acf302969b7fdcb58f2130e4',1,'trackers.h']]], - ['trackerwrite_5fuser_58',['TrackerWrite_User',['../group___t_r_a_c_k_e_r_s.html#gad2f4062a9ac8c2ab062a364f640ebc51',1,'trackers.h']]] + ['tools_27',['Tools',['../group___m_y_l_i_b_s___d_e_f_i_n_e_s.html',1,'General Tools'],['../group___m_y___l_i_b_s___g_p_i_o.html',1,'GPIO Tools'],['../group___m_y___l_i_b_s___s_p_i.html',1,'SPI Tools'],['../group___m_y___l_i_b_s___t_i_m.html',1,'TIM Tools'],['../group___m_y___l_i_b_s___u_a_r_t.html',1,'UART Tools']]], + ['tools_28',['tools',['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html',1,'Delay tools'],['../group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html',1,'Encoder tools'],['../group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html',1,'General tools'],['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html',1,'General tools'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html',1,'LED tools'],['../group___m_y_l_i_b_s___t_i_m___o_c.html',1,'PWM/OC Channels tools'],['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html',1,'Switch tools']]], + ['trace_29',['Трассировка <a class="el" href="group___t_r_a_c_e.html">Trace defines</a>',['../index.html#trace_module',1,'']]], + ['trace_20configs_30',['Trace configs',['../group___t_r_a_c_e___c_o_n_f_i_g.html',1,'']]], + ['trace_20defines_31',['Trace defines',['../group___t_r_a_c_e.html',1,'']]], + ['trace_20defines_32',['trace defines',['../group___t_r_a_c_e___g_p_i_o.html',1,'GPIO trace defines'],['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html',1,'Hardfault trace defines'],['../group___t_r_a_c_e___s_e_r_i_a_l.html',1,'Serial trace defines']]], + ['trace_2eh_33',['trace.h',['../trace_8h.html',1,'']]], + ['trace_5fgpio_5freset_34',['TRACE_GPIO_RESET',['../group___t_r_a_c_e___g_p_i_o.html#ga69741d88c991112e99fe7a62e025108a',1,'trace.h']]], + ['trace_5fgpio_5fset_35',['TRACE_GPIO_SET',['../group___t_r_a_c_e___g_p_i_o.html#ga02a6a7b273766121db8ad4a1371373eb',1,'trace.h']]], + ['trackerclear_5fall_36',['TrackerClear_All',['../group___t_r_a_c_k_e_r_s.html#ga704f7b9f8c65c9bcec48ce7cb77a2d3b',1,'trackers.h']]], + ['trackerclear_5ferr_37',['TrackerClear_Err',['../group___t_r_a_c_k_e_r_s.html#gae860b6947c6e317e14d40bd7b4b8eb74',1,'trackers.h']]], + ['trackerclear_5fok_38',['TrackerClear_Ok',['../group___t_r_a_c_k_e_r_s.html#ga5dd8bac8c7ab5832019d55d7a68371b9',1,'trackers.h']]], + ['trackerclear_5fuser_39',['TrackerClear_User',['../group___t_r_a_c_k_e_r_s.html#ga063dab1067005e1600ea32531fdf3f8d',1,'trackers.h']]], + ['trackerclear_5fuserall_40',['TrackerClear_UserAll',['../group___t_r_a_c_k_e_r_s.html#gaaec7ec19977bb26fa1919dfe920b82d5',1,'trackers.h']]], + ['trackerclear_5fwarn_41',['TrackerClear_Warn',['../group___t_r_a_c_k_e_r_s.html#ga365a8c60bd13b75154feda649dd21ead',1,'trackers.h']]], + ['trackercnt_5ferr_42',['TrackerCnt_Err',['../group___t_r_a_c_k_e_r_s.html#ga49af29ab3927cad105c1d2b018a767e9',1,'trackers.h']]], + ['trackercnt_5fok_43',['TrackerCnt_Ok',['../group___t_r_a_c_k_e_r_s.html#ga23de0006aa08984cfeddb6aa5e512fa1',1,'trackers.h']]], + ['trackercnt_5fuser_44',['TrackerCnt_User',['../group___t_r_a_c_k_e_r_s.html#ga1b7549afc4a1760b54a9b93b0f6d105e',1,'trackers.h']]], + ['trackercnt_5fwarn_45',['TrackerCnt_Warn',['../group___t_r_a_c_k_e_r_s.html#ga8017fb05a56a1b667244f1f786fa9c57',1,'trackers.h']]], + ['trackerget_5ferr_46',['TrackerGet_Err',['../group___t_r_a_c_k_e_r_s.html#ga9dc91e6b798a081f95f2ccef2c288e5e',1,'trackers.h']]], + ['trackerget_5fok_47',['TrackerGet_Ok',['../group___t_r_a_c_k_e_r_s.html#gab880911066605602a966641682090169',1,'trackers.h']]], + ['trackerget_5fuser_48',['TrackerGet_User',['../group___t_r_a_c_k_e_r_s.html#ga4b08632669043dfdbd219dda03502bdb',1,'trackers.h']]], + ['trackerget_5fwarn_49',['TrackerGet_Warn',['../group___t_r_a_c_k_e_r_s.html#ga47ac59a406ee74d4cd9fe0fbaf63a758',1,'trackers.h']]], + ['trackers_20defines_50',['Trackers defines',['../group___t_r_a_c_k_e_r_s.html',1,'']]], + ['trackers_2eh_51',['trackers.h',['../trackers_8h.html',1,'']]], + ['trackers_5fenable_52',['TRACKERS_ENABLE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gac9eaedc31ab023ce7d6403999216e496',1,'mylibs_config.h']]], + ['trackertypedef_53',['TrackerTypeDef',['../group___t_r_a_c_k_e_r_s.html#ga50ccb119acf302969b7fdcb58f2130e4',1,'trackers.h']]], + ['trackerwrite_5fuser_54',['TrackerWrite_User',['../group___t_r_a_c_k_e_r_s.html#gad2f4062a9ac8c2ab062a364f640ebc51',1,'trackers.h']]] ]; diff --git a/Doc/html/search/all_11.js b/Doc/html/search/all_11.js index 4b375bc..e6fd0be 100644 --- a/Doc/html/search/all_11.js +++ b/Doc/html/search/all_11.js @@ -1,27 +1,44 @@ var searchData= [ - ['uart_5fsettingstypedef_0',['UART_SettingsTypeDef',['../struct_u_a_r_t___settings_type_def.html',1,'']]], - ['uint16_5fbit_1',['uint16_bit',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html#ga6a122b536ad99ae611c8cf01437af086',1,'bit_access.h']]], - ['uint16_5fbittypedef_2',['uint16_BitTypeDef',['../unionuint16___bit_type_def.html',1,'']]], - ['uint32_5fbit_3',['uint32_bit',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html#gafaa2080168b1b6f7281e8bfabab022d1',1,'bit_access.h']]], - ['uint32_5fbittypedef_4',['uint32_BitTypeDef',['../unionuint32___bit_type_def.html',1,'']]], - ['uint64_5fbit_5',['uint64_bit',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html#ga47eb69ce9330a1c73fe8031240f02f0a',1,'bit_access.h']]], - ['uint64_5fbittypedef_6',['uint64_BitTypeDef',['../unionuint64___bit_type_def.html',1,'']]], - ['uint8_5fbit_7',['uint8_bit',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html#ga57dc3bb3472a66fc92312f89d42d2396',1,'bit_access.h']]], - ['uint8_5fbittypedef_8',['uint8_BitTypeDef',['../unionuint8___bit_type_def.html',1,'']]], - ['use_5ftim1_9',['USE_TIM1',['../group___t_i_m___i_n_i_t.html#ga54a98c21365e0bc45b81555d2b101f2b',1,'general_tim.h']]], - ['use_5ftim10_10',['USE_TIM10',['../group___t_i_m___i_n_i_t.html#ga98c0691052d1da2c4053dd3586ff7ce9',1,'general_tim.h']]], - ['use_5ftim11_11',['USE_TIM11',['../group___t_i_m___i_n_i_t.html#ga176c97f06ebcf14e06e5c5bdbfac44c2',1,'general_tim.h']]], - ['use_5ftim12_12',['USE_TIM12',['../group___t_i_m___i_n_i_t.html#ga4e2b0e6cdf9eed74581b575c3fd9516b',1,'general_tim.h']]], - ['use_5ftim13_13',['USE_TIM13',['../group___t_i_m___i_n_i_t.html#gaf48ef87650517652ddec039a189507ac',1,'general_tim.h']]], - ['use_5ftim14_14',['USE_TIM14',['../group___t_i_m___i_n_i_t.html#ga9ae40be31d5271abe3e49f896d916d5c',1,'general_tim.h']]], - ['use_5ftim2_15',['USE_TIM2',['../group___t_i_m___i_n_i_t.html#ga72535a44955b43cbcd56e25039ab32eb',1,'general_tim.h']]], - ['use_5ftim3_16',['USE_TIM3',['../group___t_i_m___i_n_i_t.html#ga5b5685a43273b6e37242a4aba3ee0617',1,'general_tim.h']]], - ['use_5ftim4_17',['USE_TIM4',['../group___t_i_m___i_n_i_t.html#ga1493b39c9214501180b81b4c892f9be0',1,'general_tim.h']]], - ['use_5ftim5_18',['USE_TIM5',['../group___t_i_m___i_n_i_t.html#ga252f4fba93fc265110e83760e0590af3',1,'general_tim.h']]], - ['use_5ftim6_19',['USE_TIM6',['../group___t_i_m___i_n_i_t.html#ga8fe31b98160627d19038222910be3f46',1,'general_tim.h']]], - ['use_5ftim7_20',['USE_TIM7',['../group___t_i_m___i_n_i_t.html#ga7cdc54cc8cbbb6e9f60001f1e3e6ec67',1,'general_tim.h']]], - ['use_5ftim8_21',['USE_TIM8',['../group___t_i_m___i_n_i_t.html#ga28ba33d7c6bf22821dafa5bcee4854be',1,'general_tim.h']]], - ['use_5ftim9_22',['USE_TIM9',['../group___t_i_m___i_n_i_t.html#gaac627c0e98c9594cc41b1b46eb39e44a',1,'general_tim.h']]], - ['utils_20defines_23',['Utils defines',['../group___u_t_i_l_s___d_e_f_i_n_e_s.html',1,'']]] + ['uart_20my_5flibs_5fuart_0',['Модуль UART <a class="el" href="group___m_y___l_i_b_s___u_a_r_t.html">UART Tools</a>',['../index.html#uart_module',1,'']]], + ['uart_20tools_1',['UART Tools',['../group___m_y___l_i_b_s___u_a_r_t.html',1,'']]], + ['uart_5fbase_5finit_2',['UART_Base_Init',['../group___m_y___l_i_b_s___u_a_r_t.html#gab9f07396b778505c934143e89953e154',1,'UART_Base_Init(UART_SettingsTypeDef *suart): general_uart.c'],['../group___m_y___l_i_b_s___u_a_r_t.html#gab9f07396b778505c934143e89953e154',1,'UART_Base_Init(UART_SettingsTypeDef *suart): general_uart.c']]], + ['uart_5fcheck_5finit_5fstruct_3',['UART_Check_Init_Struct',['../group___m_y___l_i_b_s___u_a_r_t.html#ga2a22e46ecb9e04b2ce197a0e9c09044a',1,'UART_Check_Init_Struct(UART_SettingsTypeDef *suart): general_uart.c'],['../group___m_y___l_i_b_s___u_a_r_t.html#ga2a22e46ecb9e04b2ce197a0e9c09044a',1,'UART_Check_Init_Struct(UART_SettingsTypeDef *suart): general_uart.c']]], + ['uart_5fdma_5finit_4',['UART_DMA_Init',['../general__uart_8c.html#ad82d0cbd19151675135fd75dad315d05',1,'general_uart.c']]], + ['uart_5fgpio_5finit_5',['UART_GPIO_Init',['../general__uart_8c.html#a3abae05bbde5f3b402bf18ca13dc6a0b',1,'general_uart.c']]], + ['uart_5fmspdeinit_6',['UART_MspDeInit',['../group___m_y___l_i_b_s___u_a_r_t.html#ga93ed6ceef4e3b5e7885786125cce93bc',1,'UART_MspDeInit(UART_HandleTypeDef *huart): general_uart.c'],['../group___m_y___l_i_b_s___u_a_r_t.html#ga93ed6ceef4e3b5e7885786125cce93bc',1,'UART_MspDeInit(UART_HandleTypeDef *huart): general_uart.c']]], + ['uart_5fmspinit_7',['UART_MspInit',['../group___m_y___l_i_b_s___u_a_r_t.html#gab9313fd2f9fc6873ca6bfbc5b96edbbb',1,'UART_MspInit(UART_HandleTypeDef *huart): general_uart.c'],['../group___m_y___l_i_b_s___u_a_r_t.html#gab9313fd2f9fc6873ca6bfbc5b96edbbb',1,'UART_MspInit(UART_HandleTypeDef *huart): general_uart.c']]], + ['uart_5fsettingstypedef_8',['UART_SettingsTypeDef',['../struct_u_a_r_t___settings_type_def.html',1,'']]], + ['uint16_5fbit_9',['uint16_bit',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html#ga6a122b536ad99ae611c8cf01437af086',1,'bit_access.h']]], + ['uint16_5fbittypedef_10',['uint16_BitTypeDef',['../unionuint16___bit_type_def.html',1,'']]], + ['uint32_5fbit_11',['uint32_bit',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html#gafaa2080168b1b6f7281e8bfabab022d1',1,'bit_access.h']]], + ['uint32_5fbittypedef_12',['uint32_BitTypeDef',['../unionuint32___bit_type_def.html',1,'']]], + ['uint64_5fbit_13',['uint64_bit',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html#ga47eb69ce9330a1c73fe8031240f02f0a',1,'bit_access.h']]], + ['uint64_5fbittypedef_14',['uint64_BitTypeDef',['../unionuint64___bit_type_def.html',1,'']]], + ['uint8_5fbit_15',['uint8_bit',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html#ga57dc3bb3472a66fc92312f89d42d2396',1,'bit_access.h']]], + ['uint8_5fbittypedef_16',['uint8_BitTypeDef',['../unionuint8___bit_type_def.html',1,'']]], + ['use_5fspi1_17',['USE_SPI1',['../group___s_p_i___i_n_i_t.html#ga2fe0c8aeb2c61679f32836fef479eedf',1,'general_spi.h']]], + ['use_5fspi2_18',['USE_SPI2',['../group___s_p_i___i_n_i_t.html#ga53687cddb8e39e76a79b8ffaa152fb2b',1,'general_spi.h']]], + ['use_5fspi3_19',['USE_SPI3',['../group___s_p_i___i_n_i_t.html#ga5fdd6e5934a8005ef05b80f6d95883dc',1,'general_spi.h']]], + ['use_5ftim1_20',['USE_TIM1',['../group___t_i_m___i_n_i_t.html#ga54a98c21365e0bc45b81555d2b101f2b',1,'general_tim.h']]], + ['use_5ftim10_21',['USE_TIM10',['../group___t_i_m___i_n_i_t.html#ga98c0691052d1da2c4053dd3586ff7ce9',1,'general_tim.h']]], + ['use_5ftim11_22',['USE_TIM11',['../group___t_i_m___i_n_i_t.html#ga176c97f06ebcf14e06e5c5bdbfac44c2',1,'general_tim.h']]], + ['use_5ftim12_23',['USE_TIM12',['../group___t_i_m___i_n_i_t.html#ga4e2b0e6cdf9eed74581b575c3fd9516b',1,'general_tim.h']]], + ['use_5ftim13_24',['USE_TIM13',['../group___t_i_m___i_n_i_t.html#gaf48ef87650517652ddec039a189507ac',1,'general_tim.h']]], + ['use_5ftim14_25',['USE_TIM14',['../group___t_i_m___i_n_i_t.html#ga9ae40be31d5271abe3e49f896d916d5c',1,'general_tim.h']]], + ['use_5ftim2_26',['USE_TIM2',['../group___t_i_m___i_n_i_t.html#ga72535a44955b43cbcd56e25039ab32eb',1,'general_tim.h']]], + ['use_5ftim3_27',['USE_TIM3',['../group___t_i_m___i_n_i_t.html#ga5b5685a43273b6e37242a4aba3ee0617',1,'general_tim.h']]], + ['use_5ftim4_28',['USE_TIM4',['../group___t_i_m___i_n_i_t.html#ga1493b39c9214501180b81b4c892f9be0',1,'general_tim.h']]], + ['use_5ftim5_29',['USE_TIM5',['../group___t_i_m___i_n_i_t.html#ga252f4fba93fc265110e83760e0590af3',1,'general_tim.h']]], + ['use_5ftim6_30',['USE_TIM6',['../group___t_i_m___i_n_i_t.html#ga8fe31b98160627d19038222910be3f46',1,'general_tim.h']]], + ['use_5ftim7_31',['USE_TIM7',['../group___t_i_m___i_n_i_t.html#ga7cdc54cc8cbbb6e9f60001f1e3e6ec67',1,'general_tim.h']]], + ['use_5ftim8_32',['USE_TIM8',['../group___t_i_m___i_n_i_t.html#ga28ba33d7c6bf22821dafa5bcee4854be',1,'general_tim.h']]], + ['use_5ftim9_33',['USE_TIM9',['../group___t_i_m___i_n_i_t.html#gaac627c0e98c9594cc41b1b46eb39e44a',1,'general_tim.h']]], + ['use_5fuart4_34',['USE_UART4',['../group___u_a_r_t___i_n_i_t.html#ga779530e93e7aa1f25eb13045ec42b8e7',1,'general_uart.h']]], + ['use_5fuart5_35',['USE_UART5',['../group___u_a_r_t___i_n_i_t.html#ga592c6bf4a6496d6806ba0838cdfa2340',1,'general_uart.h']]], + ['use_5fusart1_36',['USE_USART1',['../group___u_a_r_t___i_n_i_t.html#gace54f148bb1d72f13bf397d096d38d1b',1,'general_uart.h']]], + ['use_5fusart2_37',['USE_USART2',['../group___u_a_r_t___i_n_i_t.html#gaacb3968508217a0d8b3f64aa0c8aa07d',1,'general_uart.h']]], + ['use_5fusart3_38',['USE_USART3',['../group___u_a_r_t___i_n_i_t.html#ga6dadd967b428aade24008ec060009976',1,'general_uart.h']]], + ['use_5fusart6_39',['USE_USART6',['../group___u_a_r_t___i_n_i_t.html#gafaeb8bdd4aa7fb1987505530daa90868',1,'general_uart.h']]], + ['utils_20defines_40',['Utils defines',['../group___u_t_i_l_s___d_e_f_i_n_e_s.html',1,'']]] ]; diff --git a/Doc/html/search/all_13.js b/Doc/html/search/all_13.js index 088670f..4f064c9 100644 --- a/Doc/html/search/all_13.js +++ b/Doc/html/search/all_13.js @@ -1,4 +1,4 @@ var searchData= [ - ['зависимости_0',['Зависимости',['../index.html#dependencies',1,'']]] + ['использование_0',['Использование',['../index.html#usage_basic',1,'']]] ]; diff --git a/Doc/html/search/all_14.js b/Doc/html/search/all_14.js index 4f064c9..09baad2 100644 --- a/Doc/html/search/all_14.js +++ b/Doc/html/search/all_14.js @@ -1,4 +1,7 @@ var searchData= [ - ['использование_0',['Использование',['../index.html#usage_basic',1,'']]] + ['модуль_20таймеров_20my_5flibs_5ftim_0',['Модуль таймеров <a class="el" href="group___m_y___l_i_b_s___t_i_m.html">TIM Tools</a>',['../index.html#tim_module',1,'']]], + ['модуль_20gpio_20my_5flibs_5fgpio_1',['Модуль GPIO <a class="el" href="group___m_y___l_i_b_s___g_p_i_o.html">GPIO Tools</a>',['../index.html#gpio_module',1,'']]], + ['модуль_20spi_20my_5flibs_5fspi_2',['Модуль SPI <a class="el" href="group___m_y___l_i_b_s___s_p_i.html">SPI Tools</a>',['../index.html#spi_module',1,'']]], + ['модуль_20uart_20my_5flibs_5fuart_3',['Модуль UART <a class="el" href="group___m_y___l_i_b_s___u_a_r_t.html">UART Tools</a>',['../index.html#uart_module',1,'']]] ]; diff --git a/Doc/html/search/all_15.js b/Doc/html/search/all_15.js index 728d84a..ca20af9 100644 --- a/Doc/html/search/all_15.js +++ b/Doc/html/search/all_15.js @@ -1,5 +1,6 @@ var searchData= [ - ['модуль_20таймеров_20ref_20my_5flibs_5ftim_0',['Модуль таймеров @ref MY_LIBS_TIM',['../index.html#tim_module',1,'']]], - ['модуль_20gpio_20ref_20my_5flibs_5fgpio_1',['Модуль GPIO @ref MY_LIBS_GPIO',['../index.html#gpio_module',1,'']]] + ['обзор_0',['Обзор',['../index.html#overview',1,'']]], + ['общие_20утилиты_20mylibs_5fdefines_1',['Общие утилиты (<a class="el" href="group___m_y_l_i_b_s___d_e_f_i_n_e_s.html">General Tools</a>)',['../index.html#utils_module',1,'']]], + ['основные_20возможности_2',['Основные возможности',['../index.html#features',1,'']]] ]; diff --git a/Doc/html/search/all_16.js b/Doc/html/search/all_16.js index 08f8b9f..82a23b2 100644 --- a/Doc/html/search/all_16.js +++ b/Doc/html/search/all_16.js @@ -1,6 +1,4 @@ var searchData= [ - ['обзор_0',['Обзор',['../index.html#overview',1,'']]], - ['общие_20утилиты_20ref_20mylibs_5fdefines_1',['Общие утилиты (@ref MYLIBS_DEFINES)',['../index.html#utils_module',1,'']]], - ['основные_20возможности_2',['Основные возможности',['../index.html#features',1,'']]] + ['проекта_0',['Структура проекта',['../index.html#structure',1,'']]] ]; diff --git a/Doc/html/search/all_17.js b/Doc/html/search/all_17.js index 77c91f2..dd4f424 100644 --- a/Doc/html/search/all_17.js +++ b/Doc/html/search/all_17.js @@ -1,6 +1,4 @@ var searchData= [ - ['пример_20работы_20с_20таймером_0',['Пример работы с таймером',['../index.html#tim_example',1,'']]], - ['пример_20работы_20с_20gpio_1',['Пример работы с GPIO',['../index.html#gpio_example',1,'']]], - ['проекта_2',['Структура проекта',['../index.html#structure',1,'']]] + ['структура_20проекта_0',['Структура проекта',['../index.html#structure',1,'']]] ]; diff --git a/Doc/html/search/all_18.js b/Doc/html/search/all_18.js index e75b48e..25680da 100644 --- a/Doc/html/search/all_18.js +++ b/Doc/html/search/all_18.js @@ -1,5 +1,5 @@ var searchData= [ - ['работы_20с_20таймером_0',['Пример работы с таймером',['../index.html#tim_example',1,'']]], - ['работы_20с_20gpio_1',['Пример работы с GPIO',['../index.html#gpio_example',1,'']]] + ['трассировка_20trace_0',['Трассировка <a class="el" href="group___t_r_a_c_e.html">Trace defines</a>',['../index.html#trace_module',1,'']]], + ['таймеров_20my_5flibs_5ftim_1',['Модуль таймеров <a class="el" href="group___m_y___l_i_b_s___t_i_m.html">TIM Tools</a>',['../index.html#tim_module',1,'']]] ]; diff --git a/Doc/html/search/all_19.js b/Doc/html/search/all_19.js index 77b7b10..f69cabe 100644 --- a/Doc/html/search/all_19.js +++ b/Doc/html/search/all_19.js @@ -1,6 +1,4 @@ var searchData= [ - ['структура_20проекта_0',['Структура проекта',['../index.html#structure',1,'']]], - ['с_20таймером_1',['Пример работы с таймером',['../index.html#tim_example',1,'']]], - ['с_20gpio_2',['Пример работы с GPIO',['../index.html#gpio_example',1,'']]] + ['утилиты_20mylibs_5fdefines_0',['Общие утилиты (<a class="el" href="group___m_y_l_i_b_s___d_e_f_i_n_e_s.html">General Tools</a>)',['../index.html#utils_module',1,'']]] ]; diff --git a/Doc/html/search/all_2.js b/Doc/html/search/all_2.js index 8fed4dd..0a30887 100644 --- a/Doc/html/search/all_2.js +++ b/Doc/html/search/all_2.js @@ -9,6 +9,9 @@ var searchData= ['check_5fnull_5fptr_5f4_6',['check_null_ptr_4',['../group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html#ga590973be111afc3f9ba15e6939530254',1,'mylibs_defs.h']]], ['check_5fnull_5fptr_5f5_7',['check_null_ptr_5',['../group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html#gaab0aafd7a4a21ec4f338b19269f65490',1,'mylibs_defs.h']]], ['clearstruct_8',['ClearStruct',['../group___u_t_i_l_s___d_e_f_i_n_e_s.html#gaf5e598848326d48e86167e5099a029be',1,'mylibs_defs.h']]], - ['configs_9',['Configs',['../group___m_y_l_i_b_s___c_o_n_f_i_g.html',1,'']]], - ['configs_10',['configs',['../group___e_v_o_l_v_e___c_o_n_f_i_g.html',1,'Evolve configs'],['../group___l_i_b_s___c_o_n_f_i_g.html',1,'Libraries configs'],['../group___t_r_a_c_e___c_o_n_f_i_g.html',1,'Trace configs']]] + ['clk_5fgpio_5falternagefunc_9',['CLK_GPIO_AlternageFunc',['../struct_s_p_i___settings_type_def.html#a3f3748103a0b7861f6700042fd691ba1',1,'SPI_SettingsTypeDef']]], + ['clk_5fgpiox_10',['CLK_GPIOx',['../struct_s_p_i___settings_type_def.html#a6a15d48eccf92959de3a086031fdc979',1,'SPI_SettingsTypeDef']]], + ['clk_5fpin_11',['CLK_PIN',['../struct_s_p_i___settings_type_def.html#a3bcb1ed12da3544e02e6d36493669bdc',1,'SPI_SettingsTypeDef']]], + ['configs_12',['Configs',['../group___m_y_l_i_b_s___c_o_n_f_i_g.html',1,'']]], + ['configs_13',['configs',['../group___e_v_o_l_v_e___c_o_n_f_i_g.html',1,'Evolve configs'],['../group___l_i_b_s___c_o_n_f_i_g.html',1,'Libraries configs'],['../group___t_r_a_c_e___c_o_n_f_i_g.html',1,'Trace configs']]] ]; diff --git a/Doc/html/search/all_3.js b/Doc/html/search/all_3.js index 80775d3..98ee53c 100644 --- a/Doc/html/search/all_3.js +++ b/Doc/html/search/all_3.js @@ -1,8 +1,10 @@ var searchData= [ ['data_0',['data',['../struct_r_t_t___flash_header__t.html#ae7276198385c8d6f6508f433d042d52a',1,'RTT_FlashHeader_t']]], - ['defines_1',['defines',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html',1,'Bit access defines'],['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html',1,'Delays defines'],['../group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html',1,'Error Handler defines'],['../group___t_r_a_c_e___g_p_i_o.html',1,'GPIO trace defines'],['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html',1,'Hardfault trace defines'],['../group___g_p_i_o___i_n_i_t.html',1,'Init defines'],['../group___t_i_m___i_n_i_t.html',1,'Init defines'],['../group___t_r_a_c_e___s_e_r_i_a_l.html',1,'Serial trace defines'],['../group___t_r_a_c_e.html',1,'Trace defines'],['../group___t_r_a_c_k_e_r_s.html',1,'Trackers defines'],['../group___u_t_i_l_s___d_e_f_i_n_e_s.html',1,'Utils defines']]], + ['defines_1',['defines',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html',1,'Bit access defines'],['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html',1,'Delays defines'],['../group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html',1,'Error Handler defines'],['../group___t_r_a_c_e___g_p_i_o.html',1,'GPIO trace defines'],['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html',1,'Hardfault trace defines'],['../group___g_p_i_o___i_n_i_t.html',1,'Init defines'],['../group___s_p_i___i_n_i_t.html',1,'Init defines'],['../group___t_i_m___i_n_i_t.html',1,'Init defines'],['../group___u_a_r_t___i_n_i_t.html',1,'Init defines'],['../group___t_r_a_c_e___s_e_r_i_a_l.html',1,'Serial trace defines'],['../group___t_r_a_c_e.html',1,'Trace defines'],['../group___t_r_a_c_k_e_r_s.html',1,'Trackers defines'],['../group___u_t_i_l_s___d_e_f_i_n_e_s.html',1,'Utils defines']]], ['delay_20tools_2',['Delay tools',['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html',1,'']]], ['delays_20defines_3',['Delays defines',['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html',1,'']]], - ['divide_5fup_4',['Divide_Up',['../group___u_t_i_l_s___d_e_f_i_n_e_s.html#gabf45f2b60eedf80cf9d1dbe4302a741e',1,'mylibs_defs.h']]] + ['divide_5fup_4',['Divide_Up',['../group___u_t_i_l_s___d_e_f_i_n_e_s.html#gabf45f2b60eedf80cf9d1dbe4302a741e',1,'mylibs_defs.h']]], + ['dma_5fchannel_5fx_5',['DMA_CHANNEL_X',['../struct_s_p_i___settings_type_def.html#aa0edaa145076d2383b3e0095d156d474',1,'SPI_SettingsTypeDef::DMA_CHANNEL_X'],['../struct_u_a_r_t___settings_type_def.html#a15ce92b03f7f189bfbe1ab88a5f94d19',1,'UART_SettingsTypeDef::DMA_CHANNEL_X']]], + ['dmachannel_6',['DMAChannel',['../struct_s_p_i___settings_type_def.html#a3cfd9469b0617a68bbd2a161ba06bb95',1,'SPI_SettingsTypeDef::DMAChannel'],['../struct_u_a_r_t___settings_type_def.html#a1ecc9ac6a1d2747ade56770cbab6a613',1,'UART_SettingsTypeDef::DMAChannel']]] ]; diff --git a/Doc/html/search/all_5.js b/Doc/html/search/all_5.js index dd7045f..612342f 100644 --- a/Doc/html/search/all_5.js +++ b/Doc/html/search/all_5.js @@ -1,4 +1,5 @@ var searchData= [ - ['flash_20rtt_20buffer_0',['Flash RTT Buffer',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html',1,'']]] + ['flash_20rtt_20buffer_0',['Flash RTT Buffer',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html',1,'']]], + ['freertos_5fdelay_1',['FREERTOS_DELAY',['../group___l_i_b_s___c_o_n_f_i_g.html#ga57c369737d5c0cfdb7baeecba0a4b151',1,'mylibs_config.h']]] ]; diff --git a/Doc/html/search/all_6.js b/Doc/html/search/all_6.js index ea28794..8d7f470 100644 --- a/Doc/html/search/all_6.js +++ b/Doc/html/search/all_6.js @@ -1,32 +1,38 @@ var searchData= [ - ['general_20tools_0',['General Tools',['../group___m_y_l_i_b_s___d_e_f_i_n_e_s.html',1,'']]], - ['general_20tools_1',['General tools',['../group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html',1,'General tools'],['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html',1,'General tools']]], - ['general_5fgpio_2ec_2',['general_gpio.c',['../general__gpio_8c.html',1,'']]], - ['general_5fgpio_2eh_3',['general_gpio.h',['../general__gpio_8h.html',1,'']]], - ['general_5ftim_2ec_4',['general_tim.c',['../general__tim_8c.html',1,'']]], - ['general_5ftim_2eh_5',['general_tim.h',['../general__tim_8h.html',1,'']]], - ['gpio_6',['Пример работы с GPIO',['../index.html#gpio_example',1,'']]], - ['gpio_20ref_20my_5flibs_5fgpio_7',['Модуль GPIO @ref MY_LIBS_GPIO',['../index.html#gpio_module',1,'']]], - ['gpio_20tools_8',['GPIO Tools',['../group___m_y___l_i_b_s___g_p_i_o.html',1,'']]], - ['gpio_20trace_20defines_9',['GPIO trace defines',['../group___t_r_a_c_e___g_p_i_o.html',1,'']]], - ['gpio_5fclock_5fenable_10',['GPIO_Clock_Enable',['../group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html#ga962f010f783b81fcdd27eb6b53db28e6',1,'GPIO_Clock_Enable(GPIO_TypeDef *GPIOx): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html#ga962f010f783b81fcdd27eb6b53db28e6',1,'GPIO_Clock_Enable(GPIO_TypeDef *GPIOx): general_gpio.c']]], - ['gpio_5fled_5fblink_5fstart_11',['GPIO_LED_Blink_Start',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaf22f44ecaf6a1932b47edc5a845b03a9',1,'GPIO_LED_Blink_Start(GPIO_LEDTypeDef *led, uint32_t period): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaf22f44ecaf6a1932b47edc5a845b03a9',1,'GPIO_LED_Blink_Start(GPIO_LEDTypeDef *led, uint32_t period): general_gpio.c']]], - ['gpio_5fled_5fdynamic_5fhandle_12',['GPIO_LED_Dynamic_Handle',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gad6e6189824406c4d472b6340c7f19bb2',1,'GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gad6e6189824406c4d472b6340c7f19bb2',1,'GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led): general_gpio.c']]], - ['gpio_5fled_5ffading_5fstart_13',['GPIO_LED_Fading_Start',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaa00f20021781464af3dfe74aa3e59a0a',1,'GPIO_LED_Fading_Start(GPIO_LEDTypeDef *led, uint32_t period): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaa00f20021781464af3dfe74aa3e59a0a',1,'GPIO_LED_Fading_Start(GPIO_LEDTypeDef *led, uint32_t period): general_gpio.c']]], - ['gpio_5fled_5finit_14',['GPIO_LED_Init',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gac936453c7a0841c0b17bcfdae4958084',1,'GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_On_State): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gac936453c7a0841c0b17bcfdae4958084',1,'GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_ActiveLevel): general_gpio.c']]], - ['gpio_5fled_5foff_15',['GPIO_LED_Off',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaadda2d4f021390a4e392210a5ace5357',1,'GPIO_LED_Off(GPIO_LEDTypeDef *led): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaadda2d4f021390a4e392210a5ace5357',1,'GPIO_LED_Off(GPIO_LEDTypeDef *led): general_gpio.c']]], - ['gpio_5fled_5fon_16',['GPIO_LED_On',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#ga4b9572949326b050694cd55d0a7e5f6c',1,'GPIO_LED_On(GPIO_LEDTypeDef *led): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#ga4b9572949326b050694cd55d0a7e5f6c',1,'GPIO_LED_On(GPIO_LEDTypeDef *led): general_gpio.c']]], - ['gpio_5fled_5fset_17',['GPIO_LED_Set',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gae78b570447d55a462a679a89dbaa8ea2',1,'GPIO_LED_Set(GPIO_LEDTypeDef *led, uint8_t led_state): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gae78b570447d55a462a679a89dbaa8ea2',1,'GPIO_LED_Set(GPIO_LEDTypeDef *led, uint8_t led_state): general_gpio.c']]], - ['gpio_5fledstatetypedef_18',['GPIO_LEDStateTypeDef',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaac2b90d8b8c9579b6aa5d3bbda9b1ff1',1,'general_gpio.h']]], - ['gpio_5fledtypedef_19',['GPIO_LEDTypeDef',['../struct_g_p_i_o___l_e_d_type_def.html',1,'']]], - ['gpio_5fpin_5fsw_20',['GPIO_PIN_SW',['../struct_t_i_m___encoder_type_def.html#a6973108a83d2a3ea4fc3e0e8a501af80',1,'TIM_EncoderTypeDef']]], - ['gpio_5fpin_5fti1_21',['GPIO_PIN_TI1',['../struct_t_i_m___encoder_type_def.html#a4fc05ef011205a6702cb3d006bab677e',1,'TIM_EncoderTypeDef']]], - ['gpio_5fpin_5fti2_22',['GPIO_PIN_TI2',['../struct_t_i_m___encoder_type_def.html#a67ad037b92162546763fc9c425b5e3c5',1,'TIM_EncoderTypeDef']]], - ['gpio_5fread_5fswitch_23',['GPIO_Read_Switch',['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html#ga960b24335b2026abcad126ab8c422d70',1,'GPIO_Read_Switch(GPIO_SwitchTypeDef *swstart): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html#ga960b24335b2026abcad126ab8c422d70',1,'GPIO_Read_Switch(GPIO_SwitchTypeDef *sw): general_gpio.c']]], - ['gpio_5fswitch_5finit_24',['GPIO_Switch_Init',['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html#gacafee0e68877f2b25df843356871d1f7',1,'GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html#gacafee0e68877f2b25df843356871d1f7',1,'GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_ActiveLevel): general_gpio.c']]], - ['gpio_5fswitchtypedef_25',['GPIO_SwitchTypeDef',['../struct_g_p_i_o___switch_type_def.html',1,'']]], - ['gpio_5ftim_5falternate_5fmapping_26',['GPIO_TIM_Alternate_Mapping',['../group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html#ga580b842096340b066c28b24d6b315be6',1,'general_gpio.h']]], - ['gpio_5ftrace_5fenable_27',['GPIO_TRACE_ENABLE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga4222e0e400ad81737cefcabeb03fd23b',1,'mylibs_config.h']]], - ['gpiox_28',['GPIOx',['../struct_t_i_m___encoder_type_def.html#ad29873fc8cdc71462e6d8744621120e9',1,'TIM_EncoderTypeDef']]] + ['gen_5findex_0',['gen_index',['../struct_evolve_optimizer__t.html#ad0f464d7048a9ed0753b61f76f563108',1,'EvolveOptimizer_t']]], + ['gen_5fmut_1',['gen_mut',['../struct_evolve_optimizer__t.html#a3be8c0c34db8429210ff470497a56727',1,'EvolveOptimizer_t']]], + ['general_20tools_2',['General Tools',['../group___m_y_l_i_b_s___d_e_f_i_n_e_s.html',1,'']]], + ['general_20tools_3',['General tools',['../group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html',1,'General tools'],['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html',1,'General tools']]], + ['general_5fgpio_2ec_4',['general_gpio.c',['../general__gpio_8c.html',1,'']]], + ['general_5fgpio_2eh_5',['general_gpio.h',['../general__gpio_8h.html',1,'']]], + ['general_5fspi_2ec_6',['general_spi.c',['../general__spi_8c.html',1,'']]], + ['general_5fspi_2eh_7',['general_spi.h',['../general__spi_8h.html',1,'']]], + ['general_5ftim_2ec_8',['general_tim.c',['../general__tim_8c.html',1,'']]], + ['general_5ftim_2eh_9',['general_tim.h',['../general__tim_8h.html',1,'']]], + ['general_5fuart_2ec_10',['general_uart.c',['../general__uart_8c.html',1,'']]], + ['general_5fuart_2eh_11',['general_uart.h',['../general__uart_8h.html',1,'']]], + ['gpio_20my_5flibs_5fgpio_12',['Модуль GPIO <a class="el" href="group___m_y___l_i_b_s___g_p_i_o.html">GPIO Tools</a>',['../index.html#gpio_module',1,'']]], + ['gpio_20tools_13',['GPIO Tools',['../group___m_y___l_i_b_s___g_p_i_o.html',1,'']]], + ['gpio_20trace_20defines_14',['GPIO trace defines',['../group___t_r_a_c_e___g_p_i_o.html',1,'']]], + ['gpio_5fclock_5fenable_15',['GPIO_Clock_Enable',['../group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html#ga962f010f783b81fcdd27eb6b53db28e6',1,'GPIO_Clock_Enable(GPIO_TypeDef *GPIOx): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html#ga962f010f783b81fcdd27eb6b53db28e6',1,'GPIO_Clock_Enable(GPIO_TypeDef *GPIOx): general_gpio.c']]], + ['gpio_5fled_5fblink_5fstart_16',['GPIO_LED_Blink_Start',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaf22f44ecaf6a1932b47edc5a845b03a9',1,'GPIO_LED_Blink_Start(GPIO_LEDTypeDef *led, uint32_t period): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaf22f44ecaf6a1932b47edc5a845b03a9',1,'GPIO_LED_Blink_Start(GPIO_LEDTypeDef *led, uint32_t period): general_gpio.c']]], + ['gpio_5fled_5fdynamic_5fhandle_17',['GPIO_LED_Dynamic_Handle',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gad6e6189824406c4d472b6340c7f19bb2',1,'GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gad6e6189824406c4d472b6340c7f19bb2',1,'GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led): general_gpio.c']]], + ['gpio_5fled_5ffading_5fstart_18',['GPIO_LED_Fading_Start',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaa00f20021781464af3dfe74aa3e59a0a',1,'GPIO_LED_Fading_Start(GPIO_LEDTypeDef *led, uint32_t period): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaa00f20021781464af3dfe74aa3e59a0a',1,'GPIO_LED_Fading_Start(GPIO_LEDTypeDef *led, uint32_t period): general_gpio.c']]], + ['gpio_5fled_5finit_19',['GPIO_LED_Init',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gac936453c7a0841c0b17bcfdae4958084',1,'GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_On_State): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gac936453c7a0841c0b17bcfdae4958084',1,'GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_ActiveLevel): general_gpio.c']]], + ['gpio_5fled_5foff_20',['GPIO_LED_Off',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaadda2d4f021390a4e392210a5ace5357',1,'GPIO_LED_Off(GPIO_LEDTypeDef *led): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaadda2d4f021390a4e392210a5ace5357',1,'GPIO_LED_Off(GPIO_LEDTypeDef *led): general_gpio.c']]], + ['gpio_5fled_5fon_21',['GPIO_LED_On',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#ga4b9572949326b050694cd55d0a7e5f6c',1,'GPIO_LED_On(GPIO_LEDTypeDef *led): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#ga4b9572949326b050694cd55d0a7e5f6c',1,'GPIO_LED_On(GPIO_LEDTypeDef *led): general_gpio.c']]], + ['gpio_5fled_5fset_22',['GPIO_LED_Set',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gae78b570447d55a462a679a89dbaa8ea2',1,'GPIO_LED_Set(GPIO_LEDTypeDef *led, uint8_t led_state): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gae78b570447d55a462a679a89dbaa8ea2',1,'GPIO_LED_Set(GPIO_LEDTypeDef *led, uint8_t led_state): general_gpio.c']]], + ['gpio_5fledstatetypedef_23',['GPIO_LEDStateTypeDef',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html#gaac2b90d8b8c9579b6aa5d3bbda9b1ff1',1,'general_gpio.h']]], + ['gpio_5fledtypedef_24',['GPIO_LEDTypeDef',['../struct_g_p_i_o___l_e_d_type_def.html',1,'']]], + ['gpio_5fpin_5frx_25',['GPIO_PIN_RX',['../struct_u_a_r_t___settings_type_def.html#a3fba2b52788fe453348b5d92ed52ba49',1,'UART_SettingsTypeDef']]], + ['gpio_5fpin_5fsw_26',['GPIO_PIN_SW',['../struct_t_i_m___encoder_type_def.html#a6973108a83d2a3ea4fc3e0e8a501af80',1,'TIM_EncoderTypeDef']]], + ['gpio_5fpin_5fti1_27',['GPIO_PIN_TI1',['../struct_t_i_m___encoder_type_def.html#a4fc05ef011205a6702cb3d006bab677e',1,'TIM_EncoderTypeDef']]], + ['gpio_5fpin_5fti2_28',['GPIO_PIN_TI2',['../struct_t_i_m___encoder_type_def.html#a67ad037b92162546763fc9c425b5e3c5',1,'TIM_EncoderTypeDef']]], + ['gpio_5fpin_5ftx_29',['GPIO_PIN_TX',['../struct_u_a_r_t___settings_type_def.html#a5f1babfcfb436cd77f5614253c0a5bef',1,'UART_SettingsTypeDef']]], + ['gpio_5fread_5fswitch_30',['GPIO_Read_Switch',['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html#ga960b24335b2026abcad126ab8c422d70',1,'GPIO_Read_Switch(GPIO_SwitchTypeDef *swstart): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html#ga960b24335b2026abcad126ab8c422d70',1,'GPIO_Read_Switch(GPIO_SwitchTypeDef *sw): general_gpio.c']]], + ['gpio_5fswitch_5finit_31',['GPIO_Switch_Init',['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html#gacafee0e68877f2b25df843356871d1f7',1,'GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State): general_gpio.c'],['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html#gacafee0e68877f2b25df843356871d1f7',1,'GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_ActiveLevel): general_gpio.c']]], + ['gpio_5fswitchtypedef_32',['GPIO_SwitchTypeDef',['../struct_g_p_i_o___switch_type_def.html',1,'']]], + ['gpio_5ftrace_5fenable_33',['GPIO_TRACE_ENABLE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga4222e0e400ad81737cefcabeb03fd23b',1,'mylibs_config.h']]], + ['gpiox_34',['GPIOx',['../struct_t_i_m___encoder_type_def.html#ad29873fc8cdc71462e6d8744621120e9',1,'TIM_EncoderTypeDef::GPIOx'],['../struct_u_a_r_t___settings_type_def.html#af6f9910d065bae715cdb4a1024143a8f',1,'UART_SettingsTypeDef::GPIOx']]] ]; diff --git a/Doc/html/search/all_7.js b/Doc/html/search/all_7.js index a3dfba5..abe2462 100644 --- a/Doc/html/search/all_7.js +++ b/Doc/html/search/all_7.js @@ -1,15 +1,19 @@ var searchData= [ - ['handler_20defines_0',['Error Handler defines',['../group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html',1,'']]], - ['hardfault_20trace_20defines_1',['Hardfault trace defines',['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html',1,'']]], - ['hardfault_5fserial_5ftrace_2',['HARDFAULT_SERIAL_TRACE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga47f454f804b4dbc26cae079e8d8641e6',1,'mylibs_config.h']]], - ['hf_5fcheckrecovered_3',['HF_CheckRecovered',['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html#ga03f8b6f3b537ee1c8e91065c60db504f',1,'trace.h']]], - ['hf_5fflash_5faddr_4',['HF_FLASH_ADDR',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga0c602733a4a359bf8c095d71cd4d0f63',1,'mylibs_config.h']]], - ['hf_5fhandlefault_5',['HF_HandleFault',['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html#gadd8e10e7ec3b0204f7f92062ecd452f7',1,'trace.h']]], - ['hf_5fram_5fend_6',['HF_RAM_END',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga92d0d14732edb7dfa21d483304bdb051',1,'mylibs_config.h']]], - ['hf_5frtt_5ftag_5fbase_7',['HF_RTT_TAG_BASE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gadc960255719c7eff4bdfaa850be9b313',1,'mylibs_config.h']]], - ['hf_5frtt_5ftail_5fsize_8',['HF_RTT_TAIL_SIZE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gafcc7ea03d4df8f1909e580b519a7f3ca',1,'mylibs_config.h']]], - ['hf_5fstack_5fdump_5fwords_9',['HF_STACK_DUMP_WORDS',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gaa31234688b333a505aaa57b8ecdedf5b',1,'mylibs_config.h']]], - ['hf_5fstackframe_5ft_10',['HF_StackFrame_t',['../struct_h_f___stack_frame__t.html',1,'']]], - ['htim_11',['htim',['../struct_t_i_m___settings_type_def.html#ada49efdbd35a8e442c3cff630d42f34c',1,'TIM_SettingsTypeDef::htim'],['../struct_t_i_m___encoder_type_def.html#adc80bd5a90444c31d84157f35c59b95c',1,'TIM_EncoderTypeDef::htim']]] + ['hal_5fspi_5fmodule_5fenabled_0',['HAL_SPI_MODULE_ENABLED',['../group___s_p_i___i_n_i_t.html#ga8ad4712bf4add56892d057778e826e0c',1,'general_spi.h']]], + ['hal_5fuart_5fmodule_5fenabled_1',['HAL_UART_MODULE_ENABLED',['../group___u_a_r_t___i_n_i_t.html#ga167269406e73327b95c3bb7b9cfe6d89',1,'general_uart.h']]], + ['handler_20defines_2',['Error Handler defines',['../group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html',1,'']]], + ['hardfault_20trace_20defines_3',['Hardfault trace defines',['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html',1,'']]], + ['hardfault_5fserial_5ftrace_4',['HARDFAULT_SERIAL_TRACE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga47f454f804b4dbc26cae079e8d8641e6',1,'mylibs_config.h']]], + ['hf_5fcheckrecovered_5',['HF_CheckRecovered',['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html#ga03f8b6f3b537ee1c8e91065c60db504f',1,'trace.h']]], + ['hf_5fflash_5faddr_6',['HF_FLASH_ADDR',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga0c602733a4a359bf8c095d71cd4d0f63',1,'mylibs_config.h']]], + ['hf_5fhandlefault_7',['HF_HandleFault',['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html#gadd8e10e7ec3b0204f7f92062ecd452f7',1,'trace.h']]], + ['hf_5fram_5fend_8',['HF_RAM_END',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga92d0d14732edb7dfa21d483304bdb051',1,'mylibs_config.h']]], + ['hf_5frtt_5ftag_5fbase_9',['HF_RTT_TAG_BASE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gadc960255719c7eff4bdfaa850be9b313',1,'mylibs_config.h']]], + ['hf_5frtt_5ftail_5fsize_10',['HF_RTT_TAIL_SIZE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gafcc7ea03d4df8f1909e580b519a7f3ca',1,'mylibs_config.h']]], + ['hf_5fstack_5fdump_5fwords_11',['HF_STACK_DUMP_WORDS',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gaa31234688b333a505aaa57b8ecdedf5b',1,'mylibs_config.h']]], + ['hf_5fstackframe_5ft_12',['HF_StackFrame_t',['../struct_h_f___stack_frame__t.html',1,'']]], + ['hspi_13',['hspi',['../struct_s_p_i___settings_type_def.html#ad203d8b8d67e4f477d002d15b03ba422',1,'SPI_SettingsTypeDef']]], + ['htim_14',['htim',['../struct_t_i_m___settings_type_def.html#ada49efdbd35a8e442c3cff630d42f34c',1,'TIM_SettingsTypeDef::htim'],['../struct_t_i_m___encoder_type_def.html#adc80bd5a90444c31d84157f35c59b95c',1,'TIM_EncoderTypeDef::htim']]], + ['huart_15',['huart',['../struct_u_a_r_t___settings_type_def.html#accf2c9448a3ea8eb3b8c25a569276fea',1,'UART_SettingsTypeDef']]] ]; diff --git a/Doc/html/search/all_8.js b/Doc/html/search/all_8.js index 037d453..01381de 100644 --- a/Doc/html/search/all_8.js +++ b/Doc/html/search/all_8.js @@ -6,5 +6,5 @@ var searchData= ['include_5fgeneral_5fperiph_5flibs_3',['INCLUDE_GENERAL_PERIPH_LIBS',['../group___l_i_b_s___c_o_n_f_i_g.html#ga181a46326e46b60afb160190832c7281',1,'mylibs_config.h']]], ['include_5ftrace_5flib_4',['INCLUDE_TRACE_LIB',['../group___l_i_b_s___c_o_n_f_i_g.html#ga0a3ca94b616997069dd53e2c6c2687d7',1,'mylibs_config.h']]], ['include_5ftrackers_5flib_5',['INCLUDE_TRACKERS_LIB',['../group___l_i_b_s___c_o_n_f_i_g.html#ga4403055986b70bb02b8d37073a122e32',1,'mylibs_config.h']]], - ['init_20defines_6',['Init defines',['../group___g_p_i_o___i_n_i_t.html',1,'Init defines'],['../group___t_i_m___i_n_i_t.html',1,'Init defines']]] + ['init_20defines_6',['Init defines',['../group___g_p_i_o___i_n_i_t.html',1,'Init defines'],['../group___s_p_i___i_n_i_t.html',1,'Init defines'],['../group___t_i_m___i_n_i_t.html',1,'Init defines'],['../group___u_a_r_t___i_n_i_t.html',1,'Init defines']]] ]; diff --git a/Doc/html/search/all_9.js b/Doc/html/search/all_9.js index 89afd0d..498b83d 100644 --- a/Doc/html/search/all_9.js +++ b/Doc/html/search/all_9.js @@ -14,7 +14,7 @@ var searchData= ['led_5fpwm_5fticks_11',['LED_PWM_TICKS',['../group___g_p_i_o___i_n_i_t.html#ga1d42e219765ec526d99e306638ac0023',1,'general_gpio.h']]], ['libraries_20configs_12',['Libraries configs',['../group___l_i_b_s___c_o_n_f_i_g.html',1,'']]], ['libs_13',['My Libs',['../group___m_y_l_i_b_s___a_l_l.html',1,'']]], - ['local_5ftime_14',['local_time',['../group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.html#ga9c853b02c22f26023c34d1d404b6d653',1,'evolve_optimizer.h']]], + ['local_5ftime_14',['local_time',['../group___l_i_b_s___c_o_n_f_i_g.html#ga9c853b02c22f26023c34d1d404b6d653',1,'mylibs_config.h']]], ['log_5flevel_15',['LOG_LEVEL',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga0b87e0d3bf5853bcbb0b66a7c48fdc05',1,'mylibs_config.h']]], ['log_5fprintf_16',['log_printf',['../group___t_r_a_c_e___s_e_r_i_a_l.html#ga730fb7b8d0bbb348dca73c15bd0e0b26',1,'trace.h']]], ['loss_17',['loss',['../struct_evolve_optimizer__t.html#a93f628397c2f8d4027f2906752b650df',1,'EvolveOptimizer_t']]], diff --git a/Doc/html/search/all_a.js b/Doc/html/search/all_a.js index fedafe7..45e0ffa 100644 --- a/Doc/html/search/all_a.js +++ b/Doc/html/search/all_a.js @@ -1,18 +1,26 @@ var searchData= [ - ['msdelay_0',['msDelay',['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html#gabeb97579daeb622c6651ed03c4a27479',1,'mylibs_defs.h']]], - ['msdelaystart_1',['msDelayStart',['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html#ga8a5051b1292d1019fe8dd3fc5521ab25',1,'mylibs_defs.h']]], - ['msdelaywaitdone_2',['msDelayWaitDone',['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html#gaed082c07b9fc4d1894330d885b9b5518',1,'mylibs_defs.h']]], - ['msdelaywhileactive_3',['msDelayWhileActive',['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html#ga0b97e172659a59ee4fa56f851643ae85',1,'mylibs_defs.h']]], - ['mutation_5famp_4',['mutation_amp',['../struct_evolve_optimizer__t.html#af779c7aeba0053e36cee7aade160f1c8',1,'EvolveOptimizer_t']]], - ['my_20libs_5',['My Libs',['../group___m_y_l_i_b_s___a_l_l.html',1,'']]], - ['my_5flibs_5fgpio_6',['Модуль GPIO @ref MY_LIBS_GPIO',['../index.html#gpio_module',1,'']]], - ['my_5flibs_5ftim_7',['Модуль таймеров @ref MY_LIBS_TIM',['../index.html#tim_module',1,'']]], - ['my_5fprintf_8',['my_printf',['../group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa',1,'trace.h']]], - ['mylibs_9',['MyLibs',['../index.html',1,'']]], - ['mylibs_5fconfig_2eh_10',['mylibs_config.h',['../mylibs__config_8h.html',1,'']]], - ['mylibs_5fdefines_11',['Общие утилиты (@ref MYLIBS_DEFINES)',['../index.html#utils_module',1,'']]], - ['mylibs_5fdefs_2eh_12',['mylibs_defs.h',['../mylibs__defs_8h.html',1,'']]], - ['mylibs_5ferror_5fhandler_13',['MyLibs_Error_Handler',['../group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html#gae110df81afd885a390bbeb152d7b709f',1,'mylibs_defs.h']]], - ['mylibs_5finclude_2eh_14',['mylibs_include.h',['../mylibs__include_8h.html',1,'']]] + ['miso_5fgpio_5falternagefunc_0',['MISO_GPIO_AlternageFunc',['../struct_s_p_i___settings_type_def.html#aecd7a5c6e205335b8ed229d74cd35d14',1,'SPI_SettingsTypeDef']]], + ['miso_5fgpiox_1',['MISO_GPIOx',['../struct_s_p_i___settings_type_def.html#a0d55a2941854f61934487f3d209cfa95',1,'SPI_SettingsTypeDef']]], + ['miso_5fpin_2',['MISO_PIN',['../struct_s_p_i___settings_type_def.html#a3366c654d7ec6dd41c6a0b504dc8509a',1,'SPI_SettingsTypeDef']]], + ['mosi_5fgpio_5falternagefunc_3',['MOSI_GPIO_AlternageFunc',['../struct_s_p_i___settings_type_def.html#afbe75a1c36650a4a9b41fa706a4c7eab',1,'SPI_SettingsTypeDef']]], + ['mosi_5fgpiox_4',['MOSI_GPIOx',['../struct_s_p_i___settings_type_def.html#a0af3bdb273818ff97eb4ff3cff918820',1,'SPI_SettingsTypeDef']]], + ['mosi_5fpin_5',['MOSI_PIN',['../struct_s_p_i___settings_type_def.html#a961208869faf4a7369aaf4edde75f176',1,'SPI_SettingsTypeDef']]], + ['msdelay_6',['msDelay',['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html#gabeb97579daeb622c6651ed03c4a27479',1,'mylibs_defs.h']]], + ['msdelaystart_7',['msDelayStart',['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html#ga8a5051b1292d1019fe8dd3fc5521ab25',1,'mylibs_defs.h']]], + ['msdelaywaitdone_8',['msDelayWaitDone',['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html#gaed082c07b9fc4d1894330d885b9b5518',1,'mylibs_defs.h']]], + ['msdelaywhileactive_9',['msDelayWhileActive',['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html#ga0b97e172659a59ee4fa56f851643ae85',1,'mylibs_defs.h']]], + ['mutation_5famp_10',['mutation_amp',['../struct_evolve_optimizer__t.html#af779c7aeba0053e36cee7aade160f1c8',1,'EvolveOptimizer_t']]], + ['my_20libs_11',['My Libs',['../group___m_y_l_i_b_s___a_l_l.html',1,'']]], + ['my_5flibs_5fgpio_12',['Модуль GPIO <a class="el" href="group___m_y___l_i_b_s___g_p_i_o.html">GPIO Tools</a>',['../index.html#gpio_module',1,'']]], + ['my_5flibs_5fspi_13',['Модуль SPI <a class="el" href="group___m_y___l_i_b_s___s_p_i.html">SPI Tools</a>',['../index.html#spi_module',1,'']]], + ['my_5flibs_5ftim_14',['Модуль таймеров <a class="el" href="group___m_y___l_i_b_s___t_i_m.html">TIM Tools</a>',['../index.html#tim_module',1,'']]], + ['my_5flibs_5fuart_15',['Модуль UART <a class="el" href="group___m_y___l_i_b_s___u_a_r_t.html">UART Tools</a>',['../index.html#uart_module',1,'']]], + ['my_5fprintf_16',['my_printf',['../group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa',1,'trace.h']]], + ['mylibs_17',['MyLibs',['../index.html',1,'']]], + ['mylibs_5fconfig_2eh_18',['mylibs_config.h',['../mylibs__config_8h.html',1,'']]], + ['mylibs_5fdefines_19',['Общие утилиты (<a class="el" href="group___m_y_l_i_b_s___d_e_f_i_n_e_s.html">General Tools</a>)',['../index.html#utils_module',1,'']]], + ['mylibs_5fdefs_2eh_20',['mylibs_defs.h',['../mylibs__defs_8h.html',1,'']]], + ['mylibs_5ferror_5fhandler_21',['MyLibs_Error_Handler',['../group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html#gae110df81afd885a390bbeb152d7b709f',1,'mylibs_defs.h']]], + ['mylibs_5finclude_2eh_22',['mylibs_include.h',['../mylibs__include_8h.html',1,'']]] ]; diff --git a/Doc/html/search/all_e.js b/Doc/html/search/all_e.js index 40ec221..95ce717 100644 --- a/Doc/html/search/all_e.js +++ b/Doc/html/search/all_e.js @@ -5,19 +5,15 @@ var searchData= ['r12_2',['r12',['../struct_h_f___stack_frame__t.html#a819ee3bc518c460ece1b7c4079f8f80b',1,'HF_StackFrame_t']]], ['r2_3',['r2',['../struct_h_f___stack_frame__t.html#a5a52e5006dabcf68c0fa4cfb0e03335b',1,'HF_StackFrame_t']]], ['r3_4',['r3',['../struct_h_f___stack_frame__t.html#a453c7af42b6928a693af422e17c981d3',1,'HF_StackFrame_t']]], - ['ref_20my_5flibs_5fgpio_5',['Модуль GPIO @ref MY_LIBS_GPIO',['../index.html#gpio_module',1,'']]], - ['ref_20my_5flibs_5ftim_6',['Модуль таймеров @ref MY_LIBS_TIM',['../index.html#tim_module',1,'']]], - ['ref_20mylibs_5fdefines_7',['Общие утилиты (@ref MYLIBS_DEFINES)',['../index.html#utils_module',1,'']]], - ['ref_20trace_8',['Трассировка @ref TRACE',['../index.html#trace_module',1,'']]], - ['rtt_20buffer_9',['Flash RTT Buffer',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html',1,'']]], - ['rtt_5feraseflash_10',['RTT_EraseFlash',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga8d8c6850e32b42871faefce3352012d1',1,'trace.h']]], - ['rtt_5fflash_5fbuffer_5fsize_11',['RTT_FLASH_BUFFER_SIZE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga501312b24e322de4dd6755ad442f0ba3',1,'mylibs_config.h']]], - ['rtt_5fflash_5fsector_12',['RTT_FLASH_SECTOR',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga3bc1b76864e1d32cbdd174d4caae7724',1,'mylibs_config.h']]], - ['rtt_5fflash_5fsector_5fend_13',['RTT_FLASH_SECTOR_END',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gafeca0be3688dea07ff443f894668003d',1,'mylibs_config.h']]], - ['rtt_5fflash_5fsector_5fstart_14',['RTT_FLASH_SECTOR_START',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga8e56f75d3ab8a89ddde1404ae23c3297',1,'mylibs_config.h']]], - ['rtt_5fflashheader_5ft_15',['RTT_FlashHeader_t',['../struct_r_t_t___flash_header__t.html',1,'']]], - ['rtt_5fflashprepare_16',['RTT_FlashPrepare',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga21353cb4f5af666237739e62ce019cd6',1,'trace.h']]], - ['rtt_5freadfromflash_17',['RTT_ReadFromFlash',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga734b2ebbf0c77699b739013878cfd146',1,'trace.h']]], - ['rtt_5fsavetoflash_18',['RTT_SaveToFlash',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga79f222c8ab644de4d47f07528d1edd63',1,'trace.h']]], - ['rtt_5ftrace_5fenable_19',['RTT_TRACE_ENABLE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga00ff2175bdc1fb11c8ec970ea3010dd8',1,'mylibs_config.h']]] + ['rtt_20buffer_5',['Flash RTT Buffer',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html',1,'']]], + ['rtt_5feraseflash_6',['RTT_EraseFlash',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga8d8c6850e32b42871faefce3352012d1',1,'trace.h']]], + ['rtt_5fflash_5fbuffer_5fsize_7',['RTT_FLASH_BUFFER_SIZE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga501312b24e322de4dd6755ad442f0ba3',1,'mylibs_config.h']]], + ['rtt_5fflash_5fsector_8',['RTT_FLASH_SECTOR',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga3bc1b76864e1d32cbdd174d4caae7724',1,'mylibs_config.h']]], + ['rtt_5fflash_5fsector_5fend_9',['RTT_FLASH_SECTOR_END',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gafeca0be3688dea07ff443f894668003d',1,'mylibs_config.h']]], + ['rtt_5fflash_5fsector_5fstart_10',['RTT_FLASH_SECTOR_START',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga8e56f75d3ab8a89ddde1404ae23c3297',1,'mylibs_config.h']]], + ['rtt_5fflashheader_5ft_11',['RTT_FlashHeader_t',['../struct_r_t_t___flash_header__t.html',1,'']]], + ['rtt_5fflashprepare_12',['RTT_FlashPrepare',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga21353cb4f5af666237739e62ce019cd6',1,'trace.h']]], + ['rtt_5freadfromflash_13',['RTT_ReadFromFlash',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga734b2ebbf0c77699b739013878cfd146',1,'trace.h']]], + ['rtt_5fsavetoflash_14',['RTT_SaveToFlash',['../group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga79f222c8ab644de4d47f07528d1edd63',1,'trace.h']]], + ['rtt_5ftrace_5fenable_15',['RTT_TRACE_ENABLE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#ga00ff2175bdc1fb11c8ec970ea3010dd8',1,'mylibs_config.h']]] ]; diff --git a/Doc/html/search/all_f.js b/Doc/html/search/all_f.js index 6527aed..103d4c4 100644 --- a/Doc/html/search/all_f.js +++ b/Doc/html/search/all_f.js @@ -8,23 +8,30 @@ var searchData= ['size_5',['size',['../struct_r_t_t___flash_header__t.html#afd1a5c51af6f97d170c2ccbbe3e34699',1,'RTT_FlashHeader_t']]], ['smasterconfig_6',['sMasterConfig',['../struct_t_i_m___settings_type_def.html#a2d9d277dd395424b964445ec1bc65b21',1,'TIM_SettingsTypeDef']]], ['sorted_5fidx_7',['sorted_idx',['../struct_evolve_optimizer__t.html#a74b81df1c298c99162310f3f7d91735a',1,'EvolveOptimizer_t']]], - ['spi_5fsettingstypedef_8',['SPI_SettingsTypeDef',['../struct_s_p_i___settings_type_def.html',1,'']]], - ['sslaveconfig_9',['sSlaveConfig',['../struct_t_i_m___settings_type_def.html#a9694cf0910a69d48ff94f8aeac106969',1,'TIM_SettingsTypeDef']]], - ['stability_10',['stability',['../struct_evolve_optimizer__t.html#a80eb0b8525b6bb838484f5922b9d8f7c',1,'EvolveOptimizer_t']]], - ['state_11',['state',['../struct_g_p_i_o___l_e_d_type_def.html#ad28d93023a00e3c5669bd3deda122435',1,'GPIO_LEDTypeDef']]], - ['stickbaseprescaler_12',['sTickBasePrescaler',['../struct_t_i_m___settings_type_def.html#a11151fe125960cb8e61328ffd06b7718',1,'TIM_SettingsTypeDef']]], - ['stickbaseus_13',['sTickBaseUS',['../struct_t_i_m___settings_type_def.html#a58da1b4c0f6d12d7d9fb2f170b9b9e6e',1,'TIM_SettingsTypeDef']]], - ['stimahbfreqmhz_14',['sTimAHBFreqMHz',['../struct_t_i_m___settings_type_def.html#a7073358fd3a722687eb85238ab570014',1,'TIM_SettingsTypeDef']]], - ['stimfreqhz_15',['sTimFreqHz',['../struct_t_i_m___settings_type_def.html#af6057ff3f60f5e01b41d4a347b79a5e4',1,'TIM_SettingsTypeDef']]], - ['stimmode_16',['sTimMode',['../struct_t_i_m___settings_type_def.html#ab90e370c3edda88e76583293c250d2b0',1,'TIM_SettingsTypeDef']]], - ['sw_17',['Sw',['../struct_t_i_m___encoder_type_def.html#a99295760ff8b27d1e6f1710f29383a45',1,'TIM_EncoderTypeDef']]], - ['sw_5factivelvl_18',['Sw_ActiveLvl',['../struct_g_p_i_o___switch_type_def.html#a4fadf5ead3ebccad521a52c064eeb405',1,'GPIO_SwitchTypeDef']]], - ['sw_5ffilterdelay_19',['Sw_FilterDelay',['../struct_g_p_i_o___switch_type_def.html#a2600e599a961af2e280c721894df4c06',1,'GPIO_SwitchTypeDef']]], - ['sw_5foff_20',['SW_OFF',['../group___g_p_i_o___i_n_i_t.html#gacd8900c9ec0efde1da3253b718574067',1,'general_gpio.h']]], - ['sw_5fon_21',['SW_ON',['../group___g_p_i_o___i_n_i_t.html#ga19d9e3aced311179a2914e0c9b13d0f9',1,'general_gpio.h']]], - ['sw_5fpin_22',['Sw_Pin',['../struct_g_p_i_o___switch_type_def.html#a63d58d9cba49a5823175585ef2996032',1,'GPIO_SwitchTypeDef']]], - ['sw_5fport_23',['Sw_Port',['../struct_g_p_i_o___switch_type_def.html#afb369df75a6065fd89ac4ba97d98ab1a',1,'GPIO_SwitchTypeDef']]], - ['sw_5fprevstate_24',['Sw_PrevState',['../struct_g_p_i_o___switch_type_def.html#a245f1dc811279ce5d4598582db979a89',1,'GPIO_SwitchTypeDef']]], - ['switch_20tools_25',['Switch tools',['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html',1,'']]], - ['swo_5ftrace_5fenable_26',['SWO_TRACE_ENABLE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gab8db9704b5d11858aa879689b9d36336',1,'mylibs_config.h']]] + ['spi_20my_5flibs_5fspi_8',['Модуль SPI <a class="el" href="group___m_y___l_i_b_s___s_p_i.html">SPI Tools</a>',['../index.html#spi_module',1,'']]], + ['spi_20tools_9',['SPI Tools',['../group___m_y___l_i_b_s___s_p_i.html',1,'']]], + ['spi_5fbase_5finit_10',['SPI_Base_Init',['../group___m_y___l_i_b_s___s_p_i.html#ga0e177e3c57a8fcdc73b5602e72ec66ba',1,'SPI_Base_Init(SPI_SettingsTypeDef *sspi): general_spi.c'],['../group___m_y___l_i_b_s___s_p_i.html#ga0e177e3c57a8fcdc73b5602e72ec66ba',1,'SPI_Base_Init(SPI_SettingsTypeDef *sspi): general_spi.c']]], + ['spi_5fcheck_5finit_5fstruct_11',['SPI_Check_Init_Struct',['../group___m_y___l_i_b_s___s_p_i.html#ga333dd251bc878931086d48aa932b1a5f',1,'SPI_Check_Init_Struct(SPI_SettingsTypeDef *sspi): general_spi.c'],['../group___m_y___l_i_b_s___s_p_i.html#ga333dd251bc878931086d48aa932b1a5f',1,'SPI_Check_Init_Struct(SPI_SettingsTypeDef *sspi): general_spi.c']]], + ['spi_5fgpio_5finit_12',['SPI_GPIO_Init',['../general__spi_8c.html#ae80d21e5cab86571709a2619442733b5',1,'general_spi.c']]], + ['spi_5fmspdeinit_13',['SPI_MspDeInit',['../group___m_y___l_i_b_s___s_p_i.html#gac279cc3eaa35541edfe330a1844a85e4',1,'SPI_MspDeInit(SPI_HandleTypeDef *hspi): general_spi.c'],['../group___m_y___l_i_b_s___s_p_i.html#gac279cc3eaa35541edfe330a1844a85e4',1,'SPI_MspDeInit(SPI_HandleTypeDef *hspi): general_spi.c']]], + ['spi_5fmspinit_14',['SPI_MspInit',['../group___m_y___l_i_b_s___s_p_i.html#gab9f13318daf02bc5b5f302ae392dccac',1,'SPI_MspInit(SPI_HandleTypeDef *hspi): general_spi.c'],['../group___m_y___l_i_b_s___s_p_i.html#gab9f13318daf02bc5b5f302ae392dccac',1,'SPI_MspInit(SPI_HandleTypeDef *hspi): general_spi.c']]], + ['spi_5fsettingstypedef_15',['SPI_SettingsTypeDef',['../struct_s_p_i___settings_type_def.html',1,'']]], + ['sslaveconfig_16',['sSlaveConfig',['../struct_t_i_m___settings_type_def.html#a9694cf0910a69d48ff94f8aeac106969',1,'TIM_SettingsTypeDef']]], + ['stability_17',['stability',['../struct_evolve_optimizer__t.html#a80eb0b8525b6bb838484f5922b9d8f7c',1,'EvolveOptimizer_t']]], + ['state_18',['state',['../struct_g_p_i_o___l_e_d_type_def.html#ad28d93023a00e3c5669bd3deda122435',1,'GPIO_LEDTypeDef']]], + ['stickbaseprescaler_19',['sTickBasePrescaler',['../struct_t_i_m___settings_type_def.html#a11151fe125960cb8e61328ffd06b7718',1,'TIM_SettingsTypeDef']]], + ['stickbaseus_20',['sTickBaseUS',['../struct_t_i_m___settings_type_def.html#a58da1b4c0f6d12d7d9fb2f170b9b9e6e',1,'TIM_SettingsTypeDef']]], + ['stimahbfreqmhz_21',['sTimAHBFreqMHz',['../struct_t_i_m___settings_type_def.html#a7073358fd3a722687eb85238ab570014',1,'TIM_SettingsTypeDef']]], + ['stimfreqhz_22',['sTimFreqHz',['../struct_t_i_m___settings_type_def.html#af6057ff3f60f5e01b41d4a347b79a5e4',1,'TIM_SettingsTypeDef']]], + ['stimmode_23',['sTimMode',['../struct_t_i_m___settings_type_def.html#ab90e370c3edda88e76583293c250d2b0',1,'TIM_SettingsTypeDef']]], + ['sw_24',['Sw',['../struct_t_i_m___encoder_type_def.html#a99295760ff8b27d1e6f1710f29383a45',1,'TIM_EncoderTypeDef']]], + ['sw_5factivelvl_25',['Sw_ActiveLvl',['../struct_g_p_i_o___switch_type_def.html#a4fadf5ead3ebccad521a52c064eeb405',1,'GPIO_SwitchTypeDef']]], + ['sw_5ffilterdelay_26',['Sw_FilterDelay',['../struct_g_p_i_o___switch_type_def.html#a2600e599a961af2e280c721894df4c06',1,'GPIO_SwitchTypeDef']]], + ['sw_5foff_27',['SW_OFF',['../group___g_p_i_o___i_n_i_t.html#gacd8900c9ec0efde1da3253b718574067',1,'general_gpio.h']]], + ['sw_5fon_28',['SW_ON',['../group___g_p_i_o___i_n_i_t.html#ga19d9e3aced311179a2914e0c9b13d0f9',1,'general_gpio.h']]], + ['sw_5fpin_29',['Sw_Pin',['../struct_g_p_i_o___switch_type_def.html#a63d58d9cba49a5823175585ef2996032',1,'GPIO_SwitchTypeDef']]], + ['sw_5fport_30',['Sw_Port',['../struct_g_p_i_o___switch_type_def.html#afb369df75a6065fd89ac4ba97d98ab1a',1,'GPIO_SwitchTypeDef']]], + ['sw_5fprevstate_31',['Sw_PrevState',['../struct_g_p_i_o___switch_type_def.html#a245f1dc811279ce5d4598582db979a89',1,'GPIO_SwitchTypeDef']]], + ['switch_20tools_32',['Switch tools',['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html',1,'']]], + ['swo_5ftrace_5fenable_33',['SWO_TRACE_ENABLE',['../group___t_r_a_c_e___c_o_n_f_i_g.html#gab8db9704b5d11858aa879689b9d36336',1,'mylibs_config.h']]] ]; diff --git a/Doc/html/search/files_2.js b/Doc/html/search/files_2.js index 30872e3..045601b 100644 --- a/Doc/html/search/files_2.js +++ b/Doc/html/search/files_2.js @@ -2,6 +2,10 @@ var searchData= [ ['general_5fgpio_2ec_0',['general_gpio.c',['../general__gpio_8c.html',1,'']]], ['general_5fgpio_2eh_1',['general_gpio.h',['../general__gpio_8h.html',1,'']]], - ['general_5ftim_2ec_2',['general_tim.c',['../general__tim_8c.html',1,'']]], - ['general_5ftim_2eh_3',['general_tim.h',['../general__tim_8h.html',1,'']]] + ['general_5fspi_2ec_2',['general_spi.c',['../general__spi_8c.html',1,'']]], + ['general_5fspi_2eh_3',['general_spi.h',['../general__spi_8h.html',1,'']]], + ['general_5ftim_2ec_4',['general_tim.c',['../general__tim_8c.html',1,'']]], + ['general_5ftim_2eh_5',['general_tim.h',['../general__tim_8h.html',1,'']]], + ['general_5fuart_2ec_6',['general_uart.c',['../general__uart_8c.html',1,'']]], + ['general_5fuart_2eh_7',['general_uart.h',['../general__uart_8h.html',1,'']]] ]; diff --git a/Doc/html/search/functions_4.js b/Doc/html/search/functions_4.js index d14df27..63ad634 100644 --- a/Doc/html/search/functions_4.js +++ b/Doc/html/search/functions_4.js @@ -1,14 +1,8 @@ var searchData= [ - ['tim_5fbase_5finit_0',['TIM_Base_Init',['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga7044214f24a9868ba7e1650b55e639ec',1,'TIM_Base_Init(TIM_SettingsTypeDef *stim): general_tim.c'],['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga7044214f24a9868ba7e1650b55e639ec',1,'TIM_Base_Init(TIM_SettingsTypeDef *stim): general_tim.c']]], - ['tim_5fbase_5fmspdeinit_1',['TIM_Base_MspDeInit',['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga879e3f1c919c02990736730275367115',1,'TIM_Base_MspDeInit(TIM_HandleTypeDef *htim): general_tim.c'],['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#ga879e3f1c919c02990736730275367115',1,'TIM_Base_MspDeInit(TIM_HandleTypeDef *htim): general_tim.c']]], - ['tim_5fbase_5fmspinit_2',['TIM_Base_MspInit',['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#gaad47337be7ba2f6c0777c40d7278c931',1,'TIM_Base_MspInit(TIM_HandleTypeDef *htim, TIM_ITModeTypeDef it_mode): general_tim.c'],['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html#gaad47337be7ba2f6c0777c40d7278c931',1,'TIM_Base_MspInit(TIM_HandleTypeDef *htim, TIM_ITModeTypeDef it_mode): general_tim.c']]], - ['tim_5fdelay_3',['TIM_Delay',['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga88c552a133cb6e3015453cccab74c07e',1,'TIM_Delay(TIM_HandleTypeDef *htim, uint16_t delay): general_tim.c'],['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga88c552a133cb6e3015453cccab74c07e',1,'TIM_Delay(TIM_HandleTypeDef *htim, uint16_t delay): general_tim.c']]], - ['tim_5fdelay_5fnonblocking_4',['TIM_Delay_NonBlocking',['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga108637af414bff3373059273b815ce9b',1,'TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay): general_tim.c'],['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga108637af414bff3373059273b815ce9b',1,'TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay): general_tim.c']]], - ['tim_5fdelay_5fstart_5',['TIM_Delay_Start',['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga4c0dfde4e15f677600605348b4e97834',1,'TIM_Delay_Start(TIM_HandleTypeDef *htim): general_tim.c'],['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html#ga4c0dfde4e15f677600605348b4e97834',1,'TIM_Delay_Start(TIM_HandleTypeDef *htim): general_tim.c']]], - ['tim_5fencoder_5finit_6',['TIM_Encoder_Init',['../group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc',1,'TIM_Encoder_Init(TIM_EncoderTypeDef *henc1, TIM_HandleTypeDef *htim): general_tim.c'],['../group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc',1,'TIM_Encoder_Init(TIM_EncoderTypeDef *henc, TIM_HandleTypeDef *htim): general_tim.c']]], - ['tim_5fencoder_5fread_7',['TIM_Encoder_Read',['../group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#gac3bc6525f88c275e47eb864e6d567501',1,'TIM_Encoder_Read(TIM_EncoderTypeDef *henc): general_tim.c'],['../group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#gac3bc6525f88c275e47eb864e6d567501',1,'TIM_Encoder_Read(TIM_EncoderTypeDef *henc): general_tim.c']]], - ['tim_5fencoder_5freadswitch_8',['TIM_Encoder_ReadSwitch',['../group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#ga117b795017e9e3a357ddefe323412761',1,'TIM_Encoder_ReadSwitch(TIM_EncoderTypeDef *henc): general_tim.c'],['../group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html#ga117b795017e9e3a357ddefe323412761',1,'TIM_Encoder_ReadSwitch(TIM_EncoderTypeDef *henc): general_tim.c']]], - ['tim_5foc_5fcomparator_5finit_9',['TIM_OC_Comparator_Init',['../group___m_y_l_i_b_s___t_i_m___o_c.html#gae2608ca8023e9a0713af0b4fbfbc1889',1,'TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL): general_tim.c'],['../group___m_y_l_i_b_s___t_i_m___o_c.html#gae2608ca8023e9a0713af0b4fbfbc1889',1,'TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL): general_tim.c']]], - ['tim_5foutput_5fpwm_5finit_10',['TIM_Output_PWM_Init',['../group___m_y_l_i_b_s___t_i_m___o_c.html#gadb2f465d89f609e035867e980c3a29c6',1,'TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN): general_tim.c'],['../group___m_y_l_i_b_s___t_i_m___o_c.html#gadb2f465d89f609e035867e980c3a29c6',1,'TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN): general_tim.c']]] + ['spi_5fbase_5finit_0',['SPI_Base_Init',['../group___m_y___l_i_b_s___s_p_i.html#ga0e177e3c57a8fcdc73b5602e72ec66ba',1,'SPI_Base_Init(SPI_SettingsTypeDef *sspi): general_spi.c'],['../group___m_y___l_i_b_s___s_p_i.html#ga0e177e3c57a8fcdc73b5602e72ec66ba',1,'SPI_Base_Init(SPI_SettingsTypeDef *sspi): general_spi.c']]], + ['spi_5fcheck_5finit_5fstruct_1',['SPI_Check_Init_Struct',['../group___m_y___l_i_b_s___s_p_i.html#ga333dd251bc878931086d48aa932b1a5f',1,'SPI_Check_Init_Struct(SPI_SettingsTypeDef *sspi): general_spi.c'],['../group___m_y___l_i_b_s___s_p_i.html#ga333dd251bc878931086d48aa932b1a5f',1,'SPI_Check_Init_Struct(SPI_SettingsTypeDef *sspi): general_spi.c']]], + ['spi_5fgpio_5finit_2',['SPI_GPIO_Init',['../general__spi_8c.html#ae80d21e5cab86571709a2619442733b5',1,'general_spi.c']]], + ['spi_5fmspdeinit_3',['SPI_MspDeInit',['../group___m_y___l_i_b_s___s_p_i.html#gac279cc3eaa35541edfe330a1844a85e4',1,'SPI_MspDeInit(SPI_HandleTypeDef *hspi): general_spi.c'],['../group___m_y___l_i_b_s___s_p_i.html#gac279cc3eaa35541edfe330a1844a85e4',1,'SPI_MspDeInit(SPI_HandleTypeDef *hspi): general_spi.c']]], + ['spi_5fmspinit_4',['SPI_MspInit',['../group___m_y___l_i_b_s___s_p_i.html#gab9f13318daf02bc5b5f302ae392dccac',1,'SPI_MspInit(SPI_HandleTypeDef *hspi): general_spi.c'],['../group___m_y___l_i_b_s___s_p_i.html#gab9f13318daf02bc5b5f302ae392dccac',1,'SPI_MspInit(SPI_HandleTypeDef *hspi): general_spi.c']]] ]; diff --git a/Doc/html/search/groups_10.js b/Doc/html/search/groups_10.js index a12cb46..461f68c 100644 --- a/Doc/html/search/groups_10.js +++ b/Doc/html/search/groups_10.js @@ -1,4 +1,5 @@ var searchData= [ - ['utils_20defines_0',['Utils defines',['../group___u_t_i_l_s___d_e_f_i_n_e_s.html',1,'']]] + ['uart_20tools_0',['UART Tools',['../group___m_y___l_i_b_s___u_a_r_t.html',1,'']]], + ['utils_20defines_1',['Utils defines',['../group___u_t_i_l_s___d_e_f_i_n_e_s.html',1,'']]] ]; diff --git a/Doc/html/search/groups_3.js b/Doc/html/search/groups_3.js index dadffcf..6a7d179 100644 --- a/Doc/html/search/groups_3.js +++ b/Doc/html/search/groups_3.js @@ -1,6 +1,6 @@ var searchData= [ - ['defines_0',['defines',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html',1,'Bit access defines'],['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html',1,'Delays defines'],['../group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html',1,'Error Handler defines'],['../group___t_r_a_c_e___g_p_i_o.html',1,'GPIO trace defines'],['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html',1,'Hardfault trace defines'],['../group___g_p_i_o___i_n_i_t.html',1,'Init defines'],['../group___t_i_m___i_n_i_t.html',1,'Init defines'],['../group___t_r_a_c_e___s_e_r_i_a_l.html',1,'Serial trace defines'],['../group___t_r_a_c_e.html',1,'Trace defines'],['../group___t_r_a_c_k_e_r_s.html',1,'Trackers defines'],['../group___u_t_i_l_s___d_e_f_i_n_e_s.html',1,'Utils defines']]], + ['defines_0',['defines',['../group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.html',1,'Bit access defines'],['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html',1,'Delays defines'],['../group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.html',1,'Error Handler defines'],['../group___t_r_a_c_e___g_p_i_o.html',1,'GPIO trace defines'],['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html',1,'Hardfault trace defines'],['../group___g_p_i_o___i_n_i_t.html',1,'Init defines'],['../group___s_p_i___i_n_i_t.html',1,'Init defines'],['../group___t_i_m___i_n_i_t.html',1,'Init defines'],['../group___u_a_r_t___i_n_i_t.html',1,'Init defines'],['../group___t_r_a_c_e___s_e_r_i_a_l.html',1,'Serial trace defines'],['../group___t_r_a_c_e.html',1,'Trace defines'],['../group___t_r_a_c_k_e_r_s.html',1,'Trackers defines'],['../group___u_t_i_l_s___d_e_f_i_n_e_s.html',1,'Utils defines']]], ['delay_20tools_1',['Delay tools',['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html',1,'']]], ['delays_20defines_2',['Delays defines',['../group___d_e_l_a_y_s___d_e_f_i_n_e_s.html',1,'']]] ]; diff --git a/Doc/html/search/groups_8.js b/Doc/html/search/groups_8.js index 1023257..8230248 100644 --- a/Doc/html/search/groups_8.js +++ b/Doc/html/search/groups_8.js @@ -1,4 +1,4 @@ var searchData= [ - ['init_20defines_0',['Init defines',['../group___g_p_i_o___i_n_i_t.html',1,'Init defines'],['../group___t_i_m___i_n_i_t.html',1,'Init defines']]] + ['init_20defines_0',['Init defines',['../group___g_p_i_o___i_n_i_t.html',1,'Init defines'],['../group___s_p_i___i_n_i_t.html',1,'Init defines'],['../group___t_i_m___i_n_i_t.html',1,'Init defines'],['../group___u_a_r_t___i_n_i_t.html',1,'Init defines']]] ]; diff --git a/Doc/html/search/groups_e.js b/Doc/html/search/groups_e.js index 29e65af..4b963a4 100644 --- a/Doc/html/search/groups_e.js +++ b/Doc/html/search/groups_e.js @@ -1,5 +1,6 @@ var searchData= [ ['serial_20trace_20defines_0',['Serial trace defines',['../group___t_r_a_c_e___s_e_r_i_a_l.html',1,'']]], - ['switch_20tools_1',['Switch tools',['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html',1,'']]] + ['spi_20tools_1',['SPI Tools',['../group___m_y___l_i_b_s___s_p_i.html',1,'']]], + ['switch_20tools_2',['Switch tools',['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html',1,'']]] ]; diff --git a/Doc/html/search/groups_f.js b/Doc/html/search/groups_f.js index 0861945..0864006 100644 --- a/Doc/html/search/groups_f.js +++ b/Doc/html/search/groups_f.js @@ -1,14 +1,10 @@ var searchData= [ ['tim_20tools_0',['TIM Tools',['../group___m_y___l_i_b_s___t_i_m.html',1,'']]], - ['tools_1',['tools',['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html',1,'Delay tools'],['../group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html',1,'Encoder tools']]], - ['tools_2',['General Tools',['../group___m_y_l_i_b_s___d_e_f_i_n_e_s.html',1,'']]], - ['tools_3',['tools',['../group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html',1,'General tools'],['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html',1,'General tools']]], - ['tools_4',['GPIO Tools',['../group___m_y___l_i_b_s___g_p_i_o.html',1,'']]], - ['tools_5',['tools',['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html',1,'LED tools'],['../group___m_y_l_i_b_s___t_i_m___o_c.html',1,'PWM/OC Channels tools'],['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html',1,'Switch tools']]], - ['tools_6',['TIM Tools',['../group___m_y___l_i_b_s___t_i_m.html',1,'']]], - ['trace_20configs_7',['Trace configs',['../group___t_r_a_c_e___c_o_n_f_i_g.html',1,'']]], - ['trace_20defines_8',['trace defines',['../group___t_r_a_c_e___g_p_i_o.html',1,'GPIO trace defines'],['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html',1,'Hardfault trace defines'],['../group___t_r_a_c_e___s_e_r_i_a_l.html',1,'Serial trace defines']]], - ['trace_20defines_9',['Trace defines',['../group___t_r_a_c_e.html',1,'']]], - ['trackers_20defines_10',['Trackers defines',['../group___t_r_a_c_k_e_r_s.html',1,'']]] + ['tools_1',['Tools',['../group___m_y_l_i_b_s___d_e_f_i_n_e_s.html',1,'General Tools'],['../group___m_y___l_i_b_s___g_p_i_o.html',1,'GPIO Tools'],['../group___m_y___l_i_b_s___s_p_i.html',1,'SPI Tools'],['../group___m_y___l_i_b_s___t_i_m.html',1,'TIM Tools'],['../group___m_y___l_i_b_s___u_a_r_t.html',1,'UART Tools']]], + ['tools_2',['tools',['../group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.html',1,'Delay tools'],['../group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.html',1,'Encoder tools'],['../group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l.html',1,'General tools'],['../group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.html',1,'General tools'],['../group___m_y_l_i_b_s___g_p_i_o___l_e_d_s.html',1,'LED tools'],['../group___m_y_l_i_b_s___t_i_m___o_c.html',1,'PWM/OC Channels tools'],['../group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h.html',1,'Switch tools']]], + ['trace_20configs_3',['Trace configs',['../group___t_r_a_c_e___c_o_n_f_i_g.html',1,'']]], + ['trace_20defines_4',['Trace defines',['../group___t_r_a_c_e.html',1,'']]], + ['trace_20defines_5',['trace defines',['../group___t_r_a_c_e___g_p_i_o.html',1,'GPIO trace defines'],['../group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html',1,'Hardfault trace defines'],['../group___t_r_a_c_e___s_e_r_i_a_l.html',1,'Serial trace defines']]], + ['trackers_20defines_6',['Trackers defines',['../group___t_r_a_c_k_e_r_s.html',1,'']]] ]; diff --git a/Doc/html/search/pages_0.js b/Doc/html/search/pages_0.js index 2e8c2c6..04631a1 100644 --- a/Doc/html/search/pages_0.js +++ b/Doc/html/search/pages_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['mylibs_0',['MyLibs',['../index.html',1,'']]] + ['gpio_20my_5flibs_5fgpio_0',['Модуль GPIO <a class="el" href="group___m_y___l_i_b_s___g_p_i_o.html">GPIO Tools</a>',['../index.html#gpio_module',1,'']]] ]; diff --git a/Doc/html/search/pages_1.js b/Doc/html/search/pages_1.js index c604c22..c38a7d1 100644 --- a/Doc/html/search/pages_1.js +++ b/Doc/html/search/pages_1.js @@ -1,7 +1,9 @@ var searchData= [ ['my_5flibs_5fgpio_0',['Модуль GPIO <a class="el" href="group___m_y___l_i_b_s___g_p_i_o.html">GPIO Tools</a>',['../index.html#gpio_module',1,'']]], - ['my_5flibs_5ftim_1',['Модуль таймеров <a class="el" href="group___m_y___l_i_b_s___t_i_m.html">TIM Tools</a>',['../index.html#tim_module',1,'']]], - ['mylibs_2',['MyLibs',['../index.html',1,'']]], - ['mylibs_5fdefines_3',['Общие утилиты (<a class="el" href="group___m_y_l_i_b_s___d_e_f_i_n_e_s.html">General Tools</a>)',['../index.html#utils_module',1,'']]] + ['my_5flibs_5fspi_1',['Модуль SPI <a class="el" href="group___m_y___l_i_b_s___s_p_i.html">SPI Tools</a>',['../index.html#spi_module',1,'']]], + ['my_5flibs_5ftim_2',['Модуль таймеров <a class="el" href="group___m_y___l_i_b_s___t_i_m.html">TIM Tools</a>',['../index.html#tim_module',1,'']]], + ['my_5flibs_5fuart_3',['Модуль UART <a class="el" href="group___m_y___l_i_b_s___u_a_r_t.html">UART Tools</a>',['../index.html#uart_module',1,'']]], + ['mylibs_4',['MyLibs',['../index.html',1,'']]], + ['mylibs_5fdefines_5',['Общие утилиты (<a class="el" href="group___m_y_l_i_b_s___d_e_f_i_n_e_s.html">General Tools</a>)',['../index.html#utils_module',1,'']]] ]; diff --git a/Doc/html/search/pages_2.js b/Doc/html/search/pages_2.js index 8cbc609..6fc01ef 100644 --- a/Doc/html/search/pages_2.js +++ b/Doc/html/search/pages_2.js @@ -1,4 +1,4 @@ var searchData= [ - ['trace_0',['Трассировка <a class="el" href="group___t_r_a_c_e.html">Trace defines</a>',['../index.html#trace_module',1,'']]] + ['spi_20my_5flibs_5fspi_0',['Модуль SPI <a class="el" href="group___m_y___l_i_b_s___s_p_i.html">SPI Tools</a>',['../index.html#spi_module',1,'']]] ]; diff --git a/Doc/html/search/pages_3.js b/Doc/html/search/pages_3.js index 205b15e..8cbc609 100644 --- a/Doc/html/search/pages_3.js +++ b/Doc/html/search/pages_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['возможности_0',['Основные возможности',['../index.html#features',1,'']]] + ['trace_0',['Трассировка <a class="el" href="group___t_r_a_c_e.html">Trace defines</a>',['../index.html#trace_module',1,'']]] ]; diff --git a/Doc/html/search/pages_4.js b/Doc/html/search/pages_4.js index 088670f..ba35ec5 100644 --- a/Doc/html/search/pages_4.js +++ b/Doc/html/search/pages_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['зависимости_0',['Зависимости',['../index.html#dependencies',1,'']]] + ['uart_20my_5flibs_5fuart_0',['Модуль UART <a class="el" href="group___m_y___l_i_b_s___u_a_r_t.html">UART Tools</a>',['../index.html#uart_module',1,'']]] ]; diff --git a/Doc/html/search/pages_5.js b/Doc/html/search/pages_5.js index 4f064c9..205b15e 100644 --- a/Doc/html/search/pages_5.js +++ b/Doc/html/search/pages_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['использование_0',['Использование',['../index.html#usage_basic',1,'']]] + ['возможности_0',['Основные возможности',['../index.html#features',1,'']]] ]; diff --git a/Doc/html/search/pages_6.js b/Doc/html/search/pages_6.js index 5143fc3..4f064c9 100644 --- a/Doc/html/search/pages_6.js +++ b/Doc/html/search/pages_6.js @@ -1,5 +1,4 @@ var searchData= [ - ['модуль_20таймеров_20my_5flibs_5ftim_0',['Модуль таймеров <a class="el" href="group___m_y___l_i_b_s___t_i_m.html">TIM Tools</a>',['../index.html#tim_module',1,'']]], - ['модуль_20gpio_20my_5flibs_5fgpio_1',['Модуль GPIO <a class="el" href="group___m_y___l_i_b_s___g_p_i_o.html">GPIO Tools</a>',['../index.html#gpio_module',1,'']]] + ['использование_0',['Использование',['../index.html#usage_basic',1,'']]] ]; diff --git a/Doc/html/search/pages_7.js b/Doc/html/search/pages_7.js index ca20af9..09baad2 100644 --- a/Doc/html/search/pages_7.js +++ b/Doc/html/search/pages_7.js @@ -1,6 +1,7 @@ var searchData= [ - ['обзор_0',['Обзор',['../index.html#overview',1,'']]], - ['общие_20утилиты_20mylibs_5fdefines_1',['Общие утилиты (<a class="el" href="group___m_y_l_i_b_s___d_e_f_i_n_e_s.html">General Tools</a>)',['../index.html#utils_module',1,'']]], - ['основные_20возможности_2',['Основные возможности',['../index.html#features',1,'']]] + ['модуль_20таймеров_20my_5flibs_5ftim_0',['Модуль таймеров <a class="el" href="group___m_y___l_i_b_s___t_i_m.html">TIM Tools</a>',['../index.html#tim_module',1,'']]], + ['модуль_20gpio_20my_5flibs_5fgpio_1',['Модуль GPIO <a class="el" href="group___m_y___l_i_b_s___g_p_i_o.html">GPIO Tools</a>',['../index.html#gpio_module',1,'']]], + ['модуль_20spi_20my_5flibs_5fspi_2',['Модуль SPI <a class="el" href="group___m_y___l_i_b_s___s_p_i.html">SPI Tools</a>',['../index.html#spi_module',1,'']]], + ['модуль_20uart_20my_5flibs_5fuart_3',['Модуль UART <a class="el" href="group___m_y___l_i_b_s___u_a_r_t.html">UART Tools</a>',['../index.html#uart_module',1,'']]] ]; diff --git a/Doc/html/search/pages_8.js b/Doc/html/search/pages_8.js index 77c91f2..ca20af9 100644 --- a/Doc/html/search/pages_8.js +++ b/Doc/html/search/pages_8.js @@ -1,6 +1,6 @@ var searchData= [ - ['пример_20работы_20с_20таймером_0',['Пример работы с таймером',['../index.html#tim_example',1,'']]], - ['пример_20работы_20с_20gpio_1',['Пример работы с GPIO',['../index.html#gpio_example',1,'']]], - ['проекта_2',['Структура проекта',['../index.html#structure',1,'']]] + ['обзор_0',['Обзор',['../index.html#overview',1,'']]], + ['общие_20утилиты_20mylibs_5fdefines_1',['Общие утилиты (<a class="el" href="group___m_y_l_i_b_s___d_e_f_i_n_e_s.html">General Tools</a>)',['../index.html#utils_module',1,'']]], + ['основные_20возможности_2',['Основные возможности',['../index.html#features',1,'']]] ]; diff --git a/Doc/html/search/pages_9.js b/Doc/html/search/pages_9.js index e75b48e..82a23b2 100644 --- a/Doc/html/search/pages_9.js +++ b/Doc/html/search/pages_9.js @@ -1,5 +1,4 @@ var searchData= [ - ['работы_20с_20таймером_0',['Пример работы с таймером',['../index.html#tim_example',1,'']]], - ['работы_20с_20gpio_1',['Пример работы с GPIO',['../index.html#gpio_example',1,'']]] + ['проекта_0',['Структура проекта',['../index.html#structure',1,'']]] ]; diff --git a/Doc/html/search/pages_a.js b/Doc/html/search/pages_a.js index 77b7b10..dd4f424 100644 --- a/Doc/html/search/pages_a.js +++ b/Doc/html/search/pages_a.js @@ -1,6 +1,4 @@ var searchData= [ - ['структура_20проекта_0',['Структура проекта',['../index.html#structure',1,'']]], - ['с_20таймером_1',['Пример работы с таймером',['../index.html#tim_example',1,'']]], - ['с_20gpio_2',['Пример работы с GPIO',['../index.html#gpio_example',1,'']]] + ['структура_20проекта_0',['Структура проекта',['../index.html#structure',1,'']]] ]; diff --git a/Doc/html/search/pages_b.js b/Doc/html/search/pages_b.js index 22224e1..25680da 100644 --- a/Doc/html/search/pages_b.js +++ b/Doc/html/search/pages_b.js @@ -1,6 +1,5 @@ var searchData= [ ['трассировка_20trace_0',['Трассировка <a class="el" href="group___t_r_a_c_e.html">Trace defines</a>',['../index.html#trace_module',1,'']]], - ['таймеров_20my_5flibs_5ftim_1',['Модуль таймеров <a class="el" href="group___m_y___l_i_b_s___t_i_m.html">TIM Tools</a>',['../index.html#tim_module',1,'']]], - ['таймером_2',['Пример работы с таймером',['../index.html#tim_example',1,'']]] + ['таймеров_20my_5flibs_5ftim_1',['Модуль таймеров <a class="el" href="group___m_y___l_i_b_s___t_i_m.html">TIM Tools</a>',['../index.html#tim_module',1,'']]] ]; diff --git a/Doc/html/search/search.css b/Doc/html/search/search.css index 19f76f9..956f31f 100644 --- a/Doc/html/search/search.css +++ b/Doc/html/search/search.css @@ -5,8 +5,8 @@ display: flex; justify-content: center; align-items: center; - height: 36px; - margin-right: 1em; + height: 43px; + margin-right: 0; } /*---------------- Search box styling */ @@ -27,43 +27,23 @@ dark-mode-toggle { white-space : nowrap; background: var(--search-background-color); border-radius: 0.65em; - box-shadow: var(--search-box-shadow); + border: 1px solid var(--search-box-border-color); z-index: 102; + margin-right: 4px; } #MSearchBox .left { display: inline-block; vertical-align: middle; - height: 1.4em; + height: 1.6em; } -#MSearchSelect { - display: inline-block; - vertical-align: middle; - width: 20px; - height: 19px; - background-image: var(--search-magnification-select-image); - margin: 0 0 0 0.3em; - padding: 0; -} - -#MSearchSelectExt { - display: inline-block; - vertical-align: middle; - width: 10px; - height: 19px; - background-image: var(--search-magnification-image); - margin: 0 0 0 0.5em; - padding: 0; -} - - #MSearchField { display: inline-block; - vertical-align: middle; + vertical-align: top; width: 7.5em; - height: 19px; - margin: 0 0.15em; + height: 22px; + margin: 0 0 0 0.15em; padding: 0; line-height: 1em; border:none; @@ -86,7 +66,7 @@ dark-mode-toggle { display: inline-block; vertical-align: middle; width: 1.4em; - height: 1.4em; + height: 1.6em; } #MSearchClose { @@ -101,14 +81,100 @@ dark-mode-toggle { } #MSearchCloseImg { - padding: 0.3em; - margin: 0; + margin: 6px 0 0 4px; } +.close-icon { + width: 11px; + height: 11px; + background-color: var(--search-close-icon-bg-color); + border-radius: 50%; + position: relative; + display: flex; + justify-content: center; + align-items: center; + box-sizing: content-box; +} + +.close-icon:before, +.close-icon:after { + content: ''; + position: absolute; + width: 7px; + height: 1px; + background-color: var(--search-close-icon-fg-color); +} + +.close-icon:before { + transform: rotate(45deg); +} + +.close-icon:after { + transform: rotate(-45deg); +} + + .MSearchBoxActive #MSearchField { color: var(--search-active-color); } +.search-icon { + width: 20px; + height: 20px; + display: inline-block; + position: relative; + margin-left: 3px; +} + +#MSearchSelectExt.search-icon { + width: 10px; +} + +#MSearchSelectExt + input { + margin-left: 5px; +} + +.search-icon::before, .search-icon::after { + content: ''; + position: absolute; + border: 1.5px solid var(--search-foreground-color); + box-sizing: content-box; +} + +.search-icon::before { + width: 6px; + height: 6px; + border-radius: 50%; + top: 7px; + left: 2px; + background: var(--search-background-color); +} + +.search-icon::after { + border: 1px solid var(--search-foreground-color); + width: 0px; + height: 3px; + border-radius: 2px; + top: 15px; + left: 8px; + transform: rotate(-45deg); + transform-origin: top left; +} + +.search-icon-dropdown { + content: ''; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 3px solid var(--search-foreground-color); + top: 8px; + left: 15px; + transform: translateX(-50%); + position: absolute; +} + + /*---------------- Search filter selection */ @@ -119,15 +185,12 @@ dark-mode-toggle { left: 0; top: 0; border: 1px solid var(--search-filter-border-color); background-color: var(--search-filter-background-color); + backdrop-filter: var(--search-filter-backdrop-filter); + -webkit-backdrop-filter: var(--search-filter-backdrop-filter); z-index: 10001; padding-top: 4px; padding-bottom: 4px; - -moz-border-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-radius: 4px; } .SelectItem { @@ -176,18 +239,39 @@ iframe#MSearchResults { height: 15em; } +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + #MSearchResultsWindow { display: none; position: absolute; - left: 0; top: 0; + left: auto; + right: 4px; + top: 0; border: 1px solid var(--search-results-border-color); background-color: var(--search-results-background-color); + backdrop-filter: var(--search-results-backdrop-filter); + -webkit-backdrop-filter: var(--search-results-backdrop-filter); z-index:10000; width: 300px; height: 400px; overflow: auto; + border-radius: 8px; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResults; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); } + /* ----------------------------------- */ @@ -201,13 +285,13 @@ iframe#MSearchResults { } .SRPage .SREntry { - font-size: 8pt; - padding: 1px 5px; + font-size: 10pt; + padding: 2px 5px; } div.SRPage { margin: 5px 2px; - background-color: var(--search-results-background-color); + /*background-color: var(--search-results-background-color);*/ } .SRChildren { @@ -261,14 +345,17 @@ div.searchresults { margin-right: 10px; } +#searchBoxPos1 dark-mode-toggle { + margin-top: 4px; +} + /*---------------- External search page results */ .pages b { - color: white; + color: var(--nav-foreground-color); padding: 5px 5px 3px 5px; - background-image: var(--nav-gradient-active-image-parent); - background-repeat: repeat-x; - text-shadow: 0 1px 1px #000000; + background-color: var(--nav-menu-active-bg); + border-radius: 4px; } .pages { diff --git a/Doc/html/search/search.js b/Doc/html/search/search.js index 666af01..dc14410 100644 --- a/Doc/html/search/search.js +++ b/Doc/html/search/search.js @@ -607,6 +607,12 @@ function createResults(resultsPath) { elem.setAttribute('className',attr); } + const decodeHtml = (html) => { + const txt = document.createElement("textarea"); + txt.innerHTML = html; + return txt.value; + }; + const results = document.getElementById("SRResults"); results.innerHTML = ''; searchData.forEach((elem,index) => { @@ -620,10 +626,14 @@ function createResults(resultsPath) { srLink.setAttribute('id','Item'+index); setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); setClassAttr(srLink,'SRSymbol'); - srLink.innerHTML = elem[1][0]; + srLink.innerHTML = decodeHtml(elem[1][0]); srEntry.appendChild(srLink); if (elem[1].length==2) { // single result - srLink.setAttribute('href',resultsPath+elem[1][1][0]); + if (elem[1][1][0].startsWith('http://') || elem[1][1][0].startsWith('https://')) { // absolute path + srLink.setAttribute('href',elem[1][1][0]); + } else { // relative path + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + } srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); if (elem[1][1][1]) { srLink.setAttribute('target','_parent'); @@ -632,7 +642,7 @@ function createResults(resultsPath) { } const srScope = document.createElement('span'); setClassAttr(srScope,'SRScope'); - srScope.innerHTML = elem[1][1][2]; + srScope.innerHTML = decodeHtml(elem[1][1][2]); srEntry.appendChild(srScope); } else { // multiple results srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); @@ -643,14 +653,18 @@ function createResults(resultsPath) { srChild.setAttribute('id','Item'+index+'_c'+c); setKeyActions(srChild,'return searchResults.NavChild(event,'+index+','+c+')'); setClassAttr(srChild,'SRScope'); - srChild.setAttribute('href',resultsPath+elem[1][c+1][0]); + if (elem[1][c+1][0].startsWith('http://') || elem[1][c+1][0].startsWith('https://')) { // absolute path + srChild.setAttribute('href',elem[1][c+1][0]); + } else { // relative path + srChild.setAttribute('href',resultsPath+elem[1][c+1][0]); + } srChild.setAttribute('onclick','searchBox.CloseResultsWindow()'); if (elem[1][c+1][1]) { srChild.setAttribute('target','_parent'); } else { srChild.setAttribute('target','_blank'); } - srChild.innerHTML = elem[1][c+1][2]; + srChild.innerHTML = decodeHtml(elem[1][c+1][2]); srChildren.appendChild(srChild); } srEntry.appendChild(srChildren); diff --git a/Doc/html/search/searchdata.js b/Doc/html/search/searchdata.js index 9a4156c..7f3006a 100644 --- a/Doc/html/search/searchdata.js +++ b/Doc/html/search/searchdata.js @@ -1,14 +1,14 @@ var indexSectionsWithContent = { - 0: "abcdefghilmnoprstuвзимопрсту", + 0: "abcdefghilmnoprstuвимопсту", 1: "eghrstu", 2: "begmt", - 3: "eghrt", + 3: "eghrstu", 4: "cdeghlmnprst", 5: "gt", 6: "lt", 7: "abcdefghilmoprstu", - 8: "m" + 8: "gmstuвимопсту" }; var indexSectionNames = diff --git a/Doc/html/search/variables_0.js b/Doc/html/search/variables_0.js index 0d2dad9..91d9d13 100644 --- a/Doc/html/search/variables_0.js +++ b/Doc/html/search/variables_0.js @@ -1,5 +1,8 @@ var searchData= [ ['cand_5findex_0',['cand_index',['../struct_evolve_optimizer__t.html#a0ae0e63ba351335d4445d927991c64ae',1,'EvolveOptimizer_t']]], - ['candidates_1',['candidates',['../struct_evolve_optimizer__t.html#aec67667fd1f1533e693e41c79bc28da4',1,'EvolveOptimizer_t']]] + ['candidates_1',['candidates',['../struct_evolve_optimizer__t.html#aec67667fd1f1533e693e41c79bc28da4',1,'EvolveOptimizer_t']]], + ['clk_5fgpio_5falternagefunc_2',['CLK_GPIO_AlternageFunc',['../struct_s_p_i___settings_type_def.html#a3f3748103a0b7861f6700042fd691ba1',1,'SPI_SettingsTypeDef']]], + ['clk_5fgpiox_3',['CLK_GPIOx',['../struct_s_p_i___settings_type_def.html#a6a15d48eccf92959de3a086031fdc979',1,'SPI_SettingsTypeDef']]], + ['clk_5fpin_4',['CLK_PIN',['../struct_s_p_i___settings_type_def.html#a3bcb1ed12da3544e02e6d36493669bdc',1,'SPI_SettingsTypeDef']]] ]; diff --git a/Doc/html/search/variables_1.js b/Doc/html/search/variables_1.js index fd94506..3bb10dc 100644 --- a/Doc/html/search/variables_1.js +++ b/Doc/html/search/variables_1.js @@ -1,4 +1,6 @@ var searchData= [ - ['data_0',['data',['../struct_r_t_t___flash_header__t.html#ae7276198385c8d6f6508f433d042d52a',1,'RTT_FlashHeader_t']]] + ['data_0',['data',['../struct_r_t_t___flash_header__t.html#ae7276198385c8d6f6508f433d042d52a',1,'RTT_FlashHeader_t']]], + ['dma_5fchannel_5fx_1',['DMA_CHANNEL_X',['../struct_s_p_i___settings_type_def.html#aa0edaa145076d2383b3e0095d156d474',1,'SPI_SettingsTypeDef::DMA_CHANNEL_X'],['../struct_u_a_r_t___settings_type_def.html#a15ce92b03f7f189bfbe1ab88a5f94d19',1,'UART_SettingsTypeDef::DMA_CHANNEL_X']]], + ['dmachannel_2',['DMAChannel',['../struct_s_p_i___settings_type_def.html#a3cfd9469b0617a68bbd2a161ba06bb95',1,'SPI_SettingsTypeDef::DMAChannel'],['../struct_u_a_r_t___settings_type_def.html#a1ecc9ac6a1d2747ade56770cbab6a613',1,'UART_SettingsTypeDef::DMAChannel']]] ]; diff --git a/Doc/html/search/variables_3.js b/Doc/html/search/variables_3.js index ebaa3e9..3e4add5 100644 --- a/Doc/html/search/variables_3.js +++ b/Doc/html/search/variables_3.js @@ -1,7 +1,11 @@ var searchData= [ - ['gpio_5fpin_5fsw_0',['GPIO_PIN_SW',['../struct_t_i_m___encoder_type_def.html#a6973108a83d2a3ea4fc3e0e8a501af80',1,'TIM_EncoderTypeDef']]], - ['gpio_5fpin_5fti1_1',['GPIO_PIN_TI1',['../struct_t_i_m___encoder_type_def.html#a4fc05ef011205a6702cb3d006bab677e',1,'TIM_EncoderTypeDef']]], - ['gpio_5fpin_5fti2_2',['GPIO_PIN_TI2',['../struct_t_i_m___encoder_type_def.html#a67ad037b92162546763fc9c425b5e3c5',1,'TIM_EncoderTypeDef']]], - ['gpiox_3',['GPIOx',['../struct_t_i_m___encoder_type_def.html#ad29873fc8cdc71462e6d8744621120e9',1,'TIM_EncoderTypeDef']]] + ['gen_5findex_0',['gen_index',['../struct_evolve_optimizer__t.html#ad0f464d7048a9ed0753b61f76f563108',1,'EvolveOptimizer_t']]], + ['gen_5fmut_1',['gen_mut',['../struct_evolve_optimizer__t.html#a3be8c0c34db8429210ff470497a56727',1,'EvolveOptimizer_t']]], + ['gpio_5fpin_5frx_2',['GPIO_PIN_RX',['../struct_u_a_r_t___settings_type_def.html#a3fba2b52788fe453348b5d92ed52ba49',1,'UART_SettingsTypeDef']]], + ['gpio_5fpin_5fsw_3',['GPIO_PIN_SW',['../struct_t_i_m___encoder_type_def.html#a6973108a83d2a3ea4fc3e0e8a501af80',1,'TIM_EncoderTypeDef']]], + ['gpio_5fpin_5fti1_4',['GPIO_PIN_TI1',['../struct_t_i_m___encoder_type_def.html#a4fc05ef011205a6702cb3d006bab677e',1,'TIM_EncoderTypeDef']]], + ['gpio_5fpin_5fti2_5',['GPIO_PIN_TI2',['../struct_t_i_m___encoder_type_def.html#a67ad037b92162546763fc9c425b5e3c5',1,'TIM_EncoderTypeDef']]], + ['gpio_5fpin_5ftx_6',['GPIO_PIN_TX',['../struct_u_a_r_t___settings_type_def.html#a5f1babfcfb436cd77f5614253c0a5bef',1,'UART_SettingsTypeDef']]], + ['gpiox_7',['GPIOx',['../struct_t_i_m___encoder_type_def.html#ad29873fc8cdc71462e6d8744621120e9',1,'TIM_EncoderTypeDef::GPIOx'],['../struct_u_a_r_t___settings_type_def.html#af6f9910d065bae715cdb4a1024143a8f',1,'UART_SettingsTypeDef::GPIOx']]] ]; diff --git a/Doc/html/search/variables_4.js b/Doc/html/search/variables_4.js index 020fcba..1d4c0a0 100644 --- a/Doc/html/search/variables_4.js +++ b/Doc/html/search/variables_4.js @@ -1,4 +1,6 @@ var searchData= [ - ['htim_0',['htim',['../struct_t_i_m___settings_type_def.html#ada49efdbd35a8e442c3cff630d42f34c',1,'TIM_SettingsTypeDef::htim'],['../struct_t_i_m___encoder_type_def.html#adc80bd5a90444c31d84157f35c59b95c',1,'TIM_EncoderTypeDef::htim']]] + ['hspi_0',['hspi',['../struct_s_p_i___settings_type_def.html#ad203d8b8d67e4f477d002d15b03ba422',1,'SPI_SettingsTypeDef']]], + ['htim_1',['htim',['../struct_t_i_m___settings_type_def.html#ada49efdbd35a8e442c3cff630d42f34c',1,'TIM_SettingsTypeDef::htim'],['../struct_t_i_m___encoder_type_def.html#adc80bd5a90444c31d84157f35c59b95c',1,'TIM_EncoderTypeDef::htim']]], + ['huart_2',['huart',['../struct_u_a_r_t___settings_type_def.html#accf2c9448a3ea8eb3b8c25a569276fea',1,'UART_SettingsTypeDef']]] ]; diff --git a/Doc/html/search/variables_6.js b/Doc/html/search/variables_6.js index 76205be..bd7bed0 100644 --- a/Doc/html/search/variables_6.js +++ b/Doc/html/search/variables_6.js @@ -1,4 +1,10 @@ var searchData= [ - ['mutation_5famp_0',['mutation_amp',['../struct_evolve_optimizer__t.html#af779c7aeba0053e36cee7aade160f1c8',1,'EvolveOptimizer_t']]] + ['miso_5fgpio_5falternagefunc_0',['MISO_GPIO_AlternageFunc',['../struct_s_p_i___settings_type_def.html#aecd7a5c6e205335b8ed229d74cd35d14',1,'SPI_SettingsTypeDef']]], + ['miso_5fgpiox_1',['MISO_GPIOx',['../struct_s_p_i___settings_type_def.html#a0d55a2941854f61934487f3d209cfa95',1,'SPI_SettingsTypeDef']]], + ['miso_5fpin_2',['MISO_PIN',['../struct_s_p_i___settings_type_def.html#a3366c654d7ec6dd41c6a0b504dc8509a',1,'SPI_SettingsTypeDef']]], + ['mosi_5fgpio_5falternagefunc_3',['MOSI_GPIO_AlternageFunc',['../struct_s_p_i___settings_type_def.html#afbe75a1c36650a4a9b41fa706a4c7eab',1,'SPI_SettingsTypeDef']]], + ['mosi_5fgpiox_4',['MOSI_GPIOx',['../struct_s_p_i___settings_type_def.html#a0af3bdb273818ff97eb4ff3cff918820',1,'SPI_SettingsTypeDef']]], + ['mosi_5fpin_5',['MOSI_PIN',['../struct_s_p_i___settings_type_def.html#a961208869faf4a7369aaf4edde75f176',1,'SPI_SettingsTypeDef']]], + ['mutation_5famp_6',['mutation_amp',['../struct_evolve_optimizer__t.html#af779c7aeba0053e36cee7aade160f1c8',1,'EvolveOptimizer_t']]] ]; diff --git a/Doc/html/struct_evolve_optimizer__t-members.html b/Doc/html/struct_evolve_optimizer__t-members.html index 34782f0..dbd3cfc 100644 --- a/Doc/html/struct_evolve_optimizer__t-members.html +++ b/Doc/html/struct_evolve_optimizer__t-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
        - + +
      @@ -73,10 +71,9 @@ $(function() {
    + diff --git a/Doc/html/struct_evolve_optimizer__t.html b/Doc/html/struct_evolve_optimizer__t.html index 36e2fab..b100ac5 100644 --- a/Doc/html/struct_evolve_optimizer__t.html +++ b/Doc/html/struct_evolve_optimizer__t.html @@ -3,7 +3,7 @@ - + MyLibs: EvolveOptimizer_t Struct Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    EvolveOptimizer_t Struct Reference
    @@ -112,41 +106,36 @@ $(function(){initNavTree('struct_evolve_optimizer__t.html',''); initResizable();

    #include <evolve_optimizer.h>

    - - - - - - - + + + + - - -

    +

    Public Attributes

    float stability
     Коэффициент насколько стабильная популяция (0..1)(n_cand)
     
    uint16_t n_params
     Количество параметров
     
    uint16_t n_cand
     Количество кандидатов в популяции
     
    uint16_t n_best
     Количество лучших, усредняемых
     
    float mutation_amp
     Амплитуда мутации (0..1)
     
    uint16_t cand_index
     Индекс кандидата для обработки
     
    uint16_t gen_index
     Индекс популяции
    float gen_mut
     Амплитуда мутации у текущей популяции
    float loss [100]
     Loss для каждого кандидата
     
    float candidates [100][20]
     Параметры кандидатов
     
    uint16_t sorted_idx [100]
     Индексы отсортированных кандидатов
     
    -

    Detailed Description

    +

    Detailed Description

    Структура эволюционного оптимизатора

    Definition at line 102 of file evolve_optimizer.h.

    -

    Member Data Documentation

    +

    Member Data Documentation

    ◆ stability

    @@ -179,7 +168,7 @@ Public Attributes

    Количество параметров

    -

    Definition at line 104 of file evolve_optimizer.h.

    +

    Definition at line 105 of file evolve_optimizer.h.

    @@ -197,7 +186,7 @@ Public Attributes

    Количество кандидатов в популяции

    -

    Definition at line 105 of file evolve_optimizer.h.

    +

    Definition at line 106 of file evolve_optimizer.h.

    @@ -215,7 +204,7 @@ Public Attributes

    Количество лучших, усредняемых

    -

    Definition at line 106 of file evolve_optimizer.h.

    +

    Definition at line 107 of file evolve_optimizer.h.

    @@ -233,7 +222,7 @@ Public Attributes

    Амплитуда мутации (0..1)

    -

    Definition at line 107 of file evolve_optimizer.h.

    +

    Definition at line 108 of file evolve_optimizer.h.

    @@ -251,7 +240,43 @@ Public Attributes

    Индекс кандидата для обработки

    -

    Definition at line 108 of file evolve_optimizer.h.

    +

    Definition at line 110 of file evolve_optimizer.h.

    + + + + +

    ◆ gen_index

    + +
    +
    + + + + +
    uint16_t EvolveOptimizer_t::gen_index
    +
    + +

    Индекс популяции

    + +

    Definition at line 111 of file evolve_optimizer.h.

    + +
    +
    + +

    ◆ gen_mut

    + +
    +
    + + + + +
    float EvolveOptimizer_t::gen_mut
    +
    + +

    Амплитуда мутации у текущей популяции

    + +

    Definition at line 114 of file evolve_optimizer.h.

    @@ -269,7 +294,7 @@ Public Attributes

    Loss для каждого кандидата

    -

    Definition at line 109 of file evolve_optimizer.h.

    +

    Definition at line 116 of file evolve_optimizer.h.

    @@ -287,7 +312,7 @@ Public Attributes

    Параметры кандидатов

    -

    Definition at line 110 of file evolve_optimizer.h.

    +

    Definition at line 117 of file evolve_optimizer.h.

    @@ -305,20 +330,28 @@ Public Attributes

    Индексы отсортированных кандидатов

    -

    Definition at line 111 of file evolve_optimizer.h.

    +

    Definition at line 118 of file evolve_optimizer.h.


    The documentation for this struct was generated from the following file: + + diff --git a/Doc/html/struct_evolve_optimizer__t.js b/Doc/html/struct_evolve_optimizer__t.js index cf9289a..588d42a 100644 --- a/Doc/html/struct_evolve_optimizer__t.js +++ b/Doc/html/struct_evolve_optimizer__t.js @@ -6,6 +6,8 @@ var struct_evolve_optimizer__t = [ "n_best", "struct_evolve_optimizer__t.html#a950cd70cb6bff33b78ad35ee58c729a6", null ], [ "mutation_amp", "struct_evolve_optimizer__t.html#af779c7aeba0053e36cee7aade160f1c8", null ], [ "cand_index", "struct_evolve_optimizer__t.html#a0ae0e63ba351335d4445d927991c64ae", null ], + [ "gen_index", "struct_evolve_optimizer__t.html#ad0f464d7048a9ed0753b61f76f563108", null ], + [ "gen_mut", "struct_evolve_optimizer__t.html#a3be8c0c34db8429210ff470497a56727", null ], [ "loss", "struct_evolve_optimizer__t.html#a93f628397c2f8d4027f2906752b650df", null ], [ "candidates", "struct_evolve_optimizer__t.html#aec67667fd1f1533e693e41c79bc28da4", null ], [ "sorted_idx", "struct_evolve_optimizer__t.html#a74b81df1c298c99162310f3f7d91735a", null ] diff --git a/Doc/html/struct_g_p_i_o___l_e_d_type_def-members.html b/Doc/html/struct_g_p_i_o___l_e_d_type_def-members.html index cd97a90..beef91b 100644 --- a/Doc/html/struct_g_p_i_o___l_e_d_type_def-members.html +++ b/Doc/html/struct_g_p_i_o___l_e_d_type_def-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    tickprev (defined in GPIO_LEDTypeDef)GPIO_LEDTypeDef
    +
    diff --git a/Doc/html/struct_g_p_i_o___l_e_d_type_def.html b/Doc/html/struct_g_p_i_o___l_e_d_type_def.html index 8e74029..2908f1f 100644 --- a/Doc/html/struct_g_p_i_o___l_e_d_type_def.html +++ b/Doc/html/struct_g_p_i_o___l_e_d_type_def.html @@ -3,7 +3,7 @@ - + MyLibs: GPIO_LEDTypeDef Struct Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    GPIO_LEDTypeDef Struct Reference
    @@ -112,31 +106,25 @@ $(function(){initNavTree('struct_g_p_i_o___l_e_d_type_def.html',''); initResizab

    #include <general_gpio.h>

    - - - - - - -

    +

    Public Attributes

    GPIO_LEDStateTypeDef state
     Текущий режим работы светодиода
     
    GPIO_TypeDef * LED_Port
     GPIO порт ножки светодиода
     
    uint32_t LED_Pin
     GPIO пин ножки светодиода
     
    uint8_t LED_ActiveLvl
     Активный уровень ножки (при котором светодиод горит)
     
    uint32_t LED_Period
     Период моргания светодиода
     
    uint32_t tickprev
     
    -

    Detailed Description

    +

    Detailed Description

    Структура светодиода

    -

    Definition at line 93 of file general_gpio.h.

    -

    Member Data Documentation

    +

    Definition at line 73 of file general_gpio.h.

    +

    Member Data Documentation

    ◆ state

    @@ -151,7 +139,7 @@ Public Attributes

    Текущий режим работы светодиода

    -

    Definition at line 95 of file general_gpio.h.

    +

    Definition at line 75 of file general_gpio.h.

    @@ -169,7 +157,7 @@ Public Attributes

    GPIO порт ножки светодиода

    -

    Definition at line 97 of file general_gpio.h.

    +

    Definition at line 77 of file general_gpio.h.

    @@ -187,7 +175,7 @@ Public Attributes

    GPIO пин ножки светодиода

    -

    Definition at line 98 of file general_gpio.h.

    +

    Definition at line 78 of file general_gpio.h.

    @@ -205,7 +193,7 @@ Public Attributes

    Активный уровень ножки (при котором светодиод горит)

    -

    Definition at line 100 of file general_gpio.h.

    +

    Definition at line 80 of file general_gpio.h.

    @@ -223,7 +211,7 @@ Public Attributes

    Период моргания светодиода

    -

    Definition at line 101 of file general_gpio.h.

    +

    Definition at line 81 of file general_gpio.h.

    @@ -239,20 +227,28 @@ Public Attributes
    -

    Definition at line 103 of file general_gpio.h.

    +

    Definition at line 83 of file general_gpio.h.


    The documentation for this struct was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_gpio.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_gpio.h
    + + diff --git a/Doc/html/struct_g_p_i_o___switch_type_def-members.html b/Doc/html/struct_g_p_i_o___switch_type_def-members.html index 23156f4..4957c60 100644 --- a/Doc/html/struct_g_p_i_o___switch_type_def-members.html +++ b/Doc/html/struct_g_p_i_o___switch_type_def-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    +
    diff --git a/Doc/html/struct_g_p_i_o___switch_type_def.html b/Doc/html/struct_g_p_i_o___switch_type_def.html index 7e5088c..362fcb1 100644 --- a/Doc/html/struct_g_p_i_o___switch_type_def.html +++ b/Doc/html/struct_g_p_i_o___switch_type_def.html @@ -3,7 +3,7 @@ - + MyLibs: GPIO_SwitchTypeDef Struct Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    GPIO_SwitchTypeDef Struct Reference
    @@ -112,31 +106,25 @@ $(function(){initNavTree('struct_g_p_i_o___switch_type_def.html',''); initResiza

    #include <general_gpio.h>

    - - - - - - -

    +

    Public Attributes

    GPIO_TypeDef * Sw_Port
     GPIO порт ножки кнопки
     
    uint32_t Sw_Pin
     GPIO пин ножки кнопки
     
    uint8_t Sw_ActiveLvl
     Активный уровень ножки (при котором кнопка нажата)
     
    uint32_t Sw_PrevState
     Предыдущее состояние кнопки
     
    uint32_t Sw_FilterDelay
     Фильтр от дребезга (в мс)
     
    uint32_t tickprev
     
    -

    Detailed Description

    +

    Detailed Description

    Структура кнопки

    -

    Definition at line 110 of file general_gpio.h.

    -

    Member Data Documentation

    +

    Definition at line 90 of file general_gpio.h.

    +

    Member Data Documentation

    ◆ Sw_Port

    @@ -151,7 +139,7 @@ Public Attributes

    GPIO порт ножки кнопки

    -

    Definition at line 112 of file general_gpio.h.

    +

    Definition at line 92 of file general_gpio.h.

    @@ -169,7 +157,7 @@ Public Attributes

    GPIO пин ножки кнопки

    -

    Definition at line 113 of file general_gpio.h.

    +

    Definition at line 93 of file general_gpio.h.

    @@ -187,7 +175,7 @@ Public Attributes

    Активный уровень ножки (при котором кнопка нажата)

    -

    Definition at line 115 of file general_gpio.h.

    +

    Definition at line 95 of file general_gpio.h.

    @@ -205,7 +193,7 @@ Public Attributes

    Предыдущее состояние кнопки

    -

    Definition at line 116 of file general_gpio.h.

    +

    Definition at line 96 of file general_gpio.h.

    @@ -223,7 +211,7 @@ Public Attributes

    Фильтр от дребезга (в мс)

    -

    Definition at line 117 of file general_gpio.h.

    +

    Definition at line 97 of file general_gpio.h.

    @@ -239,20 +227,28 @@ Public Attributes
    -

    Definition at line 119 of file general_gpio.h.

    +

    Definition at line 99 of file general_gpio.h.


    The documentation for this struct was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_gpio.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_gpio.h
    + + diff --git a/Doc/html/struct_h_f___stack_frame__t-members.html b/Doc/html/struct_h_f___stack_frame__t-members.html index 7641c7d..dcf3ead 100644 --- a/Doc/html/struct_h_f___stack_frame__t-members.html +++ b/Doc/html/struct_h_f___stack_frame__t-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { + diff --git a/Doc/html/struct_h_f___stack_frame__t.html b/Doc/html/struct_h_f___stack_frame__t.html index 10afeb7..7b3739c 100644 --- a/Doc/html/struct_h_f___stack_frame__t.html +++ b/Doc/html/struct_h_f___stack_frame__t.html @@ -3,7 +3,7 @@ - + MyLibs: HF_StackFrame_t Struct Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    @@ -112,39 +106,31 @@ $(function(){initNavTree('struct_h_f___stack_frame__t.html',''); initResizable()

    #include <trace.h>

    - - - - - - - - -

    +

    Public Attributes

    uint32_t r0
     Регистр R0.
     
    uint32_t r1
     Регистр R1.
     
    uint32_t r2
     Регистр R2.
     
    uint32_t r3
     Регистр R3.
     
    uint32_t r12
     Регистр R12.
     
    uint32_t lr
     Link Register.
     
    uint32_t pc
     Program Counter.
     
    uint32_t psr
     Program Status Register.
     
    -

    Detailed Description

    +

    Detailed Description

    Контекст стек-фрейма процессора при HardFault.

    Сохраняет регистры R0-R3, R12, LR, PC, PSR для последующего анализа.

    -

    Definition at line 463 of file trace.h.

    -

    Member Data Documentation

    +

    Definition at line 476 of file trace.h.

    +

    Member Data Documentation

    ◆ r0

    @@ -159,7 +145,7 @@ Public Attributes

    Регистр R0.

    -

    Definition at line 464 of file trace.h.

    +

    Definition at line 477 of file trace.h.

    @@ -177,7 +163,7 @@ Public Attributes

    Регистр R1.

    -

    Definition at line 465 of file trace.h.

    +

    Definition at line 478 of file trace.h.

    @@ -195,7 +181,7 @@ Public Attributes

    Регистр R2.

    -

    Definition at line 466 of file trace.h.

    +

    Definition at line 479 of file trace.h.

    @@ -213,7 +199,7 @@ Public Attributes

    Регистр R3.

    -

    Definition at line 467 of file trace.h.

    +

    Definition at line 480 of file trace.h.

    @@ -231,7 +217,7 @@ Public Attributes

    Регистр R12.

    -

    Definition at line 468 of file trace.h.

    +

    Definition at line 481 of file trace.h.

    @@ -249,7 +235,7 @@ Public Attributes

    Link Register.

    -

    Definition at line 469 of file trace.h.

    +

    Definition at line 482 of file trace.h.

    @@ -267,7 +253,7 @@ Public Attributes

    Program Counter.

    -

    Definition at line 470 of file trace.h.

    +

    Definition at line 483 of file trace.h.

    @@ -285,20 +271,28 @@ Public Attributes

    Program Status Register.

    -

    Definition at line 471 of file trace.h.

    +

    Definition at line 484 of file trace.h.


    The documentation for this struct was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/trace.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/trace.h
    + + diff --git a/Doc/html/struct_r_t_t___flash_header__t-members.html b/Doc/html/struct_r_t_t___flash_header__t-members.html index 47d5610..f48c46e 100644 --- a/Doc/html/struct_r_t_t___flash_header__t-members.html +++ b/Doc/html/struct_r_t_t___flash_header__t-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { + diff --git a/Doc/html/struct_r_t_t___flash_header__t.html b/Doc/html/struct_r_t_t___flash_header__t.html index cc17867..5a3cd42 100644 --- a/Doc/html/struct_r_t_t___flash_header__t.html +++ b/Doc/html/struct_r_t_t___flash_header__t.html @@ -3,7 +3,7 @@ - + MyLibs: RTT_FlashHeader_t Struct Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    @@ -112,23 +106,20 @@ $(function(){initNavTree('struct_r_t_t___flash_header__t.html',''); initResizabl

    #include <trace.h>

    - - - -

    +

    Public Attributes

    uint32_t tag
     Уникальный идентификатор буфера
     
    uint32_t size
     Размер данных
     
    char data [1024]
     Буфер RTT.
     
    -

    Detailed Description

    +

    Detailed Description

    Структура RTT, которая будет положена в Flash.

    -

    Definition at line 180 of file trace.h.

    -

    Member Data Documentation

    +

    Definition at line 193 of file trace.h.

    +

    Member Data Documentation

    ◆ tag

    @@ -143,7 +134,7 @@ Public Attributes

    Уникальный идентификатор буфера

    -

    Definition at line 181 of file trace.h.

    +

    Definition at line 194 of file trace.h.

    @@ -161,7 +152,7 @@ Public Attributes

    Размер данных

    -

    Definition at line 182 of file trace.h.

    +

    Definition at line 195 of file trace.h.

    @@ -179,20 +170,28 @@ Public Attributes

    Буфер RTT.

    -

    Definition at line 183 of file trace.h.

    +

    Definition at line 196 of file trace.h.


    The documentation for this struct was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/trace.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/trace.h
    + + diff --git a/Doc/html/struct_s_p_i___settings_type_def-members.html b/Doc/html/struct_s_p_i___settings_type_def-members.html index dc63a06..4a1c06c 100644 --- a/Doc/html/struct_s_p_i___settings_type_def-members.html +++ b/Doc/html/struct_s_p_i___settings_type_def-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { + diff --git a/Doc/html/struct_s_p_i___settings_type_def.html b/Doc/html/struct_s_p_i___settings_type_def.html index 4499565..7bfb07d 100644 --- a/Doc/html/struct_s_p_i___settings_type_def.html +++ b/Doc/html/struct_s_p_i___settings_type_def.html @@ -3,7 +3,7 @@ - + MyLibs: SPI_SettingsTypeDef Struct Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    SPI_SettingsTypeDef Struct Reference
    +
    SPI_SettingsTypeDef Struct Reference
    + +

    Структура настроек SPI. + More...

    + +

    #include <general_spi.h>

    - - + - + - + - + - + - + - + - + - + - + + + + +

    +

    Public Attributes

    SPI_HandleTypeDef hspi
     
     HAL handle SPI.
    GPIO_TypeDef * CLK_GPIOx
     
     Порт CLK.
    uint32_t CLK_PIN
     
     Пин CLK.
    uint32_t CLK_GPIO_AlternageFunc
     
     Альтернативная функция для CLK.
    GPIO_TypeDef * MISO_GPIOx
     
     Порт MISO.
    uint32_t MISO_PIN
     
     Пин MISO.
    uint32_t MISO_GPIO_AlternageFunc
     
     Альтернативная функция для MISO.
    GPIO_TypeDef * MOSI_GPIOx
     
     Порт MOSI.
    uint32_t MOSI_PIN
     
     Пин MOSI.
    uint32_t MOSI_GPIO_AlternageFunc
     
     Альтернативная функция для MOSI.
    DMA_Stream_TypeDef * DMAChannel
     Канал DMA (NULL если не нужен)
    uint32_t DMA_CHANNEL_X
     Номер канала DMA (0 если не нужен)
    -

    Detailed Description

    -
    -

    Definition at line 33 of file __general_spi.h.

    -

    Member Data Documentation

    +

    Detailed Description

    +

    Структура настроек SPI.

    +

    Содержит все необходимые параметры для инициализации SPI, включая GPIO и DMA.

    + +

    Definition at line 103 of file general_spi.h.

    +

    Member Data Documentation

    ◆ hspi

    @@ -146,7 +151,9 @@ Public Attributes
    -

    Definition at line 35 of file __general_spi.h.

    +

    HAL handle SPI.

    + +

    Definition at line 105 of file general_spi.h.

    @@ -162,7 +169,9 @@ Public Attributes
    -

    Definition at line 37 of file __general_spi.h.

    +

    Порт CLK.

    + +

    Definition at line 107 of file general_spi.h.

    @@ -178,7 +187,9 @@ Public Attributes
    -

    Definition at line 38 of file __general_spi.h.

    +

    Пин CLK.

    + +

    Definition at line 108 of file general_spi.h.

    @@ -194,7 +205,9 @@ Public Attributes
    -

    Definition at line 39 of file __general_spi.h.

    +

    Альтернативная функция для CLK.

    + +

    Definition at line 109 of file general_spi.h.

    @@ -210,7 +223,9 @@ Public Attributes
    -

    Definition at line 41 of file __general_spi.h.

    +

    Порт MISO.

    + +

    Definition at line 111 of file general_spi.h.

    @@ -226,7 +241,9 @@ Public Attributes
    -

    Definition at line 42 of file __general_spi.h.

    +

    Пин MISO.

    + +

    Definition at line 112 of file general_spi.h.

    @@ -242,7 +259,9 @@ Public Attributes
    -

    Definition at line 43 of file __general_spi.h.

    +

    Альтернативная функция для MISO.

    + +

    Definition at line 113 of file general_spi.h.

    @@ -258,7 +277,9 @@ Public Attributes
    -

    Definition at line 45 of file __general_spi.h.

    +

    Порт MOSI.

    + +

    Definition at line 115 of file general_spi.h.

    @@ -274,7 +295,9 @@ Public Attributes
    -

    Definition at line 46 of file __general_spi.h.

    +

    Пин MOSI.

    + +

    Definition at line 116 of file general_spi.h.

    @@ -290,20 +313,66 @@ Public Attributes
    -

    Definition at line 47 of file __general_spi.h.

    +

    Альтернативная функция для MOSI.

    + +

    Definition at line 117 of file general_spi.h.

    + +
    + + +

    ◆ DMAChannel

    + +
    +
    + + + + +
    DMA_Stream_TypeDef* SPI_SettingsTypeDef::DMAChannel
    +
    + +

    Канал DMA (NULL если не нужен)

    + +

    Definition at line 119 of file general_spi.h.

    + +
    +
    + +

    ◆ DMA_CHANNEL_X

    + +
    +
    + + + + +
    uint32_t SPI_SettingsTypeDef::DMA_CHANNEL_X
    +
    + +

    Номер канала DMA (0 если не нужен)

    + +

    Definition at line 120 of file general_spi.h.


    The documentation for this struct was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/__general_spi.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_spi.h
    + + diff --git a/Doc/html/struct_t_i_m___encoder_type_def-members.html b/Doc/html/struct_t_i_m___encoder_type_def-members.html index 430b6ed..0519215 100644 --- a/Doc/html/struct_t_i_m___encoder_type_def-members.html +++ b/Doc/html/struct_t_i_m___encoder_type_def-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { + diff --git a/Doc/html/struct_t_i_m___encoder_type_def.html b/Doc/html/struct_t_i_m___encoder_type_def.html index 68dc357..564f84b 100644 --- a/Doc/html/struct_t_i_m___encoder_type_def.html +++ b/Doc/html/struct_t_i_m___encoder_type_def.html @@ -3,7 +3,7 @@ - + MyLibs: TIM_EncoderTypeDef Struct Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    TIM_EncoderTypeDef Struct Reference
    @@ -111,58 +105,48 @@ $(function(){initNavTree('struct_t_i_m___encoder_type_def.html',''); initResizab More...

    #include <general_tim.h>

    -
    - + Collaboration diagram for TIM_EncoderTypeDef:
    +
    Collaboration diagram for TIM_EncoderTypeDef:
    - - - - - - - - - -

    +

    Public Attributes

    int16_t Encoder_Diff
     Считанная разница
     
    uint16_t Encoder_Shdw
     Последние считанные тики
     
    TIM_HandleTypeDef * htim
     Указатель на HAL handle таймера
     
    TIM_Encoder_InitTypeDef sConfig
     Указатель на структуру настройки энкодера
     
    GPIO_TypeDef * GPIOx
     Порт, куда подключается энкодер
     
    uint32_t GPIO_PIN_TI1
     Пин, куда подключается канал TI1.
     
    uint32_t GPIO_PIN_TI2
     Пин, куда подключается канал TI2.
     
    uint32_t GPIO_PIN_SW
     Пин, куда кнопка энкодера (если есть)
     
    GPIO_SwitchTypeDef Sw
     Структура кнопки
     
    -

    Detailed Description

    +

    Detailed Description

    Структура инициализации енкодера


    Содержит все базовые структуры, которые нужны для инициализации таймера. Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами

    Также высокоуровневые настройки частоты работы таймера. Если какая-либо высокоуровневая настройка не задана, то по возможности берется низкоуровневая настройка из структур

    -

    Definition at line 140 of file general_tim.h.

    -

    Member Data Documentation

    +

    Definition at line 141 of file general_tim.h.

    +

    Member Data Documentation

    ◆ Encoder_Diff

    @@ -177,7 +161,7 @@ Public Attributes

    Считанная разница

    -

    Definition at line 142 of file general_tim.h.

    +

    Definition at line 143 of file general_tim.h.

    @@ -195,7 +179,7 @@ Public Attributes

    Последние считанные тики

    -

    Definition at line 143 of file general_tim.h.

    +

    Definition at line 144 of file general_tim.h.

    @@ -213,7 +197,7 @@ Public Attributes

    Указатель на HAL handle таймера

    -

    Definition at line 145 of file general_tim.h.

    +

    Definition at line 146 of file general_tim.h.

    @@ -231,7 +215,7 @@ Public Attributes

    Указатель на структуру настройки энкодера

    -

    Definition at line 146 of file general_tim.h.

    +

    Definition at line 147 of file general_tim.h.

    @@ -249,7 +233,7 @@ Public Attributes

    Порт, куда подключается энкодер

    -

    Definition at line 148 of file general_tim.h.

    +

    Definition at line 149 of file general_tim.h.

    @@ -267,7 +251,7 @@ Public Attributes

    Пин, куда подключается канал TI1.

    -

    Definition at line 149 of file general_tim.h.

    +

    Definition at line 150 of file general_tim.h.

    @@ -285,7 +269,7 @@ Public Attributes

    Пин, куда подключается канал TI2.

    -

    Definition at line 150 of file general_tim.h.

    +

    Definition at line 151 of file general_tim.h.

    @@ -303,7 +287,7 @@ Public Attributes

    Пин, куда кнопка энкодера (если есть)

    -

    Definition at line 151 of file general_tim.h.

    +

    Definition at line 152 of file general_tim.h.

    @@ -321,20 +305,28 @@ Public Attributes

    Структура кнопки

    -

    Definition at line 153 of file general_tim.h.

    +

    Definition at line 154 of file general_tim.h.


    The documentation for this struct was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_tim.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_tim.h
    + + diff --git a/Doc/html/struct_t_i_m___encoder_type_def__coll__graph.map b/Doc/html/struct_t_i_m___encoder_type_def__coll__graph.map index 23c67d8..7e20fbf 100644 --- a/Doc/html/struct_t_i_m___encoder_type_def__coll__graph.map +++ b/Doc/html/struct_t_i_m___encoder_type_def__coll__graph.map @@ -1,5 +1,5 @@ - + - + diff --git a/Doc/html/struct_t_i_m___encoder_type_def__coll__graph.md5 b/Doc/html/struct_t_i_m___encoder_type_def__coll__graph.md5 index 3bf5ef6..b7fa754 100644 --- a/Doc/html/struct_t_i_m___encoder_type_def__coll__graph.md5 +++ b/Doc/html/struct_t_i_m___encoder_type_def__coll__graph.md5 @@ -1 +1 @@ -941563dd38300d4589813f0d77aba757 \ No newline at end of file +2ea4c5426996fe33f0078eba5fb4ab62 \ No newline at end of file diff --git a/Doc/html/struct_t_i_m___encoder_type_def__coll__graph.png b/Doc/html/struct_t_i_m___encoder_type_def__coll__graph.png index c4f904c1688d4a4f298f1deac6e56bfa2a85c2c4..9ea81a6f632fc408621bb84f9ff0b07ef7ce0e93 100644 GIT binary patch delta 1834 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 diff --git a/Doc/html/struct_t_i_m___settings_type_def-members.html b/Doc/html/struct_t_i_m___settings_type_def-members.html index ccfa745..d78d7ea 100644 --- a/Doc/html/struct_t_i_m___settings_type_def-members.html +++ b/Doc/html/struct_t_i_m___settings_type_def-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { + diff --git a/Doc/html/struct_t_i_m___settings_type_def.html b/Doc/html/struct_t_i_m___settings_type_def.html index 32bf216..175625a 100644 --- a/Doc/html/struct_t_i_m___settings_type_def.html +++ b/Doc/html/struct_t_i_m___settings_type_def.html @@ -3,7 +3,7 @@ - + MyLibs: TIM_SettingsTypeDef Struct Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    TIM_SettingsTypeDef Struct Reference
    @@ -112,50 +106,38 @@ $(function(){initNavTree('struct_t_i_m___settings_type_def.html',''); initResiza

    #include <general_tim.h>

    - - - - - - - - + - - + - - -

    +

    Public Attributes

    TIM_HandleTypeDef htim
     HAL handle таймера
     
    TIM_ClockConfigTypeDef sClockSourceConfig
     Настройки тактирования таймера
     
    TIM_SlaveConfigTypeDef sSlaveConfig
     Настройки слейв режима таймера
     
    TIM_MasterConfigTypeDef sMasterConfig
     Настройки мастер режима таймера
     
    TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig
     Настройки дедтаймов таймера
     
    TIM_ITModeTypeDef sTimMode
     Настройки прерывания таймера
    -
     
     Настройки прерывания таймера
    TIM_MHzTickBaseTypeDef sTickBaseUS
     Длительность одного тика
    -
     
     Длительность одного тика
    uint8_t sTickBasePrescaler
     Дополнительный делитель, для удобного деления sTickBaseUS.
     
    float sTimAHBFreqMHz
     Частота шины тактирования таймера
     
    float sTimFreqHz
     Желаемая частота таймера
     
    -

    Detailed Description

    +

    Detailed Description

    Структура инициализации таймера


    Содержит все базовые структуры, которые нужны для инициализации таймера. Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами

    Также высокоуровневые настройки частоты работы таймера. Если какая-либо высокоуровневая настройка не задана, то по возможности берется низкоуровневая настройка из структур

    -

    Definition at line 112 of file general_tim.h.

    -

    Member Data Documentation

    +

    Definition at line 113 of file general_tim.h.

    +

    Member Data Documentation

    ◆ htim

    @@ -170,7 +152,7 @@ Public Attributes

    HAL handle таймера

    -

    Definition at line 114 of file general_tim.h.

    +

    Definition at line 115 of file general_tim.h.

    @@ -188,7 +170,7 @@ Public Attributes

    Настройки тактирования таймера

    -

    Definition at line 115 of file general_tim.h.

    +

    Definition at line 116 of file general_tim.h.

    @@ -206,7 +188,7 @@ Public Attributes

    Настройки слейв режима таймера

    -

    Definition at line 116 of file general_tim.h.

    +

    Definition at line 117 of file general_tim.h.

    @@ -224,7 +206,7 @@ Public Attributes

    Настройки мастер режима таймера

    -

    Definition at line 117 of file general_tim.h.

    +

    Definition at line 118 of file general_tim.h.

    @@ -242,7 +224,7 @@ Public Attributes

    Настройки дедтаймов таймера

    -

    Definition at line 118 of file general_tim.h.

    +

    Definition at line 119 of file general_tim.h.

    @@ -258,10 +240,9 @@ Public Attributes
    -

    Настройки прерывания таймера
    -

    +

    Настройки прерывания таймера

    -

    Definition at line 120 of file general_tim.h.

    +

    Definition at line 121 of file general_tim.h.

    @@ -277,10 +258,9 @@ Public Attributes
    -

    Длительность одного тика
    -

    +

    Длительность одного тика

    -

    Definition at line 121 of file general_tim.h.

    +

    Definition at line 122 of file general_tim.h.

    @@ -298,7 +278,7 @@ Public Attributes

    Дополнительный делитель, для удобного деления sTickBaseUS.

    -

    Definition at line 122 of file general_tim.h.

    +

    Definition at line 123 of file general_tim.h.

    @@ -316,7 +296,7 @@ Public Attributes

    Частота шины тактирования таймера

    -

    Definition at line 123 of file general_tim.h.

    +

    Definition at line 124 of file general_tim.h.

    @@ -334,20 +314,28 @@ Public Attributes

    Желаемая частота таймера

    -

    Definition at line 124 of file general_tim.h.

    +

    Definition at line 125 of file general_tim.h.


    The documentation for this struct was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_tim.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_tim.h
    + + diff --git a/Doc/html/struct_u_a_r_t___settings_type_def-members.html b/Doc/html/struct_u_a_r_t___settings_type_def-members.html index 95a4d63..85a66a1 100644 --- a/Doc/html/struct_u_a_r_t___settings_type_def-members.html +++ b/Doc/html/struct_u_a_r_t___settings_type_def-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { + diff --git a/Doc/html/struct_u_a_r_t___settings_type_def.html b/Doc/html/struct_u_a_r_t___settings_type_def.html index 43f2851..37b728c 100644 --- a/Doc/html/struct_u_a_r_t___settings_type_def.html +++ b/Doc/html/struct_u_a_r_t___settings_type_def.html @@ -3,7 +3,7 @@ - + MyLibs: UART_SettingsTypeDef Struct Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    - -
    UART_SettingsTypeDef Struct Reference
    +
    UART_SettingsTypeDef Struct Reference
    + +

    Структура настроек UART. + More...

    + +

    #include <general_uart.h>

    - - + - + - + - + - + - +

    +

    Public Attributes

    UART_HandleTypeDef huart
     
     HAL handle UART.
    GPIO_TypeDef * GPIOx
     
     Порт для UART.
    uint16_t GPIO_PIN_RX
     
     Пин приема
    uint16_t GPIO_PIN_TX
     
     Пин передачи
    DMA_Stream_TypeDef * DMAChannel
     
     Канал DMA (NULL если не нужен)
    uint32_t DMA_CHANNEL_X
     
     Номер канала DMA (0 если не нужен)
    -

    Detailed Description

    -
    -

    Definition at line 45 of file __general_uart.h.

    -

    Member Data Documentation

    +

    Detailed Description

    +

    Структура настроек UART.

    +

    Содержит все необходимые параметры для инициализации UART, включая GPIO и DMA.

    + +

    Definition at line 96 of file general_uart.h.

    +

    Member Data Documentation

    ◆ huart

    @@ -138,7 +139,9 @@ Public Attributes
    -

    Definition at line 47 of file __general_uart.h.

    +

    HAL handle UART.

    + +

    Definition at line 98 of file general_uart.h.

    @@ -154,7 +157,9 @@ Public Attributes
    -

    Definition at line 49 of file __general_uart.h.

    +

    Порт для UART.

    + +

    Definition at line 100 of file general_uart.h.

    @@ -170,7 +175,9 @@ Public Attributes
    -

    Definition at line 50 of file __general_uart.h.

    +

    Пин приема

    + +

    Definition at line 101 of file general_uart.h.

    @@ -186,7 +193,9 @@ Public Attributes
    -

    Definition at line 51 of file __general_uart.h.

    +

    Пин передачи

    + +

    Definition at line 102 of file general_uart.h.

    @@ -202,7 +211,9 @@ Public Attributes
    -

    Definition at line 53 of file __general_uart.h.

    +

    Канал DMA (NULL если не нужен)

    + +

    Definition at line 104 of file general_uart.h.

    @@ -218,20 +229,30 @@ Public Attributes
    -

    Definition at line 54 of file __general_uart.h.

    +

    Номер канала DMA (0 если не нужен)

    + +

    Definition at line 105 of file general_uart.h.


    The documentation for this struct was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/__general_uart.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/general_uart.h
    + + diff --git a/Doc/html/tabs.css b/Doc/html/tabs.css index fe4854a..84f33ae 100644 --- a/Doc/html/tabs.css +++ b/Doc/html/tabs.css @@ -1 +1 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-color:var(--nav-menu-background-color)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;line-height:36px;text-decoration:none;color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-color:var(--nav-menu-background-color);line-height:36px}.sm-dox a span.sub-arrow{top:15px;right:10px;box-sizing:content-box;padding:0;margin:0;display:inline-block;width:5px;height:5px;background-color:var(--nav-menu-background-color);border-right:2px solid var(--nav-arrow-color);border-bottom:2px solid var(--nav-arrow-color);transform:rotate(45deg);-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 6px}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px !important}.sm-dox a:hover span.sub-arrow{background-color:var(--nav-menu-active-bg);border-right:2px solid var(--nav-arrow-selected-color);border-bottom:2px solid var(--nav-arrow-selected-color)}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0;padding:3px}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{transform:rotate(-45deg)}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:6px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:6px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/Doc/html/topics.html b/Doc/html/topics.html index 3bcb61d..8fdffb3 100644 --- a/Doc/html/topics.html +++ b/Doc/html/topics.html @@ -3,7 +3,7 @@ - + MyLibs: Topics @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    Here is a list of all topics with brief descriptions:
    [detail level 12345]
    - - + + - + - + - - - + + + - - - - - - + + + + + + + + + +
     My LibsВсе используемые MyLibs библиотеки
     ConfigsКонфигурации для библиотек MyLibs
     My LibsВсе используемые MyLibs библиотеки
     ConfigsКонфигурации для библиотек MyLibs
     Trace configsКонфигурация трекеров и трассировки
     Evolve configsКонфигурация однослойного персептрона и алгоритма обучения
     Libraries configsПодключение различных модулей библиотеки
     General ToolsОбщие макросы и typedef'ы, используемые по всему проекту
     General ToolsОбщие макросы и typedef'ы, используемые по всему проекту
     Bit access definesМакросы и typedef'ы для работы с битами в unsigned типах
     Evolve optimizerБиблиотека для эволюционного подбора параметров
     Error Handler definesДефайны для обработки ошибок
     Delays definesМакросы и определения для работы с задержками в миллисекундах
     Utils definesОбщие вспомогательные макросы
     Trace definesДефайны для работы с трассировкой
     Trace definesДефайны для работы с трассировкой
     Serial trace definesДефайны для работы с serial трассировкой (SWO, RTT)
     GPIO trace definesДефайны для работы с GPIO трассировкой
     Flash RTT BufferМакросы и функции для сохранения/чтения RTT буфера в Flash
     Hardfault trace definesМодуль трассировки HardFault с возможностью сохранения RTT буфера во Flash
     Trackers definesДефайны для работы с трекерами
     PeripheralМодули для управления периферией
     GPIO ToolsФункции и макросы для удобной работы с GPIO
     General toolsОбщие функции/макросы для работы с GPIO
     PeripheralМодули для управления периферией
     GPIO ToolsФункции и макросы для удобной работы с GPIO
     General toolsОбщие функции/макросы для работы с GPIO
     Init definesНастройка состояний кнопок и количества тиков в периоде ШИМ
     Switch toolsФункции для работы с GPIO, как с кнопкой
     LED toolsФункции для работы с GPIO, для управления светодиодом
     TIM ToolsФункции и макросы для удобной работы с TIM
     PWM/OC Channels toolsФункции для инициализации базовых функций каналов таймера
     Encoder toolsФункции для считывания энкодера
     Delay toolsФункции для формирования задержек с помощью таймеров
     General toolsФункции для базовой инициализации таймеров
     Init definesНастройка таймеров
     SPI ToolsФункции и макросы для удобной работы с SPI
     Init definesНастройка SPI
     TIM ToolsФункции и макросы для удобной работы с TIM
     General toolsФункции для базовой инициализации таймеров
     Init definesНастройка таймеров
     Delay toolsФункции для формирования задержек с помощью таймеров
     PWM/OC Channels toolsФункции для инициализации базовых функций каналов таймера
     Encoder toolsФункции для считывания энкодера
     UART ToolsФункции и макросы для удобной работы с UART
     Init definesНастройка UART
    +
    diff --git a/Doc/html/trace_8h.html b/Doc/html/trace_8h.html index cb80436..65e6345 100644 --- a/Doc/html/trace_8h.html +++ b/Doc/html/trace_8h.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/trace.h File Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/trace.h File Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    trace.h File Reference
    @@ -113,14 +106,13 @@ $(function(){initNavTree('trace_8h.html',''); initResizable(); });
    #include "mylibs_defs.h"
    #include <string.h>
    #include "SEGGER_RTT.h"
    -
    - + Include dependency graph for trace.h:
    +
    Include dependency graph for trace.h:
    -
    - + This graph shows which files directly or indirectly include this file:
    +
    This graph shows which files directly or indirectly include this file:

    Go to the source code of this file.

    - - + - - + -

    +

    Classes

    struct  RTT_FlashHeader_t
    struct  RTT_FlashHeader_t
     Структура RTT, которая будет положена в Flash. More...
     
    struct  HF_StackFrame_t
    struct  HF_StackFrame_t
     Контекст стек-фрейма процессора при HardFault. More...
     
    - - + - - - - + + - - + -

    +

    Macros

    #define my_printf(...)   SEGGER_RTT_printf(0, __VA_ARGS__)
    #define my_printf(...)
     Универсальный макрос для вывода трассировки
     
    #define log_printf(TAG, fmt, ...)
     Макрос логирования с поддержкой уровней LOG_LEVEL.
     
    #define TRACE_GPIO_SET(_gpio_, _pin_)   (_gpio_)->BSRR = (((_pin_)))
     Макрос логирования с поддержкой уровней LOG_LEVEL.
    #define TRACE_GPIO_SET(_gpio_, _pin_)
     Установить указанную ножку GPIO.
     
    #define TRACE_GPIO_RESET(_gpio_, _pin_)   (_gpio_)->BSRR = ((_pin_)<<16)
    #define TRACE_GPIO_RESET(_gpio_, _pin_)
     Сбросить указанную ножку GPIO.
     
    - - - - - - -

    +

    Functions

    __STATIC_FORCEINLINE void RTT_FlashPrepare (void)
     Подготовка Flash к записи
     
    __STATIC_FORCEINLINE int RTT_SaveToFlash (uint32_t tag, uint32_t tail_size)
     Сохраняет последние символы RTT-буфера в Flash по тегу
     
    __STATIC_FORCEINLINE int RTT_ReadFromFlash (uint32_t tag, char *Buffer, uint32_t tail_size, uint32_t *read_size)
     Читает последние символы RTT-буфера из Flash по тегу
     
    __STATIC_FORCEINLINE int RTT_EraseFlash (void)
     Стирание сектора Flash с RTT-буфером
     
    __STATIC_FORCEINLINE int HF_CheckRecovered (int erase)
     Проверка и вывод последнего HardFault-трейса из Flash.
     
    __STATIC_FORCEINLINE void HF_HandleFault (void)
     Обработчик HardFault.
     
    -

    Detailed Description

    +

    Detailed Description

    Заголочный файл для работы с трассировкой.

    Definition in file trace.h.

    + +
    diff --git a/Doc/html/trace_8h__dep__incl.map b/Doc/html/trace_8h__dep__incl.map index a3f2a35..77208d6 100644 --- a/Doc/html/trace_8h__dep__incl.map +++ b/Doc/html/trace_8h__dep__incl.map @@ -1,5 +1,5 @@ - - - - + + + + diff --git a/Doc/html/trace_8h__dep__incl.md5 b/Doc/html/trace_8h__dep__incl.md5 index 7cae4e3..92c640d 100644 --- a/Doc/html/trace_8h__dep__incl.md5 +++ b/Doc/html/trace_8h__dep__incl.md5 @@ -1 +1 @@ -99f98c0a88d15e48ceee0c0796ad19d5 \ No newline at end of file +6db45c82fbfd5a7b1d1cecc0d0fad259 \ No newline at end of file diff --git a/Doc/html/trace_8h__dep__incl.png b/Doc/html/trace_8h__dep__incl.png index c8c439c61f27b788c3adddd94114b0beb05185f8..085fac82189f8f956d1aeb6273c91d73967a93d7 100644 GIT binary patch literal 2854 zcmb`Jdpr|*AIEj-K?xZ}E|oP*lyFKjmuQ)}_MlXTkVdYHAq(AW<+e4KC>$}VHn|LQ zna;tsrmT=To6&Q2kr<63_s4n8>v^8nIsZMc*YohM|9;Bas~#yRY~v$fPJSs*q=Jqb z1NhE2GHdSLW1B)wKFHkC{F9S%M6_;|lZKY71^@uM3v$&;NAkXDi!Aodbsp+d^xaP| z_PcR&OmRn^*{n6p3I>+V_V6p?V;e@AtfAJZbcYN_Lip&aC3dQ}q!pEsY5v1T3JN)g ztV`piJgS9GSP4aA`-c{^{wN(SWCU0B_x5UAG3;V8ueKx49`~m_U|CdYdVxOnihBy` z;hW{6&z~=#mq_vYZ>moKHo1W`%3%M+V8F0pBcF^JSzBBC+A}9B6B3UeEP;=$NO&ArnUGJM>gWL8lQ)PtL9{h=lJqdl!p^J!; z#er)^(KEE~7L;E^3=|ithzr#|y((ru(@IvgGXX4Q-HS9?8ZL{F@+?HzVeYAjeRwy7 zR%%+UUs5xP8OvcN>KWPcP6HM}iDZB&e3*P7Da=r^=#^Os>jS--J~}879|I#tF-2b- z&~n{m6|e2;qkKMgL}%9a*39*L2KxG}W7+;S!5wQKSZ63W1tWs;Dd2xlIf-Zx#F8^E zKM<^~EVN_yWeJAp`h*e zq!=+U)CwHvylzIFd?9ho2X{DdWPT}!tQi;%_kaNUyj6)MwDrb{BsI7z(PoXWJ`nfQ zm)}%%rZFZebdz^#E+8kd@us1N(33~3OTZQN2~YB)K7F0-iXJx?0RRhq7aaMhV8aRV z6#o(dEb_PJ7I#w{kiE2u`_P5mSE`@5lW}?~y6vTTNE_S1bb+tAW)C$dl!*~Lm_7Zf zr($TM8QN2tYk7ROh)10*kdW<}Xln3Rb0Rdh6dhQ-)HimoYnSh~OcPsi>H+ltW(shh zCI-@UM(X*Ckgg?RQCQ3@K!C@tZo({=tZFT|s_cY^S2d!oZ_w^m^5O>kU zf&(YFD6wgbw(k=%>#?IVaT<%FUnZXknWA5!IECxPY?Y*qD6`*P=q5mvdA&_Bc1A#u zUD$X{p_2$c_}Jy5uqfvMcuaSu--e+AzqN8AbCwx%%psrCG5=~2Rr}_1*W>4gd(~z( z*W*LNYeN#wl$Zf_wB^E7cW1R7%dWEo-g6P1a-mrO;a2R`oGM)O_T=#*X9)Lx=}O2- zm#lTB&SSZYg$gGYbhBPsu{(?(=AcRl{uwe%f}h=~C&vLtqNix77+_YqocOtJnScf}~%2&tCfcaDh!m+oJa3D0J_Dni8=1 zy<}{8dAXz53knU6(7F4NQ8*pkl30zr__}o+i?;||DQ9)_@OCq?f)=CB!^2t{$pC3| z6MxcalYOmt3m0}BfY<`Y{|V>f(Dx2Yx~%y*S;FR)scVlbBMtkV-{w0k}^tMzZ6D7Zm2c4V4e;NVev;slU~`gPonJ2x0BC_I+d@scz5 zV8X@K8{Gsx2beRKI73J$j!ckdz}JgVF(ZBU;{qiI9Qj_?xn{g*3yooT`#UR+d9*L)>M9e0qVwNbk1 zJ9KHiv>ej#lzKK)vPjYNEm`tVSxl$*L<-fiOfbO|X_LN0A~oXXR|c)06` zD!qWV)t+*92r=PbKOR#IbGOhXMccr!jTvJ@XU31Z)o=;1kDkM6HNMSiFP`;)*o#^v zn>BuF@cR&3~quiFvDOOfVyGPwvn z7?BYb{EaN19A7CgoI(8cY89}R1YJTex2a|)^^}{t)Cu!VnDk=T+8Xj_7WG?@lWl&>RHMMWgyRoeY&EGb28Ik6u~Zz$t!!YEM|lJ8 z-*WlKb~2H5N17C1rB)VTLWt03Hk}k*zH|1vB#pTD_bu~!&dT19He8CEc{Jm9A92zP JMsdDy^Pk))jgbHV literal 3376 zcmcJSc{Cf?8o<*Ur3j{DFKTqsnxYzeYSd0i?Hx&pCA8HvD2b)kYHO(yw1^hbHN{9W zv4&b}Eh%Y3X|1(HD#Q{?YOAL+Z_at|o%!p%^X@(O`_B39ANSt#Ex+%kI62q=MHEB; z007YTtfkAI9@tyW!Uy)`^#DTgo;u(QwXp>3ew&XQin0IzF_x{R+4<`QT!LdU$VNKZ zas18W13D*)A3yl@l+n>Qq(iV=F=?W>zWCR#P1tptt+l?HLPrQb=fjwDc84l&df!r zWk?x0I5^y;J7>`Z`(ivVi6queCUjHJ%SYQ-!BtrVMtkKmT97UfoXqSdz7Y47C_=&2 z9yy)C}rrLsj=azNP* zBDF18<88@cIXzgg*K(g7P5F}VBfmj3PpiiW1k5!m$b0nqf|*J}xQ2FTUPKZ~C@*P) zlKWxu<#>c9zA#Lv$JXRndF1t=&Aw24!4?Imhg>_CPQUmOsf(D*b5;u@N^l^uEgYf+ zisf0CC$z5XExoE&&1k1$jPVPhPu`XOM6!wu7U)B1`=Si2ON=hQ1G@wsY)>UlLZOCO-Q5n{VFs{uNkK?yZeq4E*1^&7l4576!L_lNPv3!~1^0;=%BISaOD+r~ z1;$gwOr7G@g?#`m`%js^m)3xIy`|HK@fu-XCn_K5NXe+ScYxHmj_y0ukBVsfrzj8) z&nB8jgIxK}o5dxi!4>V|ot2Kh&$X*a+Iv1CvgbIr zaY?SMy5|B_EwI9=E`iw}!1%eKQ~T-Q_khreUt~-zUV7HU)%Bn=#)mLj)h^bel6Y;8 zxd0D!NA=)64}6R2Vqx{^%^pnB0{Ka;IvjK0L_6`flq|F(s-9^j2F%B<@1VG67}A)OhT0IlMc}(0QC~8S zM(!#z3SE8PFWpu9J3Eq)Dih{wWzce{>qg7kt)$U`qa}1J&O?Rh=+6eDB#|UM!|z$V zb%BdHaKU2-y1Z2tXq!^xX`^uRi!R~*5>Z*@^6rR7+pZOuvP49fq3bNzk6rqf?#(4B zPq}OI+4!SB)nqn6*rj;ht=^tUl3p#Is%)4c_%@RwqowiS>((NzQozTx;QN6fT3xK6;#duq-Fs*~K7(;%twL3m$B@{qpn^{M z(S}F8h7PDr4|z;6C{2*Bp(rC2;0zp%%#`gUY+pg?sNi&>1)rG2@$#3;qKzUQEtB@- z_Tc!DF^{2R!mW3z_KQn&Nmxz$eP0`m%x2@Og(g)<(!p{pkUZ<@9fYC;Z;HshX((KZ z^@>ApudDES90}`Y%5`67zO+5HHj_$t54rt%MHLf)nO&I3LcawIm-=^vNZymRnx35I zv?DWf7n042R7mNO8=4#GcVb4rU#&tnXPViGksZ5GmnMqU-ZB7Dw< z#Tj_j?A(h{Q}yOqZVW$rbno|i-sr>>KHN+p4Nl;_y1_!pH#|Kg&q}44++WnwJ*aI8 zCzSsXi43i~*(n?mp{k|3XKR+8&pa}sV8Ty?@&=u!C!FfdroC_MCdX{7v6F7l%7ILu zHcloqkve7dQSL7XIh$c%9wrK~3W(k%o$KjS1jS{@Vi;8L4-~ zZp2JELWlQDln-;`!Y~-#)@+r|?vc4*!(UE|wN~V6c?bE+|Fpz*jPtDJwUviAXGe_3 z!o-tX=Tr~L4BXp^yA~wXJhVKU0NG>L-&}I(B#nJa%zsQL_0DU?@uhsK3~@dD+Wd+~^kfkE7c?=2s!^x_0NA)IBqh_7l zBL^unH;sE>g0VO*7ED595RE*qte!ZCc2*u~4$Vu058<3S;uk{G&U=_I`=V-Q2xZ%d z5Z8r$O6L=#(Z&7JElx!mxVf!@tji^ukmalNLhKFuuVh)wfXM%mXI)0RYDL2kx9&*w z!G~(N&=*Zu=JIGRG{`1`OZ_}+26OR;1nM_2{4Kg-iMm+9*d%tLXWos%CY^4GI_vHn z26wgBGO_q$iPv4LxU%XsB}fT*?(H~s%cbwFIhTGBQ?2*@X%*S}-=HSWI^3NplbF#>jf^F8jnu-hS)8pwD+Ao?)Cyc zlD$n@U}(b9fkgg5f7sR2U=O=iyV-SPndZFN@MT|ezs5uU+1K_%cJi90@a_O|MIiYX zaCeUS>`$@(`>;;#AqrghFpi@d5kOp;lF;MekF z2E%~52E{MOX2B8fii%Eq;?!$8dOufu)z=xeki;1ISqW&{LdpZmD%Jaz2q zhuF4DMe4W`C_alu&*=-cfpTr_kDr$rXTJ^W(WgJzz-(2nY<&%n^-_S=`Ju9B0)K6C z4+A&BEF+S4@5hq&z*nAl{O`b*QHAVXueh(@pPp-Bu-9eik5wP*T!^&Ecj4Th9vNJz zr+_p!-S^06dzcty*%~x=ub=g`z+ay&vMFqT_Mg;K>ZfhyYV+S#gFuDhN~oGoHoC*q zc8m7;N71QYn$$X^8?)7~1k#|0GD8UVwxU7kOH-eBwNY4h?mT*C_lUaxenOOf(G0@j zYQ1|MmV3~C1bZf#veg~B?eUC~8(`6+UrIa-lk|axR$WKF+TIZ+W$0B;%p_L5=l~d? z11u0`f40)XbO4SxFJlDOT@Wx3rpN2`9yFEx1C`o7agCq9)U6_%x;LJ`)h8B=uHyZ( zdwL%b$5Ov>-`(ly?KP*HGl9wFlKuWnEK)gz)DtpQ` z486KjrBcGaWzH_bv=>@ZLM14$@3e$q(6?Ie({@5--B=bNTncCt z0RLz8A8SwDi5q8%$J>Wk!>0@zkE+6Cse(Q^BZFdpemUfpP2Bb6z6{)r5C3McwQ{he InETxN2MPpwLI3~& diff --git a/Doc/html/trace_8h__incl.map b/Doc/html/trace_8h__incl.map index 01eafc0..ccf5247 100644 --- a/Doc/html/trace_8h__incl.map +++ b/Doc/html/trace_8h__incl.map @@ -1,5 +1,5 @@ - - + + diff --git a/Doc/html/trace_8h__incl.md5 b/Doc/html/trace_8h__incl.md5 index 7a1eeb2..ebc32ea 100644 --- a/Doc/html/trace_8h__incl.md5 +++ b/Doc/html/trace_8h__incl.md5 @@ -1 +1 @@ -3a6d24b597cc9be1714ca6f437269dfb \ No newline at end of file +4051482c4be4cefdf69e8f83da6d912d \ No newline at end of file diff --git a/Doc/html/trace_8h__incl.png b/Doc/html/trace_8h__incl.png index bee5a08ace904a95e1ee0011a9c9c912e9da6635..8ff10f6762339faa0f2c8a7d0ab6c90119b53bca 100644 GIT binary patch literal 6855 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 XX}i7G-QRr=`K1I|Iap%MeeV4S%fVVq literal 7065 zcmc&(c{m$u+fP-|I*Q{|sP(9&t-UQ;szi&X#L`-7iL~|zQ56)m99m0JN>Tg16SW1g zq%F0t35i`xk;n;EL51+8@Atmf^_}bc|NCaHnR(`(xt_V7d+y(Fp8GekW+sL_XU?Ai z002DTyLavb04E$-n+z8R%d&8SjAk7;9E}X`0FHmH`5k2`0Dy=I_zuY8SvGAxEJ@TY zWNm9Sz}5P94(eIH8{enzbhF<_7ds|#^*jM*3vJ%(Q9b>TL$0$Sz&d%8v)6L{%+p?` znNs?_@+zrQo$S=!0lhkB>HQJDX(E~}##i`>Cm1;Lg55C^l>MB;>HT-!{0UsP>#gk}g0`s<%gJ9$cxCTx0FT=Q@!BGxvn%vMtosG+=3CtV|# zfQ-~!?@In)XhqKKGdmDz+JR&S$YTgJ6T-oCXzi>?!|U>mjK|;!=b& zbCtG34HO3@W73LOG;1zYF18bP3)3LJ68Y}-moI%{>`+M=)8ZUan-Vp>Us>VjZ#`(T zYeue|5z{V2umRYL5NxgFwQH*R9$b#!A^;qCmI1(aA?Adn3RdRw=8YuJ7K6W3+X2Hd1xBxR&CJ zPZw7A2J|`3+wA;hkRb9#)_G=gc9a){e+|rDJy|@lu-wBD(Xj#nPjt_8--miwJM#qb*C0cs>*rTZiH zw?Fu0T|6dBZ476SvDGrCpk>&>-GcWq#I5f|`q?Qh+xLs^bnG{1#!QX|6`sAUU(+C= z{~9RTRI?jt;j^tpq0jmIhNDSq3Y0*wtsL{yS5kS(red zc1Gtt7#p}qK^(llY4Ady?}Bfaph?&6GqYPL2tfA{yDEU)fX_|3LPFI;Hz%|?Wi@*W zNhHA?1pVZAGzDzubg%nt*DqLIbg3*E;96q)wr^B}EDew!JmDkADc~VyQNBLK`S1=O zZxZOHvIcs!KHA6OAc!yT_P0byC0&hWod5QYHchDAe6aY9^?Y36dc3V60tnKWeZ6km zR~TGO3c^niAsrnfaaCnQ67gNH2_!amp1~Ge5i&Z>Z9a!MPQ`4`;Fue6Evl+`wESRi z1`75^q@WL=BmPA8s(h%G}U?;xuM|>!^KU>aj{&?xDo)7?l0VEw_7)dO%GP*1#zzUMV>-I-rmJi z+;eO*Y!nDp#o;kpT2c_43$dx#Mu{5oRzKa08WfZP+vOD=%NNz79gn-A@pwq{c0>ff<_pM2TG$(e+=}pAZBwz4Jrad zVym~Fldq_J;9BBpvZXz2m~LM-)M1#D??=?1(`jqpBJ!jYI|ILa)Azyx6;Rqo+?yeh z($lvCo?k^Nx=ncefE}CS)<~rUqFHXobYJ+Qkw|sQKs_2*TZZ52*}n> zqWgM>7P|2mh%N26S(FD8oG?l##Tr@OpS5l9=3=>F)G+;Bh$0Fiq(J9i_S{gvu`J@BJu>BUDqzU6q4v-|b^ku#SlxOQds^KU#swuv&Z;Bx zEN^=!Uz4Nsb;qYynu@I4=ChugsP@Jo_$03kB(V#JG1bas$Gw&+>oQ z=(ZH@-RWAZd>RTIh?PW_L!zHMuZM?yf;Qh}q;MbI+gxZOn!G?G-p#cWO}r!;c(Ig# zA=La2-<^^Qn=mLDYj%s>=akpfru^$1JV;}njNUV5dF?ghJUr&dQ$=&a3_`1FN=r6^ zp0GmC0~Hu}DT#g;D}4O9r(FCk-8N$Z6Ou45j4i!9)!Eajio1i8rkH5VtEo~Y7N1NR z-X^_#Dj6g1?ASxfpu2zvDh;TYBRPr zPMqEyQ~P>qwic6TTwAx7MUe#`uTIG@=6C`Qs#v}+@ps=|r<3M6rE@AtO+i6J8>|Qv zdWkeBLMZoJLxY^}M9ZE1sm012N7kM09z>0Y4*~|&?D7a&n07*^2v%0Q&2R2?E~=wq zdct}L<-Q*7U07A9DU|pu=J^+K7{e3N+(HckOJq27J>!pbCfREJx#!0k5DCff?p>(V zFdg~HLs;H*CeI`(-|~s>?gr^>PG=sa7cVALG=v-7bTjtpEg|-JEoa6l@Nw|EI8GX6 z(+33IWJhLiY1lnrjq~NCUqAgFjTb7wxT=lhomis_f?<1^8#&oqywT{>`+vr8&V7rA zS!>M8Q4k3wj1sTSMjUIH^>r(kgB^p65i(3eaM<-5%K-~d`i>uyu}Rty&vc;;Bq}ST zdz1auN@{>}wE?u2p-@q*lCx())l$(a)*f$1Eu(+vjz4xJ*C#1PJOe;Re#)mQlTLso zP?Wr1nRvy0^vNuyr}Mf8cB**u9qRa7e3%Lf(sveg^AT~8=KX|XDYm0s5`yco!=#$7`}$r7NOx}|4-&bUH(-%+Etw{1K8610V|vVR~J zH4&b6PFdfupGxY?NniVIj`vv*)M4L}{4y}$-j!Mu%?+}DYHuU#)AE%5T{6ZfUS7UP z04=I5%C(fdG%!HsuzoG>$?kJn(ZOcAgtN8&3Vvx|JTgvF>CG>oITCd`pSi4%7HX?l zm#`mGi#P>9_P@tjTd9-St*s1jtX?10jh%Y*bznd?#Nhtz(g0s`Q}|N&aa6JVtSl^) zaXi`t!37_jKZrZ5I)76`^oPsN1FQ|cI14ErSaPJ8K5$tg;`)1nwNoKW7oowd*kr2_=4IV>{sf18L)ToW#p4P~@Q#mv2#%zCBu7U3GL^J|hawKrqew$Tv1`it?V8%r-?L7zt%XDrRjkOx-i~)XcC5 z6{s8`MRsx|J431;i2iYeWn5xLhs#*8fwEO=sVN@3Uq1)pV=@-#_7J->N{B}g7<};! zHHQ8vI^Adk|2UM9ldvMUA)n#g!(k{VAW0Y^UEyd)_0hRQRTPQB0y zv@~b;F)+!&Zw~IJ&yv*ITaGH z8H!AdMkB^1GlOC^nv6=zOiVRX-#>$*6RUN|K%lwZvczqD`~-a_-BHWSE_Uh(OX1g~RZPeXN`r2#{N)s&UPfAGGCN9X-;0eT{`> z;3Oi*l;D?;k&Am&q4aAK!iuF3N~~K%-Sg+WHdvCO>dCbgV7tXA)7eBW%>Gr?<*eyC zMLWzP(t*0z9=P2*q%h^X`2G!6dNQPQ96sINa!{8bqOn?^czbgZd9&f$Ib|{Uh(_8- z-gRMY8tC^uMyyVNN)MS#o|Lz${+U5)Usap7Q2!o!8FeDLxK}*b*!1RBcXOjkuD+5- z)6C>rw(rPj``<3gg9w3=T{^*(I_;J>>?Ogwa3q#WPaf0%Exwp!N&+c>tE_79me$b8 zfX96!N6Z5?Ev>8re+TBeHT4s>@=%DD3%&0`BH3<{VTGP8|8XSd53ZFMx$wWL?*G)` z)nx>dp32qM;H5=!Jc$xt28gf!(L7oDL20I_B+>|ywkSafVh{z!_!X_G90?oaD5-D)DKatv9QiEyG89z&k zh_QHWo*q_q<^Uz*GSi!dIlfNA6s{-O^)7h@Y_@cm%qn9ywY+JH<;2=}IBv;c*oe`V zm8lmdMzan!y5^OKEL&;dbIj83qwYMo%h$|#&;CPWl#K@H?aotkHJ1XyE~oZ0R&iHI zYaYEmZ2b+y8{u!xxf(>N^_uMD4Zh)?j)7sJxTf9u*T^UD(VVnDGcCtTcvjmnIv4Sn zsicHzTMzTE3!_irn~O%nE}CD6i3K_jo2R^z{01>Qu<=<5={P9A=ve=P3T;%uK_c?- zygZaIU{>)>am*K^8H00?&6eZduRtLJQG&onG{vFD!Ghr1<7)hSJ2(>huVNxXgKBK+ zFLbuY4_|?hiqm*PRmbNd)fAQ@R6TTh=XKyvxT$5FEjm5Y&xg~e?agOR!E^hJe(e}7 zv2yB)uHD=s9Fu2N77o$Urqy?Bq}Rs<{~4f}{}%N{j`p$KVN>HS;|5@cT5scdmFAl^ zsTow!+D9^_U}eLRV`6_jHmgL(I`qQHep=>HB{H_>vNKfM@ws)Xzui06t^ZQ;v6g)l z4HA3GGRT4QtEl>i8dOb<^c!|<@F771DCoA0fg*8wfkUmv4|`mjhIr`D$J&SAy8@A= z6GIBkAwx%Ep+2>F=*VZGp+_f^k3fs(Qp1neqia*750(rAqR}$k+uPfwEA6qo@21Ue z?uGREN;HH;!xlEjKVH2-4VH5Y@g{2mEJQ-O0enKB-vEE{|9>^!y;RD-n8JA&a>Yv} z>}yvq1PD%U?OeE0bBUD3s>mpOer)BrZ^lmjQQ{g@ehIqDFQJWOq+(oj%q*Y)vkbvH zX~+nJB*VY-A#dvfUg%z1L;QkzaWk*q!_h z@6|+nuxBqz@;YI}X7)JsH^&@&j?!>mt5>GZ^n}|!PDm&l(b=wJ`D+t7}^Z^qddXii-}OZ6BQ z{g-9pZ>8`4-7;hn^)I6(oF(rS6iZ0crjOk&Dxd%4kmxJG*1q?*|hg|=ucHR^2b{)rEjm>gUx0$?gF%hU6 z#xeoSWHLCm9Jxn^Mm&a_7Lic(4Szhne5c7|6C;y>!nFi~6Pr3V$`1?_NfoyMU6-~& zVME3np{w3tw|R#{t*V{g8Z8FE z4zTO?ndj~Bhe*#WCvLnZ`eADGtZte?GB|w7PWp9-y2l-84et`}VPW`>JuR~x8`0If z65$^|@oJti2w)HQ|HxwDQPq)PEpxp_l^bm*b=w|+>@5JPs^o!(0^v{oC93=r|H~h- z%e{%z?_az0CnDm-bV6^UP6O`W{cXvhNHu^?HW$+lYAg?W)#SPV=~&M6Ma>1nCR;Bh z6c2z8@szk{GQwCG^8=KtGkz(W{}5*WrE&frTHgPHt4mj?P8rg6M$>Dg=}z*|KJ@4Z zk-|f&P_&+I&?j={V=oJIC-6fTRpx(J+uY~Z4kWUZAj#@Lb0EN?6yb=p2zUqYBs`TJ z9!*$(E#<)msL%toZ$CYFOxQ^;?N&jyP```}(xP9UMGe8?**w4ZwntZ#@2jD z2ISjH2iZzq9`xah=1tsK`N>C*nvg#*))Ac z#{k^K{N9U;rS7%QS095b@2C8<1qa^-p7`Qf2NiH~a?&UMl|4K%5~XxPH+~>j?F4`& zd!PJ|0{cH3C1;mX<*jpflxgk6eRIM#k*c1&VSQ&F@Trd}HzIG1o+wJZmD$e}ERz{F znvs3Xksp6=R?6herbC1nVBm6tHX5P%~h$>%;dh7k_^% zSASX*k4TFir`eSfCWsSYp - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/trace.h Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/trace.h Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({
    - + + -
    +
    20 - @ref SERIAL_TRACE_ENABLE - Если трассировка отключена, то все дефайны определяются как 'ничего'
    21 и на производительность кода не влияют
    22
    -
    23 - @ref RTT_TRACE_ENABLE - для RTT это будет вызов функции SEGGER_RTT_printf(), с подключением библиотеки SEGGER_RTT.h
    -
    24 Предварительно надо подключить библиотеку SEGGER RTT и вызвать функцию SEGGER_RTT_Init()
    -
    25
    -
    26 - @ref SWO_TRACE_ENABLE для SWO это будет просто printf()
    -
    27
    -
    28 Но библиотеку STDOUT надо подключить самостоятельно:
    -
    29
    -
    30 @verbatim
    -
    31 Manage Run-Time Environment -> Compiler -> I/O -> STDOUT
    -
    32 @endverbatim
    -
    33
    -
    34 Для SWO также надо включить трассировку:
    -
    35
    -
    36 @verbatim
    -
    37 Options For Target -> Debug -> Debugger Settings
    -
    38 @endverbatim
    -
    39
    -
    40 В вкладке Debug:
    -
    41 - Port = SW
    -
    42 В вкладке Trace:
    -
    43 - Указать Core Clock
    -
    44 - Выставить Trace Port = SWO
    -
    45 - ITM - выбрать нужный порт (для Keil нулевой порт)
    -
    46
    -
    47
    -
    48 * @{
    -
    49 *
    -
    50 * @def my_printf(...)
    -
    51 * @brief Универсальный макрос для вывода трассировки
    -
    52 * @details Варианты реализации:
    -
    53 * - RTT_TRACE_ENABLE `SEGGER_RTT_printf(0, ...)`
    -
    54 * - SWO_TRACE_ENABLE - `printf(...)`
    -
    55 * - NO_TRACE - пустой макрос
    -
    56 *
    -
    57 * @def log_printf(TAG, fmt, ...)
    -
    58 * @brief Макрос логирования с поддержкой уровней LOG_LEVEL
    -
    59 * @param TAG Тэг лога
    -
    60 * @param fmt, ... Форматируемая строка
    -
    61 * @details Варианты реализации:
    -
    62 * - LOG_LEVEL == 0 - логирование отключено (макрос пустой)
    -
    63 * - LOG_LEVEL == 1 - выводится время и TAG
    -
    64 * - LOG_LEVEL >= 2 - выводится время, TAG, имя файла и номер строки
    -
    65 */
    -
    66#ifdef SERIAL_TRACE_ENABLE
    -
    67
    -
    68 #if defined(RTT_TRACE_ENABLE)
    -
    69 #undef SWO_TRACE_ENABLE
    -
    70 #include "SEGGER_RTT.h"
    -
    71 #define my_printf(...) SEGGER_RTT_printf(0, __VA_ARGS__)
    -
    72 #elif defined(SWO_TRACE_ENABLE)
    -
    73 #undef RTT_TRACE_ENABLE
    -
    74 #define my_printf(...) printf(__VA_ARGS__)
    -
    75 #else // NO_TRACE
    -
    76 #define my_printf(...)
    -
    77 #warning No trace is selected. Serial debug wont work.
    -
    78 #endif // RTT_TRACE_ENABLE/SWO_TRACE_ENABLE/NO_TRACE
    -
    79#else //SERIAL_TRACE_ENABLE
    -
    80
    -
    81 #define my_printf(...)
    -
    82 #undef RTT_TRACE_ENABLE
    -
    83 #undef SWO_TRACE_ENABLE
    -
    84
    -
    85#endif //SERIAL_TRACE_ENABLE
    -
    86
    -
    87
    -
    88#ifndef LOG_LEVEL
    -
    89#define LOG_LEVEL 1 ///< @brief Уровень логирования (по умолчанию == 1)
    -
    90#endif
    -
    91
    -
    92#if LOG_LEVEL == 0 // лог отключен
    -
    93 #define \
    -
    94log_printf(TAG, fmt, ...)
    -
    95#elif LOG_LEVEL == 1 // только тэг
    -
    -
    96 #define log_printf(TAG, fmt, ...) \
    -
    97my_printf("\n[%lu] [%s] " fmt, \
    -
    98(unsigned long)uwTick, TAG, ##__VA_ARGS__)
    +
    23 - @ref RTT_TRACE_ENABLE - для RTT это будет вызов функции SEGGER_RTT_printf()
    +
    24
    +
    25 Предварительно надо подключить библиотеку SEGGER RTT (SEGGER_RTT.h) и вызвать функцию SEGGER_RTT_Init()
    +
    26
    +
    27 - @ref SWO_TRACE_ENABLE для SWO это будет просто printf()
    +
    28
    +
    29 Предварительно надо подключить библиотеку STDOUT и retarget под ITM:
    +
    30
    +
    31 @verbatim
    +
    32 Manage Run-Time Environment -> Compiler -> I/O -> STDOUT -> ITM
    +
    33 @endverbatim
    +
    34
    +
    35 Для SWO также надо включить трассировку:
    +
    36
    +
    37 @verbatim
    +
    38 Options For Target -> Debug -> Debugger Settings
    +
    39 @endverbatim
    +
    40
    +
    41 В вкладке Debug:
    +
    42 - Port = SW
    +
    43 В вкладке Trace:
    +
    44 - Указать Core Clock
    +
    45 - Выставить Trace Port = SWO
    +
    46 - ITM - выбрать нужный порт (для Keil нулевой порт)
    +
    47
    +
    48
    +
    49 * @{
    +
    50 *
    +
    51 * @def my_printf(...)
    +
    52 * @brief Универсальный макрос для вывода трассировки
    +
    53 * @details Варианты реализации:
    +
    54 * - RTT_TRACE_ENABLE `SEGGER_RTT_printf(0, ...)`
    +
    55 * - SWO_TRACE_ENABLE - `printf(...)`
    +
    56 * - NO_TRACE - пустой макрос
    +
    57 *
    +
    58 * @def log_printf(TAG, fmt, ...)
    +
    59 * @brief Макрос логирования с поддержкой уровней @ref LOG_LEVEL
    +
    60 * @param TAG Тэг лога
    +
    61 * @param fmt, ... Форматируемая строка
    +
    62 * @details Варианты реализации:
    +
    63 * - @ref LOG_LEVEL == 0 - логирование отключено (макрос пустой)
    +
    64 * - @ref LOG_LEVEL == 1 - выводится время @ref local_time и TAG
    +
    65 * @code
    +
    66 [123] [ADC] Measure Done
    +
    67 [456] [ADC] Measure Err
    +
    68 * @endcode
    +
    69 * - @ref LOG_LEVEL >= 2 - выводится время, TAG, имя файла и номер строки
    +
    70 * @code
    +
    71 [123] [ADC] (../Core/Src/adc.c:75) Measure Done
    +
    72 [456] [ADC] (../Core/Src/adc.c:80) Measure Err
    +
    73 * @endcode
    +
    74 */
    +
    75#ifdef SERIAL_TRACE_ENABLE
    +
    76
    +
    77 #if defined(RTT_TRACE_ENABLE)
    +
    78 #undef SWO_TRACE_ENABLE
    +
    79 #include "SEGGER_RTT.h"
    +
    80 #define my_printf(...) SEGGER_RTT_printf(0, __VA_ARGS__)
    +
    81 #elif defined(SWO_TRACE_ENABLE)
    +
    82 #undef RTT_TRACE_ENABLE
    +
    83 #define my_printf(...) printf(__VA_ARGS__)
    +
    84 #else // NO_TRACE
    +
    85 #define my_printf(...)
    +
    86 #warning No trace is selected. Serial debug wont work.
    +
    87 #endif // RTT_TRACE_ENABLE/SWO_TRACE_ENABLE/NO_TRACE
    +
    88#else //SERIAL_TRACE_ENABLE
    +
    89
    +
    90 #define my_printf(...)
    +
    91 #undef RTT_TRACE_ENABLE
    +
    92 #undef SWO_TRACE_ENABLE
    +
    93
    +
    94#endif //SERIAL_TRACE_ENABLE
    +
    95
    +
    96
    +
    97#ifndef local_time
    +
    98#define local_time() HAL_GetTick() ///< Локальное время
    +
    99#endif
    +
    100#ifndef LOG_LEVEL
    +
    101#define LOG_LEVEL 1 ///< @brief Уровень логирования (по умолчанию == 1)
    +
    102#endif
    +
    103
    +
    104
    +
    105#if LOG_LEVEL == 0 // лог отключен
    +
    106 #define \
    +
    107log_printf(TAG, fmt, ...)
    +
    108#elif LOG_LEVEL == 1 // только тэг
    +
    +
    109 #define log_printf(TAG, fmt, ...) \
    +
    110my_printf("\n[%lu] [%s] " fmt, \
    +
    111(unsigned long)local_time(), TAG, ##__VA_ARGS__)
    -
    99#elif LOG_LEVEL >= 2 // всё
    -
    100 #define log_printf(TAG, fmt, ...) \
    -
    101my_printf("\n[%lu] [%s] (%s:%d) " fmt, \
    -
    102(unsigned long)uwTick, TAG, __FILE__, __LINE__, ##__VA_ARGS__)
    -
    103#endif
    -
    104
    -
    105/** TRACE_SERIAL
    -
    106 * @}
    -
    107 */
    -
    108
    -
    109/**
    -
    110 * @addtogroup TRACE_GPIO GPIO trace defines
    -
    111 * @ingroup TRACE
    -
    112 * @brief Дефайны для работы с GPIO трассировкой
    -
    113 * @details Определяется дефайны для работы с GPIO трассировкой:
    -
    114 - TRACE_GPIO_RESET() - для сброса ножки GPIO (через BSRR)
    -
    115 - TRACE_GPIO_SET() - для выставления ножки GPIO (через BSRR)
    -
    116
    -
    117 - Если трассировка @ref GPIO_TRACE_ENABLE отключена, то все дефайны определяются как 'ничего'
    -
    118 и на производительность кода не влияют
    -
    119 * @{
    -
    120 *
    -
    121 * @def TRACE_GPIO_RESET(_gpio_, _pin_)
    -
    122 * @brief Сбросить указанную ножку GPIO
    -
    123 * @param _gpio_ Указатель на структуру GPIO (напр. GPIOA)
    -
    124 * @param _pin_ Номер ножки (напр. GPIO_PIN_0)
    -
    125 * @details Варианты реализации:
    -
    126 * - GPIO_TRACE_ENABLE не определён - макрос пустой
    -
    127 * - GPIO_TRACE_ENABLE определён - устанавливает бит сброса через BSRR ((_pin_)<<16)
    -
    128 *
    -
    129 * @def TRACE_GPIO_SET(_gpio_, _pin_)
    -
    130 * @brief Установить указанную ножку GPIO
    -
    131 * @param _gpio_ Указатель на структуру GPIO (например GPIOA)
    -
    132 * @param _pin_ Номер ножки (напр. GPIO_PIN_0)
    -
    133 * @details Варианты реализации:
    -
    134 * - GPIO_TRACE_ENABLE не определён - макрос пустой
    -
    135 * - GPIO_TRACE_ENABLE определён - устанавливает бит установки через BSRR (_pin_)
    -
    136 */
    -
    137#ifndef GPIO_TRACE_ENABLE
    -
    138 #define TRACE_GPIO_SET(_gpio_,_pin_)
    -
    139 #define TRACE_GPIO_RESET(_gpio_,_pin_)
    -
    140#else
    -
    141 #define TRACE_GPIO_SET(_gpio_,_pin_) (_gpio_)->BSRR = (((_pin_)))
    -
    142 #define TRACE_GPIO_RESET(_gpio_,_pin_) (_gpio_)->BSRR = ((_pin_)<<16)
    -
    143#endif //GPIO_TRACE_ENABLE
    -
    144
    -
    145
    -
    146/** TRACE_GPIO
    -
    147 * @}
    -
    148 */
    -
    149
    -
    150
    -
    151
    -
    152#if defined(HAL_MODULE_ENABLED) && defined(RTT_TRACE_ENABLE)
    -
    153
    -
    154/**
    -
    155 * @addtogroup TRACE_RTT_FLASH Flash RTT Buffer
    -
    156 * @ingroup TRACE
    -
    157 * @brief Макросы и функции для сохранения/чтения RTT буфера в Flash
    -
    158 * @details Модуль позволяет сохранять данные RTT буфера во Flash и читать их обратно по тегам.
    -
    159 * Теги работают следующим образом:
    -
    160 * - Базовый тег (младший байт = 0): модуль сам выбирает первый свободный слот во Flash;
    -
    161 * новые записи получают автоинкрементированный младший байт тега (от 0x00 до 0xFF).
    -
    162 * - Конкретный тег (младший байт != 0): запись или чтение происходит строго с указанным тегом;
    -
    163 * если слот с таким тегом уже занят, запись не выполняется.
    -
    164 * - Автоинкремент позволяет хранить несколько последовательных записей в пределах одного базового тега,
    -
    165 * без необходимости вручную отслеживать адреса Flash или позиции буферов.
    -
    166 *
    -
    167 * Параметры:
    -
    168 * - @ref RTT_FLASH_BUFFER_SIZE - Размер буфера RTT в Flash
    -
    169 * - @ref RTT_FLASH_SECTOR - Сектор FLASH куда положится RTT буфер
    -
    170 * - @ref RTT_FLASH_SECTOR_START - Начало сектора RTT_FLASH_SECTOR
    -
    171 * - @ref RTT_FLASH_SECTOR_END - Конец сектора RTT_FLASH_SECTOR
    -
    172 *
    -
    173 * @{
    -
    174 */
    -
    175
    -
    176
    -
    177/**
    -
    178 * @brief Структура RTT, которая будет положена в Flash
    -
    179 */
    -
    -
    180typedef struct {
    -
    181 uint32_t tag; ///< Уникальный идентификатор буфера
    -
    182 uint32_t size; ///< Размер данных
    -
    183 char data[RTT_FLASH_BUFFER_SIZE]; ///< Буфер RTT
    - -
    -
    185
    -
    186/**
    -
    187 * @brief Подготовка Flash к записи
    -
    188 * @details Сбрасывает ошибки Flash и ожидает готовности перед записью
    -
    189 */
    -
    -
    190__STATIC_FORCEINLINE void RTT_FlashPrepare(void)
    -
    191{
    -
    192 HAL_FLASH_Unlock();
    -
    193 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR | FLASH_FLAG_OPERR);
    -
    194 while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) {
    -
    195 __NOP();
    -
    196 }
    -
    197}
    +
    112#elif LOG_LEVEL >= 2 // всё
    +
    113 #define log_printf(TAG, fmt, ...) \
    +
    114my_printf("\n[%lu] [%s] (%s:%d) " fmt, \
    +
    115(unsigned long)local_time(), TAG, __FILE__, __LINE__, ##__VA_ARGS__)
    +
    116#endif
    +
    117
    +
    118/** TRACE_SERIAL
    +
    119 * @}
    +
    120 */
    +
    121
    +
    122/**
    +
    123 * @addtogroup TRACE_GPIO GPIO trace defines
    +
    124 * @ingroup TRACE
    +
    125 * @brief Дефайны для работы с GPIO трассировкой
    +
    126 * @details Определяется дефайны для работы с GPIO трассировкой:
    +
    127 - TRACE_GPIO_RESET() - для сброса ножки GPIO (через BSRR)
    +
    128 - TRACE_GPIO_SET() - для выставления ножки GPIO (через BSRR)
    +
    129
    +
    130 - Если трассировка @ref GPIO_TRACE_ENABLE отключена, то все дефайны определяются как 'ничего'
    +
    131 и на производительность кода не влияют
    +
    132 * @{
    +
    133 *
    +
    134 * @def TRACE_GPIO_RESET(_gpio_, _pin_)
    +
    135 * @brief Сбросить указанную ножку GPIO
    +
    136 * @param _gpio_ Указатель на структуру GPIO (напр. GPIOA)
    +
    137 * @param _pin_ Номер ножки (напр. GPIO_PIN_0)
    +
    138 * @details Варианты реализации:
    +
    139 * - GPIO_TRACE_ENABLE не определён - макрос пустой
    +
    140 * - GPIO_TRACE_ENABLE определён - устанавливает бит сброса через BSRR ((_pin_)<<16)
    +
    141 *
    +
    142 * @def TRACE_GPIO_SET(_gpio_, _pin_)
    +
    143 * @brief Установить указанную ножку GPIO
    +
    144 * @param _gpio_ Указатель на структуру GPIO (например GPIOA)
    +
    145 * @param _pin_ Номер ножки (напр. GPIO_PIN_0)
    +
    146 * @details Варианты реализации:
    +
    147 * - GPIO_TRACE_ENABLE не определён - макрос пустой
    +
    148 * - GPIO_TRACE_ENABLE определён - устанавливает бит установки через BSRR (_pin_)
    +
    149 */
    +
    150#ifndef GPIO_TRACE_ENABLE
    +
    151 #define TRACE_GPIO_SET(_gpio_,_pin_)
    +
    152 #define TRACE_GPIO_RESET(_gpio_,_pin_)
    +
    153#else
    +
    154 #define TRACE_GPIO_SET(_gpio_,_pin_) (_gpio_)->BSRR = (((_pin_)))
    +
    155 #define TRACE_GPIO_RESET(_gpio_,_pin_) (_gpio_)->BSRR = ((_pin_)<<16)
    +
    156#endif //GPIO_TRACE_ENABLE
    +
    157
    +
    158
    +
    159/** TRACE_GPIO
    +
    160 * @}
    +
    161 */
    +
    162
    +
    163
    +
    164
    +
    165#if defined(HAL_MODULE_ENABLED) && defined(RTT_TRACE_ENABLE)
    +
    166
    +
    167/**
    +
    168 * @addtogroup TRACE_RTT_FLASH Flash RTT Buffer
    +
    169 * @ingroup TRACE
    +
    170 * @brief Макросы и функции для сохранения/чтения RTT буфера в Flash
    +
    171 * @details Модуль позволяет сохранять данные RTT буфера во Flash и читать их обратно по тегам.
    +
    172 * Теги работают следующим образом:
    +
    173 * - Базовый тег (младший байт = 0): модуль сам выбирает первый свободный слот во Flash;
    +
    174 * новые записи получают автоинкрементированный младший байт тега (от 0x00 до 0xFF).
    +
    175 * - Конкретный тег (младший байт != 0): запись или чтение происходит строго с указанным тегом;
    +
    176 * если слот с таким тегом уже занят, запись не выполняется.
    +
    177 * - Автоинкремент позволяет хранить несколько последовательных записей в пределах одного базового тега,
    +
    178 * без необходимости вручную отслеживать адреса Flash или позиции буферов.
    +
    179 *
    +
    180 * Параметры:
    +
    181 * - @ref RTT_FLASH_BUFFER_SIZE - Размер буфера RTT в Flash
    +
    182 * - @ref RTT_FLASH_SECTOR - Сектор FLASH куда положится RTT буфер
    +
    183 * - @ref RTT_FLASH_SECTOR_START - Начало сектора RTT_FLASH_SECTOR
    +
    184 * - @ref RTT_FLASH_SECTOR_END - Конец сектора RTT_FLASH_SECTOR
    +
    185 *
    +
    186 * @{
    +
    187 */
    +
    188
    +
    189
    +
    190/**
    +
    191 * @brief Структура RTT, которая будет положена в Flash
    +
    192 */
    +
    +
    193typedef struct {
    +
    194 uint32_t tag; ///< Уникальный идентификатор буфера
    +
    195 uint32_t size; ///< Размер данных
    +
    196 char data[RTT_FLASH_BUFFER_SIZE]; ///< Буфер RTT
    +
    198
    199/**
    -
    200 * @brief Сохраняет последние символы RTT-буфера в Flash по тегу
    -
    201 * @param tag Базовый или конкретный идентификатор буфера.
    -
    202 * @param tail_size Количество последних символов RTT для копирования
    -
    203 * @param buf_num Указатель на переменную в которую запишется номер буфера для конкретного тега
    -
    204 * @return >=0 — номер буфера (тег) для записи, <0 — ошибка (нет места, тег уже занят, ошибка записи в флеш)
    -
    205 *
    -
    206 * @details Автоматически копирует последние tail_size символов из RTT-буфера
    -
    207 * и записывает их во Flash.
    -
    208 * Тег может быть базовым или конкретным:
    -
    209 * - Если базовый (младший байт == 0) — будет выбран первый свободный слот с автоинкрементом.
    -
    210 * Автоинкремент формируется в пределах от 0x1 до 0xFF
    -
    211 * - Если конкретный (младший байт != 0) — запись выполняется только с этим тегом, иначе ошибка.
    -
    212 *
    -
    213 */
    -
    -
    214__STATIC_FORCEINLINE int RTT_SaveToFlash(uint32_t tag, uint32_t tail_size)
    -
    215{
    -
    216 if (tag == 0xFFFFFFFF)
    -
    217 return -1; // Неверный тег
    -
    218
    -
    219 SEGGER_RTT_BUFFER_UP *up = &_SEGGER_RTT.aUp[0];
    -
    220 unsigned buf_size = up->SizeOfBuffer;
    -
    221 unsigned wr = up->WrOff;
    -
    222
    -
    223 // Ограничиваем по размеру буфера RTT и RTT_FLASH_BUFFER_SIZE
    -
    224 unsigned n = (tail_size > buf_size) ? buf_size : tail_size;
    -
    225 if (n > RTT_FLASH_BUFFER_SIZE)
    - -
    227
    -
    228 uint32_t addr = RTT_FLASH_SECTOR_START;
    -
    229 RTT_FlashHeader_t *flash_hdr = NULL;
    -
    230 uint32_t base_tag = tag & 0xFFFFFF00;
    -
    231 uint32_t next_tag = (tag & 0xFF) == 0 ? tag + 1 : tag;
    -
    232
    -
    233 // Ищем первый свободный слот, параллельно автоинкрементируем тег
    -
    234 while ((addr + sizeof(RTT_FlashHeader_t)) <= RTT_FLASH_SECTOR_END)
    -
    235 {
    -
    236 flash_hdr = (RTT_FlashHeader_t *)addr;
    -
    237
    -
    238 if (flash_hdr->tag == 0xFFFFFFFF)
    -
    239 break; // Нашли свободное место
    +
    200 * @brief Подготовка Flash к записи
    +
    201 * @details Сбрасывает ошибки Flash и ожидает готовности перед записью
    +
    202 */
    +
    +
    203__STATIC_FORCEINLINE void RTT_FlashPrepare(void)
    +
    204{
    +
    205 HAL_FLASH_Unlock();
    +
    206 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR | FLASH_FLAG_OPERR);
    +
    207 while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) {
    +
    208 __NOP();
    +
    209 }
    +
    210}
    +
    +
    211
    +
    212/**
    +
    213 * @brief Сохраняет последние символы RTT-буфера в Flash по тегу
    +
    214 * @param tag Базовый или конкретный идентификатор буфера.
    +
    215 * @param tail_size Количество последних символов RTT для копирования
    +
    216 * @param buf_num Указатель на переменную в которую запишется номер буфера для конкретного тега
    +
    217 * @return >=0 — номер буфера (тег) для записи, <0 — ошибка (нет места, тег уже занят, ошибка записи в флеш)
    +
    218 *
    +
    219 * @details Автоматически копирует последние tail_size символов из RTT-буфера
    +
    220 * и записывает их во Flash.
    +
    221 * Тег может быть базовым или конкретным:
    +
    222 * - Если базовый (младший байт == 0) — будет выбран первый свободный слот с автоинкрементом.
    +
    223 * Автоинкремент формируется в пределах от 0x1 до 0xFF
    +
    224 * - Если конкретный (младший байт != 0) — запись выполняется только с этим тегом, иначе ошибка.
    +
    225 *
    +
    226 */
    +
    +
    227__STATIC_FORCEINLINE int RTT_SaveToFlash(uint32_t tag, uint32_t tail_size)
    +
    228{
    +
    229 if (tag == 0xFFFFFFFF)
    +
    230 return -1; // Неверный тег
    +
    231
    +
    232 SEGGER_RTT_BUFFER_UP *up = &_SEGGER_RTT.aUp[0];
    +
    233 unsigned buf_size = up->SizeOfBuffer;
    +
    234 unsigned wr = up->WrOff;
    +
    235
    +
    236 // Ограничиваем по размеру буфера RTT и RTT_FLASH_BUFFER_SIZE
    +
    237 unsigned n = (tail_size > buf_size) ? buf_size : tail_size;
    +
    238 if (n > RTT_FLASH_BUFFER_SIZE)
    +
    240
    -
    241
    -
    242 if((flash_hdr->tag & 0xFFFFFF00) == base_tag) // выбраный тег
    -
    243 {
    -
    244 if ((tag & 0xFF) == 0) // если он базовый - ищем последний
    -
    245 next_tag = flash_hdr->tag + 1; // автоинкремент
    -
    246 else
    -
    247 if(flash_hdr->tag == tag) // если он конкретный и уже существует - то ошибка
    -
    248 return -1; // конкретный тег уже занят
    -
    249 }
    +
    241 uint32_t addr = RTT_FLASH_SECTOR_START;
    +
    242 RTT_FlashHeader_t *flash_hdr = NULL;
    +
    243 uint32_t base_tag = tag & 0xFFFFFF00;
    +
    244 uint32_t next_tag = (tag & 0xFF) == 0 ? tag + 1 : tag;
    +
    245
    +
    246 // Ищем первый свободный слот, параллельно автоинкрементируем тег
    +
    247 while ((addr + sizeof(RTT_FlashHeader_t)) <= RTT_FLASH_SECTOR_END)
    +
    248 {
    +
    249 flash_hdr = (RTT_FlashHeader_t *)addr;
    250
    -
    251
    -
    252 if(next_tag - tag > 0xFF)
    -
    253 return -1; // автоинкремент слишком большой
    +
    251 if (flash_hdr->tag == 0xFFFFFFFF)
    +
    252 break; // Нашли свободное место
    +
    253
    254
    -
    255 addr += sizeof(RTT_FlashHeader_t);
    -
    256 }
    -
    257
    -
    258 if ((addr + sizeof(RTT_FlashHeader_t)) > RTT_FLASH_SECTOR_END)
    -
    259 return -1; // Нет свободного места
    -
    260
    -
    261 // Копируем последние n символов из RTT
    -
    262 char temp[RTT_FLASH_BUFFER_SIZE];
    -
    263 unsigned valid_count = 0;
    -
    264
    -
    265 for (unsigned i = 0; i < n; i++)
    -
    266 {
    -
    267 unsigned idx = (wr + buf_size - n + i) % buf_size;
    -
    268 char c = up->pBuffer[idx];
    -
    269 if (c != 0)
    -
    270 temp[valid_count++] = c;
    -
    271 }
    -
    272
    - -
    274
    -
    275 // Формируем структуру в RAM
    -
    276 RTT_FlashHeader_t flash_data;
    -
    277 flash_data.tag = next_tag;
    -
    278 flash_data.size = valid_count;
    -
    279 memcpy(flash_data.data, temp, valid_count);
    -
    280
    -
    281 // Записываем структуру во Flash (по 4 байта)
    -
    282 const uint32_t *p = (const uint32_t *)&flash_data;
    -
    283 for (unsigned i = 0; i < sizeof(RTT_FlashHeader_t) / 4; i++)
    -
    284 {
    -
    285 if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + i * 4, p[i]) != HAL_OK)
    -
    286 return -1;
    -
    287 }
    -
    288
    -
    289 HAL_FLASH_Lock();
    -
    290 __DSB();
    -
    291 __ISB();
    -
    292
    +
    255 if((flash_hdr->tag & 0xFFFFFF00) == base_tag) // выбраный тег
    +
    256 {
    +
    257 if ((tag & 0xFF) == 0) // если он базовый - ищем последний
    +
    258 next_tag = flash_hdr->tag + 1; // автоинкремент
    +
    259 else
    +
    260 if(flash_hdr->tag == tag) // если он конкретный и уже существует - то ошибка
    +
    261 return -1; // конкретный тег уже занят
    +
    262 }
    +
    263
    +
    264
    +
    265 if(next_tag - tag > 0xFF)
    +
    266 return -1; // автоинкремент слишком большой
    +
    267
    +
    268 addr += sizeof(RTT_FlashHeader_t);
    +
    269 }
    +
    270
    +
    271 if ((addr + sizeof(RTT_FlashHeader_t)) > RTT_FLASH_SECTOR_END)
    +
    272 return -1; // Нет свободного места
    +
    273
    +
    274 // Копируем последние n символов из RTT
    +
    275 char temp[RTT_FLASH_BUFFER_SIZE];
    +
    276 unsigned valid_count = 0;
    +
    277
    +
    278 for (unsigned i = 0; i < n; i++)
    +
    279 {
    +
    280 unsigned idx = (wr + buf_size - n + i) % buf_size;
    +
    281 char c = up->pBuffer[idx];
    +
    282 if (c != 0)
    +
    283 temp[valid_count++] = c;
    +
    284 }
    +
    285
    + +
    287
    +
    288 // Формируем структуру в RAM
    +
    289 RTT_FlashHeader_t flash_data;
    +
    290 flash_data.tag = next_tag;
    +
    291 flash_data.size = valid_count;
    +
    292 memcpy(flash_data.data, temp, valid_count);
    293
    -
    294 return (int)(next_tag&0xFF);
    -
    295}
    +
    294 // Записываем структуру во Flash (по 4 байта)
    +
    295 const uint32_t *p = (const uint32_t *)&flash_data;
    +
    296 for (unsigned i = 0; i < sizeof(RTT_FlashHeader_t) / 4; i++)
    +
    297 {
    +
    298 if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + i * 4, p[i]) != HAL_OK)
    +
    299 return -1;
    +
    300 }
    +
    301
    +
    302 HAL_FLASH_Lock();
    +
    303 __DSB();
    +
    304 __ISB();
    +
    305
    +
    306
    +
    307 return (int)(next_tag&0xFF);
    +
    308}
    -
    296
    -
    297
    -
    298/**
    -
    299 * @brief Читает последние символы RTT-буфера из Flash по тегу
    -
    300 * @param tag Базовый или конкретный идентификатор буфера.
    -
    301 * @param Buffer Буфер назначения для копирования данных
    -
    302 * @param tail_size Количество последних символов, которые нужно прочитать
    -
    303 * @param read_size Количество считанных символов
    -
    304 * @return >=0 — номер буфера (тег) для записи, <0 — ошибка (тег не найден или структура повреждена)
    -
    305 *
    -
    306 * @details Копирует последние tail_size символов из найденной записи Flash в Buffer.
    -
    307 * Тег может быть базовым или конкретным:
    -
    308 * - Если базовый (младший байт == 0) — будет прочитана последняя запись из группы.
    -
    309 * - Если конкретный (младший байт != 0) — прочитывается именно эта запись.
    -
    310 */
    -
    -
    311__STATIC_FORCEINLINE int RTT_ReadFromFlash(uint32_t tag, char *Buffer, uint32_t tail_size, uint32_t *read_size)
    -
    312{
    -
    313 if (!Buffer || tail_size == 0)
    -
    314 return -1; // Неверные параметры
    -
    315
    -
    316 if (tag == 0xFFFFFFFF)
    -
    317 return -1; // Недопустимый тег
    -
    318
    -
    319 uint32_t addr = RTT_FLASH_SECTOR_START;
    -
    320 RTT_FlashHeader_t *flash_hdr = NULL;
    -
    321 RTT_FlashHeader_t *target_hdr = NULL;
    -
    322 uint32_t base_tag = tag & 0xFFFFFF00;
    -
    323
    -
    324 // Поиск записи по тегу
    -
    325 while ((addr + sizeof(RTT_FlashHeader_t)) <= RTT_FLASH_SECTOR_END)
    -
    326 {
    -
    327 flash_hdr = (RTT_FlashHeader_t *)addr;
    +
    309
    +
    310
    +
    311/**
    +
    312 * @brief Читает последние символы RTT-буфера из Flash по тегу
    +
    313 * @param tag Базовый или конкретный идентификатор буфера.
    +
    314 * @param Buffer Буфер назначения для копирования данных
    +
    315 * @param tail_size Количество последних символов, которые нужно прочитать
    +
    316 * @param read_size Количество считанных символов
    +
    317 * @return >=0 — номер буфера (тег) для записи, <0 — ошибка (тег не найден или структура повреждена)
    +
    318 *
    +
    319 * @details Копирует последние tail_size символов из найденной записи Flash в Buffer.
    +
    320 * Тег может быть базовым или конкретным:
    +
    321 * - Если базовый (младший байт == 0) — будет прочитана последняя запись из группы.
    +
    322 * - Если конкретный (младший байт != 0) — прочитывается именно эта запись.
    +
    323 */
    +
    +
    324__STATIC_FORCEINLINE int RTT_ReadFromFlash(uint32_t tag, char *Buffer, uint32_t tail_size, uint32_t *read_size)
    +
    325{
    +
    326 if (!Buffer || tail_size == 0)
    +
    327 return -1; // Неверные параметры
    328
    -
    329 if (flash_hdr->tag == 0xFFFFFFFF)
    -
    330 break; // Достигнут конец записанных структур
    +
    329 if (tag == 0xFFFFFFFF)
    +
    330 return -1; // Недопустимый тег
    331
    -
    332 // выбраный тег
    -
    333 if((flash_hdr->tag & 0xFFFFFF00) == base_tag)
    -
    334 {
    -
    335 if ((tag & 0xFF) == 0) // если он базовый - ищем последний
    -
    336 target_hdr = flash_hdr; // сохраняем последний в группе
    -
    337 else
    -
    338 if(flash_hdr->tag == tag) // если он конкретный и найден - берем его
    -
    339 {
    -
    340 target_hdr = flash_hdr;
    -
    341 break; // конкретный тег найден
    -
    342 }
    -
    343 }
    -
    344
    -
    345 addr += sizeof(RTT_FlashHeader_t);
    -
    346 }
    -
    347
    -
    348 if (!target_hdr) return -1; // Тег не найден
    -
    349
    -
    350 // Проверка корректности размера
    -
    351 if (target_hdr->size > RTT_FLASH_BUFFER_SIZE)
    -
    352 return -1; // Повреждённая запись
    -
    353
    -
    354 // Определяем количество читаемых символов
    -
    355 uint32_t n = (tail_size > target_hdr->size) ? target_hdr->size : tail_size;
    -
    356 // Начальная позиция для чтения последних tail_size символов
    -
    357 uint32_t start = target_hdr->size - n;
    -
    358 // Копируем данные из Flash в RAM
    -
    359 memcpy(Buffer, &target_hdr->data[start], n);
    -
    360
    -
    361 if(read_size != NULL)
    -
    362 {
    -
    363 *read_size = n;
    -
    364 }
    -
    365
    -
    366 __DSB();
    -
    367 __ISB();
    -
    368
    -
    369 return (int)(target_hdr->tag & 0xFF);
    -
    370}
    -
    -
    371
    -
    372/**
    -
    373 * @brief Стирание сектора Flash с RTT-буфером
    -
    374 */
    -
    -
    375__STATIC_FORCEINLINE int RTT_EraseFlash(void)
    -
    376{
    -
    377 FLASH_EraseInitTypeDef eraseInit;
    -
    378 uint32_t pageError = 0;
    -
    379
    - +
    332 uint32_t addr = RTT_FLASH_SECTOR_START;
    +
    333 RTT_FlashHeader_t *flash_hdr = NULL;
    +
    334 RTT_FlashHeader_t *target_hdr = NULL;
    +
    335 uint32_t base_tag = tag & 0xFFFFFF00;
    +
    336
    +
    337 // Поиск записи по тегу
    +
    338 while ((addr + sizeof(RTT_FlashHeader_t)) <= RTT_FLASH_SECTOR_END)
    +
    339 {
    +
    340 flash_hdr = (RTT_FlashHeader_t *)addr;
    +
    341
    +
    342 if (flash_hdr->tag == 0xFFFFFFFF)
    +
    343 break; // Достигнут конец записанных структур
    +
    344
    +
    345 // выбраный тег
    +
    346 if((flash_hdr->tag & 0xFFFFFF00) == base_tag)
    +
    347 {
    +
    348 if ((tag & 0xFF) == 0) // если он базовый - ищем последний
    +
    349 target_hdr = flash_hdr; // сохраняем последний в группе
    +
    350 else
    +
    351 if(flash_hdr->tag == tag) // если он конкретный и найден - берем его
    +
    352 {
    +
    353 target_hdr = flash_hdr;
    +
    354 break; // конкретный тег найден
    +
    355 }
    +
    356 }
    +
    357
    +
    358 addr += sizeof(RTT_FlashHeader_t);
    +
    359 }
    +
    360
    +
    361 if (!target_hdr) return -1; // Тег не найден
    +
    362
    +
    363 // Проверка корректности размера
    +
    364 if (target_hdr->size > RTT_FLASH_BUFFER_SIZE)
    +
    365 return -1; // Повреждённая запись
    +
    366
    +
    367 // Определяем количество читаемых символов
    +
    368 uint32_t n = (tail_size > target_hdr->size) ? target_hdr->size : tail_size;
    +
    369 // Начальная позиция для чтения последних tail_size символов
    +
    370 uint32_t start = target_hdr->size - n;
    +
    371 // Копируем данные из Flash в RAM
    +
    372 memcpy(Buffer, &target_hdr->data[start], n);
    +
    373
    +
    374 if(read_size != NULL)
    +
    375 {
    +
    376 *read_size = n;
    +
    377 }
    +
    378
    +
    379 __DSB();
    +
    380 __ISB();
    381
    -
    382 eraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
    -
    383 eraseInit.Sector = RTT_FLASH_SECTOR;
    -
    384 eraseInit.NbSectors = 1;
    -
    385
    -
    386 if (HAL_FLASHEx_Erase(&eraseInit, &pageError) != HAL_OK)
    -
    387 {
    -
    388 return -1;
    -
    389 }
    -
    390 return 0;
    -
    391 HAL_FLASH_Lock();
    -
    392}
    +
    382 return (int)(target_hdr->tag & 0xFF);
    +
    383}
    -
    393
    -
    394/** TRACE_RTT_FLASH
    -
    395 * @}
    -
    396 */
    -
    397
    -
    398#else // HAL_MODULE_ENABLED && RTT_TRACE_ENABLE
    -
    399#define RTT_FlashPrepare(...)
    -
    400#define RTT_EraseFlash(...) 0
    -
    401#define RTT_SaveToFlash(...) 0
    -
    402#define RTT_ReadFromFlash(...) 0
    -
    403#endif // HAL_MODULE_ENABLED && RTT_TRACE_ENABLE
    -
    404
    -
    405
    -
    406
    -
    407
    -
    408/**
    -
    409 * @addtogroup TRACE_HARDFAULT Hardfault trace defines
    -
    410 * @ingroup TRACE
    -
    411 * @brief Модуль трассировки HardFault с возможностью сохранения RTT буфера во Flash
    -
    412 * @details
    -
    413 * Этот модуль позволяет сохранять контекст процессора и последние символы RTT буфера при возникновении HardFault.
    -
    414 *
    -
    415 * Механизм работы:
    -
    416 * - При срабатывании HardFault вызывается HF_HandleFault(), который:
    -
    417 * 1. Получает указатель на стек, где произошёл HardFault (MSP или PSP).
    -
    418 * 2. Выводит значения регистров R0-R3, R12, LR, PC, PSR и системных регистров SCB.
    -
    419 * 3. Формирует строку с регистрами и копирует последние символы RTT буфера.
    -
    420 * 4. Сохраняет данные во Flash с базовым тегом HF_RTT_TAG_BASE.
    -
    421 * - Для восстановления последнего HardFault используется HF_CheckRecovered(), который:
    -
    422 * 1. Читает запись во Flash по базовому тегу.
    -
    423 * 2. Выводит сохранённый RTT буфер и контекст регистров.
    -
    424 * 3. Опционально стирает Flash после восстановления.
    -
    425 *
    -
    426 * Параметры:
    -
    427 * - @ref HARDFAULT_SERIAL_TRACE - Включить обработку и serial трассировку Hardfault
    -
    428 * Если отключена то вставляются заглушки, никак не влияющие на параметры и остальную программу
    -
    429 * - @ref HF_RTT_TAG_BASE - Базовый тег RTT Flash для HardFault
    -
    430 * - @ref HF_RTT_TAIL_SIZE - Размер буфера RTT, который сохранится при Hardfault
    -
    431 * - @ref HF_STACK_DUMP_WORDS - Сколько слов стека будет проанализировано во время Hardfault
    -
    432 * - @ref HF_FLASH_ADDR - Адрес FLASH куда положится RTT буфер
    -
    433 * - @ref HF_RAM_END - Конец RAM памяти (чтобы во время анализа стека не выйти за пределы)
    -
    434 *
    -
    435 @code
    -
    436 void Hardfault()
    -
    437 {
    -
    438 HF_HandleFault();
    -
    439 NVIC_SystemReset();
    -
    440 }
    -
    441
    -
    442 int main()
    -
    443 {
    -
    444 if(HF_CheckRecovered(0))
    -
    445 {
    -
    446 //set hardfault error
    -
    447 RTT_EraseFlash(); // erase rtt flash after message readed
    -
    448 }
    -
    449 }
    -
    450 @endcode
    -
    451 * @{
    -
    452 */
    -
    453#if defined(HAL_MODULE_ENABLED) && defined(HARDFAULT_SERIAL_TRACE)
    -
    454
    -
    455#ifndef HF_RTT_TAIL_SIZE
    -
    456#define HF_RTT_TAIL_SIZE RTT_FLASH_BUFFER_SIZE ///< Размер буфера RTT, который сохранится при Hardfault
    -
    457#endif
    -
    458
    -
    459/**
    -
    460 * @brief Контекст стек-фрейма процессора при HardFault
    -
    461 * @details Сохраняет регистры R0-R3, R12, LR, PC, PSR для последующего анализа.
    -
    462 */
    -
    -
    463typedef struct {
    -
    464 uint32_t r0; ///< Регистр R0
    -
    465 uint32_t r1; ///< Регистр R1
    -
    466 uint32_t r2; ///< Регистр R2
    -
    467 uint32_t r3; ///< Регистр R3
    -
    468 uint32_t r12; ///< Регистр R12
    -
    469 uint32_t lr; ///< Link Register
    -
    470 uint32_t pc; ///< Program Counter
    -
    471 uint32_t psr; ///< Program Status Register
    - +
    384
    +
    385/**
    +
    386 * @brief Стирание сектора Flash с RTT-буфером
    +
    387 */
    +
    +
    388__STATIC_FORCEINLINE int RTT_EraseFlash(void)
    +
    389{
    +
    390 FLASH_EraseInitTypeDef eraseInit;
    +
    391 uint32_t pageError = 0;
    +
    392
    + +
    394
    +
    395 eraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
    +
    396 eraseInit.Sector = RTT_FLASH_SECTOR;
    +
    397 eraseInit.NbSectors = 1;
    +
    398
    +
    399 if (HAL_FLASHEx_Erase(&eraseInit, &pageError) != HAL_OK)
    +
    400 {
    +
    401 return -1;
    +
    402 }
    +
    403 return 0;
    +
    404 HAL_FLASH_Lock();
    +
    405}
    -
    473
    -
    474/**
    -
    475 * @brief Проверка и вывод последнего HardFault-трейса из Flash
    -
    476 * @details
    -
    477 * Функция ищет последнюю запись HardFault по базовому тегу HF_RTT_TAG_BASE
    -
    478 * и выводит её содержимое в консоль. После успешного вывода Flash можно опционально очистить.
    -
    479 *
    -
    480 * @return int
    -
    481 * - 1 — данные HardFault найдены и выведены
    -
    482 * - 0 — данные отсутствуют или тег не найден
    -
    483 *
    -
    484 * @note Вызов рекомендуется при инициализации приложения для анализа предыдущего сбоя.
    -
    485 */
    -
    -
    486__STATIC_FORCEINLINE int HF_CheckRecovered(int erase)
    -
    487{
    -
    488 char buffer[RTT_FLASH_BUFFER_SIZE];
    -
    489 uint32_t read_size = 0;
    -
    490 int n_hardfault = RTT_ReadFromFlash(HF_RTT_TAG_BASE, buffer, HF_RTT_TAIL_SIZE, &read_size);
    -
    491 if (n_hardfault > 0)
    -
    492 {
    -
    493 my_printf("\n--- Recovered HardFault RTT buffer #%u ---\n", n_hardfault);
    -
    494 for (int i = 0; i < read_size; i++)
    -
    495 {
    -
    496 char c = buffer[i];
    -
    497 if (c == 0 || c == (char)0xFF) break;
    -
    498 my_printf("%c", c);
    -
    499 }
    -
    500
    -
    501 if(erase)
    - -
    503 my_printf("\n--------- HardFault Dump End ---------\n");
    -
    504 return 1;
    -
    505 }
    -
    506 return 0;
    -
    507}
    +
    406
    +
    407/** TRACE_RTT_FLASH
    +
    408 * @}
    +
    409 */
    +
    410
    +
    411#else // HAL_MODULE_ENABLED && RTT_TRACE_ENABLE
    +
    412#define RTT_FlashPrepare(...)
    +
    413#define RTT_EraseFlash(...) 0
    +
    414#define RTT_SaveToFlash(...) 0
    +
    415#define RTT_ReadFromFlash(...) 0
    +
    416#endif // HAL_MODULE_ENABLED && RTT_TRACE_ENABLE
    +
    417
    +
    418
    +
    419
    +
    420
    +
    421/**
    +
    422 * @addtogroup TRACE_HARDFAULT Hardfault trace defines
    +
    423 * @ingroup TRACE
    +
    424 * @brief Модуль трассировки HardFault с возможностью сохранения RTT буфера во Flash
    +
    425 * @details
    +
    426 * Этот модуль позволяет сохранять контекст процессора и последние символы RTT буфера при возникновении HardFault.
    +
    427 *
    +
    428 * Механизм работы:
    +
    429 * - При срабатывании HardFault вызывается HF_HandleFault(), который:
    +
    430 * 1. Получает указатель на стек, где произошёл HardFault (MSP или PSP).
    +
    431 * 2. Выводит значения регистров R0-R3, R12, LR, PC, PSR и системных регистров SCB.
    +
    432 * 3. Формирует строку с регистрами и копирует последние символы RTT буфера.
    +
    433 * 4. Сохраняет данные во Flash с базовым тегом HF_RTT_TAG_BASE.
    +
    434 * - Для восстановления последнего HardFault используется HF_CheckRecovered(), который:
    +
    435 * 1. Читает запись во Flash по базовому тегу.
    +
    436 * 2. Выводит сохранённый RTT буфер и контекст регистров.
    +
    437 * 3. Опционально стирает Flash после восстановления.
    +
    438 *
    +
    439 * Параметры:
    +
    440 * - @ref HARDFAULT_SERIAL_TRACE - Включить обработку и serial трассировку Hardfault
    +
    441 * Если отключена то вставляются заглушки, никак не влияющие на параметры и остальную программу
    +
    442 * - @ref HF_RTT_TAG_BASE - Базовый тег RTT Flash для HardFault
    +
    443 * - @ref HF_RTT_TAIL_SIZE - Размер буфера RTT, который сохранится при Hardfault
    +
    444 * - @ref HF_STACK_DUMP_WORDS - Сколько слов стека будет проанализировано во время Hardfault
    +
    445 * - @ref HF_FLASH_ADDR - Адрес FLASH куда положится RTT буфер
    +
    446 * - @ref HF_RAM_END - Конец RAM памяти (чтобы во время анализа стека не выйти за пределы)
    +
    447 *
    +
    448 @code
    +
    449 void Hardfault()
    +
    450 {
    +
    451 HF_HandleFault();
    +
    452 NVIC_SystemReset();
    +
    453 }
    +
    454
    +
    455 int main()
    +
    456 {
    +
    457 if(HF_CheckRecovered(0))
    +
    458 {
    +
    459 //set hardfault error
    +
    460 RTT_EraseFlash(); // erase rtt flash after message readed
    +
    461 }
    +
    462 }
    +
    463 @endcode
    +
    464 * @{
    +
    465 */
    +
    466#if defined(HAL_MODULE_ENABLED) && defined(HARDFAULT_SERIAL_TRACE)
    +
    467
    +
    468#ifndef HF_RTT_TAIL_SIZE
    +
    469#define HF_RTT_TAIL_SIZE RTT_FLASH_BUFFER_SIZE ///< Размер буфера RTT, который сохранится при Hardfault
    +
    470#endif
    +
    471
    +
    472/**
    +
    473 * @brief Контекст стек-фрейма процессора при HardFault
    +
    474 * @details Сохраняет регистры R0-R3, R12, LR, PC, PSR для последующего анализа.
    +
    475 */
    +
    +
    476typedef struct {
    +
    477 uint32_t r0; ///< Регистр R0
    +
    478 uint32_t r1; ///< Регистр R1
    +
    479 uint32_t r2; ///< Регистр R2
    +
    480 uint32_t r3; ///< Регистр R3
    +
    481 uint32_t r12; ///< Регистр R12
    +
    482 uint32_t lr; ///< Link Register
    +
    483 uint32_t pc; ///< Program Counter
    +
    484 uint32_t psr; ///< Program Status Register
    +
    -
    508
    -
    509
    -
    510static HF_StackFrame_t *stack_frame;
    -
    511static uint32_t stack_dump[HF_STACK_DUMP_WORDS];
    -
    512static void *ret_adr[10] = {0};
    -
    513/**
    -
    514 * @brief Обработчик HardFault
    -
    515 * @details
    -
    516 * Вызывается из прерывания HardFault или в любом месте где понятно что ошибка критическая.
    -
    517 * Последовательно выполняет:
    -
    518 * 1. Определяет активный стек (MSP или PSP) на момент сбоя.
    -
    519 * 2. Сохраняет значения регистров R0-R3, R12, LR, PC, PSR.
    -
    520 * 3. Выводит системные регистры CFSR, HFSR, DFSR, AFSR, MMFAR, BFAR.
    -
    521 * 4. Формирует stack trace с 3 уровнями возврата.
    -
    522 * 5. Копирует последние символы RTT буфера.
    -
    523 * 6. Сохраняет все данные во Flash через RTT_SaveToFlash с базовым тегом HF_RTT_TAG_BASE.
    -
    524 *
    -
    525 * @note Функция защищена, так как вызывается в контексте сбоя — минимизирует использование вызовов HAL.
    -
    526 */
    -
    -
    527__STATIC_FORCEINLINE void HF_HandleFault(void)
    -
    528{
    -
    529 // Получаем указатель на стек, где произошёл HardFault
    -
    530 __ASM volatile(
    -
    531 "TST lr, #4 \n"
    -
    532 "ITE EQ \n"
    -
    533 "MRSEQ %[ptr], MSP\n"
    -
    534 "MRSNE %[ptr], PSP\n"
    -
    535 : [ptr] "=r"(stack_frame)
    -
    536 );
    -
    537
    -
    538 my_printf("\n===== HardFault occurred! =====\n");
    -
    539 my_printf("R0 = 0x%08X\n", stack_frame->r0);
    -
    540 my_printf("R1 = 0x%08X\n", stack_frame->r1);
    -
    541 my_printf("R2 = 0x%08X\n", stack_frame->r2);
    -
    542 my_printf("R3 = 0x%08X\n", stack_frame->r3);
    -
    543 my_printf("R12 = 0x%08X\n", stack_frame->r12);
    -
    544 my_printf("LR = 0x%08X\n", stack_frame->lr);
    -
    545 my_printf("PC = 0x%08X\n", stack_frame->pc);
    -
    546 my_printf("PSR = 0x%08X\n", stack_frame->psr);
    -
    547
    -
    548 my_printf("CFSR = 0x%08X\n", SCB->CFSR);
    -
    549 my_printf("HFSR = 0x%08X\n", SCB->HFSR);
    -
    550 my_printf("DFSR = 0x%08X\n", SCB->DFSR);
    -
    551 my_printf("AFSR = 0x%08X\n", SCB->AFSR);
    -
    552 my_printf("MMFAR = 0x%08X\n", SCB->MMFAR);
    -
    553 my_printf("BFAR = 0x%08X\n", SCB->BFAR);
    -
    554
    -
    555 // --- Stack trace ---
    -
    556 my_printf("--- Stack trace ---\n");
    -
    557 ret_adr[0] = __builtin_return_address(0);
    -
    558 ret_adr[1] = __builtin_return_address(1);
    -
    559 ret_adr[2] = __builtin_return_address(2);
    +
    486
    +
    487/**
    +
    488 * @brief Проверка и вывод последнего HardFault-трейса из Flash
    +
    489 * @details
    +
    490 * Функция ищет последнюю запись HardFault по базовому тегу HF_RTT_TAG_BASE
    +
    491 * и выводит её содержимое в консоль. После успешного вывода Flash можно опционально очистить.
    +
    492 *
    +
    493 * @return int
    +
    494 * - 1 — данные HardFault найдены и выведены
    +
    495 * - 0 — данные отсутствуют или тег не найден
    +
    496 *
    +
    497 * @note Вызов рекомендуется при инициализации приложения для анализа предыдущего сбоя.
    +
    498 */
    +
    +
    499__STATIC_FORCEINLINE int HF_CheckRecovered(int erase)
    +
    500{
    +
    501 char buffer[RTT_FLASH_BUFFER_SIZE];
    +
    502 uint32_t read_size = 0;
    +
    503 int n_hardfault = RTT_ReadFromFlash(HF_RTT_TAG_BASE, buffer, HF_RTT_TAIL_SIZE, &read_size);
    +
    504 if (n_hardfault > 0)
    +
    505 {
    +
    506 my_printf("\n--- Recovered HardFault RTT buffer #%u ---\n", n_hardfault);
    +
    507 for (int i = 0; i < read_size; i++)
    +
    508 {
    +
    509 char c = buffer[i];
    +
    510 if (c == 0 || c == (char)0xFF) break;
    +
    511 my_printf("%c", c);
    +
    512 }
    +
    513
    +
    514 if(erase)
    + +
    516 my_printf("\n--------- HardFault Dump End ---------\n");
    +
    517 return 1;
    +
    518 }
    +
    519 return 0;
    +
    520}
    +
    +
    521
    +
    522
    +
    523static HF_StackFrame_t *stack_frame;
    +
    524static uint32_t stack_dump[HF_STACK_DUMP_WORDS];
    +
    525static void *ret_adr[10] = {0};
    +
    526/**
    +
    527 * @brief Обработчик HardFault
    +
    528 * @details
    +
    529 * Вызывается из прерывания HardFault или в любом месте где понятно что ошибка критическая.
    +
    530 * Последовательно выполняет:
    +
    531 * 1. Определяет активный стек (MSP или PSP) на момент сбоя.
    +
    532 * 2. Сохраняет значения регистров R0-R3, R12, LR, PC, PSR.
    +
    533 * 3. Выводит системные регистры CFSR, HFSR, DFSR, AFSR, MMFAR, BFAR.
    +
    534 * 4. Формирует stack trace с 3 уровнями возврата.
    +
    535 * 5. Копирует последние символы RTT буфера.
    +
    536 * 6. Сохраняет все данные во Flash через RTT_SaveToFlash с базовым тегом HF_RTT_TAG_BASE.
    +
    537 *
    +
    538 * @note Функция защищена, так как вызывается в контексте сбоя — минимизирует использование вызовов HAL.
    +
    539 */
    +
    +
    540__STATIC_FORCEINLINE void HF_HandleFault(void)
    +
    541{
    +
    542 // Получаем указатель на стек, где произошёл HardFault
    +
    543 __ASM volatile(
    +
    544 "TST lr, #4 \n"
    +
    545 "ITE EQ \n"
    +
    546 "MRSEQ %[ptr], MSP\n"
    +
    547 "MRSNE %[ptr], PSP\n"
    +
    548 : [ptr] "=r"(stack_frame)
    +
    549 );
    +
    550
    +
    551 my_printf("\n===== HardFault occurred! =====\n");
    +
    552 my_printf("R0 = 0x%08X\n", stack_frame->r0);
    +
    553 my_printf("R1 = 0x%08X\n", stack_frame->r1);
    +
    554 my_printf("R2 = 0x%08X\n", stack_frame->r2);
    +
    555 my_printf("R3 = 0x%08X\n", stack_frame->r3);
    +
    556 my_printf("R12 = 0x%08X\n", stack_frame->r12);
    +
    557 my_printf("LR = 0x%08X\n", stack_frame->lr);
    +
    558 my_printf("PC = 0x%08X\n", stack_frame->pc);
    +
    559 my_printf("PSR = 0x%08X\n", stack_frame->psr);
    560
    -
    561 for (int i = 0; i < 3; i++) // развернуть n уровней
    -
    562 {
    -
    563 if(ret_adr[i])
    -
    564 my_printf(" #%d: 0x%08lX\r\n", i, ret_adr[i]); // -1 для Thumb
    -
    565 }
    - -
    567}
    +
    561 my_printf("CFSR = 0x%08X\n", SCB->CFSR);
    +
    562 my_printf("HFSR = 0x%08X\n", SCB->HFSR);
    +
    563 my_printf("DFSR = 0x%08X\n", SCB->DFSR);
    +
    564 my_printf("AFSR = 0x%08X\n", SCB->AFSR);
    +
    565 my_printf("MMFAR = 0x%08X\n", SCB->MMFAR);
    +
    566 my_printf("BFAR = 0x%08X\n", SCB->BFAR);
    +
    567
    +
    568 // --- Stack trace ---
    +
    569 my_printf("--- Stack trace ---\n");
    +
    570 ret_adr[0] = __builtin_return_address(0);
    +
    571 ret_adr[1] = __builtin_return_address(1);
    +
    572 ret_adr[2] = __builtin_return_address(2);
    +
    573
    +
    574 for (int i = 0; i < 3; i++) // развернуть n уровней
    +
    575 {
    +
    576 if(ret_adr[i])
    +
    577 my_printf(" #%d: 0x%08lX\r\n", i, ret_adr[i]); // -1 для Thumb
    +
    578 }
    + +
    580}
    -
    568#else // HAL_MODULE_ENABLED && HARDFAULT_SERIAL_TRACE
    -
    569#define HF_CheckRecovered(...) 0
    -
    570#define HF_HandleFault(...)
    -
    571#endif // HAL_MODULE_ENABLED && HARDFAULT_SERIAL_TRACE
    -
    572/** TRACE_HARDFAULT
    -
    573 * @}
    -
    574 */
    -
    575
    -
    576
    -
    577
    -
    578#endif //__TRACE_H_
    +
    581#else // HAL_MODULE_ENABLED && HARDFAULT_SERIAL_TRACE
    +
    582#define HF_CheckRecovered(...) 0
    +
    583#define HF_HandleFault(...)
    +
    584#endif // HAL_MODULE_ENABLED && HARDFAULT_SERIAL_TRACE
    +
    585/** TRACE_HARDFAULT
    +
    586 * @}
    +
    587 */
    +
    588
    +
    589
    +
    590
    +
    591#endif //__TRACE_H_
    #define RTT_FLASH_SECTOR
    Сектор FLASH куда положится RTT буфер
    #define RTT_FLASH_BUFFER_SIZE
    Размер буфера RTT в Flash.
    #define RTT_FLASH_SECTOR_START
    Начало сектора RTT_FLASH_SECTOR.
    @@ -711,34 +716,35 @@ $(function(){initNavTree('trace_8h_source.html',''); initResizable(); });
    #define HF_RTT_TAG_BASE
    базовый тег для HardFault
    #define HF_RTT_TAIL_SIZE
    Размер буфера RTT, который сохранится при Hardfault.
    #define RTT_FLASH_SECTOR_END
    Конец сектора RTT_FLASH_SECTOR.
    -
    __STATIC_FORCEINLINE int HF_CheckRecovered(int erase)
    Проверка и вывод последнего HardFault-трейса из Flash.
    Definition trace.h:486
    -
    __STATIC_FORCEINLINE void HF_HandleFault(void)
    Обработчик HardFault.
    Definition trace.h:527
    -
    __STATIC_FORCEINLINE void RTT_FlashPrepare(void)
    Подготовка Flash к записи
    Definition trace.h:190
    -
    __STATIC_FORCEINLINE int RTT_ReadFromFlash(uint32_t tag, char *Buffer, uint32_t tail_size, uint32_t *read_size)
    Читает последние символы RTT-буфера из Flash по тегу
    Definition trace.h:311
    -
    __STATIC_FORCEINLINE int RTT_SaveToFlash(uint32_t tag, uint32_t tail_size)
    Сохраняет последние символы RTT-буфера в Flash по тегу
    Definition trace.h:214
    -
    __STATIC_FORCEINLINE int RTT_EraseFlash(void)
    Стирание сектора Flash с RTT-буфером
    Definition trace.h:375
    -
    #define my_printf(...)
    Универсальный макрос для вывода трассировки
    Definition trace.h:71
    +
    __STATIC_FORCEINLINE int HF_CheckRecovered(int erase)
    Проверка и вывод последнего HardFault-трейса из Flash.
    Definition trace.h:499
    +
    __STATIC_FORCEINLINE void HF_HandleFault(void)
    Обработчик HardFault.
    Definition trace.h:540
    +
    __STATIC_FORCEINLINE void RTT_FlashPrepare(void)
    Подготовка Flash к записи
    Definition trace.h:203
    +
    __STATIC_FORCEINLINE int RTT_ReadFromFlash(uint32_t tag, char *Buffer, uint32_t tail_size, uint32_t *read_size)
    Читает последние символы RTT-буфера из Flash по тегу
    Definition trace.h:324
    +
    __STATIC_FORCEINLINE int RTT_SaveToFlash(uint32_t tag, uint32_t tail_size)
    Сохраняет последние символы RTT-буфера в Flash по тегу
    Definition trace.h:227
    +
    __STATIC_FORCEINLINE int RTT_EraseFlash(void)
    Стирание сектора Flash с RTT-буфером
    Definition trace.h:388
    +
    #define my_printf(...)
    Универсальный макрос для вывода трассировки
    Definition trace.h:80
    Заголочный файл для дефайнов библиотеки MyLibsGeneral.
    -
    Контекст стек-фрейма процессора при HardFault.
    Definition trace.h:463
    -
    uint32_t pc
    Program Counter.
    Definition trace.h:470
    -
    uint32_t r1
    Регистр R1.
    Definition trace.h:465
    -
    uint32_t r0
    Регистр R0.
    Definition trace.h:464
    -
    uint32_t r3
    Регистр R3.
    Definition trace.h:467
    -
    uint32_t r2
    Регистр R2.
    Definition trace.h:466
    -
    uint32_t lr
    Link Register.
    Definition trace.h:469
    -
    uint32_t r12
    Регистр R12.
    Definition trace.h:468
    -
    uint32_t psr
    Program Status Register.
    Definition trace.h:471
    -
    Структура RTT, которая будет положена в Flash.
    Definition trace.h:180
    -
    uint32_t tag
    Уникальный идентификатор буфера
    Definition trace.h:181
    -
    char data[1024]
    Буфер RTT.
    Definition trace.h:183
    -
    uint32_t size
    Размер данных
    Definition trace.h:182
    +
    Контекст стек-фрейма процессора при HardFault.
    Definition trace.h:476
    +
    uint32_t pc
    Program Counter.
    Definition trace.h:483
    +
    uint32_t r1
    Регистр R1.
    Definition trace.h:478
    +
    uint32_t r0
    Регистр R0.
    Definition trace.h:477
    +
    uint32_t r3
    Регистр R3.
    Definition trace.h:480
    +
    uint32_t r2
    Регистр R2.
    Definition trace.h:479
    +
    uint32_t lr
    Link Register.
    Definition trace.h:482
    +
    uint32_t r12
    Регистр R12.
    Definition trace.h:481
    +
    uint32_t psr
    Program Status Register.
    Definition trace.h:484
    +
    Структура RTT, которая будет положена в Flash.
    Definition trace.h:193
    +
    uint32_t tag
    Уникальный идентификатор буфера
    Definition trace.h:194
    +
    char data[1024]
    Буфер RTT.
    Definition trace.h:196
    +
    uint32_t size
    Размер данных
    Definition trace.h:195
    +
    diff --git a/Doc/html/trackers_8h.html b/Doc/html/trackers_8h.html index 84a684b..ab445ec 100644 --- a/Doc/html/trackers_8h.html +++ b/Doc/html/trackers_8h.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/trackers.h File Reference +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/trackers.h File Reference - @@ -44,21 +43,20 @@ MathJax.Hub.Config({
    - + +
    @@ -73,10 +71,9 @@ $(function() {
    +
    -
    trackers.h File Reference
    @@ -109,111 +104,97 @@ $(function(){initNavTree('trackers_8h.html',''); initResizable(); });

    Заголочный файл для работы с трекерами Trackers defines. More...

    #include "mylibs_defs.h"
    -
    - + Include dependency graph for trackers.h:
    +
    Include dependency graph for trackers.h:
    -
    - + This graph shows which files directly or indirectly include this file:
    +
    This graph shows which files directly or indirectly include this file:

    Go to the source code of this file.

    - - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + -

    +

    Macros

    #define TrackerTypeDef(num_user_vars)
     Структура для счетчиков отладки
     
    #define num_of_usercnts(_user_)   (sizeof(_user_) / sizeof(uint32_t))
    #define num_of_usercnts(_user_)
     Получить количетство пользовательских переменных
     
    #define assert_usertracker(_cntstruct_, _uservarnumb_)   ((_uservarnumb_) < num_of_usercnts((_cntstruct_).user))
    #define assert_usertracker(_cntstruct_, _uservarnumb_)
     Проверка существует ли указанная пользовательская переменная
     
    #define if_assert_usertracker(_cntstruct_, _uservarnumb_)   if(assert_usertracker(_cntstruct_, _uservarnumb_))
    #define if_assert_usertracker(_cntstruct_, _uservarnumb_)
     Условие для проверки существует ли указанная пользовательская переменная
     
    #define tern_assert_usertracker(_cntstruct_, _uservarnumb_)   (assert_usertracker(_cntstruct_, _uservarnumb_)) ? _uservarnumb_ : 0
    #define tern_assert_usertracker(_cntstruct_, _uservarnumb_)
     Тернарный оператор для проверки существует ли указанная пользовательская переменная
     
    #define TrackerGet_Ok(_cntstruct_)   (_cntstruct_).cnt_ok
    #define TrackerGet_Ok(_cntstruct_)
     Считать счетчик успешных событий
     
    #define TrackerGet_Err(_cntstruct_)   (_cntstruct_).cnt_err
    #define TrackerGet_Err(_cntstruct_)
     Считать счетчик ошибок
     
    #define TrackerGet_Warn(_cntstruct_)   (_cntstruct_).cnt_warn
    #define TrackerGet_Warn(_cntstruct_)
     Считать счетчик предупреждений
     
    #define TrackerGet_User(_cntstruct_, _uservarnumb_)   (_cntstruct_).user[tern_assert_usertracker(_cntstruct_, _uservarnumb_)]
    #define TrackerGet_User(_cntstruct_, _uservarnumb_)
     Считать пользовательскую переменную
     
    #define TrackerCnt_Ok(_cntstruct_)   (_cntstruct_).cnt_ok++
    #define TrackerCnt_Ok(_cntstruct_)
     Инкрементирование счетчика успешных событий
     
    #define TrackerCnt_Err(_cntstruct_)   (_cntstruct_).cnt_err++
    #define TrackerCnt_Err(_cntstruct_)
     Инкрементирование счетчика ошибок
     
    #define TrackerCnt_Warn(_cntstruct_)   (_cntstruct_).cnt_warn++
    #define TrackerCnt_Warn(_cntstruct_)
     Инкрементирование счетчика предупреждений
     
    #define TrackerCnt_User(_cntstruct_, _uservarnumb_)   if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_]++;
    #define TrackerCnt_User(_cntstruct_, _uservarnumb_)
     Инкрементирование пользовательской переменной
     
    #define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_)   if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = (_val_)
    #define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_)
     Запись числа в пользовательскую переменную
     
    #define TrackerClear_All(_cntstruct_)   memset(&(_cntstruct_), 0, sizeof(_cntstruct_))
    #define TrackerClear_All(_cntstruct_)
     Очистка всей структуры
     
    #define TrackerClear_Ok(_cntstruct_)   (_cntstruct_).cnt_ok = 0
    #define TrackerClear_Ok(_cntstruct_)
     Очистка счетчика успешных событий
     
    #define TrackerClear_Err(_cntstruct_)   (_cntstruct_).cnt_err = 0
    #define TrackerClear_Err(_cntstruct_)
     Очистка счетчика ошибок
     
    #define TrackerClear_Warn(_cntstruct_)   (_cntstruct_).cnt_warn = 0
    #define TrackerClear_Warn(_cntstruct_)
     Очистка счетчика предупреждений
     
    #define TrackerClear_User(_cntstruct_, _uservarnumb_)   if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = 0;
    #define TrackerClear_User(_cntstruct_, _uservarnumb_)
     Очистка пользовательской переменной
     
    #define TrackerClear_UserAll(_cntstruct_)   memset(&(_cntstruct_).user, 0, sizeof((_cntstruct_).user))
    #define TrackerClear_UserAll(_cntstruct_)
     Очистка всех пользовательских переменных
     
    -

    Detailed Description

    +

    Detailed Description

    Заголочный файл для работы с трекерами Trackers defines.

    Definition in file trackers.h.

    + +
    diff --git a/Doc/html/trackers_8h__dep__incl.map b/Doc/html/trackers_8h__dep__incl.map index 2d500d0..1b0fa3d 100644 --- a/Doc/html/trackers_8h__dep__incl.map +++ b/Doc/html/trackers_8h__dep__incl.map @@ -1,5 +1,5 @@ - - - - + + + + diff --git a/Doc/html/trackers_8h__dep__incl.md5 b/Doc/html/trackers_8h__dep__incl.md5 index f1a498d..90e66c4 100644 --- a/Doc/html/trackers_8h__dep__incl.md5 +++ b/Doc/html/trackers_8h__dep__incl.md5 @@ -1 +1 @@ -33dbfd4ef039421a18fe436f2a444bd1 \ No newline at end of file +0e606a2ac14f204c2f3eb519136b3d25 \ No newline at end of file diff --git a/Doc/html/trackers_8h__dep__incl.png b/Doc/html/trackers_8h__dep__incl.png index 5a4f16294853f93aecc23dcaa50a0c1f9289671f..3db1a1083334754e860f6d6a9b03823cdf9f540f 100644 GIT binary patch literal 2894 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 literal 3527 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 diff --git a/Doc/html/trackers_8h__incl.map b/Doc/html/trackers_8h__incl.map index 3efb504..3e6b58f 100644 --- a/Doc/html/trackers_8h__incl.map +++ b/Doc/html/trackers_8h__incl.map @@ -1,9 +1,9 @@ - - - - - - - - + + + + + + + + diff --git a/Doc/html/trackers_8h__incl.md5 b/Doc/html/trackers_8h__incl.md5 index 72c1e03..b38f593 100644 --- a/Doc/html/trackers_8h__incl.md5 +++ b/Doc/html/trackers_8h__incl.md5 @@ -1 +1 @@ -727bb8e299b6891ca417cde17bb1a2f9 \ No newline at end of file +efe05b63911c6edeb90de988b14c85fc \ No newline at end of file diff --git a/Doc/html/trackers_8h__incl.png b/Doc/html/trackers_8h__incl.png index a6d14239828ee7a8b428623b9bb07b6ed831685f..c95cf1a2124236e007a3bb206e6f57ab4c139d26 100644 GIT binary patch literal 4009 zcmb`Kdpy%`|HoC|BFdq3Q<5w>l*6}Mjte#07s;5C!lrL>%IRhsIjhL2gR`(XOp()M zPHl|ux0D!j8p~l5Vr*<-CKm2>-;dwp?*9FLe|{g=AJ_GHT-W3Jd>)_c^?bixSF!`t z>Y(H?Nii|8gErP+M^Qf@CbsLe#6Hm|0xEt@)a|=%YXuhD`O%8W<(Xn)G6);+rEB*v zON_~9$}D*2avxG)1%{PaXLmnSKUa4#`_LNToI)=aVmmQ$KLz=2@7>l>+cVn_$TQN7 z>})dB8q;W$d{|QA*wy0M?n`f}kSqt;Pk(pCmRkOE?9^7%zvjCf=#0?7Gb&x8K|3FQ~li)baKXp_(mX zB4geV;$Y!d2Bj9{#6joR`z>YG5C?x%&((9MDqASMk-jx03-}{RcGqw562Ah#adN7= zA4}>58`ZV7A&i&4bY*5!yjWdI^gB^ag{^D!ibkJE$T&uZRnzY8!o1*F`YPZk{{aggBTvFYfr zI&z(8t6MCvlei}-7E{>l6Lr;7V*ov8XMYwrnXflqMkVnYsT-F^6VlENE0uZi6aqZYk)iq(nBJ{-;YHYOtdx8mR%k$+R?MvX#adDxSH@BZXFMe=2Q)idMJQP= z&J%QD*o%p5z#1&9dSA=y{<(Fm;mU(M`~4XK*X%em#hQ_|3&r#bk7{)1=Ranq{QUen zvBV!gE{>3|CNxtMT<-tq0^;y5@?~qQP<6yRfAD4XA8dc z%`j~t(B9eLV95Bh*<(AOV(t}is^*$3ZjB5(G0vI&eb9)6Ojnw@Z`6T=pGyXS!~2T9 zY#EuE)uyHuw$BTSaM&9oOFl!&zJx+`cp<5eBOh((v{@OcTMMPMRhx#6jf{4jWDqM| zAFwY7(h$y!DFS_TlZ`K}F-6ZFOdRoMz!xd%l*XF+%X}6%+P^BG`R$-`h43hCbP8Qa zUtklf4AI_=WEp&Fexk7e7hd?Pi^?s%DLw4mw@<(9`l~CMq}3CGv&ZmNT_MrDaUT%v zi)(!?Fx4`d2y`w>B?$vnS4l{C>h#+O??1V|BuFVcO>*HqL)S;WX#yg?&GltM+w1-> zw?X4v`%LdRLNuEoV-e&s%ro}ns8k+dw{T7S(C9`zPE@-5Fl}$4hRZ)Z*e54 z<2S5lxzC^uEH~`25xJDOq_2nGO$#+cbMhj52tLVxfllQfG~HyxJOB2jB*3lkxtGy-rB?RHg=4Wb-HmJ*A46ibzNCu`pr@;d`--> zwbJ?i^DfK#LGtMZ$p}Z%k?ve=Jr3}pe7uVU3`{j=o2T&!St@Gl%ir38Ye&|%ixW!Z zRZ|`#$5yzRsZzcOmzBYheuI+Zswq87PFpprXEslD8r8-Y^Q2v5&&c6EUWle`P1x#n zX+>^q=42u+#7-~{I4VlY;Usjzu|u8C)8MjN;_H-wX~?%8FYyDJ2MUw3 z*SQ_*{Id1UgEm2C8%gGRtf<)##p61#YRoFa^pp)WB46x%sw|}EbObcx%UaZD$GBzF z;6D!+f7F>U8Q9$1%*{~S80tr(=J4(=!&WMb@w%mF>qi&+>2H5@0!;ZNIy zG$XlwGUnfI%{!(ov#V;)*kr6`NDL@e*VZQL?mC)EvVZeh?7!9bFIB)2G05!N#808v z@NwGt4xwUc!WLHZJa4Aeoo1pC5a0o^{UO@uLA$O{7D0HDhal_Y}aDzN%>Nv zzh$m79yG4(b`8Z6yl635-J@pazqH$v?%u#9jdxcy`zWve&WoNER5rO^7hW4UwA6Lt z07Sg=`^Bt$WiY(Y8(y|VlIXqE0KWgy(nN&|VsNj!j~5*R$=^3*5Y;&c>bA5>fOHU( z2yrcmwVd94Us-41VhZU>K+Dz9+3vFJntFeP%gYFf^h&)m4Ma@`K8Y&eR7zSgmeH&L zAyM0ugp8BZfmx1Drfo8zCtTv*$l@M7GL75ceXk$8=O-+5784R6TPk}2=28j(-WJ5> zSpvRPs-<1VLq$>z{Oh{LAV+`Uey<1jN&nhO z71qCP_^-h2zkK~a8!kJm0_v9cw12lySpe$S+D{%`;A`n^JuyELjSq|BxXs86cE4|XbRt!{-iN^}%lDXLb*Vn6_4|sG34ssC}byd9#`Pr%K?Dl2|SNUINyE8LE%e zE86cOaaj(Rv@t%GljW0(Ki)q^cNfI|jkGUIY3($(v9WQ6N@Q8m2dYL1S=s^*OQx{X z(8$PL0&e9>DUq6gJ2vJrf2eAQ>ba-Hg)Gzxp*^MnZm&URruMHU{9RV34s4A%{`HC~1 zvlR$!p9eXw#3AseCI*o(yEzXiqvydbYFL*trC`I51Ve?rDG2BV5F4Oi4U7AQ19 zt!?NWA|Z|Ablvnb{gU%PZa<=}hpxnb^J1O3tsnoY!$I8svAFMJgZC-i<3E{^kE*V= z8wsU_+W-7@g2VveyNnpJH)l3>NswNciJ9)rL4`md+)WU1uc<25-d;Fyn%rJDmGOHOxG>?H5S)73 z8&XT*(CcS{fbfatatt#Awf>Lnk^>B)^$&?h2H1|(JV(snQPGTt+?HE zS`Vv)J3)JA0=sjf{d4W*&EAZg+rlmnZvU^t#nLXgkH)q78G%QxFqfgR=kA!j`Yj1C zgKbi)k-vg)!m%Dziw}#?D!eeaZ9C|PSP`llhli5|G-pO^e8mBX1S}qd@(TTWh7q7= zc38v_04#UeYfO+AJ@axlk1kbm7jzCJUs4{^N1nwX(wzY|(90OqGQX5-RpR&VQoN?4 z`9OV$N|8c%7jWUqe16(9SqOV11%ZlG4au0iIcWRC$w2ZI`tG4THN?(I8zv{xyKRxV zAAWd6#FUAzAMgF>A1{l4QBCjZ42J%%K=m(6OaHUPGEuNq1=KM!3yPW?3oP{~ zs+WqG_v+)wKm5Ml_>$cK1}U}){djk`q_1l$W6zc9V>kKv?5;J?~rPK?A7wb#6if# zZkK$+8i(u(bZ50X5_+E3=DBCM+*CY_X>wy=!*O84HkYTx7{=bE4ARsUUNp-JLk9!|pn&K@43lE}%z3Jv-6-(@{54k&w-@a22ofg!Q&~GdCM6Zr zzSU&@{p-7a&*D=a%-qrgune`>=$Q{sT7o9t$dTkxA0v0X=8yfj*oyUjw@A;*+t6N; Qyzt}E1_A}+LAM_K6I1rW#{d8T literal 4286 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 T4fF2P{Sk0+a(BeqU&{C=)LNp* diff --git a/Doc/html/trackers_8h_source.html b/Doc/html/trackers_8h_source.html index f8587f1..f618be6 100644 --- a/Doc/html/trackers_8h_source.html +++ b/Doc/html/trackers_8h_source.html @@ -3,15 +3,14 @@ - + -MyLibs: F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/trackers.h Source File +MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/trackers.h Source File - @@ -44,28 +43,22 @@ MathJax.Hub.Config({
    - + + -
    +
    Заголочный файл для дефайнов библиотеки MyLibsGeneral.
    + diff --git a/Doc/html/unionuint16___bit_type_def-members.html b/Doc/html/unionuint16___bit_type_def-members.html index 3bae288..50f13d1 100644 --- a/Doc/html/unionuint16___bit_type_def-members.html +++ b/Doc/html/unionuint16___bit_type_def-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { + diff --git a/Doc/html/unionuint16___bit_type_def.html b/Doc/html/unionuint16___bit_type_def.html index e290dc4..a6cc4cb 100644 --- a/Doc/html/unionuint16___bit_type_def.html +++ b/Doc/html/unionuint16___bit_type_def.html @@ -3,7 +3,7 @@ - + MyLibs: uint16_BitTypeDef Union Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    uint16_BitTypeDef Union Reference
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + +

    +

    Public Attributes

    uint16_t all
     
    +
    struct { 
     
       unsigned   bit0:1 
     
       unsigned   bit1:1 
     
       unsigned   bit2:1 
     
       unsigned   bit3:1 
     
       unsigned   bit4:1 
     
       unsigned   bit5:1 
     
       unsigned   bit6:1 
     
       unsigned   bit7:1 
     
       unsigned   bit8:1 
     
       unsigned   bit9:1 
     
       unsigned   bit10:1 
     
       unsigned   bit11:1 
     
       unsigned   bit12:1 
     
       unsigned   bit13:1 
     
       unsigned   bit14:1 
     
       unsigned   bit15:1 
     
    bit 
     
       unsigned   bit0:1 
       unsigned   bit1:1 
       unsigned   bit2:1 
       unsigned   bit3:1 
       unsigned   bit4:1 
       unsigned   bit5:1 
       unsigned   bit6:1 
       unsigned   bit7:1 
       unsigned   bit8:1 
       unsigned   bit9:1 
       unsigned   bit10:1 
       unsigned   bit11:1 
       unsigned   bit12:1 
       unsigned   bit13:1 
       unsigned   bit14:1 
       unsigned   bit15:1 
    bit
    -

    Detailed Description

    +

    Detailed Description

    Definition at line 55 of file bit_access.h.

    -

    Member Data Documentation

    +

    Member Data Documentation

    ◆ all

    @@ -426,15 +401,23 @@ struct { 

    The documentation for this union was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h
    + + diff --git a/Doc/html/unionuint32___bit_type_def-members.html b/Doc/html/unionuint32___bit_type_def-members.html index 1ebc9db..e728915 100644 --- a/Doc/html/unionuint32___bit_type_def-members.html +++ b/Doc/html/unionuint32___bit_type_def-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { + diff --git a/Doc/html/unionuint32___bit_type_def.html b/Doc/html/unionuint32___bit_type_def.html index fbb4745..05761c6 100644 --- a/Doc/html/unionuint32___bit_type_def.html +++ b/Doc/html/unionuint32___bit_type_def.html @@ -3,7 +3,7 @@ - + MyLibs: uint32_BitTypeDef Union Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    uint32_BitTypeDef Union Reference
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +

    Public Attributes

    uint32_t all
     
    +
    struct { 
     
       unsigned   bit0:1 
     
       unsigned   bit1:1 
     
       unsigned   bit2:1 
     
       unsigned   bit3:1 
     
       unsigned   bit4:1 
     
       unsigned   bit5:1 
     
       unsigned   bit6:1 
     
       unsigned   bit7:1 
     
       unsigned   bit8:1 
     
       unsigned   bit9:1 
     
       unsigned   bit10:1 
     
       unsigned   bit11:1 
     
       unsigned   bit12:1 
     
       unsigned   bit13:1 
     
       unsigned   bit14:1 
     
       unsigned   bit15:1 
     
       unsigned   bit16:1 
     
       unsigned   bit17:1 
     
       unsigned   bit18:1 
     
       unsigned   bit19:1 
     
       unsigned   bit20:1 
     
       unsigned   bit21:1 
     
       unsigned   bit22:1 
     
       unsigned   bit23:1 
     
       unsigned   bit24:1 
     
       unsigned   bit25:1 
     
       unsigned   bit26:1 
     
       unsigned   bit27:1 
     
       unsigned   bit28:1 
     
       unsigned   bit29:1 
     
       unsigned   bit30:1 
     
       unsigned   bit31:1 
     
    bit 
     
       unsigned   bit0:1 
       unsigned   bit1:1 
       unsigned   bit2:1 
       unsigned   bit3:1 
       unsigned   bit4:1 
       unsigned   bit5:1 
       unsigned   bit6:1 
       unsigned   bit7:1 
       unsigned   bit8:1 
       unsigned   bit9:1 
       unsigned   bit10:1 
       unsigned   bit11:1 
       unsigned   bit12:1 
       unsigned   bit13:1 
       unsigned   bit14:1 
       unsigned   bit15:1 
       unsigned   bit16:1 
       unsigned   bit17:1 
       unsigned   bit18:1 
       unsigned   bit19:1 
       unsigned   bit20:1 
       unsigned   bit21:1 
       unsigned   bit22:1 
       unsigned   bit23:1 
       unsigned   bit24:1 
       unsigned   bit25:1 
       unsigned   bit26:1 
       unsigned   bit27:1 
       unsigned   bit28:1 
       unsigned   bit29:1 
       unsigned   bit30:1 
       unsigned   bit31:1 
    bit
    -

    Detailed Description

    +

    Detailed Description

    Definition at line 80 of file bit_access.h.

    -

    Member Data Documentation

    +

    Member Data Documentation

    ◆ all

    @@ -714,15 +673,23 @@ struct { 

    The documentation for this union was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h
    + + diff --git a/Doc/html/unionuint64___bit_type_def-members.html b/Doc/html/unionuint64___bit_type_def-members.html index 39f8418..aa8f0ea 100644 --- a/Doc/html/unionuint64___bit_type_def-members.html +++ b/Doc/html/unionuint64___bit_type_def-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { + diff --git a/Doc/html/unionuint64___bit_type_def.html b/Doc/html/unionuint64___bit_type_def.html index 7f31bd5..d9aa7f7 100644 --- a/Doc/html/unionuint64___bit_type_def.html +++ b/Doc/html/unionuint64___bit_type_def.html @@ -3,7 +3,7 @@ - + MyLibs: uint64_BitTypeDef Union Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    uint64_BitTypeDef Union Reference
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +

    Public Attributes

    uint64_t all
     
    +
    struct { 
     
       unsigned   bit0:1 
     
       unsigned   bit1:1 
     
       unsigned   bit2:1 
     
       unsigned   bit3:1 
     
       unsigned   bit4:1 
     
       unsigned   bit5:1 
     
       unsigned   bit6:1 
     
       unsigned   bit7:1 
     
       unsigned   bit8:1 
     
       unsigned   bit9:1 
     
       unsigned   bit10:1 
     
       unsigned   bit11:1 
     
       unsigned   bit12:1 
     
       unsigned   bit13:1 
     
       unsigned   bit14:1 
     
       unsigned   bit15:1 
     
       unsigned   bit16:1 
     
       unsigned   bit17:1 
     
       unsigned   bit18:1 
     
       unsigned   bit19:1 
     
       unsigned   bit20:1 
     
       unsigned   bit21:1 
     
       unsigned   bit22:1 
     
       unsigned   bit23:1 
     
       unsigned   bit24:1 
     
       unsigned   bit25:1 
     
       unsigned   bit26:1 
     
       unsigned   bit27:1 
     
       unsigned   bit28:1 
     
       unsigned   bit29:1 
     
       unsigned   bit30:1 
     
       unsigned   bit31:1 
     
       unsigned   bit32:1 
     
       unsigned   bit33:1 
     
       unsigned   bit34:1 
     
       unsigned   bit35:1 
     
       unsigned   bit36:1 
     
       unsigned   bit37:1 
     
       unsigned   bit38:1 
     
       unsigned   bit39:1 
     
       unsigned   bit40:1 
     
       unsigned   bit41:1 
     
       unsigned   bit42:1 
     
       unsigned   bit43:1 
     
       unsigned   bit44:1 
     
       unsigned   bit45:1 
     
       unsigned   bit46:1 
     
       unsigned   bit47:1 
     
       unsigned   bit48:1 
     
       unsigned   bit49:1 
     
       unsigned   bit50:1 
     
       unsigned   bit51:1 
     
       unsigned   bit52:1 
     
       unsigned   bit53:1 
     
       unsigned   bit54:1 
     
       unsigned   bit55:1 
     
       unsigned   bit56:1 
     
       unsigned   bit57:1 
     
       unsigned   bit58:1 
     
       unsigned   bit59:1 
     
       unsigned   bit60:1 
     
       unsigned   bit61:1 
     
       unsigned   bit62:1 
     
       unsigned   bit63:1 
     
    bit 
     
       unsigned   bit0:1 
       unsigned   bit1:1 
       unsigned   bit2:1 
       unsigned   bit3:1 
       unsigned   bit4:1 
       unsigned   bit5:1 
       unsigned   bit6:1 
       unsigned   bit7:1 
       unsigned   bit8:1 
       unsigned   bit9:1 
       unsigned   bit10:1 
       unsigned   bit11:1 
       unsigned   bit12:1 
       unsigned   bit13:1 
       unsigned   bit14:1 
       unsigned   bit15:1 
       unsigned   bit16:1 
       unsigned   bit17:1 
       unsigned   bit18:1 
       unsigned   bit19:1 
       unsigned   bit20:1 
       unsigned   bit21:1 
       unsigned   bit22:1 
       unsigned   bit23:1 
       unsigned   bit24:1 
       unsigned   bit25:1 
       unsigned   bit26:1 
       unsigned   bit27:1 
       unsigned   bit28:1 
       unsigned   bit29:1 
       unsigned   bit30:1 
       unsigned   bit31:1 
       unsigned   bit32:1 
       unsigned   bit33:1 
       unsigned   bit34:1 
       unsigned   bit35:1 
       unsigned   bit36:1 
       unsigned   bit37:1 
       unsigned   bit38:1 
       unsigned   bit39:1 
       unsigned   bit40:1 
       unsigned   bit41:1 
       unsigned   bit42:1 
       unsigned   bit43:1 
       unsigned   bit44:1 
       unsigned   bit45:1 
       unsigned   bit46:1 
       unsigned   bit47:1 
       unsigned   bit48:1 
       unsigned   bit49:1 
       unsigned   bit50:1 
       unsigned   bit51:1 
       unsigned   bit52:1 
       unsigned   bit53:1 
       unsigned   bit54:1 
       unsigned   bit55:1 
       unsigned   bit56:1 
       unsigned   bit57:1 
       unsigned   bit58:1 
       unsigned   bit59:1 
       unsigned   bit60:1 
       unsigned   bit61:1 
       unsigned   bit62:1 
       unsigned   bit63:1 
    bit
    -

    Detailed Description

    +

    Detailed Description

    Definition at line 97 of file bit_access.h.

    -

    Member Data Documentation

    +

    Member Data Documentation

    ◆ all

    @@ -1290,15 +1217,23 @@ struct { 

    The documentation for this union was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h
    + + diff --git a/Doc/html/unionuint8___bit_type_def-members.html b/Doc/html/unionuint8___bit_type_def-members.html index 4e59f97..d5c72bf 100644 --- a/Doc/html/unionuint8___bit_type_def-members.html +++ b/Doc/html/unionuint8___bit_type_def-members.html @@ -3,7 +3,7 @@ - + MyLibs: Member List @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { + diff --git a/Doc/html/unionuint8___bit_type_def.html b/Doc/html/unionuint8___bit_type_def.html index 5f54a9c..53a402f 100644 --- a/Doc/html/unionuint8___bit_type_def.html +++ b/Doc/html/unionuint8___bit_type_def.html @@ -3,7 +3,7 @@ - + MyLibs: uint8_BitTypeDef Union Reference @@ -11,7 +11,6 @@ - @@ -44,21 +43,20 @@ MathJax.Hub.Config({ - + + @@ -73,10 +71,9 @@ $(function() { +
    -
    uint8_BitTypeDef Union Reference
    - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + +

    +

    Public Attributes

    uint8_t all
     
    +
    struct { 
     
       unsigned   bit0:1 
     
       unsigned   bit1:1 
     
       unsigned   bit2:1 
     
       unsigned   bit3:1 
     
       unsigned   bit4:1 
     
       unsigned   bit5:1 
     
       unsigned   bit6:1 
     
       unsigned   bit7:1 
     
    bit 
     
       unsigned   bit0:1 
       unsigned   bit1:1 
       unsigned   bit2:1 
       unsigned   bit3:1 
       unsigned   bit4:1 
       unsigned   bit5:1 
       unsigned   bit6:1 
       unsigned   bit7:1 
    bit
    -

    Detailed Description

    +

    Detailed Description

    Definition at line 39 of file bit_access.h.

    -

    Member Data Documentation

    +

    Member Data Documentation

    ◆ all

    @@ -282,15 +265,23 @@ struct { 

    The documentation for this union was generated from the following file:
      -
    • F:/Work/Projects/STM/.Elementary/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h
    • +
    • E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/bit_access.h
    + + diff --git a/Doc/latex/Makefile b/Doc/latex/Makefile index 7f82972..8e14614 100644 --- a/Doc/latex/Makefile +++ b/Doc/latex/Makefile @@ -9,19 +9,34 @@ all: $(MANUAL_FILE).pdf pdf: $(MANUAL_FILE).pdf $(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex - $(LATEX_CMD) $(MANUAL_FILE) + $(LATEX_CMD) $(MANUAL_FILE) || \ + if [ $$? != 0 ] ; then \ + \echo "Please consult $(MANUAL_FILE).log to see the error messages" ; \ + false; \ + fi $(MKIDX_CMD) $(MANUAL_FILE).idx - $(LATEX_CMD) $(MANUAL_FILE) + $(LATEX_CMD) $(MANUAL_FILE) || \ + if [ $$? != 0 ] ; then \ + \echo "Please consult $(MANUAL_FILE).log to see the error messages" ; \ + false; \ + fi latex_count=$(LATEX_COUNT) ; \ while grep -E -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\ do \ echo "Rerunning latex...." ;\ - $(LATEX_CMD) $(MANUAL_FILE) ;\ + $(LATEX_CMD) $(MANUAL_FILE) || \ + if [ $$? != 0 ] ; then \ + \echo "Please consult $(MANUAL_FILE).log to see the error messages" ; \ + false; \ + fi; \ latex_count=`expr $$latex_count - 1` ;\ done $(MKIDX_CMD) $(MANUAL_FILE).idx - $(LATEX_CMD) $(MANUAL_FILE) - + $(LATEX_CMD) $(MANUAL_FILE) || \ + if [ $$? != 0 ] ; then \ + \echo "Please consult $(MANUAL_FILE).log to see the error messages" ; \ + false; \ + fi clean: rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf diff --git a/Doc/latex/____general__flash_8c_source.tex b/Doc/latex/____general__flash_8c_source.tex index b82fafe..f904808 100644 --- a/Doc/latex/____general__flash_8c_source.tex +++ b/Doc/latex/____general__flash_8c_source.tex @@ -1,8 +1,8 @@ \doxysection{\+\_\+\+\_\+general\+\_\+flash.\+c} -\hypertarget{____general__flash_8c_source}{}\label{____general__flash_8c_source}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Src/\_\_general\_flash.c@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Src/\_\_general\_flash.c}} +\hypertarget{____general__flash_8c_source}{}\label{____general__flash_8c_source}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Src/\_\_general\_flash.c@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Src/\_\_general\_flash.c}} \begin{DoxyCode}{0} -\DoxyCodeLine{\Hypertarget{____general__flash_8c_source_l00001}00001\ \textcolor{preprocessor}{\#include\ "{}general\_flash.h"{}}} +\DoxyCodeLine{\Hypertarget{____general__flash_8c_source_l00001}00001\ \textcolor{preprocessor}{\#include\ "{}\_\_general\_flash.h"{}}} \DoxyCodeLine{\Hypertarget{____general__flash_8c_source_l00002}00002\ FLASH\_EraseInitTypeDef\ EraseInitStruct;} \DoxyCodeLine{\Hypertarget{____general__flash_8c_source_l00003}00003\ \textcolor{keyword}{extern}\ HAL\_StatusTypeDef\ res\_hal;} \DoxyCodeLine{\Hypertarget{____general__flash_8c_source_l00004}00004\ \textcolor{keywordtype}{unsigned}\ CRC\_Update;} diff --git a/Doc/latex/____general__flash_8h_source.tex b/Doc/latex/____general__flash_8h_source.tex index 788727d..2922838 100644 --- a/Doc/latex/____general__flash_8h_source.tex +++ b/Doc/latex/____general__flash_8h_source.tex @@ -1,5 +1,5 @@ \doxysection{\+\_\+\+\_\+general\+\_\+flash.\+h} -\hypertarget{____general__flash_8h_source}{}\label{____general__flash_8h_source}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/\_\_general\_flash.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/\_\_general\_flash.h}} +\hypertarget{____general__flash_8h_source}{}\label{____general__flash_8h_source}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/\_\_general\_flash.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/\_\_general\_flash.h}} \begin{DoxyCode}{0} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00001}00001\ \textcolor{comment}{/**************************************************************************}} @@ -11,28 +11,28 @@ \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00007}00007\ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00008}00008\ \textcolor{comment}{//////////////////////////////////////////////////////////////////////}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00009}00009\ \textcolor{comment}{/////////////////////////-\/-\/-\/USER\ SETTINGS-\/-\/-\//////////////////////////}} -\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00010}00010\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00010}00010\ } \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00011}00011\ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00012}00012\ \textcolor{comment}{/////////////////////////-\/-\/-\/USER\ SETTINGS-\/-\/-\//////////////////////////}} -\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00013}00013\ \textcolor{comment}{}\textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{mylibs__defs_8h}{mylibs\_defs.h}}"{}}} +\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00013}00013\ \textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{mylibs__defs_8h}{mylibs\_defs.h}}"{}}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00014}00014\ } \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00015}00015\ } \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00016}00016\ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00017}00017\ \textcolor{comment}{/////////////////////////////////////////////////////////////////////}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00018}00018\ \textcolor{comment}{////////////////////////////-\/-\/-\/DEFINES-\/-\/-\/////////////////////////////}} -\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00019}00019\ \textcolor{comment}{}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00019}00019\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00020}00020\ \textcolor{comment}{////////////////////////////-\/-\/-\/DEFINES-\/-\/-\/////////////////////////////}} -\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00021}00021\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00021}00021\ } \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00022}00022\ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00023}00023\ \textcolor{comment}{/////////////////////////////////////////////////////////////////////}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00024}00024\ \textcolor{comment}{///////////////////////-\/-\/-\/STRUCTURES\ \&\ ENUMS-\/-\/-\///////////////////////}} -\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00025}00025\ \textcolor{comment}{}\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00025}00025\ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00026}00026\ \textcolor{comment}{///////////////////////-\/-\/-\/STRUCTURES\ \&\ ENUMS-\/-\/-\///////////////////////}} -\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00027}00027\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00027}00027\ } \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00028}00028\ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00029}00029\ \textcolor{comment}{/////////////////////////////////////////////////////////////////////}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00030}00030\ \textcolor{comment}{///////////////////////////-\/-\/-\/FUNCTIONS-\/-\/-\////////////////////////////}} -\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00031}00031\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00031}00031\ } \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00032}00032\ HAL\_StatusTypeDef\ FLASH\_Enable\_DualBankMode(\textcolor{keywordtype}{void});} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00033}00033\ HAL\_StatusTypeDef\ FLASH\_WriteProtection(uint32\_t\ BankN,\ uint32\_t\ WriteProtection);} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00034}00034\ \textcolor{comment}{/*\ functions\ for\ reading\ bytes/halswords/words\ */}} @@ -44,7 +44,7 @@ \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00040}00040\ HAL\_StatusTypeDef\ FLASH\_Write\_HalfWord(uint32\_t\ Address,\ uint16\_t\ Data);} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00041}00041\ HAL\_StatusTypeDef\ FLASH\_Write\_Word(uint32\_t\ Address,\ uint32\_t\ Data);\textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00042}00042\ \textcolor{comment}{///////////////////////////-\/-\/-\/FUNCTIONS-\/-\/-\////////////////////////////}} -\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00043}00043\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00043}00043\ } \DoxyCodeLine{\Hypertarget{____general__flash_8h_source_l00044}00044\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ \_\_FLASH\_GENERAL\_H\_}} \end{DoxyCode} diff --git a/Doc/latex/annotated.tex b/Doc/latex/annotated.tex index 6cc7cee..7c59474 100644 --- a/Doc/latex/annotated.tex +++ b/Doc/latex/annotated.tex @@ -5,10 +5,10 @@ Here are the classes, structs, unions and interfaces with brief descriptions\+:\ \item\contentsline{section}{\mbox{\hyperlink{struct_g_p_i_o___switch_type_def}{GPIO\+\_\+\+Switch\+Type\+Def}} \\*Структура кнопки }{\pageref{struct_g_p_i_o___switch_type_def}}{} \item\contentsline{section}{\mbox{\hyperlink{struct_h_f___stack_frame__t}{HF\+\_\+\+Stack\+Frame\+\_\+t}} \\*Контекст стек-\/фрейма процессора при Hard\+Fault }{\pageref{struct_h_f___stack_frame__t}}{} \item\contentsline{section}{\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\+\_\+\+Flash\+Header\+\_\+t}} \\*Структура RTT, которая будет положена в Flash }{\pageref{struct_r_t_t___flash_header__t}}{} -\item\contentsline{section}{\mbox{\hyperlink{struct_s_p_i___settings_type_def}{SPI\+\_\+\+Settings\+Type\+Def}} }{\pageref{struct_s_p_i___settings_type_def}}{} +\item\contentsline{section}{\mbox{\hyperlink{struct_s_p_i___settings_type_def}{SPI\+\_\+\+Settings\+Type\+Def}} \\*Структура настроек SPI }{\pageref{struct_s_p_i___settings_type_def}}{} \item\contentsline{section}{\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\+\_\+\+Encoder\+Type\+Def}} \\*Структура инициализации енкодера }{\pageref{struct_t_i_m___encoder_type_def}}{} \item\contentsline{section}{\mbox{\hyperlink{struct_t_i_m___settings_type_def}{TIM\+\_\+\+Settings\+Type\+Def}} \\*Структура инициализации таймера }{\pageref{struct_t_i_m___settings_type_def}}{} -\item\contentsline{section}{\mbox{\hyperlink{struct_u_a_r_t___settings_type_def}{UART\+\_\+\+Settings\+Type\+Def}} }{\pageref{struct_u_a_r_t___settings_type_def}}{} +\item\contentsline{section}{\mbox{\hyperlink{struct_u_a_r_t___settings_type_def}{UART\+\_\+\+Settings\+Type\+Def}} \\*Структура настроек UART }{\pageref{struct_u_a_r_t___settings_type_def}}{} \item\contentsline{section}{\mbox{\hyperlink{unionuint16___bit_type_def}{uint16\+\_\+\+Bit\+Type\+Def}} }{\pageref{unionuint16___bit_type_def}}{} \item\contentsline{section}{\mbox{\hyperlink{unionuint32___bit_type_def}{uint32\+\_\+\+Bit\+Type\+Def}} }{\pageref{unionuint32___bit_type_def}}{} \item\contentsline{section}{\mbox{\hyperlink{unionuint64___bit_type_def}{uint64\+\_\+\+Bit\+Type\+Def}} }{\pageref{unionuint64___bit_type_def}}{} diff --git a/Doc/latex/bit__access_8h.tex b/Doc/latex/bit__access_8h.tex index 03df7db..4ce7302 100644 --- a/Doc/latex/bit__access_8h.tex +++ b/Doc/latex/bit__access_8h.tex @@ -1,23 +1,25 @@ -\doxysection{F\+:/\+Work/\+Projects/\+STM/.Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/bit\+\_\+access.h File Reference} -\hypertarget{bit__access_8h}{}\label{bit__access_8h}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/bit\_access.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/bit\_access.h}} +\doxysection{E\+:/.WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/bit\+\_\+access.h File Reference} +\hypertarget{bit__access_8h}{}\label{bit__access_8h}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/bit\_access.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/bit\_access.h}} Заголочный файл для дефайнов битового доступа. {\ttfamily \#include "{}mylibs\+\_\+defs.\+h"{}}\newline -Include dependency graph for bit\+\_\+access.\+h\+:\nopagebreak +Include dependency graph for bit\+\_\+access.\+h\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode -\includegraphics[width=233pt]{bit__access_8h__incl} +\includegraphics[width=229pt]{bit__access_8h__incl} \end{center} \end{figure} -This graph shows which files directly or indirectly include this file\+:\nopagebreak +This graph shows which files directly or indirectly include this file\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode -\includegraphics[width=233pt]{bit__access_8h__dep__incl} +\includegraphics[width=229pt]{bit__access_8h__dep__incl} \end{center} \end{figure} \doxysubsubsection*{Classes} @@ -34,13 +36,13 @@ union \mbox{\hyperlink{unionuint64___bit_type_def}{uint64\+\_\+\+Bit\+Type\+Def} \doxysubsubsection*{Macros} \begin{DoxyCompactItemize} \item -\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga57dc3bb3472a66fc92312f89d42d2396}{uint8\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+)~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint8___bit_type_def}{uint8\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+ +\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga57dc3bb3472a66fc92312f89d42d2396}{uint8\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+) \begin{DoxyCompactList}\small\item\em Получить n-\/й бит из uint8\+\_\+t. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga6a122b536ad99ae611c8cf01437af086}{uint16\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+)~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint16___bit_type_def}{uint16\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+ +\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga6a122b536ad99ae611c8cf01437af086}{uint16\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+) \begin{DoxyCompactList}\small\item\em Получить n-\/й бит из uint16\+\_\+t. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_gafaa2080168b1b6f7281e8bfabab022d1}{uint32\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+)~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint32___bit_type_def}{uint32\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+ +\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_gafaa2080168b1b6f7281e8bfabab022d1}{uint32\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+) \begin{DoxyCompactList}\small\item\em Получить n-\/й бит из uint32\+\_\+t. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga47eb69ce9330a1c73fe8031240f02f0a}{uint64\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+)~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint64___bit_type_def}{uint64\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+ +\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga47eb69ce9330a1c73fe8031240f02f0a}{uint64\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+) \begin{DoxyCompactList}\small\item\em Получить n-\/й бит из uint64\+\_\+t. \end{DoxyCompactList}\end{DoxyCompactItemize} diff --git a/Doc/latex/bit__access_8h__dep__incl.md5 b/Doc/latex/bit__access_8h__dep__incl.md5 index 9c52014..d668a32 100644 --- a/Doc/latex/bit__access_8h__dep__incl.md5 +++ b/Doc/latex/bit__access_8h__dep__incl.md5 @@ -1 +1 @@ -f100d5df8d78acb2e79ae9c3faf7fd33 \ No newline at end of file +a0db7c46e6c8e84aaed5bb4becf5bf9c \ No newline at end of file diff --git a/Doc/latex/bit__access_8h__dep__incl.pdf b/Doc/latex/bit__access_8h__dep__incl.pdf index 43600f6b5c640f4f4fd4f2e3892016c7c544590c..413e18bc3455e20f338156caab938be03894ca6c 100644 GIT binary patch delta 19203 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 delta 19598 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 JB_%~qMhe)r=&Aq! diff --git a/Doc/latex/bit__access_8h__incl.md5 b/Doc/latex/bit__access_8h__incl.md5 index cb6e7b6..8982918 100644 --- a/Doc/latex/bit__access_8h__incl.md5 +++ b/Doc/latex/bit__access_8h__incl.md5 @@ -1 +1 @@ -201ec235709cefdcc9370ba71d46f128 \ No newline at end of file +04aae01d1a86d60c14b0ea57bbf11647 \ No newline at end of file diff --git a/Doc/latex/bit__access_8h__incl.pdf b/Doc/latex/bit__access_8h__incl.pdf index 4f94bcfd1bc274f2ba7d93010aac6f87f89499b4..c3afe0362a899d386976bbe0e258cdabf1ca4bba 100644 GIT binary patch delta 20606 zcmV(}K+wO~tO53{0gz39luK{hFbsh2`V~CN2P+~a+wzV9ieisqSZiR1qA1e5x*_SX zWWc(AKT@h+X|irB5;GLdm-s0{u>8r91=R%et@^I4DWQFKYnaR|toLm7&_0*vfbdgU zc*oCIb$!ED3k!u7F2Gy)q7SAjzB+Ea7m6bnX4Ia=P<+|;rvXM>?XLs9;HV$MJTRYmOH7*2l1-Dlb z7G=#9sr<(o$$Y9fu8qaN2Bqj zsYB@3MQN-X&?tGIucE;TkP8e-R>?A;QMQ%=jV_L-%a-6BUyaX{*g$_t3L+b;kR#ym z7XVcuIs4*37@_^(=GpdFRmZ`Lny#nEmKidP^lzuc^XZ5nr5#^5lcxe50yQ_Y#sX6Te=|5R3O+sxb98cLVQmU{oaMcF zV3fuAI6gD)wfpYzzPs6bH`(3nk&q1}B!Li!wH3u$ z!K3wPEt>-fU`wjhT9rbpwbgoHi$|>}^+Rb@lKnk1@4jKN_WSw#|J%*XJafErKJ#2N z?*?Ine~^sY5r-m+uUxq1ZRL?aAT(nQLS)|JjT<7*9(wN{gl4^pka*SQYp%F*)Q>zV zgj(tmvShAUb?xO{ho28Z4L?O_`r&0u7cTkxl=KmVmV63nBbPyfv)c3-LQCTik1xA& z!!k5Puuu4_>+Of0{L7(7YR=%QrwgvS!`VHIH_E{0YRr zkC3$j5!zV+zR+6GiAl!3gI5OiMco_1f)HC({ z_0!bT^;7%nQ3Js0S@4EeMjcT{0z8a(bT-2Eoz(>NHHz?k2x0UXLj1?V0c1fZGn-S* zf0|nqicBU+LL6U2Fp0zUr}BbAZ`Am?Bc(lqTD30JU1jTd=7>niG1I?`aLe_-n6s`soC1dPl8^{hfB%mdK13KQgONHwG! zbrq?~;VspUs5_c-kMZ%dk8r88f8cHt4m>;1@Y4a?vw#|CKTOaTKFQW$8k?O6FCbAe z6S1D>>aobnq`m?*AVSCbsOixMVG&NZu04qw8cwPwvBOzc2Y=A7Jpyk+8b-c~f54H3 zBhY-oh-xkD#U<`Dnp#l2g#?=@%b8<94PBYNZJVa;SSND@7Lq z2-IkUXVb`@{Yp;-SjqMemf+4SVL_H$iPJjVljg-7?s0MsAO<$_)*OCve+B^USsTN- z>P{mYvgNA#Bo974*b!^?b!bLU7YtadP7gsz#}H@ISBFMA>YO8elhGu{WalJbGrGjl z?7YOMK4^MSAr7CWt2p3Kxod

    jYtfb&7kAFvohSdx@~by3)Nt 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 delta 20570 zcmV(*K;FOhtO3}p0gz39R84QxFc7`_SIp5q#I?tE;&5E4R3It=U5P_gRr_5^Lq)d| z<=-=7D~b1`6sUGHvL`d|jpt2l!O*X=WSsG^=)@0UbPfIUuz{1Afz6h@9{T6=8Cdu! z47{i3R$N|@*T7O(1Lxok|7}1WAP~X|Cc-2d0-H=ZD05O=gy1NDY}$#Fb!93_gXvma z%D2i|`9@WU@+8?W$~$?l9Lfjfocu=4kX||YQB^T}>AjV=D}}9GaDb4HDS2B&UvTu4 z;m_68lg9qF`^4pW`j1=Eiv$a2ViTB0a~)Qg|6RQ$ z&LSVA-=WdyA}rwIC~9iSGh}VTApm2sU~}1VH!xxExDf|QljmDcMKfHC5IqCG)Ot+u zXzc&CK99=%Fq~O{6uRNPrqAf_Rp8sko4ROBh`NoV4t3PVwZoR?3!7KyK>6IOkuGM( zs6*2`MjeJ;Bx);7ZuE|>-GfCUA1`1Q2a_V+17*J?j7hPfIi}0DxOcjpyD4|y^DB*-5*W;Op!7&LKL7_`0=2GN(opu<-Q!}&YHpvPTd`iMf9F=-+`iQh2matf1) z0v!T2FtexvQvrW8H!=!7J_>Vma%Ev{3V595y?cCA#o0JMGv~H@cF*qF`!(6!Y<3f} z34tUK0x3BG0wQvUH9;alE^<={Al@}p5sf!$TdURzURp2Jvbg{Y*pe!>t(8JsYu{RL zZP8jQ%Iiz17n1!wGiOiOSo?jyzt8W_-)?5+IWu$S%$a|A=DE!?8-x);GU`Gcimtd~ z`KC8!Jn{lU^Nu1!maN#eHTv9q{VH6?p%GH}Lzhc7oy(xs+b|GZRT)yGj)w`V6 zwnGcg!ae>qtCp|)$E@@*gjQ*gH+~IdIBQKG!}T?AUApFqt=BxF+FWq`FkC;dVdIMB zNO<#BgjRpo!S%yeEWc)x7&h;P>l1Jt-L!etrbm0<{{XH}BV?^cgmzYdFZ5PIQ~C)$ zDN0%LpyomXf09G8#Gk|{U=oFsgnOQhMP~dU9*z7d^=#u{;~e!&z&S?Vr0!8@&gfMyvA%2H&2$_G;?=m}5ty+mF6q`)cQ{PA-P~S|aN7`e!ySMQFz4L+h`f)p`00HxUwzj>KN{6D z&d~=daC<5h>H~~`t~514KRmb=`(#V$kT+apAo*Nvl!HuY4L6&@tGdkR#=EXc-aB?0X z2Bz@VJnnD?0MD~FNAk^`K?+jx&3#Y+pBe6mHTNn!M$Z=vSgTEsLP^IcXVTw*#yc9E z~aWIhb)CqOgX~Hz? zEYBigk@XVKN@1mSy=SYi)q1_hE_kdQ!cG%1*@=lRhbH=QIDHN63;{w~F~nrcftCUX=CghVlN)5#J{rec4O-|g}E zomR8C*y9Ay>9E@EQPtsARfp4THTgY)-Jx0$fi4N0U$xuKW|N6PpZrdz!+}gepD(C3 zoAG=Ug%O*NJP&{ z=@;G*!}~dm(9p1R_UP2k8;^hP9PR)21eWPen|kypM2$xcs4&8_GWLbDGLHF6GGuB- zo42I3*D3pfI!u_*24x8-t2kc6`^Qemlif!gkD_b%{XAzWczsb1l{!n@LcHTIZALAitj zjFm63Zs1l4tKIDCcl8wqa!~BTT!3Y>aW(7_YFZD#TvK zK{R-Dgwknb&9{q;b}6&T(oUeU!Mb|NBq?7R#*|YK)Xr4<*;M=aOqPq9PBonZ4C`!1 zol}>#YUYK)Li2xR!ewS2x3?jNWjz*0maFdHV6pH%0D3p@5@SA;^SIRd@wGL`;}*qu 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 diff --git a/Doc/latex/bit__access_8h_source.tex b/Doc/latex/bit__access_8h_source.tex index 53b023f..f5e2fec 100644 --- a/Doc/latex/bit__access_8h_source.tex +++ b/Doc/latex/bit__access_8h_source.tex @@ -1,5 +1,5 @@ \doxysection{bit\+\_\+access.\+h} -\hypertarget{bit__access_8h_source}{}\label{bit__access_8h_source}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/bit\_access.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/bit\_access.h}} +\hypertarget{bit__access_8h_source}{}\label{bit__access_8h_source}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/bit\_access.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/bit\_access.h}} \mbox{\hyperlink{bit__access_8h}{Go to the documentation of this file.}} \begin{DoxyCode}{0} \DoxyCodeLine{\Hypertarget{bit__access_8h_source_l00001}00001\ \textcolor{comment}{/**\ }} diff --git a/Doc/latex/doxygen.sty b/Doc/latex/doxygen.sty index 4bfc17f..6d8fc7b 100644 --- a/Doc/latex/doxygen.sty +++ b/Doc/latex/doxygen.sty @@ -122,6 +122,7 @@ % Used by @code ... @endcode \newenvironment{DoxyCode}[1]{% \par% + \vspace{2pt}% \scriptsize% \normalfont\ttfamily% \rightskip0pt plus 1fil% @@ -129,14 +130,14 @@ \settowidth{\CodeWidthChar}{?}% \settoheight{\CodeHeightChar}{?}% \setlength{\parskip}{0ex plus 0ex minus 0ex}% - \ifthenelse{\equal{#1}{0}} - { + \ifthenelse{\equal{#1}{0}}% + {% {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces% - } - { + }% + {% {\lccode`~32 \lowercase{\global\let~}}\obeyspaces% - } - + }% + \vspace{2pt}% }{% \normalfont% \normalsize% @@ -199,6 +200,10 @@ \setlist[DoxyItemize,3]{label=\textasteriskcentered} \setlist[DoxyItemize,4]{label=\textperiodcentered} +% Used for check boxes +\newcommand{\DoxyUnchecked}{$\square$} +\newcommand{\DoxyChecked}{\rlap{\raisebox{0.3ex}{\hspace{0.4ex}\tiny \checkmark}}$\square$} + % Used by description lists (using

    ...
    ) \newenvironment{DoxyDescription}{% \description% @@ -236,6 +241,13 @@ \end{DoxyDesc}% } +% Used by @important +\newenvironment{DoxyImportant}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + % Used by @author and @authors \newenvironment{DoxyAuthor}[1]{% \begin{DoxyDesc}{#1}% @@ -372,14 +384,16 @@ } % Used for fields simple class style enums -\newenvironment{DoxyEnumFields}[1]{% +\newenvironment{DoxyEnumFields}[2][]{% \tabulinesep=1mm% \par% - \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \ifthenelse{\equal{#1}{2}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,r]|X[-1,l]|}}% with init value + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% \hline% \endfirsthead% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% \hline% \endhead% }{% @@ -389,7 +403,7 @@ % Used for parameters within a detailed function description \newenvironment{DoxyParamCaption}{% - \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}% + \renewcommand{\item}[3][]{\\ \hspace*{2.0cm} ##1 {\em ##2}##3}% }{% } @@ -528,6 +542,37 @@ \mbox{\hyperlink{#1}{#2}}% } +% Used for the cite command +\newcommand{\DoxyCite}[3]{% + \ifthenelse{#3=1}% 1 with square parenthesis + { + \ifthenelse{\equal{#2}{number}}% + { \cite{#1} }% + {% + \ifthenelse{\equal{#2}{shortauthor}}% + { \citetext{\citeauthor{#1}} }% + {% + \ifthenelse{\equal{#2}{year}}% + { \citeyearpar{#1} }% + {}% + }% + }% + }% + {% + \ifthenelse{\equal{#2}{number}}% + { \citealp{#1} }% + {% + \ifthenelse{\equal{#2}{shortauthor}}% + { \citeauthor{#1} }% + {% + \ifthenelse{\equal{#2}{year}}% + { \citeyear{#1} }% + {}% + }% + }% + }% +} + % Used when hyperlinks are turned on % Third argument is the SectionType, see the doxygen internal % documentation for the values (relevant: Page ... Subsubsection). @@ -639,12 +684,12 @@ {1.5ex \@plus .2ex}% {\raggedright\normalfont\normalsize\bfseries}} -\newcommand\l@subsubsubsection{\@dottedtocline{4}{6.1em}{7.8em}} -\newcommand\l@subsubsubsubsection{\@dottedtocline{5}{6.1em}{9.4em}} -\newcommand\l@subsubsubsubsubsection{\@dottedtocline{6}{6.1em}{11em}} -\newcommand\l@subsubsubsubsubsubsection{\@dottedtocline{7}{6.1em}{12.6em}} -\renewcommand\l@paragraph{\@dottedtocline{8}{6.1em}{14.2em}} -\renewcommand\l@subparagraph{\@dottedtocline{9}{6.1em}{15.8em}} +\newcommand\l@subsubsubsection{\@dottedtocline{4}{10.0em}{7.8em}} +\newcommand\l@subsubsubsubsection{\@dottedtocline{5}{13.0em}{9.4em}} +\newcommand\l@subsubsubsubsubsection{\@dottedtocline{6}{15.0em}{11em}} +\newcommand\l@subsubsubsubsubsubsection{\@dottedtocline{7}{18.0em}{12.6em}} +\renewcommand\l@paragraph{\@dottedtocline{8}{21.0em}{14.2em}} +\renewcommand\l@subparagraph{\@dottedtocline{9}{24.0em}{15.8em}} \makeatother % the sectsty doesn't look to be maintained but gives, in our case, some warning like: % LaTeX Warning: Command \underline has changed. @@ -677,10 +722,16 @@ \doxysubparagraphfont{#1}% \doxyminisecfont{#1}}% % Define caption that is also suitable in a table +% for usage with hyperlinks \makeatletter \def\doxyfigcaption{% \H@refstepcounter{figure}% \@dblarg{\@caption{figure}}} + +% for usage without hyperlinks +\def\doxyfigcaptionnolink{% +\refstepcounter{figure}% +\@dblarg{\@caption{figure}}} \makeatother % Define alpha enumarative names for counters > 26 diff --git a/Doc/latex/evolve__optimizer_8h.tex b/Doc/latex/evolve__optimizer_8h.tex index eca0dbc..bc83850 100644 --- a/Doc/latex/evolve__optimizer_8h.tex +++ b/Doc/latex/evolve__optimizer_8h.tex @@ -1,5 +1,5 @@ -\doxysection{F\+:/\+Work/\+Projects/\+STM/.Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/evolve\+\_\+optimizer.h File Reference} -\hypertarget{evolve__optimizer_8h}{}\label{evolve__optimizer_8h}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/evolve\_optimizer.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/evolve\_optimizer.h}} +\doxysection{E\+:/.WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/evolve\+\_\+optimizer.h File Reference} +\hypertarget{evolve__optimizer_8h}{}\label{evolve__optimizer_8h}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/evolve\_optimizer.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/evolve\_optimizer.h}} Заголовочный файл для адаптивного подбора параметров @@ -8,18 +8,20 @@ {\ttfamily \#include "{}mylibs\+\_\+defs.\+h"{}}\newline {\ttfamily \#include $<$stdint.\+h$>$}\newline {\ttfamily \#include $<$stdlib.\+h$>$}\newline -Include dependency graph for evolve\+\_\+optimizer.\+h\+:\nopagebreak +Include dependency graph for evolve\+\_\+optimizer.\+h\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode \includegraphics[width=295pt]{evolve__optimizer_8h__incl} \end{center} \end{figure} -This graph shows which files directly or indirectly include this file\+:\nopagebreak +This graph shows which files directly or indirectly include this file\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode -\includegraphics[width=233pt]{evolve__optimizer_8h__dep__incl} +\includegraphics[width=229pt]{evolve__optimizer_8h__dep__incl} \end{center} \end{figure} \doxysubsubsection*{Classes} @@ -30,12 +32,10 @@ struct \mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} \doxysubsubsection*{Macros} \begin{DoxyCompactItemize} \item -\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga83abbcabaff9111c03ae2475ee72ea3e}{PARAM\+\_\+\+SCALE}}(x, min\+\_\+val, max\+\_\+val)~(((float)(x) -\/ (float)(min\+\_\+val)) / ((float)(max\+\_\+val) -\/ (float)(min\+\_\+val))) +\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga83abbcabaff9111c03ae2475ee72ea3e}{PARAM\+\_\+\+SCALE}}(x, min\+\_\+val, max\+\_\+val) \begin{DoxyCompactList}\small\item\em Линейное масштабирование x из диапазона \mbox{[}min\+\_\+val, max\+\_\+val\mbox{]} в диапазон \mbox{[}0, 1) \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaa1d5510fe5f0bd989473f3ebe324bde3}{PARAM\+\_\+\+UNSCALE}}(val, min\+\_\+val, max\+\_\+val)~(((float)(val)) \texorpdfstring{$\ast$}{*} ((float)(max\+\_\+val) -\/ (float)(min\+\_\+val)) + (float)(min\+\_\+val)) +\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaa1d5510fe5f0bd989473f3ebe324bde3}{PARAM\+\_\+\+UNSCALE}}(val, min\+\_\+val, max\+\_\+val) \begin{DoxyCompactList}\small\item\em Обратное линейное масштабирование значения из \mbox{[}0, 1) в диапазон \mbox{[}min\+\_\+val, max\+\_\+val\mbox{]}. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga9c853b02c22f26023c34d1d404b6d653}{local\+\_\+time}}()~HAL\+\_\+\+Get\+Tick() -\begin{DoxyCompactList}\small\item\em Локальное время \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga2f2b1be34ad4eb1bf3267237200cd6c6}{EVOLVE\+\_\+\+MUTATION\+\_\+\+MIN\+\_\+\+PCT}}~10 \begin{DoxyCompactList}\small\item\em Минимальная мутация (в процентах от Loss) \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga861c1c6a503c21441abcec0d57b848bc}{EVOLVE\+\_\+\+MUTATION\+\_\+\+MAX\+\_\+\+PCT}}~100 diff --git a/Doc/latex/evolve__optimizer_8h__dep__incl.md5 b/Doc/latex/evolve__optimizer_8h__dep__incl.md5 index b0eb260..17ac4cc 100644 --- a/Doc/latex/evolve__optimizer_8h__dep__incl.md5 +++ b/Doc/latex/evolve__optimizer_8h__dep__incl.md5 @@ -1 +1 @@ -ef7ed390ff839d8a446957116f861503 \ No newline at end of file +a385857375106a9066dc97059b8e5f66 \ No newline at end of file diff --git a/Doc/latex/evolve__optimizer_8h__dep__incl.pdf b/Doc/latex/evolve__optimizer_8h__dep__incl.pdf index 3145452a7a5428d3ac71bf45bf12d8022f5f9075..80575f5d03fd4298c55ab862b2559171544df52a 100644 GIT binary patch delta 20761 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 y%OU((#)LUAsU{W~cW9!5TV4YM;uK^nPW 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 diff --git a/Doc/latex/evolve__optimizer_8h__incl.md5 b/Doc/latex/evolve__optimizer_8h__incl.md5 index 453cf70..b0017bc 100644 --- a/Doc/latex/evolve__optimizer_8h__incl.md5 +++ b/Doc/latex/evolve__optimizer_8h__incl.md5 @@ -1 +1 @@ -84a2c30c997cd3aae7d0053ac8a120d1 \ No newline at end of file +e567d0680734fcff06b08511863dc20f \ No newline at end of file diff --git a/Doc/latex/evolve__optimizer_8h__incl.pdf b/Doc/latex/evolve__optimizer_8h__incl.pdf index 77ef99f7c573e1f0e259e9234be94ebda6945352..6ecb84a4889128cae1c2091746411c23769ded68 100644 GIT binary patch delta 22025 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 delta 21979 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 diff --git a/Doc/latex/evolve__optimizer_8h_source.tex b/Doc/latex/evolve__optimizer_8h_source.tex index 9f5a03b..36909b1 100644 --- a/Doc/latex/evolve__optimizer_8h_source.tex +++ b/Doc/latex/evolve__optimizer_8h_source.tex @@ -1,5 +1,5 @@ \doxysection{evolve\+\_\+optimizer.\+h} -\hypertarget{evolve__optimizer_8h_source}{}\label{evolve__optimizer_8h_source}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/evolve\_optimizer.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/evolve\_optimizer.h}} +\hypertarget{evolve__optimizer_8h_source}{}\label{evolve__optimizer_8h_source}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/evolve\_optimizer.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/evolve\_optimizer.h}} \mbox{\hyperlink{evolve__optimizer_8h}{Go to the documentation of this file.}} \begin{DoxyCode}{0} \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00001}00001\ \textcolor{comment}{/**}} @@ -84,7 +84,7 @@ \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00080}00080\ \textcolor{preprocessor}{(((float)(val))\ *\ ((float)(max\_val)\ -\/\ (float)(min\_val))\ +\ (float)(min\_val))}} \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00081}00081\ } \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00082}00082\ \textcolor{preprocessor}{\#ifndef\ local\_time}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00083}\mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga9c853b02c22f26023c34d1d404b6d653}{00083}}\ \textcolor{preprocessor}{\#define\ local\_time()\ \ HAL\_GetTick()\ }\textcolor{comment}{///<\ Локальное\ время}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00083}00083\ \textcolor{preprocessor}{\#define\ local\_time()\ \ HAL\_GetTick()\ }\textcolor{comment}{///<\ Локальное\ время}} \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00084}00084\ \textcolor{preprocessor}{\#endif}} \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00085}00085\ } \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00086}00086\ } @@ -105,229 +105,240 @@ \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00101}00101\ \textcolor{comment}{\ \ */}} \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00102}\mbox{\hyperlink{struct_evolve_optimizer__t}{00102}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{struct\ }\{} \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00103}\mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{00103}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ \mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{stability}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Коэффициент\ насколько\ стабильная\ популяция\ (0..1)(@ref\ n\_cand)}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00104}\mbox{\hyperlink{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}{00104}}\ \ \ uint16\_t\ \ \mbox{\hyperlink{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}{n\_params}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Количество\ параметров}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00105}\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{00105}}\ \ \ uint16\_t\ \ \mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Количество\ кандидатов\ в\ популяции}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00106}\mbox{\hyperlink{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}{00106}}\ \ \ uint16\_t\ \ \mbox{\hyperlink{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}{n\_best}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Количество\ лучших,\ усредняемых}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00107}\mbox{\hyperlink{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8}{00107}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ \mbox{\hyperlink{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8}{mutation\_amp}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Амплитуда\ мутации\ (0..1)}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00108}\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{00108}}\ \ \ uint16\_t\ \ \mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Индекс\ кандидата\ для\ обработки}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00109}\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{00109}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ loss[\mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}}];\ \ \ \ \textcolor{comment}{///<\ Loss\ для\ каждого\ кандидата}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00110}\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{00110}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ candidates[\mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}}][\mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga80d6162495fc3776d8902610657d4fee}{EVOLVE\_MAX\_PARAMS}}];\ \textcolor{comment}{///<\ Параметры\ кандидатов}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00111}\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{00111}}\ \ \ uint16\_t\ \ sorted\_idx[\mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}}];\ \textcolor{comment}{///<\ Индексы\ отсортированных\ кандидатов}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00112}00112\ \}\ \mbox{\hyperlink{struct_evolve_optimizer__t}{EvolveOptimizer\_t}};} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00113}00113\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00114}00114\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00115}00115\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00116}00116\ \textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00117}00117\ \textcolor{comment}{\ *\ @cond\ EVOLVE\_INTERNAL}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00118}00118\ \textcolor{comment}{\ */}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00119}00119\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00120}00120\ \textcolor{comment}{//\ Вспомогательный\ указатель\ для\ сортировки}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00121}00121\ \textcolor{keyword}{static}\ \mbox{\hyperlink{struct_evolve_optimizer__t}{EvolveOptimizer\_t}}\ *g\_sort\_opt;\ \textcolor{comment}{//\ глобальный\ указатель\ на\ текущий\ оптимизатор}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00122}00122\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00123}00123\ \textcolor{comment}{//\ функция\ условия\ сортировки}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00124}00124\ \textcolor{keyword}{static}\ \textcolor{keywordtype}{int}\ cmp\_idx(\textcolor{keyword}{const}\ \textcolor{keywordtype}{void}\ *a,\ \textcolor{keyword}{const}\ \textcolor{keywordtype}{void}\ *b)\ \{} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00125}00125\ \ \ \textcolor{keywordflow}{if}\ (g\_sort\_opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[*(\textcolor{keyword}{const}\ uint16\_t*)a]\ <\ g\_sort\_opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[*(\textcolor{keyword}{const}\ uint16\_t*)b])\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00126}00126\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00127}00127\ \ \ \textcolor{keywordflow}{if}\ (g\_sort\_opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[*(\textcolor{keyword}{const}\ uint16\_t*)a]\ >\ g\_sort\_opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[*(\textcolor{keyword}{const}\ uint16\_t*)b])\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00128}00128\ \ \ \ \ \textcolor{keywordflow}{return}\ 1;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00129}00129\ \ \ \textcolor{keywordflow}{return}\ 0;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00130}00130\ \}\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00131}00131\ \textcolor{comment}{/**\ @endcond\ */}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00132}00132\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00133}00133\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00134}00134\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00135}00135\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00136}00136\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00137}00137\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00138}00138\ \textcolor{comment}{\ \ *\ @brief\ Инициализация\ эволюционного\ оптимизатора.}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00139}00139\ \textcolor{comment}{\ \ *\ @param\ opt\ \ \ \ \ \ \ \ \ \ Указатель\ на\ структуру\ оптимизатора}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00140}00140\ \textcolor{comment}{\ \ *\ @param\ n\_params\ \ \ \ \ Количество\ параметров\ в\ одном\ кандидате}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00141}00141\ \textcolor{comment}{\ \ *\ @param\ n\_cand\ \ \ \ \ \ \ Количество\ кандидатов}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00142}00142\ \textcolor{comment}{\ \ *\ @param\ n\_best\ \ \ \ \ \ \ Количество\ лучших,\ усредняемых}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00143}00143\ \textcolor{comment}{\ \ *\ @param\ mutation\_amp\ Амплитуда\ мутации\ (в\ диапазоне\ 0.0–1.0)}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00144}00144\ \textcolor{comment}{\ \ *\ @param\ start\_params\ Начальные\ параметры\ (в\ диапазоне\ 0.0–1.0)}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00145}00145\ \textcolor{comment}{\ \ *\ @return\ 0\ \ \ —\ если\ окей,\ }} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00146}00146\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ -\/1\ \ —\ если\ ошибка}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00147}00147\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00148}\mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga4e3ea118b5b9068619c57724a925ba21}{00148}}\ \_\_STATIC\_INLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga4e3ea118b5b9068619c57724a925ba21}{EvolveOptimizer\_Init}}(\mbox{\hyperlink{struct_evolve_optimizer__t}{EvolveOptimizer\_t}}*\ opt,} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00149}00149\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ uint16\_t\ n\_params,} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00150}00150\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ uint16\_t\ n\_cand,} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00151}00151\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ uint16\_t\ n\_best,} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00152}00152\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ mutation\_amp,} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00153}00153\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}*\ start\_params)} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00154}00154\ \{} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00155}00155\ \ \ \textcolor{keywordflow}{if}((opt\ ==\ NULL)\ ||\ (start\_params\ ==\ NULL))} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00156}00156\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00157}00157\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00158}00158\ \ \ \textcolor{keywordflow}{if}(n\_params\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga80d6162495fc3776d8902610657d4fee}{EVOLVE\_MAX\_PARAMS}})} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00159}00159\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00160}00160\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}{n\_params}}\ \ \ \ \ =\ n\_params;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00161}00161\ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00162}00162\ \ \ \textcolor{keywordflow}{if}(n\_cand\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}})} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00163}00163\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00164}00164\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}}\ \ \ \ \ \ \ =\ n\_cand;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00165}00165\ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00166}00166\ \ \ \textcolor{keywordflow}{if}(n\_best\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}}/2)} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00167}00167\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00168}00168\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}{n\_best}}\ \ \ \ \ \ \ =\ n\_best;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00169}00169\ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00170}00170\ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00171}00171\ \ \ \textcolor{keywordflow}{if}((mutation\_amp\ >\ 1)\ ||\ (mutation\_amp\ <\ 0))} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00172}00172\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00173}00173\ \ \ \textcolor{keywordflow}{if}(mutation\_amp\ <=\ 0.001f)} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00174}00174\ \ \ \ \ mutation\_amp\ =\ 0.001f;\ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00175}00175\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8}{mutation\_amp}}\ \ =\ mutation\_amp;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00176}00176\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00177}00177\ \ \ uint32\_t\ seed\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga9c853b02c22f26023c34d1d404b6d653}{local\_time}}();} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00178}00178\ \textcolor{preprocessor}{\#ifdef\ ADC1}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00179}00179\ \ \ seed\ +=\ (ADC1-\/>DR\ \&\ 0xFF);} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00180}00180\ \textcolor{preprocessor}{\#endif}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00181}00181\ \ \ srand(seed);} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00182}00182\ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00183}00183\ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ i\ =\ 0;\ i\ <\ n\_cand;\ i++)\ \{} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00184}00184\ \ \ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ j\ =\ 0;\ j\ <\ n\_params;\ j++)\ \{} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00185}00185\ \ \ \ \ \ \ \textcolor{comment}{//\ Добавляем\ случайную\ мутацию\ вокруг\ стартового\ параметра}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00186}00186\ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ base\ =\ start\_params[j];} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00187}00187\ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ inv\_randmax\ =\ 1.0f\ /\ (float)RAND\_MAX;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00188}00188\ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ noise\ =\ ((float)rand()\ *\ inv\_randmax\ *\ 2.0f\ -\/\ 1.0f)\ *\ mutation\_amp;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00189}00189\ \ \ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[i][j]\ =\ base\ +\ noise;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00190}00190\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[i][j]\ <\ 0.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[i][j]\ =\ 0.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00191}00191\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[i][j]\ >\ 1.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[i][j]\ =\ 1.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00192}00192\ \ \ \ \ \}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00193}00193\ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[i]\ =\ 0.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00194}00194\ \ \ \}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00195}00195\ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00196}00196\ \ \ \textcolor{keywordflow}{return}\ 0;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00197}00197\ \}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00198}00198\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00199}00199\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00200}00200\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00201}00201\ \textcolor{comment}{\ \ *\ @brief\ Один\ шаг\ эволюционного\ оптимизатора.}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00202}00202\ \textcolor{comment}{\ \ *\ @param\ opt\ \ \ \ Указатель\ на\ структуру\ оптимизатора}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00203}00203\ \textcolor{comment}{\ \ *\ @param\ params\ Массив\ параметров,\ которые\ будут\ обновлены\ (на\ выходе\ —\ новые\ параметры)}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00204}00204\ \textcolor{comment}{\ \ *\ @param\ loss\ \ \ Loss\ текущего\ кандидата}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00205}00205\ \textcolor{comment}{\ \ *\ @return\ 0\ \ \ —\ если\ окей,\ }} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00206}00206\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ -\/1\ \ —\ если\ ошибка}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00207}00207\ \textcolor{comment}{\ \ *\ @details}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00208}00208\ \textcolor{comment}{\ \ *\ Сохраняет\ loss\ текущего\ кандидата\ и\ формирует\ параметры\ следующего\ кандидата.}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00209}00209\ \textcolor{comment}{\ \ *\ Если\ накоплено\ n\_cand\ кандидатов,\ генерируется\ новое\ поколение.}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00210}00210\ \textcolor{comment}{\ \ *\ Новое\ поколение\ формируется\ случайным\ выбором\ из\ n\_best\ лучших\ с\ добавлением\ мутации.}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00211}00211\ \textcolor{comment}{\ \ *}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00212}00212\ \textcolor{comment}{\ \ *\ На\ выходе\ params\ содержит\ параметры\ следующего\ кандидата\ для\ измерений.}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00213}00213\ \textcolor{comment}{\ \ *\ @note\ Функция\ использует\ глобальную\ внутреннюю\ переменную\ для\ сортировки.}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00214}00214\ \textcolor{comment}{\ \ *\ Надо\ убедится\ что\ только\ один\ экземпляр\ функции\ запущен\ в\ момент\ времени}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00215}00215\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00216}\mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaef44a1f3298514569cc2b396a92101ef}{00216}}\ \_\_STATIC\_INLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaef44a1f3298514569cc2b396a92101ef}{EvolveOptimizer\_Step}}(\mbox{\hyperlink{struct_evolve_optimizer__t}{EvolveOptimizer\_t}}*\ opt,} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00217}00217\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}*\ params,} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00218}00218\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ loss)} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00219}00219\ \{} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00220}00220\ \ \ \textcolor{keywordflow}{if}((opt\ ==\ NULL)\ ||\ (params\ ==\ NULL))} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00221}00221\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00222}00222\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00223}00223\ \ \ uint16\_t\ n\_params\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}{n\_params}};\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00224}00224\ \ \ \textcolor{keywordflow}{if}(n\_params\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga80d6162495fc3776d8902610657d4fee}{EVOLVE\_MAX\_PARAMS}})} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00225}00225\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00226}00226\ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00227}00227\ \ \ uint16\_t\ n\_cand\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}};\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00228}00228\ \ \ \textcolor{keywordflow}{if}(n\_cand\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}})} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00229}00229\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00230}00230\ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00231}00231\ \ \ uint16\_t\ n\_best\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}{n\_best}};\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00232}00232\ \ \ \textcolor{keywordflow}{if}(n\_best\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}}/2)} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00233}00233\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00234}00234\ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00235}00235\ \ \ \textcolor{keywordtype}{float}\ \ \ \ mut\ \ \ \ \ \ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8}{mutation\_amp}};} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00236}00236\ \ \ \textcolor{keywordflow}{if}((mut\ >\ 1)\ ||(mut\ <\ 0))} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00237}00237\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00238}00238\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00239}00239\ \ \ \textcolor{comment}{//\ 1.\ Сохраняем\ loss\ текущего\ кандидата}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00240}00240\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}}]\ =\ loss;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00241}00241\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}}++;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00242}00242\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00243}00243\ \ \ \textcolor{keywordflow}{if}\ (opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}}\ >=\ n\_cand)\ \{} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00244}00244\ \ \ \ \ \textcolor{comment}{//\ 2.\ Сортируем\ текущее\ поколение\ по\ loss}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00245}00245\ \ \ \ \ \textcolor{keywordflow}{for}(uint16\_t\ i\ =\ 0;\ i\ <\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}};\ i++)} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00246}00246\ \ \ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}}[i]\ =\ i;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00247}00247\ \ \ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00248}00248\ \ \ \ \ g\_sort\_opt\ =\ opt;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00249}00249\ \ \ \ \ qsort(opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}},\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}},\ \textcolor{keyword}{sizeof}(uint16\_t),\ cmp\_idx);} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00250}00250\ \ \ \ \ g\_sort\_opt\ =\ NULL;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00104}00104\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00105}\mbox{\hyperlink{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}{00105}}\ \ \ uint16\_t\ \ \mbox{\hyperlink{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}{n\_params}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Количество\ параметров}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00106}\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{00106}}\ \ \ uint16\_t\ \ \mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Количество\ кандидатов\ в\ популяции}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00107}\mbox{\hyperlink{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}{00107}}\ \ \ uint16\_t\ \ \mbox{\hyperlink{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}{n\_best}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Количество\ лучших,\ усредняемых}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00108}\mbox{\hyperlink{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8}{00108}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ \mbox{\hyperlink{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8}{mutation\_amp}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Амплитуда\ мутации\ (0..1)}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00109}00109\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00110}\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{00110}}\ \ \ uint16\_t\ \ \mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Индекс\ кандидата\ для\ обработки}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00111}\mbox{\hyperlink{struct_evolve_optimizer__t_ad0f464d7048a9ed0753b61f76f563108}{00111}}\ \ \ uint16\_t\ \ \mbox{\hyperlink{struct_evolve_optimizer__t_ad0f464d7048a9ed0753b61f76f563108}{gen\_index}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Индекс\ популяции\ \ }} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00112}00112\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00113}00113\ \ \ \textcolor{comment}{//INTERNAL}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00114}\mbox{\hyperlink{struct_evolve_optimizer__t_a3be8c0c34db8429210ff470497a56727}{00114}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ \mbox{\hyperlink{struct_evolve_optimizer__t_a3be8c0c34db8429210ff470497a56727}{gen\_mut}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Амплитуда\ мутации\ у\ текущей\ популяции\ \ }} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00115}00115\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00116}\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{00116}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ \mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[\mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}}];\ \ \ \ \textcolor{comment}{///<\ Loss\ для\ каждого\ кандидата}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00117}\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{00117}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ \mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[\mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}}][\mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga80d6162495fc3776d8902610657d4fee}{EVOLVE\_MAX\_PARAMS}}];\ \textcolor{comment}{///<\ Параметры\ кандидатов}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00118}\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{00118}}\ \ \ uint16\_t\ \ \mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}}[\mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}}];\ \textcolor{comment}{///<\ Индексы\ отсортированных\ кандидатов}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00119}00119\ \}\ \mbox{\hyperlink{struct_evolve_optimizer__t}{EvolveOptimizer\_t}};} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00120}00120\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00121}00121\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00122}00122\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00123}00123\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00124}00124\ \textcolor{comment}{\ *\ @cond\ EVOLVE\_INTERNAL}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00125}00125\ \textcolor{comment}{\ */}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00126}00126\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00127}00127\ \textcolor{comment}{//\ Вспомогательный\ указатель\ для\ сортировки}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00128}00128\ \textcolor{keyword}{static}\ \mbox{\hyperlink{struct_evolve_optimizer__t}{EvolveOptimizer\_t}}\ *g\_sort\_opt;\ \textcolor{comment}{//\ глобальный\ указатель\ на\ текущий\ оптимизатор}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00129}00129\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00130}00130\ \textcolor{comment}{//\ функция\ условия\ сортировки}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00131}00131\ \textcolor{keyword}{static}\ \textcolor{keywordtype}{int}\ cmp\_idx(\textcolor{keyword}{const}\ \textcolor{keywordtype}{void}\ *a,\ \textcolor{keyword}{const}\ \textcolor{keywordtype}{void}\ *b)\ \{} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00132}00132\ \ \ \textcolor{keywordflow}{if}\ (g\_sort\_opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[*(\textcolor{keyword}{const}\ uint16\_t*)a]\ <\ g\_sort\_opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[*(\textcolor{keyword}{const}\ uint16\_t*)b])\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00133}00133\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00134}00134\ \ \ \textcolor{keywordflow}{if}\ (g\_sort\_opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[*(\textcolor{keyword}{const}\ uint16\_t*)a]\ >\ g\_sort\_opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[*(\textcolor{keyword}{const}\ uint16\_t*)b])\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00135}00135\ \ \ \ \ \textcolor{keywordflow}{return}\ 1;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00136}00136\ \ \ \textcolor{keywordflow}{return}\ 0;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00137}00137\ \}\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00138}00138\ \textcolor{comment}{/**\ @endcond\ */}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00139}00139\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00140}00140\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00141}00141\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00142}00142\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00143}00143\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00144}00144\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00145}00145\ \textcolor{comment}{\ \ *\ @brief\ Инициализация\ эволюционного\ оптимизатора.}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00146}00146\ \textcolor{comment}{\ \ *\ @param\ opt\ \ \ \ \ \ \ \ \ \ Указатель\ на\ структуру\ оптимизатора}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00147}00147\ \textcolor{comment}{\ \ *\ @param\ n\_params\ \ \ \ \ Количество\ параметров\ в\ одном\ кандидате}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00148}00148\ \textcolor{comment}{\ \ *\ @param\ n\_cand\ \ \ \ \ \ \ Количество\ кандидатов}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00149}00149\ \textcolor{comment}{\ \ *\ @param\ n\_best\ \ \ \ \ \ \ Количество\ лучших,\ усредняемых}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00150}00150\ \textcolor{comment}{\ \ *\ @param\ mutation\_amp\ Амплитуда\ мутации\ (в\ диапазоне\ 0.0–1.0)}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00151}00151\ \textcolor{comment}{\ \ *\ @param\ start\_params\ Начальные\ параметры\ (в\ диапазоне\ 0.0–1.0)}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00152}00152\ \textcolor{comment}{\ \ *\ @return\ 0\ \ \ —\ если\ окей,\ }} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00153}00153\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ -\/1\ \ —\ если\ ошибка}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00154}00154\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00155}\mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga4e3ea118b5b9068619c57724a925ba21}{00155}}\ \_\_STATIC\_INLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga4e3ea118b5b9068619c57724a925ba21}{EvolveOptimizer\_Init}}(\mbox{\hyperlink{struct_evolve_optimizer__t}{EvolveOptimizer\_t}}*\ opt,} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00156}00156\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ uint16\_t\ n\_params,} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00157}00157\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ uint16\_t\ n\_cand,} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00158}00158\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ uint16\_t\ n\_best,} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00159}00159\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ mutation\_amp,} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00160}00160\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}*\ start\_params)} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00161}00161\ \{} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00162}00162\ \ \ \textcolor{keywordflow}{if}((opt\ ==\ NULL)\ ||\ (start\_params\ ==\ NULL))} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00163}00163\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00164}00164\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00165}00165\ \ \ \textcolor{keywordflow}{if}(n\_params\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga80d6162495fc3776d8902610657d4fee}{EVOLVE\_MAX\_PARAMS}})} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00166}00166\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00167}00167\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}{n\_params}}\ \ \ \ \ =\ n\_params;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00168}00168\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00169}00169\ \ \ \textcolor{keywordflow}{if}(n\_cand\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}})} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00170}00170\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00171}00171\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}}\ \ \ \ \ \ \ =\ n\_cand;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00172}00172\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00173}00173\ \ \ \textcolor{keywordflow}{if}(n\_best\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}}/2)} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00174}00174\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00175}00175\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}{n\_best}}\ \ \ \ \ \ \ =\ n\_best;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00176}00176\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00177}00177\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00178}00178\ \ \ \textcolor{keywordflow}{if}((mutation\_amp\ >\ 1)\ ||\ (mutation\_amp\ <\ 0))} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00179}00179\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00180}00180\ \ \ \textcolor{keywordflow}{if}(mutation\_amp\ <=\ 0.001f)} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00181}00181\ \ \ \ \ mutation\_amp\ =\ 0.001f;\ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00182}00182\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8}{mutation\_amp}}\ \ =\ mutation\_amp;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00183}00183\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00184}00184\ \ \ uint32\_t\ seed\ =\ \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\_time}}();} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00185}00185\ \textcolor{preprocessor}{\#ifdef\ ADC1}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00186}00186\ \ \ seed\ +=\ (ADC1-\/>DR\ \&\ 0xFF);} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00187}00187\ \textcolor{preprocessor}{\#endif}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00188}00188\ \ \ srand(seed);} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00189}00189\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00190}00190\ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ i\ =\ 0;\ i\ <\ n\_cand;\ i++)\ \{} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00191}00191\ \ \ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ j\ =\ 0;\ j\ <\ n\_params;\ j++)\ \{} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00192}00192\ \ \ \ \ \ \ \textcolor{comment}{//\ Добавляем\ случайную\ мутацию\ вокруг\ стартового\ параметра}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00193}00193\ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ base\ =\ start\_params[j];} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00194}00194\ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ inv\_randmax\ =\ 1.0f\ /\ (float)RAND\_MAX;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00195}00195\ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ noise\ =\ ((float)rand()\ *\ inv\_randmax\ *\ 2.0f\ -\/\ 1.0f)\ *\ mutation\_amp;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00196}00196\ \ \ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[i][j]\ =\ base\ +\ noise;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00197}00197\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[i][j]\ <\ 0.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[i][j]\ =\ 0.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00198}00198\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[i][j]\ >\ 1.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[i][j]\ =\ 1.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00199}00199\ \ \ \ \ \}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00200}00200\ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[i]\ =\ 0.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00201}00201\ \ \ \}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00202}00202\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00203}00203\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}}\ =\ 0;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00204}00204\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ad0f464d7048a9ed0753b61f76f563108}{gen\_index}}\ =\ 0;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00205}00205\ \ \ \textcolor{keywordflow}{return}\ 0;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00206}00206\ \}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00207}00207\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00208}00208\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00209}00209\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00210}00210\ \textcolor{comment}{\ \ *\ @brief\ Один\ шаг\ эволюционного\ оптимизатора.}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00211}00211\ \textcolor{comment}{\ \ *\ @param\ opt\ \ \ \ Указатель\ на\ структуру\ оптимизатора}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00212}00212\ \textcolor{comment}{\ \ *\ @param\ params\ Массив\ параметров,\ которые\ будут\ обновлены\ (на\ выходе\ —\ новые\ параметры)}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00213}00213\ \textcolor{comment}{\ \ *\ @param\ loss\ \ \ Loss\ текущего\ кандидата}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00214}00214\ \textcolor{comment}{\ \ *\ @return\ 0\ \ \ —\ если\ окей,\ }} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00215}00215\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ -\/1\ \ —\ если\ ошибка}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00216}00216\ \textcolor{comment}{\ \ *\ @details}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00217}00217\ \textcolor{comment}{\ \ *\ Сохраняет\ loss\ текущего\ кандидата\ и\ формирует\ параметры\ следующего\ кандидата.}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00218}00218\ \textcolor{comment}{\ \ *\ Если\ накоплено\ n\_cand\ кандидатов,\ генерируется\ новое\ поколение.}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00219}00219\ \textcolor{comment}{\ \ *\ Новое\ поколение\ формируется\ случайным\ выбором\ из\ n\_best\ лучших\ с\ добавлением\ мутации.}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00220}00220\ \textcolor{comment}{\ \ *}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00221}00221\ \textcolor{comment}{\ \ *\ На\ выходе\ params\ содержит\ параметры\ следующего\ кандидата\ для\ измерений.}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00222}00222\ \textcolor{comment}{\ \ *\ @note\ Функция\ использует\ глобальную\ внутреннюю\ переменную\ для\ сортировки.}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00223}00223\ \textcolor{comment}{\ \ *\ Надо\ убедится\ что\ только\ один\ экземпляр\ функции\ запущен\ в\ момент\ времени}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00224}00224\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00225}\mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaef44a1f3298514569cc2b396a92101ef}{00225}}\ \_\_STATIC\_INLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaef44a1f3298514569cc2b396a92101ef}{EvolveOptimizer\_Step}}(\mbox{\hyperlink{struct_evolve_optimizer__t}{EvolveOptimizer\_t}}*\ opt,} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00226}00226\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}*\ params,} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00227}00227\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ loss)} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00228}00228\ \{} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00229}00229\ \ \ \textcolor{keywordflow}{if}((opt\ ==\ NULL)\ ||\ (params\ ==\ NULL))} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00230}00230\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00231}00231\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00232}00232\ \ \ uint16\_t\ n\_params\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}{n\_params}};\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00233}00233\ \ \ \textcolor{keywordflow}{if}(n\_params\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga80d6162495fc3776d8902610657d4fee}{EVOLVE\_MAX\_PARAMS}})} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00234}00234\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00235}00235\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00236}00236\ \ \ uint16\_t\ n\_cand\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}};\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00237}00237\ \ \ \textcolor{keywordflow}{if}(n\_cand\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}})} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00238}00238\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00239}00239\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00240}00240\ \ \ uint16\_t\ n\_best\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}{n\_best}};\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00241}00241\ \ \ \textcolor{keywordflow}{if}(n\_best\ >\ \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\_MAX\_CANDIDATES}}/2)} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00242}00242\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00243}00243\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00244}00244\ \ \ \textcolor{keywordtype}{float}\ \ \ \ mut\ \ \ \ \ \ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8}{mutation\_amp}};} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00245}00245\ \ \ \textcolor{keywordflow}{if}((mut\ >\ 1)\ ||(mut\ <\ 0))} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00246}00246\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00247}00247\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00248}00248\ \ \ \textcolor{comment}{//\ 1.\ Сохраняем\ loss\ текущего\ кандидата}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00249}00249\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}}]\ =\ loss;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00250}00250\ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}}++;} \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00251}00251\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00252}00252\ \ \ \ \ \textcolor{comment}{//\ -\/-\/-\/\ Адаптивная\ мутация\ в\ зависимости\ от\ Loss\ -\/-\/-\/}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00253}00253\ \ \ \ \ \textcolor{keywordtype}{float}\ best\_loss\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}}[0]];} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00254}00254\ \ \ \ \ \textcolor{keywordtype}{float}\ worst\_loss\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}}\ -\/\ 1]];} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00255}00255\ \ \ \ \ \textcolor{keywordtype}{float}\ diff\ =\ worst\_loss\ -\/\ best\_loss;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00256}00256\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00257}00257\ \ \ \ \ \textcolor{keywordtype}{float}\ sum\_loss\ =\ 0.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00258}00258\ \ \ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ i\ =\ 0;\ i\ <\ n\_cand;\ i++)} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00259}00259\ \ \ \ \ \ \ sum\_loss\ +=\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[i];} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00260}00260\ \ \ \ \ \textcolor{keywordtype}{float}\ avg\_loss\ =\ sum\_loss\ /\ (float)n\_cand;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00261}00261\ \ \ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00262}00262\ \ \ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00263}00263\ \ \ \ \ \textcolor{keywordtype}{float}\ loss\_ratio\ =\ (diff\ >\ 0.0f)\ ?\ ((avg\_loss\ -\/\ best\_loss)\ /\ diff)\ :\ 0.5f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00264}00264\ \ \ \ \ \textcolor{keywordflow}{if}\ (loss\_ratio\ <\ 0.0f)\ loss\_ratio\ =\ 0.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00265}00265\ \ \ \ \ \textcolor{keywordflow}{if}\ (loss\_ratio\ >\ 1.0f)\ loss\_ratio\ =\ 1.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00266}00266\ \ \ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00267}00267\ \ \ \ \ \textcolor{comment}{//\ Записываем\ стабильность\ популяции\ в\ структуру}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00268}00268\ \ \ \ \ \textcolor{keywordflow}{if}(diff\ <\ 0.0f)\ diff\ =\ 0.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00269}00269\ \ \ \ \ \textcolor{keywordflow}{if}(diff\ >\ 1.0f)\ diff\ =\ 1.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00270}00270\ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{stability}}\ =\ (1.0f\ -\/\ worst\_loss)\ *\ (1.0f\ -\/\ (worst\_loss\ -\/\ best\_loss));} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00271}00271\ \ \ \ \ \textcolor{keywordflow}{if}(opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{stability}}\ <\ 0.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{stability}}\ =\ 0.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00272}00272\ \ \ \ \ \textcolor{keywordflow}{if}(opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{stability}}\ >\ 1.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{stability}}\ =\ 1.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00273}00273\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00274}00274\ \ \ \ \ \textcolor{keywordtype}{float}\ mut\_pct\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga2f2b1be34ad4eb1bf3267237200cd6c6}{EVOLVE\_MUTATION\_MIN\_PCT}}\ +} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00275}00275\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (\mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga861c1c6a503c21441abcec0d57b848bc}{EVOLVE\_MUTATION\_MAX\_PCT}}\ -\/\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga2f2b1be34ad4eb1bf3267237200cd6c6}{EVOLVE\_MUTATION\_MIN\_PCT}})\ *\ loss\_ratio;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00276}00276\ \ \ \ \ \textcolor{keywordtype}{float}\ adaptive\_mut\ =\ mut\ *\ (mut\_pct\ /\ 100.0f);} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00277}00277\ \ \ \ \ \textcolor{keywordflow}{if}\ (adaptive\_mut\ <\ 0.0001f)\ adaptive\_mut\ =\ 0.0001f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00278}00278\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00279}00279\ \ \ \ \ \textcolor{comment}{//\ 3.\ Генерируем\ новое\ поколение}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00280}00280\ \ \ \ \ uint16\_t\ n\_elite\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga38607e23d9234524bc7de5869b15b8eb}{ELOVLE\_N\_ELITE\_CANDIDATE}};} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00281}00281\ \ \ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ c\ =\ 0;\ c\ <\ n\_cand;\ c++)\ \{} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00282}00282\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (c\ <\ n\_elite)\ \{} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00283}00283\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ i\ =\ 0;\ i\ <\ n\_params;\ i++)} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00284}00284\ \ \ \ \ \ \ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}}[c]][i];} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00285}00285\ \ \ \ \ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[c]\ =\ 0.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00286}00286\ \ \ \ \ \ \ \}\ \textcolor{keywordflow}{else}\ \{} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00287}00287\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ i\ =\ 0;\ i\ <\ n\_params;\ i++)\ \{} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00288}00288\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ inv\_randmax\ =\ 1.0f\ /\ (float)RAND\_MAX;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00289}00289\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ noise\ =\ ((float)rand()\ *\ inv\_randmax\ *\ 2.0f\ -\/\ 1.0f)\ *\ adaptive\_mut;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00290}00290\ \ \ \ \ \ \ \ \ \ \ uint16\_t\ parent\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}}[rand()\ \%\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}{n\_best}}];} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00291}00291\ \ \ \ \ \ \ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[parent][i]\ +\ noise;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00292}00292\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ <\ 0.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ =\ 0.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00293}00293\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ >\ 1.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ =\ 1.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00294}00294\ \ \ \ \ \ \ \ \ \}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00252}00252\ \ \ \textcolor{keywordflow}{if}\ (opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}}\ >=\ n\_cand)\ \{} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00253}00253\ \ \ \ \ \textcolor{comment}{//\ 2.\ Сортируем\ текущее\ поколение\ по\ loss}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00254}00254\ \ \ \ \ \textcolor{keywordflow}{for}(uint16\_t\ i\ =\ 0;\ i\ <\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}};\ i++)} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00255}00255\ \ \ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}}[i]\ =\ i;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00256}00256\ \ \ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00257}00257\ \ \ \ \ g\_sort\_opt\ =\ opt;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00258}00258\ \ \ \ \ qsort(opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}},\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}},\ \textcolor{keyword}{sizeof}(uint16\_t),\ cmp\_idx);} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00259}00259\ \ \ \ \ g\_sort\_opt\ =\ NULL;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00260}00260\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00261}00261\ \ \ \ \ \textcolor{comment}{//\ -\/-\/-\/\ Адаптивная\ мутация\ в\ зависимости\ от\ Loss\ -\/-\/-\/}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00262}00262\ \ \ \ \ \textcolor{keywordtype}{float}\ best\_loss\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}}[0]];} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00263}00263\ \ \ \ \ \textcolor{keywordtype}{float}\ worst\_loss\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}{n\_cand}}\ -\/\ 1]];} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00264}00264\ \ \ \ \ \textcolor{keywordtype}{float}\ diff\ =\ worst\_loss\ -\/\ best\_loss;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00265}00265\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00266}00266\ \ \ \ \ \textcolor{keywordtype}{float}\ sum\_loss\ =\ 0.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00267}00267\ \ \ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ i\ =\ 0;\ i\ <\ n\_cand;\ i++)} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00268}00268\ \ \ \ \ \ \ sum\_loss\ +=\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[i];} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00269}00269\ \ \ \ \ \textcolor{keywordtype}{float}\ avg\_loss\ =\ sum\_loss\ /\ (float)n\_cand;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00270}00270\ \ \ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00271}00271\ \ \ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00272}00272\ \ \ \ \ \textcolor{keywordtype}{float}\ loss\_ratio\ =\ (diff\ >\ 0.0f)\ ?\ ((avg\_loss\ -\/\ best\_loss)\ /\ diff)\ :\ 0.5f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00273}00273\ \ \ \ \ \textcolor{keywordflow}{if}\ (loss\_ratio\ <\ 0.0f)\ loss\_ratio\ =\ 0.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00274}00274\ \ \ \ \ \textcolor{keywordflow}{if}\ (loss\_ratio\ >\ 1.0f)\ loss\_ratio\ =\ 1.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00275}00275\ \ \ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00276}00276\ \ \ \ \ \textcolor{comment}{//\ Записываем\ стабильность\ популяции\ в\ структуру}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00277}00277\ \ \ \ \ \textcolor{keywordflow}{if}(diff\ <\ 0.0f)\ diff\ =\ 0.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00278}00278\ \ \ \ \ \textcolor{keywordflow}{if}(diff\ >\ 1.0f)\ diff\ =\ 1.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00279}00279\ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{stability}}\ =\ (1.0f\ -\/\ worst\_loss)\ *\ (1.0f\ -\/\ (worst\_loss\ -\/\ best\_loss));} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00280}00280\ \ \ \ \ \textcolor{keywordflow}{if}(opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{stability}}\ <\ 0.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{stability}}\ =\ 0.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00281}00281\ \ \ \ \ \textcolor{keywordflow}{if}(opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{stability}}\ >\ 1.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}{stability}}\ =\ 1.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00282}00282\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00283}00283\ \ \ \ \ \textcolor{keywordtype}{float}\ mut\_pct\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga2f2b1be34ad4eb1bf3267237200cd6c6}{EVOLVE\_MUTATION\_MIN\_PCT}}\ +} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00284}00284\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (\mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga861c1c6a503c21441abcec0d57b848bc}{EVOLVE\_MUTATION\_MAX\_PCT}}\ -\/\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga2f2b1be34ad4eb1bf3267237200cd6c6}{EVOLVE\_MUTATION\_MIN\_PCT}})\ *\ loss\_ratio;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00285}00285\ \ \ \ \ \textcolor{keywordtype}{float}\ adaptive\_mut\ =\ mut\ *\ (mut\_pct\ /\ 100.0f);} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00286}00286\ \ \ \ \ \textcolor{keywordflow}{if}\ (adaptive\_mut\ <\ 0.0001f)\ adaptive\_mut\ =\ 0.0001f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00287}00287\ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a3be8c0c34db8429210ff470497a56727}{gen\_mut}}\ =\ adaptive\_mut;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00288}00288\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00289}00289\ \ \ \ \ \textcolor{comment}{//\ 3.\ Генерируем\ новое\ поколение}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00290}00290\ \ \ \ \ uint16\_t\ n\_elite\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga38607e23d9234524bc7de5869b15b8eb}{ELOVLE\_N\_ELITE\_CANDIDATE}};} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00291}00291\ \ \ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ c\ =\ 0;\ c\ <\ n\_cand;\ c++)\ \{} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00292}00292\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (c\ <\ n\_elite)\ \{} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00293}00293\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ i\ =\ 0;\ i\ <\ n\_params;\ i++)} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00294}00294\ \ \ \ \ \ \ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}}[c]][i];} \DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00295}00295\ \ \ \ \ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[c]\ =\ 0.0f;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00296}00296\ \ \ \ \ \ \ \}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00297}00297\ \ \ \ \ \}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00298}00298\ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}}\ =\ 0;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00299}00299\ \ \ \}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00300}00300\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00301}00301\ \ \ \textcolor{comment}{//\ 4.\ Возвращаем\ параметры\ следующего\ кандидата}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00302}00302\ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ i\ =\ 0;\ i\ <\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}{n\_params}};\ i++)} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00303}00303\ \ \ \ \ params[i]\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}}][i];} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00304}00304\ \ \ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00305}00305\ \ \ \textcolor{keywordflow}{return}\ 0;} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00306}00306\ \}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00307}00307\ \textcolor{preprocessor}{\#else\ }\textcolor{comment}{//\ ENABLE\_EVOLVE\_OPTIMIZATION}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00308}00308\ \textcolor{comment}{//заглушки}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00309}00309\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{struct\ }\{} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00310}00310\ \ \ uint16\_t\ n\_params;\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00311}00311\ \ \ uint16\_t\ n\_cand;\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00312}00312\ \ \ uint16\_t\ n\_best;\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00313}00313\ \ \ \textcolor{keywordtype}{float}\ mutation\_amp;\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00314}00314\ \ \ \textcolor{keywordtype}{float}\ loss[0];\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00315}00315\ \ \ \textcolor{keywordtype}{float}\ candidates[0][0];\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00316}00316\ \}\ \mbox{\hyperlink{struct_evolve_optimizer__t}{EvolveOptimizer\_t}};} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00317}00317\ \textcolor{preprocessor}{\#define\ EvolveOptimizer\_Init(opt,\ n\_params,\ n\_cand,\ n\_best,\ mutation\_amp,\ start\_params)}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00318}00318\ \textcolor{preprocessor}{\#define\ EvolveOptimizer\_Step(opt,\ params,\ LossFunc)}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00319}00319\ \textcolor{preprocessor}{\#define\ PARAM\_SCALE(x,\ min\_val,\ max\_val)\ \ \ \ \ \ \ \ \ (x)}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00320}00320\ \textcolor{preprocessor}{\#define\ PARAM\_UNSCALE(val,\ min\_val,\ max\_val)\ \ \ \ \ (val)}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00321}00321\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ ENABLE\_EVOLVE\_OPTIMIZATION}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00322}00322\ } -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00323}00323\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ \_\_EVOLVE\_OPTIMIZER\_H\_}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00324}00324\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00325}00325\ \textcolor{comment}{/**\ EVOLVE\_OPTIMIZER}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00326}00326\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00327}00327\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00296}00296\ \ \ \ \ \ \ \}\ \textcolor{keywordflow}{else}\ \{} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00297}00297\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ i\ =\ 0;\ i\ <\ n\_params;\ i++)\ \{} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00298}00298\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ inv\_randmax\ =\ 1.0f\ /\ (float)RAND\_MAX;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00299}00299\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{float}\ noise\ =\ ((float)rand()\ *\ inv\_randmax\ *\ 2.0f\ -\/\ 1.0f)\ *\ adaptive\_mut;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00300}00300\ \ \ \ \ \ \ \ \ \ \ uint16\_t\ parent\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}{sorted\_idx}}[rand()\ \%\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}{n\_best}}];} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00301}00301\ \ \ \ \ \ \ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[parent][i]\ +\ noise;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00302}00302\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ <\ 0.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ =\ 0.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00303}00303\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ >\ 1.0f)\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[c][i]\ =\ 1.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00304}00304\ \ \ \ \ \ \ \ \ \}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00305}00305\ \ \ \ \ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}}[c]\ =\ 0.0f;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00306}00306\ \ \ \ \ \ \ \}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00307}00307\ \ \ \ \ \}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00308}00308\ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}}\ =\ 0;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00309}00309\ \ \ \ \ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_ad0f464d7048a9ed0753b61f76f563108}{gen\_index}}++;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00310}00310\ \ \ \}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00311}00311\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00312}00312\ \ \ \textcolor{comment}{//\ 4.\ Возвращаем\ параметры\ следующего\ кандидата}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00313}00313\ \ \ \textcolor{keywordflow}{for}\ (uint16\_t\ i\ =\ 0;\ i\ <\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}{n\_params}};\ i++)} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00314}00314\ \ \ \ \ params[i]\ =\ opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}}[opt-\/>\mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\_index}}][i];} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00315}00315\ \ \ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00316}00316\ \ \ \textcolor{keywordflow}{return}\ 0;} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00317}00317\ \}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00318}00318\ \textcolor{preprocessor}{\#else\ }\textcolor{comment}{//\ ENABLE\_EVOLVE\_OPTIMIZATION}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00319}00319\ \textcolor{comment}{//заглушки}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00320}00320\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{struct\ }\{} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00321}00321\ \ \ uint16\_t\ n\_params;\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00322}00322\ \ \ uint16\_t\ n\_cand;\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00323}00323\ \ \ uint16\_t\ n\_best;\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00324}00324\ \ \ \textcolor{keywordtype}{float}\ mutation\_amp;\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00325}00325\ \ \ \textcolor{keywordtype}{float}\ loss[0];\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00326}00326\ \ \ \textcolor{keywordtype}{float}\ candidates[0][0];\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00327}00327\ \}\ \mbox{\hyperlink{struct_evolve_optimizer__t}{EvolveOptimizer\_t}};} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00328}00328\ \textcolor{preprocessor}{\#define\ EvolveOptimizer\_Init(opt,\ n\_params,\ n\_cand,\ n\_best,\ mutation\_amp,\ start\_params)}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00329}00329\ \textcolor{preprocessor}{\#define\ EvolveOptimizer\_Step(opt,\ params,\ LossFunc)}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00330}00330\ \textcolor{preprocessor}{\#define\ PARAM\_SCALE(x,\ min\_val,\ max\_val)\ \ \ \ \ \ \ \ \ (x)}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00331}00331\ \textcolor{preprocessor}{\#define\ PARAM\_UNSCALE(val,\ min\_val,\ max\_val)\ \ \ \ \ (val)}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00332}00332\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ ENABLE\_EVOLVE\_OPTIMIZATION}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00333}00333\ } +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00334}00334\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ \_\_EVOLVE\_OPTIMIZER\_H\_}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00335}00335\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00336}00336\ \textcolor{comment}{/**\ EVOLVE\_OPTIMIZER}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00337}00337\ \textcolor{comment}{\ \ *\ @\}}} +\DoxyCodeLine{\Hypertarget{evolve__optimizer_8h_source_l00338}00338\ \textcolor{comment}{\ \ */}} \end{DoxyCode} diff --git a/Doc/latex/files.tex b/Doc/latex/files.tex index 5ca56a4..7997671 100644 --- a/Doc/latex/files.tex +++ b/Doc/latex/files.tex @@ -1,21 +1,21 @@ \doxysection{File List} Here is a list of all documented files with brief descriptions\+:\begin{DoxyCompactList} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\mbox{\hyperlink{mainpage_8h_source}{mainpage.\+h}} }{\pageref{mainpage_8h_source}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{____general__flash_8h_source}{\+\_\+\+\_\+general\+\_\+flash.\+h}} }{\pageref{____general__flash_8h_source}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}} }{\pageref{____general__spi_8h_source}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{____general__uart_8h_source}{\+\_\+\+\_\+general\+\_\+uart.\+h}} }{\pageref{____general__uart_8h_source}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{bit__access_8h}{bit\+\_\+access.\+h}} \\*Заголочный файл для дефайнов битового доступа }{\pageref{bit__access_8h}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{evolve__optimizer_8h}{evolve\+\_\+optimizer.\+h}} \\*Заголовочный файл для адаптивного подбора параметров }{\pageref{evolve__optimizer_8h}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__gpio_8h}{general\+\_\+gpio.\+h}} \\*Заголовочный файл для модуля инициализации портов и работы с ними }{\pageref{general__gpio_8h}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__tim_8h}{general\+\_\+tim.\+h}} \\*Заголовочный файл для модуля инициализации таймеров и работы с ними }{\pageref{general__tim_8h}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{mylibs__config_8h}{mylibs\+\_\+config.\+h}} \\*Конфигурации для библиотек My\+Libs }{\pageref{mylibs__config_8h}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{mylibs__defs_8h}{mylibs\+\_\+defs.\+h}} \\*Заголочный файл для дефайнов библиотеки My\+Libs\+General }{\pageref{mylibs__defs_8h}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{mylibs__include_8h}{mylibs\+\_\+include.\+h}} \\*Заголочный файл для всех библиотек }{\pageref{mylibs__include_8h}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{trace_8h}{trace.\+h}} \\*Заголочный файл для работы с трассировкой }{\pageref{trace_8h}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{trackers_8h}{trackers.\+h}} \\*Заголочный файл для работы с трекерами \doxylink{group___t_r_a_c_k_e_r_s}{Trackers defines} }{\pageref{trackers_8h}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/\mbox{\hyperlink{____general__flash_8c_source}{\+\_\+\+\_\+general\+\_\+flash.\+c}} }{\pageref{____general__flash_8c_source}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/\mbox{\hyperlink{____general__spi_8c_source}{\+\_\+\+\_\+general\+\_\+spi.\+c}} }{\pageref{____general__spi_8c_source}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/\mbox{\hyperlink{____general__uart_8c_source}{\+\_\+\+\_\+general\+\_\+uart.\+c}} }{\pageref{____general__uart_8c_source}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/\mbox{\hyperlink{general__gpio_8c}{general\+\_\+gpio.\+c}} \\*Модуль для инициализации портов и работы с ними }{\pageref{general__gpio_8c}}{} -\item\contentsline{section}{F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/\mbox{\hyperlink{general__tim_8c}{general\+\_\+tim.\+c}} \\*Модуль для инициализации таймеров и работы с ними }{\pageref{general__tim_8c}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\mbox{\hyperlink{mainpage_8h_source}{mainpage.\+h}} }{\pageref{mainpage_8h_source}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{____general__flash_8h_source}{\+\_\+\+\_\+general\+\_\+flash.\+h}} }{\pageref{____general__flash_8h_source}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{bit__access_8h}{bit\+\_\+access.\+h}} \\*Заголочный файл для дефайнов битового доступа }{\pageref{bit__access_8h}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{evolve__optimizer_8h}{evolve\+\_\+optimizer.\+h}} \\*Заголовочный файл для адаптивного подбора параметров }{\pageref{evolve__optimizer_8h}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__gpio_8h}{general\+\_\+gpio.\+h}} \\*Заголовочный файл для модуля инициализации портов и работы с ними }{\pageref{general__gpio_8h}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__spi_8h}{general\+\_\+spi.\+h}} \\*Заголовочный файл для модуля инициализации SPI }{\pageref{general__spi_8h}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__tim_8h}{general\+\_\+tim.\+h}} \\*Заголовочный файл для модуля инициализации таймеров и работы с ними }{\pageref{general__tim_8h}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__uart_8h}{general\+\_\+uart.\+h}} \\*Заголовочный файл для модуля инициализации UART }{\pageref{general__uart_8h}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{mylibs__config_8h}{mylibs\+\_\+config.\+h}} \\*Конфигурации для библиотек My\+Libs }{\pageref{mylibs__config_8h}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{mylibs__defs_8h}{mylibs\+\_\+defs.\+h}} \\*Заголочный файл для дефайнов библиотеки My\+Libs\+General }{\pageref{mylibs__defs_8h}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{mylibs__include_8h}{mylibs\+\_\+include.\+h}} \\*Заголочный файл для всех библиотек }{\pageref{mylibs__include_8h}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{trace_8h}{trace.\+h}} \\*Заголочный файл для работы с трассировкой }{\pageref{trace_8h}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{trackers_8h}{trackers.\+h}} \\*Заголочный файл для работы с трекерами \doxylink{group___t_r_a_c_k_e_r_s}{Trackers defines} }{\pageref{trackers_8h}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/\mbox{\hyperlink{____general__flash_8c_source}{\+\_\+\+\_\+general\+\_\+flash.\+c}} }{\pageref{____general__flash_8c_source}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/\mbox{\hyperlink{general__gpio_8c}{general\+\_\+gpio.\+c}} \\*Модуль для инициализации портов и работы с ними }{\pageref{general__gpio_8c}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/\mbox{\hyperlink{general__spi_8c}{general\+\_\+spi.\+c}} \\*Модуль для инициализации SPI }{\pageref{general__spi_8c}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/\mbox{\hyperlink{general__tim_8c}{general\+\_\+tim.\+c}} \\*Модуль для инициализации таймеров и работы с ними }{\pageref{general__tim_8c}}{} +\item\contentsline{section}{E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/\mbox{\hyperlink{general__uart_8c}{general\+\_\+uart.\+c}} \\*Модуль для инициализации UART }{\pageref{general__uart_8c}}{} \end{DoxyCompactList} diff --git a/Doc/latex/general__gpio_8c.tex b/Doc/latex/general__gpio_8c.tex index 46422d9..2a58371 100644 --- a/Doc/latex/general__gpio_8c.tex +++ b/Doc/latex/general__gpio_8c.tex @@ -1,16 +1,17 @@ -\doxysection{F\+:/\+Work/\+Projects/\+STM/.Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/general\+\_\+gpio.c File Reference} -\hypertarget{general__gpio_8c}{}\label{general__gpio_8c}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Src/general\_gpio.c@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Src/general\_gpio.c}} +\doxysection{E\+:/.WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Src/general\+\_\+gpio.c File Reference} +\hypertarget{general__gpio_8c}{}\label{general__gpio_8c}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Src/general\_gpio.c@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Src/general\_gpio.c}} Модуль для инициализации портов и работы с ними. {\ttfamily \#include "{}general\+\_\+gpio.\+h"{}}\newline -Include dependency graph for general\+\_\+gpio.\+c\+:\nopagebreak +Include dependency graph for general\+\_\+gpio.\+c\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode -\includegraphics[width=266pt]{general__gpio_8c__incl} +\includegraphics[width=229pt]{general__gpio_8c__incl} \end{center} \end{figure} \doxysubsubsection*{Functions} diff --git a/Doc/latex/general__gpio_8c__incl.md5 b/Doc/latex/general__gpio_8c__incl.md5 index 68c4ba4..e665dcd 100644 --- a/Doc/latex/general__gpio_8c__incl.md5 +++ b/Doc/latex/general__gpio_8c__incl.md5 @@ -1 +1 @@ -d6b4b5162b176a9d1f8fd88ea3e36d44 \ No newline at end of file +06087ea6fdcbd10af4ee99fd98be927c \ No newline at end of file diff --git a/Doc/latex/general__gpio_8c__incl.pdf b/Doc/latex/general__gpio_8c__incl.pdf index f2598002932e4e66f48412b6caaf8cce5e9db3f7..c1e3f5aac976aeae5342d82db45b99abe0aad073 100644 GIT binary patch delta 20939 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\mbox{\hyperlink{struct_g_p_i_o___l_e_d_type_def_ad28d93023a00e3c5669bd3deda122435}{state}}\ ==\ \mbox{\hyperlink{group___m_y_l_i_b_s___g_p_i_o___l_e_d_s_ggaac2b90d8b8c9579b6aa5d3bbda9b1ff1a2445895bed5dcbedc82ea3ef02bec6fb}{LED\_IS\_BLINKING}})} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00191}00191\ \ \ \{} -\DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00192}00192\ \ \ \ \ uint32\_t\ tickcurrent\ =\ HAL\_GetTick();} +\DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00192}00192\ \ \ \ \ uint32\_t\ tickcurrent\ =\ \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\_time}}();} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00193}00193\ \ \ \ \ \textcolor{comment}{/*\ Ожидание\ истечения\ периода\ моргания\ */}} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00194}00194\ \ \ \ \ \textcolor{keywordflow}{if}((tickcurrent\ -\/\ led-\/>tickprev)\ >\ led-\/>\mbox{\hyperlink{struct_g_p_i_o___l_e_d_type_def_a6cc026931a4681732f9a329ae03098ec}{LED\_Period}})} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00195}00195\ \ \ \ \ \{} @@ -208,7 +208,7 @@ \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00204}00204\ \ \ \{} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00205}00205\ \ \ \ \ \textcolor{keyword}{static}\ \textcolor{keywordtype}{unsigned}\ direction\ =\ 0;} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00206}00206\ \ \ \ \ \textcolor{keyword}{static}\ \textcolor{keywordtype}{int}\ duty\ =\ 0;} -\DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00207}00207\ \ \ \ \ uint32\_t\ tickcurrent\ =\ HAL\_GetTick();} +\DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00207}00207\ \ \ \ \ uint32\_t\ tickcurrent\ =\ \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\_time}}();} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00208}00208\ \ \ \ \ \textcolor{comment}{/*\ Ожидание\ момента\ изменения\ яркости\ */}} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00209}00209\ \ \ \ \ \textcolor{comment}{/*\ Период\ ШИМ\ 20\ мс,\ поэтому\ менять\ яроксть\ надо\ 40\ раз\ за\ период\ (туда\ обратно)\ */}} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00210}00210\ \ \ \ \ \textcolor{keywordflow}{if}((tickcurrent\ -\/\ led-\/>tickprev)\ >\ led-\/>\mbox{\hyperlink{struct_g_p_i_o___l_e_d_type_def_a6cc026931a4681732f9a329ae03098ec}{LED\_Period}}/(\mbox{\hyperlink{group___g_p_i_o___i_n_i_t_ga1d42e219765ec526d99e306638ac0023}{LED\_PWM\_TICKS}}*2))} @@ -292,9 +292,9 @@ \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00288}00288\ \ \ \ \ \textcolor{keywordflow}{if}(sw-\/>\mbox{\hyperlink{struct_g_p_i_o___switch_type_def_a2600e599a961af2e280c721894df4c06}{Sw\_FilterDelay}})\ \textcolor{comment}{//\ если\ включена\ защита\ от\ дребезга}} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00289}00289\ \ \ \ \ \{} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00290}00290\ \ \ \ \ \ \ \textcolor{keywordflow}{if}(sw-\/>tickprev\ ==\ 0)} -\DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00291}00291\ \ \ \ \ \ \ \ \ sw-\/>tickprev\ =\ HAL\_GetTick();} +\DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00291}00291\ \ \ \ \ \ \ \ \ sw-\/>tickprev\ =\ \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\_time}}();} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00292}00292\ \ \ \ \ } -\DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00293}00293\ \ \ \ \ \ \ \textcolor{keywordflow}{if}((HAL\_GetTick()\ -\/\ sw-\/>tickprev)\ >=\ sw-\/>\mbox{\hyperlink{struct_g_p_i_o___switch_type_def_a2600e599a961af2e280c721894df4c06}{Sw\_FilterDelay}})} +\DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00293}00293\ \ \ \ \ \ \ \textcolor{keywordflow}{if}((\mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\_time}}()\ -\/\ sw-\/>tickprev)\ >=\ sw-\/>\mbox{\hyperlink{struct_g_p_i_o___switch_type_def_a2600e599a961af2e280c721894df4c06}{Sw\_FilterDelay}})} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00294}00294\ \ \ \ \ \ \ \{} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00295}00295\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(HAL\_GPIO\_ReadPin(sw-\/>\mbox{\hyperlink{struct_g_p_i_o___switch_type_def_afb369df75a6065fd89ac4ba97d98ab1a}{Sw\_Port}},\ sw-\/>\mbox{\hyperlink{struct_g_p_i_o___switch_type_def_a63d58d9cba49a5823175585ef2996032}{Sw\_Pin}})\ ==\ sw-\/>\mbox{\hyperlink{struct_g_p_i_o___switch_type_def_a4fadf5ead3ebccad521a52c064eeb405}{Sw\_ActiveLvl}})} \DoxyCodeLine{\Hypertarget{general__gpio_8c_source_l00296}00296\ \ \ \ \ \ \ \ \ \{} diff --git a/Doc/latex/general__gpio_8h.tex b/Doc/latex/general__gpio_8h.tex index 2748149..677dff9 100644 --- a/Doc/latex/general__gpio_8h.tex +++ b/Doc/latex/general__gpio_8h.tex @@ -1,19 +1,21 @@ -\doxysection{F\+:/\+Work/\+Projects/\+STM/.Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/general\+\_\+gpio.h File Reference} -\hypertarget{general__gpio_8h}{}\label{general__gpio_8h}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_gpio.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_gpio.h}} +\doxysection{E\+:/.WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/general\+\_\+gpio.h File Reference} +\hypertarget{general__gpio_8h}{}\label{general__gpio_8h}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_gpio.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_gpio.h}} Заголовочный файл для модуля инициализации портов и работы с ними. {\ttfamily \#include "{}mylibs\+\_\+defs.\+h"{}}\newline -Include dependency graph for general\+\_\+gpio.\+h\+:\nopagebreak +Include dependency graph for general\+\_\+gpio.\+h\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode -\includegraphics[width=265pt]{general__gpio_8h__incl} +\includegraphics[width=229pt]{general__gpio_8h__incl} \end{center} \end{figure} -This graph shows which files directly or indirectly include this file\+:\nopagebreak +This graph shows which files directly or indirectly include this file\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode @@ -39,9 +41,7 @@ struct \mbox{\hyperlink{struct_g_p_i_o___switch_type_def}{GPIO\+\_\+\+Switch\+Ty \#define \mbox{\hyperlink{group___g_p_i_o___i_n_i_t_ga19d9e3aced311179a2914e0c9b13d0f9}{SW\+\_\+\+ON}}~1 \begin{DoxyCompactList}\small\item\em Состояние пина при нажатой кнопке \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___g_p_i_o___i_n_i_t_gacd8900c9ec0efde1da3253b718574067}{SW\+\_\+\+OFF}}~0 -\begin{DoxyCompactList}\small\item\em Состояние пина при отжатой кнопке \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l_ga580b842096340b066c28b24d6b315be6}{GPIO\+\_\+\+TIM\+\_\+\+Alternate\+\_\+\+Mapping}}(INSTANCE) -\begin{DoxyCompactList}\small\item\em Маппинг альтернативной функции TIM между GPIO. \end{DoxyCompactList}\end{DoxyCompactItemize} +\begin{DoxyCompactList}\small\item\em Состояние пина при отжатой кнопке \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsubsection*{Enumerations} \begin{DoxyCompactItemize} \item diff --git a/Doc/latex/general__gpio_8h__dep__incl.md5 b/Doc/latex/general__gpio_8h__dep__incl.md5 index 56ec0dc..daf1c10 100644 --- a/Doc/latex/general__gpio_8h__dep__incl.md5 +++ b/Doc/latex/general__gpio_8h__dep__incl.md5 @@ -1 +1 @@ -ad2bfd356854f9f0812ccb26fdf5c988 \ No newline at end of file +78ab8e4e6ebf3449d861764d1b38a0a8 \ No newline at end of file diff --git a/Doc/latex/general__gpio_8h__dep__incl.pdf b/Doc/latex/general__gpio_8h__dep__incl.pdf index 6b3454f4f085199fd0345a7a60dcc93e5315ef28..cdcacaa4a046e1ab5a9da61d6202568ff03359fa 100644 GIT binary patch delta 21365 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

    jZ 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 delta 21346 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 pWOH)kFJSo&&;f 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 SlaN;)3NkY@3MC~)Peuwj8^E3b delta 20904 zcmV(vK;-U#jU`2sxr zRu10N^PsM8$m?LPyn{=Kj=w%dJ1QYY*e+nKobXVz@q|&Clz<6;%3w>FH0o?wxPs2X zWT~$8TjRZcV+urlCiaVoL2pbzy)_}|Z{#fHRnQ+zk+PTGd;PF5SnC-Bl>Q}$cRlnK zqbD5x(%ekAfWljZ$(&d-l@)u=xV0&QUU1aLq`dgfCWoE!Qi%U_1V{vG&yaLr5VE;t zBViu}o`bYOQO|jQCENK?W*^x7m9x3y)vm|KB$+>h?zsF6xG>nydSO(Xu%s^4Rj9UbO+FECK!y{tffz9^OkG=Oj7shvYw)qB?>{2cwE-g%d$aA&nrZLMPP?;V}|C<+R;Um@I2Ca#ety9|X%gVaYQ=_6fU!?{G@I=s~9A!^W zjjHwZ)acG$QFqCcVxSB6XdwyguU;ZfNmwu-EuR&r%HUX@QfSw^a+<-lly!)_%=gk` ztC=S;$V^#1(eMx2Mb7GT= z0v!W3Fg3HQ0#E^eGcYhTI0`;K3UhRFWnpa!c%0?Edwf*I**HEk=eB$HoZYjVz3(Qw zo6T-QHX$Jigg{C*KtM$9uqH?(2q-s&0ODOk714O3wzX=l;HBQGWpe=*uq9P$>xDwA zwQp@z+M=~ql-HM1FC_bWX3n0lQTu(rzt8W_-)?5+IWu#A&Y3gw+~+wPgb_kA>Ovd} zFTZ@*hCi==cmSdKXAvTcmv7k|e(un_cO$f@6(RA8OE+A0`S>5Z69`@OYlJN6%hp|U zY4iLuzl1A13+K#TwQ|{tf6h!DLFlrpp>EtNsBqMpPQh^+j!RZuzWM4$Z?--N$8W&# zL+jQrUxvhg8Ye=lHo)<&%a>ifK`b=yMrgGL$KeedS8jNu_k$1NxEdj)3K2S30lqL= z2~F-N_=G5B$OFj&B=9FVBuo4WjC>|hI6=7Q$rxnD58%@mnN;?dbKH*hv7pf6FFhbh45DTMfcZNdR$Mz5#0C0dikqEKWq-6LU1 zLL6U2FhM5ip)d(s2=QBZGf|WbPWGqFR*OXkWJLuaX-%2KI1E<|YZ_UEGTAfzHd_u* zRR(;Kv?vNdip3(*9E6^jDGFpPr^t} zYA3PX(a->YFp@n2Z$e3oyjA`qO-JCy1!HS}T^ywSM~)of+KwDK`{WV87`O_`{+%=k zufsi8&^zu&T=tz_X9LM(-${m@4L{&8;dXMnIl^s07?1`7I>4H9A0YAp&fur_z=06rLYI=j;x?-|iBia#{X(w=*p?j}?!k@dVL_H$kJCEbpW?+F zUT|^_AO@!JN)C581AzM}&7s`oP9qhmxyyZ+2cI4uh?0E+Zll)=2Ar%-jY4tzC`a7e zfX3My9OJw*&~*C@$8>Kiy3pS0xX`PA-EX?zM(kd%ck&{Q&j#s`vl|-(^7HRX_;K?GMU3jAS8^DlP;EjU@{fC zyiS+P>rl+*B9{X|hh4GR!kXQwX?BNMF?n5r&8{hkz>oyatJ!R3v&lqYOkRh>Zbv4+ z$K%(U&3GOP!;H;CE=Wlv;CXw)VT`fQm%(@RJjDpC-S3+<==Tl|`hA1m*)1!lz7LoL zIMt}<^b1dj;rZ-FYG~L#Yjk3N`wfS;kM@4O05aWf)eawqtnsh`1i0(NSxQ}dU0%x93NqOb`YB)oAi0u4KGxunWS=r!JkOL8 z+f0{2C2Z5tf+eYweD9_k8c=!sX@_+U1VR-7CCTVV7AH z)QdR4SotDl9k)_gDX&vxPmq`FL5s!NtYtqPrcY-c5jnG;>BN=PQqB^XDd5e4q{TuO zNtx`2NjqiQl9$#>TCVm~KV{eqprdAh&6Wcw3kP5zX)TG>RZAFuNtzUvIO(84(0fzT zn0Es>K>JvVqIJ~(TTQCUIDpk)1y-F)B%4##5~NtEug7zQowr#^oBFaLzy*ZuR3cZW{y@7;cDZ{N1oIw99X}4Md;@OIbY(+BJv;Ax#GTGBfH$@60vL!LGMVjrHemFPhxU>}mPXy!yqh8x$rPGoaiQ^Ukst-aPY z4(8V*(HWIQmwnr#lU6rfbn&FglP6y6EaKyjbe=ci$&B;Ph7-ZB@>4jE{N2bfS&psrFCXXS5P_xRuN$p$y=aC&?@7 zAtqMJt@2gemGWEM-$dyN5l6+i6f-r5 zNdFdpKR3A?vMg{MPef35%qBPhK@yWhrzD9S&&LGWDG0J`h658wJYJx}&0;|^pTV}I zS>Wjs3&kdSHslXNp32wDH6kY2f|Hg z4v;eFhsiMv;WWkwG=_FELpuj!1dcpR^C{|oUn0{l^(GRthqcGf##tI8aGK55I)TV% zojjd5IV|d$8ttA2sy*?bJwfSBSOJhUQ=_SoV|h+dP-mKP$b1V&%wE-Ahv3p}z#1r9 zkj)i^4Q5keVI!>eJH3SsP`uF_W<^h=feoY$SV%kW1f~IJ>_=jDpf}P07%4IYA{IJu&Hco5v=n8}8> z5N$GN7J0;*WLQNJ2;6I^F*-TfsiGLglKr-R{LDXw*5E_$3_Wra$h_xqdT7hw3KF_@ z=ptB^he7`w1UgcY7msG#sA#2qt&_}u)Mh#_(k^oH7Ny8$wIYvKw;dcHh=zuRk0Xz~ z9EKq3OF81EgV{4Vv1Cn|WV+xcjV`i@G8VSbCV$wE;m_|?4I@M~a7i6DLe&4aM#vXm zGeUgS2pQ&C?TtATq_dq>&C-QK&JEj1jAq8YA9sHb!bZMa1QQB$0?6 zU@8wvo08hgKDj3)PS7uWkOp4E`U# z{q5)1Jz$-2FTdo=U596_09u*}`eG5tbr&imZbnO<5DL0LIt{|nANXe4&x)8{nIiP47C@bl@Uow%B!c1}XQsj|> zOqFGtqZDL9%FX1puZXIH=X?#I6f$SS2`VWPi8Gyf#C~!RP~k+=N#=VP>})3OG&X3z+K2TjT&!9p#+r z=xA7aaeGz5UR%}P33!D)On-cJQ7m#7AE@|v|38L4!OlPb9$WF* z59Ho$%kLa~i_BBTr*6OgX`J#r){jG&!wN1NdS~c!Exh}Gz$*OxTc@mg0x{ikZuSH2 zB;cT*EYtk~9%H5ZQ?juLW&^MdFN*=#0oYGbp@%R@S!cb;hHVr%=wxt+cLXhx7jOt$ zU6P5CHeDy0v(?c}j4C?UN8Wge>D=1k_8OYTR0opN%?b_$rxZ-_EGSsu=_u&%{E+;R zdr*B`d)yCy49O?2A*;DH!j;MfwM%_M*<;=-?@<)Da;x$;!dZ)#+Sc1{vT-(?AZY6fz^5&4SL2F$hC%mh+4yn}O;{Tgp~qWvYg?H~{lDq8rM7JlqYH zSP~&H>4A2V)&!d)oXoLKoXpJ{9;aJ7VW^^*iIbFn-tc)8Ke3 zk|HTr$x#W1nC7LUwoES|F+nLAMo^A4r~wwJJEw=YcQU2uoKn7V=7Q+VdDQ5})aZuR zji;#%w2`d`AicezN^1w5{RCCbJ3+B%!-kT$Z8it*%^|eK!4TS#Lufd+mZm&p zu5*BY>h1>Jo#L>InMPb=PvIv&eQW678~<_pbAJx)_T9Ajwr3u{WzF4qn`hrqT!`go zG1sk&QXVYk!7}iqXq@WW z1IZEqx_q#RiYj9cxixdbCX4PMXR&F;s2Hn%4r6T`27hwMx)xiUa>Nvzl}s(>mJVry z)FthZcmyW#E-5VyNXH~mqTG>kT8UZ%%-+sqKka9={ z8ZTK_amy`zd-fD0%8DM@sZCn>C|Q0dmevj3b?4xBXI1!hzS9JJrw8~>HDAOu7>_ZJ zUIXw^3$30lO<5kTmFB_mJUEsIm*l~J(LA^~502!)VFONHpW=(1#S_fuo2QnfidPn2 zZ@$}nOUV-jKdE?uQ_UW~*Hb;S;!TebAd3jmYOw5GVp?KeA}_HlQI@D{Ol!<*`j2c(6SZ=edh_5Ky9Nk>fRq|c=A?4n(A5?t5`f>Sb<+0L#$IJTS zzl^)fC_2y;EjECt0hAa(nQlPl`cNQh03`-cNPWqUqK3t$(wHLi{&3vITSgc9DHAOA zRZxx_@-_M9_?G&1`;PiVn=j;B?|awBhkW<=i0@~h9J@fxWEw%zNxN$}iHU}ffj)~h zOsIy?=XBRGO+mBT>o6X@q;Oq-At?;HB%Tg~o&>=A409=vETEXn2S-~%puv~;k_Fzn z8hUyS#ebhy&nf2n+!XD7VS1)7OwaN$+tSCxHf?P-vqkffi-4AM{JAeBm6XHv_5>S_ zmE&@HYkHY-N+k5!44{`Ory2>pQu#q+(fd;6em0f}=qDXD12v?nrmKd3)KK-O1bKDi zlbHr#eHq9i2G9{wU>_Z1ILDgZsc?ynNi`dL5L=k`w^7B`Ne5!H(oxu$>S_~pmSIoX zir+QNUf-CUUeew<%g{|IzfNdSZk(-wRi_hqC)G}dwHMk5Bo1ZM$xdo;00Y>VIH3)) z0`wI-Q++)ROy5nGRu)Bn1!qOvt~s;#0{X- z0HVx%);sG!%mCsB0G-byr%|X(jhB!Tt~55zRu`QbYpGg)98N_S#nxHYsB5j4I#+tH zv0STOYr8?avSd^2R<7G}yV`BLOWRg*bL?LAKHGh+qMXyEG7@(L;(l{{6pkY_%J1N7 z#>CM|pb@q5n!xP=5{S9g%A(R3jtOpo`Uw=~mny0>7ZtfVro2#_uU*G}TC_6~s5+^C z1Ifx*iB+|K2$5i6QNSdLJV!(vD=CILQ78&j`jeD|?*Wc=(v2z^yK~SQ4Tteu+<`aX z9azK}oK7m0Md5;i$&2WXVJOFwDm|h@fhRcM4EEDGX_N17G#kjWH)W2aQFs((PgD~a zMW2UxDn|KhB8CDOF@$48*FW~AV2*Iyk;#6<&T<%kjt&QP*V^dmj)l}8;v2L4BAu(u zIzf3w&Lsw%q@CF~r%zJm0e`?S7}rRgrZZ*tFjE-=*v53fbL4+sa4ggs0T z5e?sxWB{U+n{x?(+~z0Fem=Z}$bg}%pyV`vZvck7ehDkD=DOzKq%|dwB0x6;SSRr2 z4B6Bd<}shac%K-?q>95FzH_Ug*miLId9gdOu7N^SHrD!)^KADG3kcr6-|2| zIHwY}H^SmKYJ(@*-=|Dl_h5k%nCIZ=M<$UYY|S|4xvHVQ_J}<)mhPaFf}ujbdnh1( zsLwt3#sAQ`yB{IZ26LxzbJ^UP$}KsME&zE(;eOD+&*;c(vZ{7aotS?B03el*lVucA z7-0!Eg)<{eOlFG}nao7Ci1fL0-XIX7dznK>L%MFEZ%Y_1zO(vVP-F54%itLY2DD?x z1}G}C?LvyFfgF1YQ8$6ONMt$3a-QXXLOADm{4^P*5Mi!Dj%nS5iElGwG_sP@!#`tF zZlWX?qEKAGN?3N(*;ppf{bQ>InM|0-^ug)X7{D%akfe|UX(W|Yb3REix03p05vI>_ zy6QA_L^L)vHtG-4p0{);XN%p0h|T0A0TaIkEZ|?mR4Ox+88&VdA5$x=t=vU_{1)|U z>vq*-A%dwv9cP_GW^z-dq-mBq*(%>p9^mei?lV2bJt>I}VzXMS1>zJ0VghBQS}*}< zQs&#{Q(cglOlH|)QB|u|qwCb+=yDLp0rC_e_n2NGY|7vU!geRo=cwzB-)X*K&zuvSDG)C_?24c3}^2JWeUgxX5OlTQ_* z&UW11*2aADs>Os%g4Lv$hz;wT)by)wa78fNq>k95b{xg_`*8`rsM_rti^-rOH@XTO-nzxw4^{`i++#?uZ!wjCWo9I9ttMK5VYGHG0j)}x!yZp80` zKD&4p&2px_opSy$)qy^Ln0FKNXwut{t#utZ!a`P{@1wvYKcIVO=p?(Ii^T{H2MEdL zBEW982kg`wb<#ra{IDEWiR@SZKgJ6gT<(j0vzdIevtF5a(SM8>I(;I+;-Cy)eSXx? z9u_rZW|Hcw!9&z%F*156;(C-XIr}h|IQx6<78*g+^z4xO9G#ngn<1;GzIeP<_r%M2 z@h`(7;A|dZpEaZfu^4`M%WzZ;Hezj9*K=_e#|UtS)3=4`mDu*Mt9ESN zPJ{>0DbT{cX^;4Si)3Nm9y{I5h_0mS{MV*7~d2nIg z90&8@KpyPRgK2+b`GR?HAP@HE!TJ6wH4nDt!L~e@j^BWPwLI972ix=Df;_uK%Yz+x zussh}b8ZHc;cqZ!vj3HwWl`&5{0aVq`7fUL!ou%`GhyN}g`;L~AZ+HiXi-pf1!0jT zEJlIp%Ew}OM{HM^9qHMYZ!?L0*fJG1ibpsOY=6iMt(iX?Wb-FPUX*a<}xJKN#0 zi`1yL8x(JUH>9CGgWLPOhVyyYSLD^{BdMmmu^j;%V0Q`(-zmWE6rjq6o!%+H(>n#2 z&on^ynJx6%0fpW(VCYf-xYb@nYNN(YqK3~en%l5;rlK)?3}Na{CN%zJ4zOH$xx%k) zTeB@J{6Tsai?MrV2A3Wro6t{rSD{Xoy2m4mXtNwFVm0=iz~xb z?_Fn+%$x`sesx}KMuKiC=f!7$2!qT8GOSM5>=^_AK-(Xwd1B3$AB1jv<>6=gqDv-i z_+Ed1>xv7uPT=F;pS|>w)&slu4wjN1ty?LTzQ{s<$L-$JJ#m82&7?y_CcH>&Dfky{EingLjuV?H%y)UXIkd+y?Hs z4QzB9HldsG=rjFxdrm|SvtrNJSTS#Gdeb;BfC$4oKF5*4y8UYS&uk9}(mX>?_a~o! zZe(t#5f-5CrDB#vBMa-nIdpT2cC&1fC7BboxLvdcuuXR4(5@Wtu9JpS1d?V|b^~&8 zf`g%yprceCIxz!r1TJlV^vbt89+|7j{pD-V+w>$K|H1B-4YO))7~Di|z2frbdtV!T zp2g*zpZ$Oj0=|@?dajsZOodrBm-|$IfB7i2yc{%PSAAeY`Hb>*wY_|ey1Klhx?8<< z)PwFH`kz)^Wz=;@=dF}-Dj$WO@I6zu*LSe&u0LT%{U|ajSY>Up-ecWq&02+>*4@@mteo|r5qi5XWmPDrvr?}CU3M#DDHP|d%)@A9 zY}6VzqV2p4XZED5)*$D}kZ1b56}sQZn(|i2^5jL{?>mD*2@O9BYAKa#f}Ca4GHn?G zV#(LgKg-ipaw0HkNglPf zV({RS47n(2Elr}h77xd(oX8lu$lTZBnDKdPhFG-QTDxBcYl5k!`F?>*|lI+18P35V2! zTa|Zmr|#1-T)KM55AK8lbq4k!E|E|a>!=J@Ndr=Xr7~B;V9w(8c!EymZVjGuw>D9Q zm%3aXG#V(z9I4bNQ_sGC)b&cE>`Et*91XghZcjAMiISD*+jr23Yh1B^&F<%?Z#r-6 z+P5ylwJo>ZbWLH}d&RNaZ+m90X7&_6AM{*uc>R)^%U7>@G+ub~qG>Glk)QmM z>Do4LZb6*N@J^}0CJn#_%aMv?N-v07$lgfj(Oh+vvv4reH&v zGiBQ?b4fL6BermVS#_O8Gf6Q!+^W}6YAIDp)p5!=b*%LPyQR!gR&buX&CyoS=34Do zU9j49jkra<#(u5yTGuwU+kU6x&Vt*W_sdUNp4SfA4>&)R|L**kI;ef_%m#}b1zxLl zI2_(xU^vHqPc7eh58G(=iGn>)ml^tA?eqzsb^=Jl@6}E+ z2+;ea9_dGat$kB|h#!I{p^@s1ro%JSRxs|p=ZyP;L1B~{RTZxfBS)AiuVE?9cF&-Dyo$Qkj#SYvax^qGQSA~q)5({#mmCe+ z;Y1C8O*C?&T2S3;i+Zcdx7aVVZwYYo-Rrb9&K2$})oYx$s@=}p13y+}i=tY23B&zx zhCJSvgux%gUNj2GbSww}7wF~XPrjRA$gz#W^GhS!Hln1$Jg zyQC2(NqHwpc_&Gm;>idIjyR_BhQz7dVE(*+9hKe;9^dPG9Us8s>6-~j3-k-4Bq$d< zDl+)qo;#Q?C2{ifN#OE;5V~64J{(9s$QbxZZLs~sxs5m-<63)#Fb8S^MK`L2&>hpSoE}er5c^hU`iQ1ZmukM)v-~;@o|XCoPTwvZ%;O>*%$6;nKQ# zM;3Xgnqs9C@=bT6?qqsDdbh)RY|=zwqIgg^Bp#H0WqLU%%~0Buh1Rvo3hT9hj%y2U zcRcTS&;MTFlwUby*;hb{WX&XsuLS*|U-?ZzKZl9QALP^`jUxUWu#q#^yN8Yw(Sh}0 zqR1nVR?b6Oc^GNcl)TCFI!r!ATzrsh16){~nEPY#e06vFr9kd&b) zeS3`ICUuXUWLW9Z(Q> z-?nTF<$>A146Ww7hyDo$`6#CGE4T>}zkq!FlxFHMJfXdhs%BBgXAh$9?NPGf#ztHr z{^_CB-`3-cY+z^pH|QH0N$9b0>N&Yj;}U;9ayw6tzRgz#TsCYGd13}7QU%jFrvy|b z*gIr)CinN*9N1RuV*%iQ$+^CU#kTwS`%Dj5AG8e!1LA=6s?BUmx*Pmlf!U?{wXt}D zWh=hhVybdn$hS#tmR9Qz@cr`rmVG3n{Mz!0^)>A+?)T>3s(;enlO2v630f57u!FV) zbR|-1vr@<=BBCN$CL-Hcpt2oQNL|EVDvF$BGMlj|ngyQYEH;~e2Bd*)HdV7=WG1SG zQ#4rw{Y2JYLNA$#7DHwyLS~MrFR56KDV$SLIN5CGI3j8)C{akBWxaVY+ELp zZ%oP=9N3o>=Zak-CuYc$q&3XlNQ&pc)X%VAe>jJ&e&1mGAV_)bJ;2%b+ef^o#@>9) z`SIIxa=pQ3+iqfi@0{s56cQ8ljk%cpeyg{z!9wTTQrMsrdm1=M^tdQq%2>l_=rkSvtvI~N2mBP)cJ=Hy&mlgF*=-|SDYkD6qAW?-Vw!f$jx~GI-eK>u z^C9L^2{FaQ?qFU*W_vPEp~$?1EC9z&cjK5##m+*L?Z*DuInUrhV|05{_RZ(w^9=1h z7pS*4+5S>KhC{d*zlNKXu*JkKFq3 zonJnGwi9#R^O}kEi)qC1+AF_!>8;le>-yq-Ah*i_=LGb4j#m<%D-w{2ZAp_S_eg{@ z_Hl+^FyMywak&5MeVj9f%l|WD`$o)v*CO|-g~o^+{3rE_x2;|HJN%eo+IE=zh<+k$!EzCpS_9=7$|I^(iyk2%2NwVcumyevvF0r5NeU3{7!;E(g-0Dp>q zCx{R8$KZ(PjSV1v*z3qMPY=($jy&4{;&mSt1N1#0et7GLpKThs^+SE#Y~KfHB{BTQ z2HgbOIMU}h!bQE0mxcTnGmQ7}0bg$G@9*dTdGzR)ExkzJa75_TJVwQBj4W`|Mi81DqEGaT4=H*g$rzRg-eCE3jf7_p(&cn%8LZ} ztSDh%vsPfU+6Xp#j(2*8d1rCTTXM{THA~XcVd=8)I?uE)|DVO1i;p7`XV0%Cb&I~U<=G!!x#d~mz~H~` znRCx8n}$9adhwZ#=|lOLd|Wl$;_cC`{K)u zt#>_!Y?h|KA=j?2OM6qSsDy)zMZe%&JgV_2XB%39eO$7nBx0pe z?X`Q>VQdv68LnpEI??PXD6o0}?pz~B!?v(e|e3dzyqr28{of9wAU$r`>LB>^<}-Y$ee6Q@FA_#M4mlt7+1=rfdmhMdlD=mi!UK+xo&dEAHm zBvgdTiEbTsSS*6G!V+^{U}J+i2R$p#P8r#-{^w1?@_9ye>FzxBZMY1&Jq$GSf4(c|a< z0M-B8Z@_o}*6*pLJezGehKfT5qX-$gb||+m?n#AzN)FkM+TOKgZG6bqWSe8-hW+Zc zoX$NuWn-`D+59X_zLF)!%&!KsF1iZJn4hA+*n6bn0NBCOi`xN(JT%ap z`D;smK?Nte2JRVKYu5wM^MB&u(%qJtDVuM&&1=P5(tkR2#c%I={@N#2{%P0GKYZYc z8?JxqxofX}s?|R)Rj_Mz2$ z1aQ@Xitz6lu5MPeO6^m=dzOC| z4rvyNha4246>Q#iB{3dfnR zDjaOX7CUr>BLoTu9-(mzD;$Z_C%&$0FlEEuFjCb(R=d^B(93GUA}0pf>r`SMdQlbC zh?Q`=oP=Uhsh!KirR|STxOdfU$JShb`R;X#?-^}>V$0P(d2;ino}tyk&${Q$yEA+L zV?$rwalwSaFS*B$9DeopufFmJBld}-F?&w@vi>_$ZeZ6gPaX9%C)vJaj33Lja0gVL zRk=LAI*-Y&*qxk!ku4}lPK&IJ&`Xs(6i|l4BT7?B%*?_V%y__z-E7s}EMCHY%pxVs zEKZI9E`D%D@q4JRWv}*FJWop_t;NyLC#zOv3U7<Tb#$dzUT1)6hUXOj6hnP$zKS%I;TNB%>5Y1 z$#!a4HZs>YEDKu`r)C#_&5~#miKv+!0c00pWne+dw{FFW&UUmhum{QR0vaA)*}skx zWgAl-WvsijYislcijJ)vTUUSXr)gX+`f_CN&YcDRo3~uBBrv{a{?wyKxd-p;Tw6Eo zLdTEfX&sl`dG=DB*Zb+4;y|-9Qb|zvI4gz>?oX-W$e*6c`!O1SvjND%KTl(7EvVI#Vt>8wLUBVlF>9XCv%6MN}7 zWREq2?_|3oA5kQsG|dROQF~uw-UmRMGmXZt6K&UjCdOv78C$|?_MKh_3-eA|Y8$xX z$_9=vEM!JV8(1IoH(Q)a($b)G&23PU@dl+h2xTrByzQHRLhTSR0EIV;oJyFTqN*?r zJl!^7KO$0FTf-tW=qnkxmc4h&*)h3q@D}o;@4oa>|Ik>x^vB%Zv*-VK=n=w`?+>m; zx`&UW%nuNWC$pg}LK@Uq(M>3e7vN?1YJ4NUm%K#&9FB*p!xO^KMvAjp`rDLf7oLwh zp#6qidjYh6Hw?G`=MRQ^{24!pAHomAcUSKF5`2G+fBkOO+h#>fs z+!+Dn`Cmr;|H}{XDjy`j@Feo_aab>u{X3)&XgRchI!pBrA1%p;&^eP!2t9?K!>iGA zVDG+wPr+Hc(SFpAehqUx6+MKmN8bbOMMR6C=5{n6z5>*L5BswHs0uv-*zpKD0(~z; zH=+Z`jlJ1_048taUWc=`!I~ALW-vO}qr310*(=c!^e%rhsz(=~E6@hqm2J)5oxL~v zIQlVv+RyzuI|w-7N6X=RB>S=OU)evSN;u>D=mGRDzSq15%-0LSNZZf-2yH|Ua_v0M zUIq-A18lnr#=xUl=m;Jl3Ap-7^mpvV*K|~&WZRk66 zw$U%qU$7rnfsULaqsV&lFt-tCr2@_!gI1u`FyHsX)!zZZx0fj7DEAou6aGuFaOik{ z)(R^UM?XYALchQ&JZTtj!r#Vk;=hq8WGVR}`78H5{%QVq(lU7Ji_zuiF7y-hZ|uP1 z@jQGHUWKp6+wphs1NaC&hCd+9WFc8gKH*kzo!rm($?#pkZ{lwjZWZnjKNxBqIz05- zp?_y7jC`G|bZdAMRO!Hwk_xi)S+ zjA}c#1HOB>zwmzkD4&ISt`Y7Nb_!1kKM`IKPKk>2Z4)xRcJ{Hs^1*k8(9msvL-!5! z4)tgM0{p`VI28o`(g>qp2H!QX-uD5`=lFX<<5k}o)kvv4-f#g%i@xpr
    yDhFRFdy>~sBBAc79U1Z?Hw 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 diff --git a/Doc/latex/general__tim_8h__incl.md5 b/Doc/latex/general__tim_8h__incl.md5 index 7522afe..e11dc17 100644 --- a/Doc/latex/general__tim_8h__incl.md5 +++ b/Doc/latex/general__tim_8h__incl.md5 @@ -1 +1 @@ -7a5e6f29199b63105a7df21ee26a08f8 \ No newline at end of file +72b7b62252ba432b33a3132214cb26dd \ No newline at end of file diff --git a/Doc/latex/general__tim_8h__incl.pdf b/Doc/latex/general__tim_8h__incl.pdf index c44349e998d75a5cc858f34d36ac8bf777f89780..2bc48e23fd755a0b6341e745d98f65fa30d8c588 100644 GIT binary patch delta 21247 zcmV(pg!0gz9BRm)CXF$~?`ugLP=#e~?-&7(^sg!({L=}285gecEe475od1;7~I(nq|x1dyW5W3 z&n~z(_`Y^~`;Z2A+);2lE(ZNmEIyAeMt6PUHoIVcaN6cnwVG3ZC>A%0AKi4;ZJbWR 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 TJ(Js59tt!#Hwq;sMNdWw=k@FM diff --git a/Doc/latex/general__tim_8h_source.tex b/Doc/latex/general__tim_8h_source.tex index 9e69885..0f6d77b 100644 --- a/Doc/latex/general__tim_8h_source.tex +++ b/Doc/latex/general__tim_8h_source.tex @@ -1,5 +1,5 @@ \doxysection{general\+\_\+tim.\+h} -\hypertarget{general__tim_8h_source}{}\label{general__tim_8h_source}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_tim.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_tim.h}} +\hypertarget{general__tim_8h_source}{}\label{general__tim_8h_source}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_tim.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_tim.h}} \mbox{\hyperlink{general__tim_8h}{Go to the documentation of this file.}} \begin{DoxyCode}{0} \DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00001}00001\ \textcolor{comment}{/**\ }} @@ -16,215 +16,292 @@ \DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00012}00012\ \textcolor{comment}{\ \ -\/\ @ref\ \ MYLIBS\_TIM\_DELAY\ \ \ \ —\ функции\ задержки\ через\ таймеры\ (blocking\ и\ non-\/blocking).}} \DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00013}00013\ \textcolor{comment}{\ \ -\/\ @ref\ \ MYLIBS\_TIM\_OC\ \ \ \ \ \ \ —\ настройка\ каналов\ Output\ Compare\ и\ PWM.}} \DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00014}00014\ \textcolor{comment}{\ \ -\/\ @ref\ \ MYLIBS\_TIM\_ENCODER\ \ —\ работа\ с\ энкодерами,\ чтение\ положения\ и\ кнопки.}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00015}00015\ \textcolor{comment}{*\ \ @note\ Требуется\ подключение\ модуля\ TIM\ в\ библиотеке\ HAL\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00016}00016\ \textcolor{comment}{@code\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00017}00017\ \textcolor{comment}{\#define\ HAL\_TIM\_MODULE\_ENABLED}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00018}00018\ \textcolor{comment}{@endcode}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00019}00019\ \textcolor{comment}{*************************************************************************/}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00020}00020\ \textcolor{preprocessor}{\#ifndef\ \_\_TIM\_GENERAL\_H\_}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00021}00021\ \textcolor{preprocessor}{\#define\ \_\_TIM\_GENERAL\_H\_}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00022}00022\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00023}00023\ \textcolor{comment}{/////////////////////////////////////////////////////////////////////}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00024}00024\ \textcolor{comment}{/////////////////////////-\/-\/-\/USER\ SETTINGS-\/-\/-\//////////////////////////}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00025}00025\ \textcolor{comment}{}\textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00026}00026\ \textcolor{comment}{\ \ *\ @addtogroup\ TIM\_INIT\ Init\ defines}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00027}00027\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MYLIBS\_TIM\_GENERAL}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00028}00028\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Настройка\ таймеров}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00029}00029\ \textcolor{comment}{\ \ *\ @\{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00030}00030\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00031}00031\ \textcolor{preprocessor}{\#define\ HAL\_TIM\_MODULE\_ENABLED}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00032}00032\ } -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00033}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga54a98c21365e0bc45b81555d2b101f2b}{00033}}\ \textcolor{preprocessor}{\#define\ USE\_TIM1\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM1\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00034}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga72535a44955b43cbcd56e25039ab32eb}{00034}}\ \textcolor{preprocessor}{\#define\ USE\_TIM2\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM2\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00035}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga5b5685a43273b6e37242a4aba3ee0617}{00035}}\ \textcolor{preprocessor}{\#define\ USE\_TIM3\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM3\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00036}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga1493b39c9214501180b81b4c892f9be0}{00036}}\ \textcolor{preprocessor}{\#define\ USE\_TIM4\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM4\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00037}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga252f4fba93fc265110e83760e0590af3}{00037}}\ \textcolor{preprocessor}{\#define\ USE\_TIM5\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM5\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00038}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga8fe31b98160627d19038222910be3f46}{00038}}\ \textcolor{preprocessor}{\#define\ USE\_TIM6\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM6\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00039}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga7cdc54cc8cbbb6e9f60001f1e3e6ec67}{00039}}\ \textcolor{preprocessor}{\#define\ USE\_TIM7\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM7\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00040}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga28ba33d7c6bf22821dafa5bcee4854be}{00040}}\ \textcolor{preprocessor}{\#define\ USE\_TIM8\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM8\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00041}\mbox{\hyperlink{group___t_i_m___i_n_i_t_gaac627c0e98c9594cc41b1b46eb39e44a}{00041}}\ \textcolor{preprocessor}{\#define\ USE\_TIM9\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM9\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00042}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga98c0691052d1da2c4053dd3586ff7ce9}{00042}}\ \textcolor{preprocessor}{\#define\ USE\_TIM10\ \ \ }\textcolor{comment}{///<\ Включить\ TIM10\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00043}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga176c97f06ebcf14e06e5c5bdbfac44c2}{00043}}\ \textcolor{preprocessor}{\#define\ USE\_TIM11\ \ \ }\textcolor{comment}{///<\ Включить\ TIM11\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00044}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga4e2b0e6cdf9eed74581b575c3fd9516b}{00044}}\ \textcolor{preprocessor}{\#define\ USE\_TIM12\ \ \ }\textcolor{comment}{///<\ Включить\ TIM12\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00045}\mbox{\hyperlink{group___t_i_m___i_n_i_t_gaf48ef87650517652ddec039a189507ac}{00045}}\ \textcolor{preprocessor}{\#define\ USE\_TIM13\ \ \ }\textcolor{comment}{///<\ Включить\ TIM13\ в\ @ref\ TIM\_Base\_MspInit}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00046}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga9ae40be31d5271abe3e49f896d916d5c}{00046}}\ \textcolor{preprocessor}{\#define\ USE\_TIM14\ \ \ }\textcolor{comment}{///<\ Включить\ TIM14\ в\ @ref\ TIM\_Base\_MspInit}\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00047}00047\ \textcolor{comment}{/**\ TIM\_INIT}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00048}00048\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00049}00049\ \textcolor{comment}{\ \ */}\textcolor{preprocessor}{}\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00050}00050\ \textcolor{comment}{/////////////////////////-\/-\/-\/USER\ SETTINGS-\/-\/-\//////////////////////////}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00051}00051\ \textcolor{comment}{}\textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{mylibs__defs_8h}{mylibs\_defs.h}}"{}}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00052}00052\ \textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{general__gpio_8h}{general\_gpio.h}}"{}}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00053}00053\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00054}00054\ \textcolor{comment}{/////////////////////////////////////////////////////////////////////}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00055}00055\ \textcolor{comment}{////////////////////////////-\/-\/-\/DEFINES-\/-\/-\/////////////////////////////}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00056}00056\ \textcolor{comment}{}\textcolor{preprocessor}{\#define\ TIM\_IT\_CONF\_Pos\ \ \ \ \ \ \ \ \ \ \ 0}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00057}00057\ \textcolor{comment}{//\#define\ TIM\_PWM\_CONF\_Pos\ \ \ \ \ \ \ \ \ \ 1}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00058}00058\ \textcolor{comment}{//\#define\ TIM\_CLCK\_SRC\_CONF\_Pos\ \ \ \ \ 2}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00059}00059\ \textcolor{comment}{//\#define\ TIM\_SLAVE\_CONF\_Pos\ \ \ \ \ \ \ \ 3}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00060}00060\ \textcolor{comment}{//\#define\ TIM\_MASTER\_CONF\_Pos\ \ \ \ \ \ \ 4}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00061}00061\ \textcolor{comment}{//\#define\ TIM\_BDTR\_CONF\_Pos\ \ \ \ \ \ \ \ \ 5}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00062}00062\ } -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00063}00063\ \textcolor{preprocessor}{\#define\ TIM\_IT\_CONF\ \ \ (1<<(TIM\_IT\_CONF\_Pos))}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00064}00064\ \textcolor{comment}{//\#define\ TIM\_PWM\_CONF\ \ \ \ \ \ (1<<(TIM\_PWM\_Pos))}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00065}00065\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00066}00066\ \textcolor{comment}{////////////////////////////-\/-\/-\/DEFINES-\/-\/-\/////////////////////////////]}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00067}00067\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00015}00015\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00016}00016\ \textcolor{comment}{*\ \ @note\ Требуется\ подключение\ модуля\ TIM\ в\ библиотеке\ HAL\ и\ GPIO\ (@ref\ MY\_LIBS\_GPIO)\ из\ MyLibs}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00017}00017\ \textcolor{comment}{@code\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00018}00018\ \textcolor{comment}{\#define\ HAL\_TIM\_MODULE\_ENABLED}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00019}00019\ \textcolor{comment}{@endcode}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00020}00020\ \textcolor{comment}{*************************************************************************/}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00021}00021\ \textcolor{preprocessor}{\#ifndef\ \_\_TIM\_GENERAL\_H\_}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00022}00022\ \textcolor{preprocessor}{\#define\ \_\_TIM\_GENERAL\_H\_}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00023}00023\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00024}00024\ \textcolor{comment}{/////////////////////////////////////////////////////////////////////}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00025}00025\ \textcolor{comment}{/////////////////////////-\/-\/-\/USER\ SETTINGS-\/-\/-\//////////////////////////}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00026}00026\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00027}00027\ \textcolor{comment}{\ \ *\ @addtogroup\ TIM\_INIT\ Init\ defines}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00028}00028\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MYLIBS\_TIM\_GENERAL}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00029}00029\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Настройка\ таймеров}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00030}00030\ \textcolor{comment}{\ \ *\ @\{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00031}00031\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00032}00032\ \textcolor{preprocessor}{\#define\ HAL\_TIM\_MODULE\_ENABLED}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00033}00033\ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00034}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga54a98c21365e0bc45b81555d2b101f2b}{00034}}\ \textcolor{preprocessor}{\#define\ USE\_TIM1\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM1\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00035}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga72535a44955b43cbcd56e25039ab32eb}{00035}}\ \textcolor{preprocessor}{\#define\ USE\_TIM2\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM2\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00036}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga5b5685a43273b6e37242a4aba3ee0617}{00036}}\ \textcolor{preprocessor}{\#define\ USE\_TIM3\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM3\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00037}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga1493b39c9214501180b81b4c892f9be0}{00037}}\ \textcolor{preprocessor}{\#define\ USE\_TIM4\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM4\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00038}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga252f4fba93fc265110e83760e0590af3}{00038}}\ \textcolor{preprocessor}{\#define\ USE\_TIM5\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM5\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00039}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga8fe31b98160627d19038222910be3f46}{00039}}\ \textcolor{preprocessor}{\#define\ USE\_TIM6\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM6\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00040}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga7cdc54cc8cbbb6e9f60001f1e3e6ec67}{00040}}\ \textcolor{preprocessor}{\#define\ USE\_TIM7\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM7\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00041}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga28ba33d7c6bf22821dafa5bcee4854be}{00041}}\ \textcolor{preprocessor}{\#define\ USE\_TIM8\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM8\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00042}\mbox{\hyperlink{group___t_i_m___i_n_i_t_gaac627c0e98c9594cc41b1b46eb39e44a}{00042}}\ \textcolor{preprocessor}{\#define\ USE\_TIM9\ \ \ \ }\textcolor{comment}{///<\ Включить\ TIM9\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00043}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga98c0691052d1da2c4053dd3586ff7ce9}{00043}}\ \textcolor{preprocessor}{\#define\ USE\_TIM10\ \ \ }\textcolor{comment}{///<\ Включить\ TIM10\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00044}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga176c97f06ebcf14e06e5c5bdbfac44c2}{00044}}\ \textcolor{preprocessor}{\#define\ USE\_TIM11\ \ \ }\textcolor{comment}{///<\ Включить\ TIM11\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00045}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga4e2b0e6cdf9eed74581b575c3fd9516b}{00045}}\ \textcolor{preprocessor}{\#define\ USE\_TIM12\ \ \ }\textcolor{comment}{///<\ Включить\ TIM12\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00046}\mbox{\hyperlink{group___t_i_m___i_n_i_t_gaf48ef87650517652ddec039a189507ac}{00046}}\ \textcolor{preprocessor}{\#define\ USE\_TIM13\ \ \ }\textcolor{comment}{///<\ Включить\ TIM13\ в\ @ref\ TIM\_Base\_MspInit}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00047}\mbox{\hyperlink{group___t_i_m___i_n_i_t_ga9ae40be31d5271abe3e49f896d916d5c}{00047}}\ \textcolor{preprocessor}{\#define\ USE\_TIM14\ \ \ }\textcolor{comment}{///<\ Включить\ TIM14\ в\ @ref\ TIM\_Base\_MspInit}\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00048}00048\ \textcolor{comment}{/**\ TIM\_INIT}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00049}00049\ \textcolor{comment}{\ \ *\ @\}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00050}00050\ \textcolor{comment}{\ \ */}\textcolor{preprocessor}{}\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00051}00051\ \textcolor{comment}{/////////////////////////-\/-\/-\/USER\ SETTINGS-\/-\/-\//////////////////////////}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00052}00052\ \textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{mylibs__defs_8h}{mylibs\_defs.h}}"{}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00053}00053\ \textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{general__gpio_8h}{general\_gpio.h}}"{}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00054}00054\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00055}00055\ \textcolor{comment}{/////////////////////////////////////////////////////////////////////}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00056}00056\ \textcolor{comment}{////////////////////////////-\/-\/-\/DEFINES-\/-\/-\/////////////////////////////}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00057}00057\ \textcolor{preprocessor}{\#define\ TIM\_IT\_CONF\_Pos\ \ \ \ \ \ \ \ \ \ \ 0}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00058}00058\ \textcolor{comment}{//\#define\ TIM\_PWM\_CONF\_Pos\ \ \ \ \ \ \ \ \ \ 1}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00059}00059\ \textcolor{comment}{//\#define\ TIM\_CLCK\_SRC\_CONF\_Pos\ \ \ \ \ 2}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00060}00060\ \textcolor{comment}{//\#define\ TIM\_SLAVE\_CONF\_Pos\ \ \ \ \ \ \ \ 3}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00061}00061\ \textcolor{comment}{//\#define\ TIM\_MASTER\_CONF\_Pos\ \ \ \ \ \ \ 4}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00062}00062\ \textcolor{comment}{//\#define\ TIM\_BDTR\_CONF\_Pos\ \ \ \ \ \ \ \ \ 5}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00063}00063\ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00064}00064\ \textcolor{preprocessor}{\#define\ TIM\_IT\_CONF\ \ \ (1<<(TIM\_IT\_CONF\_Pos))}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00065}00065\ \textcolor{comment}{//\#define\ TIM\_PWM\_CONF\ \ \ \ \ \ (1<<(TIM\_PWM\_Pos))}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00066}00066\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00067}00067\ \textcolor{comment}{////////////////////////////-\/-\/-\/DEFINES-\/-\/-\/////////////////////////////]}} \DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00068}00068\ } -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00069}00069\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00070}00070\ \textcolor{comment}{/////////////////////////////////////////////////////////////////////}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00071}00071\ \textcolor{comment}{///////////////////////-\/-\/-\/STRUCTURES\ \&\ ENUMS-\/-\/-\///////////////////////}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00072}00072\ \textcolor{comment}{}\textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00073}00073\ \textcolor{comment}{\ \ *\ @brief\ Режим\ прерываний\ таймера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00074}00074\ \textcolor{comment}{\ \ *\ @ingroup\ \ MYLIBS\_TIM\_GENERAL}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00075}00075\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00076}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{00076}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{enum}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00077}00077\ \{} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00078}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaeb611874216a4661fb83366b99b9e787ab0869828a4dfd62eaa44868ca27835f8}{00078}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaeb611874216a4661fb83366b99b9e787ab0869828a4dfd62eaa44868ca27835f8}{TIM\_DEFAULT}}\ =\ \ \ \ \ \ \ \ \ 0,\ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Прерываний\ отключены}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00079}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaeb611874216a4661fb83366b99b9e787a89ecf1ef6d45ead2efcb7dd30396114c}{00079}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaeb611874216a4661fb83366b99b9e787a89ecf1ef6d45ead2efcb7dd30396114c}{TIM\_IT\_MODE}}\ =\ \ \ \ \ \ \ \ \ TIM\_IT\_CONF,\ \ \textcolor{comment}{///<\ Прерываний\ включены}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00080}00080\ \textcolor{comment}{//\ \ TIM\_PWM\_MODE\ =\ \ \ \ \ \ \ \ TIM\_PWM\_ENABLE,}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00081}00081\ \textcolor{comment}{//\ \ TIM\_PWM\_IT\_MODE\ =\ \ \ \ \ TIM\_PWM\_ENABLE\ |\ TIM\_IT\_CONF,}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00082}00082\ \}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\_ITModeTypeDef}};} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00083}00083\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00084}00084\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00085}00085\ \textcolor{comment}{\ \ *\ @brief\ Длительность\ тика\ таймера\ (частота\ тактирования\ таймера)}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00086}00086\ \textcolor{comment}{\ \ *\ @ingroup\ \ MYLIBS\_TIM\_GENERAL}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00087}00087\ \textcolor{comment}{\ \ *\ @details\ \ enum\ дает\ базовые\ длительности,\ но\ можно\ выставить\ другие}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00088}00088\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ (напр\ 500\ -\/\ 0.5\ мс)}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00089}00089\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00090}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800}{00090}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{enum}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00091}00091\ \{} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00092}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800ae838122c0e83bc57ad31b546bf2f00e5}{00092}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800ae838122c0e83bc57ad31b546bf2f00e5}{TIM\_Base\_Disable}}\ =\ \ \ \ \ \ 0,\ \ \ \ \ \ \textcolor{comment}{///<\ Таймер\ отключен}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00093}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a63df3123d0ddc592b189ed1594456ea2}{00093}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a63df3123d0ddc592b189ed1594456ea2}{TIM\_TickBase\_1US}}\ =\ \ \ \ \ \ 1,\ \ \ \ \ \ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 1\ \ \ \ МГц}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00094}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a060b01e890891fd17c8f95b55a94139f}{00094}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a060b01e890891fd17c8f95b55a94139f}{TIM\_TickBase\_10US}}\ =\ \ \ \ \ 10,\ \ \ \ \ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 100\ \ кГц}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00095}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a096ef0ab67788487f69d8877c6d89b30}{00095}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a096ef0ab67788487f69d8877c6d89b30}{TIM\_TickBase\_100US}}\ =\ \ \ \ 100,\ \ \ \ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 10\ \ \ кГц}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00096}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a6a66c5ed1d966c9e30f0219b664d2b25}{00096}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a6a66c5ed1d966c9e30f0219b664d2b25}{TIM\_TickBase\_1MS}}\ =\ \ \ \ \ \ 1000,\ \ \ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 1\ \ \ \ кГц}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00097}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a7421a08abd119e71aa99eea5ab5d6daa}{00097}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a7421a08abd119e71aa99eea5ab5d6daa}{TIM\_TickBase\_10MS}}\ =\ \ \ \ \ 10000,\ \ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 100\ \ Гц}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00098}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a18527a2d781eb4365aecd9a3184fc1da}{00098}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a18527a2d781eb4365aecd9a3184fc1da}{TIM\_TickBase\_100MS}}\ =\ \ \ \ 100000,\ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 10\ \ \ Гц}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00099}00099\ \}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800}{TIM\_MHzTickBaseTypeDef}};} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00100}00100\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00101}00101\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00102}00102\ \textcolor{comment}{\ \ *\ @brief\ Структура\ инициализации\ таймера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00103}00103\ \textcolor{comment}{\ \ *\ @ingroup\ \ MYLIBS\_TIM\_GENERAL}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00104}00104\ \textcolor{comment}{\ \ *\ @details\ \ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00105}00105\ \textcolor{comment}{\ \ *\ Содержит\ все\ базовые\ структуры,\ которые\ нужны\ для\ инициализации\ таймера.}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00106}00106\ \textcolor{comment}{\ \ *\ Если\ структуры\ настроек\ не\ заданы,\ то\ они\ заполнятся\ сами\ дефолтными\ параметрами\ \ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00107}00107\ \textcolor{comment}{\ \ *\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00108}00108\ \textcolor{comment}{\ \ *\ Также\ высокоуровневые\ настройки\ частоты\ работы\ таймера.\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00109}00109\ \textcolor{comment}{\ \ *\ Если\ какая-\/либо\ высокоуровневая\ настройка\ не\ задана,\ то\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00110}00110\ \textcolor{comment}{\ \ *\ по\ возможности\ берется\ низкоуровневая\ настройка\ из\ структур}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00111}00111\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00112}\mbox{\hyperlink{struct_t_i_m___settings_type_def}{00112}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{struct\ }\textcolor{comment}{//\ struct\ with\ settings\ for\ custom\ function}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00113}00113\ \{} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00114}\mbox{\hyperlink{struct_t_i_m___settings_type_def_ada49efdbd35a8e442c3cff630d42f34c}{00114}}\ \ \ TIM\_HandleTypeDef\ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_ada49efdbd35a8e442c3cff630d42f34c}{htim}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ HAL\ handle\ таймера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00115}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a3805f627567798c3cd1d79a0da42bea0}{00115}}\ \ \ TIM\_ClockConfigTypeDef\ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a3805f627567798c3cd1d79a0da42bea0}{sClockSourceConfig}};\ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Настройки\ тактирования\ таймера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00116}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a9694cf0910a69d48ff94f8aeac106969}{00116}}\ \ \ TIM\_SlaveConfigTypeDef\ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a9694cf0910a69d48ff94f8aeac106969}{sSlaveConfig}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Настройки\ слейв\ режима\ таймера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00117}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a2d9d277dd395424b964445ec1bc65b21}{00117}}\ \ \ TIM\_MasterConfigTypeDef\ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a2d9d277dd395424b964445ec1bc65b21}{sMasterConfig}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Настройки\ мастер\ режима\ таймера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00118}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a961f19f0e1672715c27bc94d7871dbb7}{00118}}\ \ \ TIM\_BreakDeadTimeConfigTypeDef\ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a961f19f0e1672715c27bc94d7871dbb7}{sBreakDeadTimeConfig}};\ \ \textcolor{comment}{///<\ Настройки\ дедтаймов\ таймера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00119}00119\ } -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00120}\mbox{\hyperlink{struct_t_i_m___settings_type_def_ab90e370c3edda88e76583293c250d2b0}{00120}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\_ITModeTypeDef}}\ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_ab90e370c3edda88e76583293c250d2b0}{sTimMode}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Настройки\ прерывания\ таймера\ \ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00121}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a58da1b4c0f6d12d7d9fb2f170b9b9e6e}{00121}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800}{TIM\_MHzTickBaseTypeDef}}\ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a58da1b4c0f6d12d7d9fb2f170b9b9e6e}{sTickBaseUS}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Длительность\ одного\ тика\ \ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00122}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a11151fe125960cb8e61328ffd06b7718}{00122}}\ \ \ uint8\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a11151fe125960cb8e61328ffd06b7718}{sTickBasePrescaler}};\ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Дополнительный\ делитель,\ для\ удобного\ деления\ @ref\ sTickBaseUS}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00123}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a7073358fd3a722687eb85238ab570014}{00123}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a7073358fd3a722687eb85238ab570014}{sTimAHBFreqMHz}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Частота\ шины\ тактирования\ таймера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00124}\mbox{\hyperlink{struct_t_i_m___settings_type_def_af6057ff3f60f5e01b41d4a347b79a5e4}{00124}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_af6057ff3f60f5e01b41d4a347b79a5e4}{sTimFreqHz}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Желаемая\ частота\ таймера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00125}00125\ \ \ } -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00126}00126\ \}\mbox{\hyperlink{struct_t_i_m___settings_type_def}{TIM\_SettingsTypeDef}};} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00127}00127\ } -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00128}00128\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00129}00129\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00130}00130\ \textcolor{comment}{\ \ *\ @brief\ Структура\ инициализации\ енкодера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00131}00131\ \textcolor{comment}{\ \ *\ @ingroup\ \ MYLIBS\_TIM\_ENCODER}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00132}00132\ \textcolor{comment}{\ \ *\ @details\ \ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00133}00133\ \textcolor{comment}{\ \ *\ Содержит\ все\ базовые\ структуры,\ которые\ нужны\ для\ инициализации\ таймера.}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00134}00134\ \textcolor{comment}{\ \ *\ Если\ структуры\ настроек\ не\ заданы,\ то\ они\ заполнятся\ сами\ дефолтными\ параметрами\ \ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00135}00135\ \textcolor{comment}{\ \ *\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00136}00136\ \textcolor{comment}{\ \ *\ Также\ высокоуровневые\ настройки\ частоты\ работы\ таймера.\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00137}00137\ \textcolor{comment}{\ \ *\ Если\ какая-\/либо\ высокоуровневая\ настройка\ не\ задана,\ то\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00138}00138\ \textcolor{comment}{\ \ *\ по\ возможности\ берется\ низкоуровневая\ настройка\ из\ структур}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00139}00139\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00140}\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{00140}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{struct\ }\textcolor{comment}{//\ struct\ with\ variables\ for\ encoder}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00141}00141\ \{} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00142}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a6f769f027b760a4b496e2b2b77bf54a3}{00142}}\ \ \ int16\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a6f769f027b760a4b496e2b2b77bf54a3}{Encoder\_Diff}};\ \ \ \textcolor{comment}{///<\ Считанная\ разница}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00143}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a0dacce3dde7df3122583869d96a372a2}{00143}}\ \ \ uint16\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a0dacce3dde7df3122583869d96a372a2}{Encoder\_Shdw}};\ \ \ \textcolor{comment}{///<\ Последние\ считанные\ тики}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00144}00144\ \ \ } -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00145}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_adc80bd5a90444c31d84157f35c59b95c}{00145}}\ \ \ TIM\_HandleTypeDef\ \ \ \ \ \ \ *\mbox{\hyperlink{struct_t_i_m___encoder_type_def_adc80bd5a90444c31d84157f35c59b95c}{htim}};\ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Указатель\ на\ HAL\ handle\ таймера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00146}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a021f0c585e9e62d68a4b09f630d8b6e5}{00146}}\ \ \ TIM\_Encoder\_InitTypeDef\ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a021f0c585e9e62d68a4b09f630d8b6e5}{sConfig}};\ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Указатель\ на\ структуру\ настройки\ энкодера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00147}00147\ \ \ } -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00148}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_ad29873fc8cdc71462e6d8744621120e9}{00148}}\ \ \ GPIO\_TypeDef\ \ \ \ \ \ \ \ \ \ \ \ *\mbox{\hyperlink{struct_t_i_m___encoder_type_def_ad29873fc8cdc71462e6d8744621120e9}{GPIOx}};\ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Порт,\ куда\ подключается\ энкодер}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00149}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a4fc05ef011205a6702cb3d006bab677e}{00149}}\ \ \ uint32\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a4fc05ef011205a6702cb3d006bab677e}{GPIO\_PIN\_TI1}};\ \ \ \textcolor{comment}{///<\ Пин,\ куда\ подключается\ канал\ TI1}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00150}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a67ad037b92162546763fc9c425b5e3c5}{00150}}\ \ \ uint32\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a67ad037b92162546763fc9c425b5e3c5}{GPIO\_PIN\_TI2}};\ \ \ \textcolor{comment}{///<\ Пин,\ куда\ подключается\ канал\ TI2}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00151}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a6973108a83d2a3ea4fc3e0e8a501af80}{00151}}\ \ \ uint32\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a6973108a83d2a3ea4fc3e0e8a501af80}{GPIO\_PIN\_SW}};\ \ \ \ \textcolor{comment}{///<\ Пин,\ куда\ кнопка\ энкодера\ (если\ есть)}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00152}00152\ } -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00153}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a99295760ff8b27d1e6f1710f29383a45}{00153}}\ \ \ \mbox{\hyperlink{struct_g_p_i_o___switch_type_def}{GPIO\_SwitchTypeDef}}\ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a99295760ff8b27d1e6f1710f29383a45}{Sw}};\ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Структура\ кнопки}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00154}00154\ \ \ } -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00155}00155\ \}\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\_EncoderTypeDef}};\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00156}00156\ \textcolor{comment}{///////////////////////-\/-\/-\/STRUCTURES\ \&\ ENUMS-\/-\/-\///////////////////////}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00157}00157\ \textcolor{comment}{}\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00158}00158\ \textcolor{comment}{/////////////////////////////////////////////////////////////////////}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00159}00159\ \textcolor{comment}{///////////////////////////-\/-\/-\/FUNCTIONS-\/-\/-\////////////////////////////}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00160}00160\ \textcolor{comment}{}\textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00161}00161\ \textcolor{comment}{\ \ *\ @addtogroup\ MYLIBS\_TIM\_OC\ PWM/OC\ Channels\ tools}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00162}00162\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MY\_LIBS\_TIM}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00163}00163\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Функции\ для\ инициализации\ базовых\ функций\ каналов\ таймера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00164}00164\ \textcolor{comment}{\ \ *\ @\{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00165}00165\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00166}00166\ \textcolor{comment}{/*\ Initialize\ PWM\ Channel\ and\ GPIO\ for\ output\ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00167}00167\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___o_c_gadb2f465d89f609e035867e980c3a29c6}{TIM\_Output\_PWM\_Init}}(TIM\_HandleTypeDef\ *htim,\ TIM\_OC\_InitTypeDef\ *sConfigOC,\ uint32\_t\ TIM\_CHANNEL,\ GPIO\_TypeDef\ *GPIOx,\ uint32\_t\ PWM\_PIN);} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00168}00168\ \textcolor{comment}{/*\ Initialize\ OC\ Comparator\ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00169}00169\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___o_c_gae2608ca8023e9a0713af0b4fbfbc1889}{TIM\_OC\_Comparator\_Init}}(TIM\_HandleTypeDef\ *htim,\ uint32\_t\ TIM\_CHANNEL);\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00170}00170\ \textcolor{comment}{/**\ MYLIBS\_TIM\_ENCODER}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00171}00171\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00172}00172\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00173}00173\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00174}00174\ \textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00175}00175\ \textcolor{comment}{\ \ *\ @addtogroup\ MYLIBS\_TIM\_ENCODER\ Encoder\ tools}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00176}00176\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MY\_LIBS\_TIM}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00177}00177\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Функции\ для\ считывания\ энкодера}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00178}00178\ \textcolor{comment}{\ \ *\ @\{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00179}00179\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00180}00180\ \textcolor{comment}{/*\ Initialize\ TIM\ Encoder\ functional\ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00181}00181\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc}{TIM\_Encoder\_Init}}(\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\_EncoderTypeDef}}\ *henc1,\ TIM\_HandleTypeDef\ *htim);} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00182}00182\ \textcolor{comment}{/*\ Считать\ энкодер\ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00183}00183\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_gac3bc6525f88c275e47eb864e6d567501}{TIM\_Encoder\_Read}}(\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\_EncoderTypeDef}}\ *henc);} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00184}00184\ \textcolor{comment}{/*\ Считать\ кнопку\ энкодера\ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00185}00185\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga117b795017e9e3a357ddefe323412761}{TIM\_Encoder\_ReadSwitch}}(\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\_EncoderTypeDef}}\ *henc);\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00186}00186\ \textcolor{comment}{/**\ MYLIBS\_TIM\_ENCODER}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00187}00187\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00188}00188\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00189}00189\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00190}00190\ \textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00191}00191\ \textcolor{comment}{\ \ *\ @addtogroup\ MYLIBS\_TIM\_DELAY\ \ Delay\ tools}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00192}00192\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MY\_LIBS\_TIM}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00193}00193\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Функции\ для\ формирования\ задержек\ с\ помощью\ таймеров}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00194}00194\ \textcolor{comment}{\ \ *\ @\{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00069}00069\ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00070}00070\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00071}00071\ \textcolor{comment}{/////////////////////////////////////////////////////////////////////}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00072}00072\ \textcolor{comment}{///////////////////////-\/-\/-\/STRUCTURES\ \&\ ENUMS-\/-\/-\///////////////////////}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00073}00073\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00074}00074\ \textcolor{comment}{\ \ *\ @brief\ Режим\ прерываний\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00075}00075\ \textcolor{comment}{\ \ *\ @ingroup\ \ MYLIBS\_TIM\_GENERAL}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00076}00076\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00077}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{00077}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{enum}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00078}00078\ \{} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00079}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaeb611874216a4661fb83366b99b9e787ab0869828a4dfd62eaa44868ca27835f8}{00079}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaeb611874216a4661fb83366b99b9e787ab0869828a4dfd62eaa44868ca27835f8}{TIM\_DEFAULT}}\ =\ \ \ \ \ \ \ \ \ 0,\ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Прерываний\ отключены}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00080}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaeb611874216a4661fb83366b99b9e787a89ecf1ef6d45ead2efcb7dd30396114c}{00080}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaeb611874216a4661fb83366b99b9e787a89ecf1ef6d45ead2efcb7dd30396114c}{TIM\_IT\_MODE}}\ =\ \ \ \ \ \ \ \ \ TIM\_IT\_CONF,\ \ \textcolor{comment}{///<\ Прерываний\ включены}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00081}00081\ \textcolor{comment}{//\ \ TIM\_PWM\_MODE\ =\ \ \ \ \ \ \ \ TIM\_PWM\_ENABLE,}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00082}00082\ \textcolor{comment}{//\ \ TIM\_PWM\_IT\_MODE\ =\ \ \ \ \ TIM\_PWM\_ENABLE\ |\ TIM\_IT\_CONF,}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00083}00083\ \}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\_ITModeTypeDef}};} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00084}00084\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00085}00085\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00086}00086\ \textcolor{comment}{\ \ *\ @brief\ Длительность\ тика\ таймера\ (частота\ тактирования\ таймера)}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00087}00087\ \textcolor{comment}{\ \ *\ @ingroup\ \ MYLIBS\_TIM\_GENERAL}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00088}00088\ \textcolor{comment}{\ \ *\ @details\ \ enum\ дает\ базовые\ длительности,\ но\ можно\ выставить\ другие}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00089}00089\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ (напр\ 500\ -\/\ 0.5\ мс)}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00090}00090\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00091}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800}{00091}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{enum}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00092}00092\ \{} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00093}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800ae838122c0e83bc57ad31b546bf2f00e5}{00093}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800ae838122c0e83bc57ad31b546bf2f00e5}{TIM\_Base\_Disable}}\ =\ \ \ \ \ \ 0,\ \ \ \ \ \ \textcolor{comment}{///<\ Таймер\ отключен}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00094}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a63df3123d0ddc592b189ed1594456ea2}{00094}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a63df3123d0ddc592b189ed1594456ea2}{TIM\_TickBase\_1US}}\ =\ \ \ \ \ \ 1,\ \ \ \ \ \ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 1\ \ \ \ МГц}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00095}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a060b01e890891fd17c8f95b55a94139f}{00095}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a060b01e890891fd17c8f95b55a94139f}{TIM\_TickBase\_10US}}\ =\ \ \ \ \ 10,\ \ \ \ \ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 100\ \ кГц}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00096}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a096ef0ab67788487f69d8877c6d89b30}{00096}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a096ef0ab67788487f69d8877c6d89b30}{TIM\_TickBase\_100US}}\ =\ \ \ \ 100,\ \ \ \ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 10\ \ \ кГц}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00097}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a6a66c5ed1d966c9e30f0219b664d2b25}{00097}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a6a66c5ed1d966c9e30f0219b664d2b25}{TIM\_TickBase\_1MS}}\ =\ \ \ \ \ \ 1000,\ \ \ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 1\ \ \ \ кГц}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00098}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a7421a08abd119e71aa99eea5ab5d6daa}{00098}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a7421a08abd119e71aa99eea5ab5d6daa}{TIM\_TickBase\_10MS}}\ =\ \ \ \ \ 10000,\ \ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 100\ \ Гц}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00099}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a18527a2d781eb4365aecd9a3184fc1da}{00099}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a18527a2d781eb4365aecd9a3184fc1da}{TIM\_TickBase\_100MS}}\ =\ \ \ \ 100000,\ \textcolor{comment}{///<\ Таймер\ тактируется\ с\ частотой\ 10\ \ \ Гц}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00100}00100\ \}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800}{TIM\_MHzTickBaseTypeDef}};} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00101}00101\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00102}00102\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00103}00103\ \textcolor{comment}{\ \ *\ @brief\ Структура\ инициализации\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00104}00104\ \textcolor{comment}{\ \ *\ @ingroup\ \ MYLIBS\_TIM\_GENERAL}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00105}00105\ \textcolor{comment}{\ \ *\ @details\ \ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00106}00106\ \textcolor{comment}{\ \ *\ Содержит\ все\ базовые\ структуры,\ которые\ нужны\ для\ инициализации\ таймера.}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00107}00107\ \textcolor{comment}{\ \ *\ Если\ структуры\ настроек\ не\ заданы,\ то\ они\ заполнятся\ сами\ дефолтными\ параметрами\ \ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00108}00108\ \textcolor{comment}{\ \ *\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00109}00109\ \textcolor{comment}{\ \ *\ Также\ высокоуровневые\ настройки\ частоты\ работы\ таймера.\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00110}00110\ \textcolor{comment}{\ \ *\ Если\ какая-\/либо\ высокоуровневая\ настройка\ не\ задана,\ то\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00111}00111\ \textcolor{comment}{\ \ *\ по\ возможности\ берется\ низкоуровневая\ настройка\ из\ структур}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00112}00112\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00113}\mbox{\hyperlink{struct_t_i_m___settings_type_def}{00113}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{struct\ }\textcolor{comment}{//\ struct\ with\ settings\ for\ custom\ function}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00114}00114\ \{} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00115}\mbox{\hyperlink{struct_t_i_m___settings_type_def_ada49efdbd35a8e442c3cff630d42f34c}{00115}}\ \ \ TIM\_HandleTypeDef\ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_ada49efdbd35a8e442c3cff630d42f34c}{htim}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ HAL\ handle\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00116}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a3805f627567798c3cd1d79a0da42bea0}{00116}}\ \ \ TIM\_ClockConfigTypeDef\ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a3805f627567798c3cd1d79a0da42bea0}{sClockSourceConfig}};\ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Настройки\ тактирования\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00117}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a9694cf0910a69d48ff94f8aeac106969}{00117}}\ \ \ TIM\_SlaveConfigTypeDef\ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a9694cf0910a69d48ff94f8aeac106969}{sSlaveConfig}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Настройки\ слейв\ режима\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00118}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a2d9d277dd395424b964445ec1bc65b21}{00118}}\ \ \ TIM\_MasterConfigTypeDef\ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a2d9d277dd395424b964445ec1bc65b21}{sMasterConfig}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Настройки\ мастер\ режима\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00119}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a961f19f0e1672715c27bc94d7871dbb7}{00119}}\ \ \ TIM\_BreakDeadTimeConfigTypeDef\ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a961f19f0e1672715c27bc94d7871dbb7}{sBreakDeadTimeConfig}};\ \ \textcolor{comment}{///<\ Настройки\ дедтаймов\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00120}00120\ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00121}\mbox{\hyperlink{struct_t_i_m___settings_type_def_ab90e370c3edda88e76583293c250d2b0}{00121}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\_ITModeTypeDef}}\ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_ab90e370c3edda88e76583293c250d2b0}{sTimMode}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Настройки\ прерывания\ таймера\ \ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00122}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a58da1b4c0f6d12d7d9fb2f170b9b9e6e}{00122}}\ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800}{TIM\_MHzTickBaseTypeDef}}\ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a58da1b4c0f6d12d7d9fb2f170b9b9e6e}{sTickBaseUS}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Длительность\ одного\ тика\ \ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00123}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a11151fe125960cb8e61328ffd06b7718}{00123}}\ \ \ uint8\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a11151fe125960cb8e61328ffd06b7718}{sTickBasePrescaler}};\ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Дополнительный\ делитель,\ для\ удобного\ деления\ @ref\ sTickBaseUS}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00124}\mbox{\hyperlink{struct_t_i_m___settings_type_def_a7073358fd3a722687eb85238ab570014}{00124}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_a7073358fd3a722687eb85238ab570014}{sTimAHBFreqMHz}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Частота\ шины\ тактирования\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00125}\mbox{\hyperlink{struct_t_i_m___settings_type_def_af6057ff3f60f5e01b41d4a347b79a5e4}{00125}}\ \ \ \textcolor{keywordtype}{float}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___settings_type_def_af6057ff3f60f5e01b41d4a347b79a5e4}{sTimFreqHz}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Желаемая\ частота\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00126}00126\ \ \ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00127}00127\ \}\mbox{\hyperlink{struct_t_i_m___settings_type_def}{TIM\_SettingsTypeDef}};} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00128}00128\ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00129}00129\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00130}00130\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00131}00131\ \textcolor{comment}{\ \ *\ @brief\ Структура\ инициализации\ енкодера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00132}00132\ \textcolor{comment}{\ \ *\ @ingroup\ \ MYLIBS\_TIM\_ENCODER}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00133}00133\ \textcolor{comment}{\ \ *\ @details\ \ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00134}00134\ \textcolor{comment}{\ \ *\ Содержит\ все\ базовые\ структуры,\ которые\ нужны\ для\ инициализации\ таймера.}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00135}00135\ \textcolor{comment}{\ \ *\ Если\ структуры\ настроек\ не\ заданы,\ то\ они\ заполнятся\ сами\ дефолтными\ параметрами\ \ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00136}00136\ \textcolor{comment}{\ \ *\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00137}00137\ \textcolor{comment}{\ \ *\ Также\ высокоуровневые\ настройки\ частоты\ работы\ таймера.\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00138}00138\ \textcolor{comment}{\ \ *\ Если\ какая-\/либо\ высокоуровневая\ настройка\ не\ задана,\ то\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00139}00139\ \textcolor{comment}{\ \ *\ по\ возможности\ берется\ низкоуровневая\ настройка\ из\ структур}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00140}00140\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00141}\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{00141}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{struct\ }\textcolor{comment}{//\ struct\ with\ variables\ for\ encoder}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00142}00142\ \{} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00143}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a6f769f027b760a4b496e2b2b77bf54a3}{00143}}\ \ \ int16\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a6f769f027b760a4b496e2b2b77bf54a3}{Encoder\_Diff}};\ \ \ \textcolor{comment}{///<\ Считанная\ разница}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00144}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a0dacce3dde7df3122583869d96a372a2}{00144}}\ \ \ uint16\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a0dacce3dde7df3122583869d96a372a2}{Encoder\_Shdw}};\ \ \ \textcolor{comment}{///<\ Последние\ считанные\ тики}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00145}00145\ \ \ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00146}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_adc80bd5a90444c31d84157f35c59b95c}{00146}}\ \ \ TIM\_HandleTypeDef\ \ \ \ \ \ \ *\mbox{\hyperlink{struct_t_i_m___encoder_type_def_adc80bd5a90444c31d84157f35c59b95c}{htim}};\ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Указатель\ на\ HAL\ handle\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00147}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a021f0c585e9e62d68a4b09f630d8b6e5}{00147}}\ \ \ TIM\_Encoder\_InitTypeDef\ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a021f0c585e9e62d68a4b09f630d8b6e5}{sConfig}};\ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Указатель\ на\ структуру\ настройки\ энкодера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00148}00148\ \ \ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00149}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_ad29873fc8cdc71462e6d8744621120e9}{00149}}\ \ \ GPIO\_TypeDef\ \ \ \ \ \ \ \ \ \ \ \ *\mbox{\hyperlink{struct_t_i_m___encoder_type_def_ad29873fc8cdc71462e6d8744621120e9}{GPIOx}};\ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Порт,\ куда\ подключается\ энкодер}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00150}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a4fc05ef011205a6702cb3d006bab677e}{00150}}\ \ \ uint32\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a4fc05ef011205a6702cb3d006bab677e}{GPIO\_PIN\_TI1}};\ \ \ \textcolor{comment}{///<\ Пин,\ куда\ подключается\ канал\ TI1}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00151}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a67ad037b92162546763fc9c425b5e3c5}{00151}}\ \ \ uint32\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a67ad037b92162546763fc9c425b5e3c5}{GPIO\_PIN\_TI2}};\ \ \ \textcolor{comment}{///<\ Пин,\ куда\ подключается\ канал\ TI2}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00152}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a6973108a83d2a3ea4fc3e0e8a501af80}{00152}}\ \ \ uint32\_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a6973108a83d2a3ea4fc3e0e8a501af80}{GPIO\_PIN\_SW}};\ \ \ \ \textcolor{comment}{///<\ Пин,\ куда\ кнопка\ энкодера\ (если\ есть)}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00153}00153\ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00154}\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a99295760ff8b27d1e6f1710f29383a45}{00154}}\ \ \ \mbox{\hyperlink{struct_g_p_i_o___switch_type_def}{GPIO\_SwitchTypeDef}}\ \ \ \ \ \ \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a99295760ff8b27d1e6f1710f29383a45}{Sw}};\ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Структура\ кнопки}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00155}00155\ \ \ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00156}00156\ \}\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\_EncoderTypeDef}};\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00157}00157\ \textcolor{comment}{///////////////////////-\/-\/-\/STRUCTURES\ \&\ ENUMS-\/-\/-\///////////////////////}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00158}00158\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00159}00159\ \textcolor{comment}{/////////////////////////////////////////////////////////////////////}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00160}00160\ \textcolor{comment}{///////////////////////////-\/-\/-\/FUNCTIONS-\/-\/-\////////////////////////////}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00161}00161\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00162}00162\ \textcolor{comment}{\ \ *\ @addtogroup\ MYLIBS\_TIM\_GENERAL\ \ General\ tools}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00163}00163\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MY\_LIBS\_TIM}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00164}00164\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Функции\ для\ базовой\ инициализации\ таймеров}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00165}00165\ \textcolor{comment}{\ \ *\ @par\ Пример\ использования:}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00166}00166\ \textcolor{comment}{\ \ \ \ @code}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00167}00167\ \textcolor{comment}{\ \ \ \ TIM\_SettingsTypeDef\ tim2Settings;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00168}00168\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00169}00169\ \textcolor{comment}{\ \ \ \ void\ TIM2\_Init(void)}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00170}00170\ \textcolor{comment}{\ \ \ \ \{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00171}00171\ \textcolor{comment}{\ \ \ \ \ \ \ \ //\ Настройка\ таймера\ TIM2\ на\ 1\ кГц\ с\ прерываниями\ с\ шагом\ таймера\ 10\ мкс}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00172}00172\ \textcolor{comment}{\ \ \ \ \ \ \ \ tim2Settings.htim.Instance\ =\ TIM2;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00173}00173\ \textcolor{comment}{\ \ \ \ \ \ \ \ tim2Settings.sTimMode\ =\ TIM\_IT\_MODE;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00174}00174\ \textcolor{comment}{\ \ \ \ \ \ \ \ tim2Settings.sTickBaseUS\ =\ TIM\_TickBase\_10US;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00175}00175\ \textcolor{comment}{\ \ \ \ \ \ \ \ tim2Settings.sTickBasePrescaler\ =\ 1;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00176}00176\ \textcolor{comment}{\ \ \ \ \ \ \ \ tim2Settings.sTimFreqHz\ =\ 1000;\ //\ 1\ кГц}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00177}00177\ \textcolor{comment}{\ \ \ \ \ \ \ \ tim2Settings.sTimAHBFreqMHz\ =\ 72000000;\ //\ Hz}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00178}00178\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00179}00179\ \textcolor{comment}{\ \ \ \ \ \ \ \ if(TIM\_Base\_Init(\&tim2Settings)\ !=\ HAL\_OK)}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00180}00180\ \textcolor{comment}{\ \ \ \ \ \ \ \ \{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00181}00181\ \textcolor{comment}{\ \ \ \ \ \ \ \ \ \ \ \ Error\_Handler();}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00182}00182\ \textcolor{comment}{\ \ \ \ \ \ \ \ \}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00183}00183\ \textcolor{comment}{\ \ \ \ \}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00184}00184\ \textcolor{comment}{\ \ \ \ @endcode}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00185}00185\ \textcolor{comment}{\ \ *\ @\{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00186}00186\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00187}00187\ \textcolor{comment}{/*\ Initialize\ TIM\ with\ TIM\_SettingsTypeDef\ structure\ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00188}00188\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga7044214f24a9868ba7e1650b55e639ec}{TIM\_Base\_Init}}(\mbox{\hyperlink{struct_t_i_m___settings_type_def}{TIM\_SettingsTypeDef}}*\ stim);} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00189}00189\ \textcolor{comment}{/*\ Initialize\ TIMs\ clock\ and\ interrupt\ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00190}00190\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaad47337be7ba2f6c0777c40d7278c931}{TIM\_Base\_MspInit}}(TIM\_HandleTypeDef*\ htim,\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\_ITModeTypeDef}}\ it\_mode);} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00191}00191\ \textcolor{comment}{/*\ DeInitialize\ TIMs\ clock\ and\ interrupt\ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00192}00192\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga879e3f1c919c02990736730275367115}{TIM\_Base\_MspDeInit}}(TIM\_HandleTypeDef*\ htim);\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00193}00193\ \textcolor{comment}{/**\ MYLIBS\_TIM\_GENERAL}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00194}00194\ \textcolor{comment}{\ \ *\ @\}}} \DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00195}00195\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00196}00196\ \textcolor{comment}{/*\ Start\ delay\ via\ TIM\ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00197}00197\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga4c0dfde4e15f677600605348b4e97834}{TIM\_Delay\_Start}}(TIM\_HandleTypeDef\ *htim);} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00198}00198\ \textcolor{comment}{/*\ Delay\ via\ TIM\ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00199}00199\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga88c552a133cb6e3015453cccab74c07e}{TIM\_Delay}}(TIM\_HandleTypeDef\ *htim,\ uint16\_t\ delay);} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00200}00200\ \textcolor{comment}{/*\ Wait\ Delay\ via\ TIM\ without\ blocking\ app\ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00201}00201\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga108637af414bff3373059273b815ce9b}{TIM\_Delay\_NonBlocking}}(TIM\_HandleTypeDef\ *htim,\ uint16\_t\ delay);\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00202}00202\ \textcolor{comment}{/**\ MYLIBS\_TIM\_DELAY}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00203}00203\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00204}00204\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00205}00205\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00206}00206\ \textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00207}00207\ \textcolor{comment}{\ \ *\ @addtogroup\ MYLIBS\_TIM\_GENERAL\ \ General\ tools}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00208}00208\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MY\_LIBS\_TIM}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00209}00209\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Функции\ для\ базовой\ инициализации\ таймеров}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00210}00210\ \textcolor{comment}{\ \ *\ @\{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00211}00211\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00212}00212\ \textcolor{comment}{/*\ Initialize\ TIM\ with\ TIM\_SettingsTypeDef\ structure\ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00213}00213\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga7044214f24a9868ba7e1650b55e639ec}{TIM\_Base\_Init}}(\mbox{\hyperlink{struct_t_i_m___settings_type_def}{TIM\_SettingsTypeDef}}*\ stim);} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00214}00214\ \textcolor{comment}{/*\ Initialize\ TIMs\ clock\ and\ interrupt\ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00215}00215\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaad47337be7ba2f6c0777c40d7278c931}{TIM\_Base\_MspInit}}(TIM\_HandleTypeDef*\ htim,\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\_ITModeTypeDef}}\ it\_mode);} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00216}00216\ \textcolor{comment}{/*\ DeInitialize\ TIMs\ clock\ and\ interrupt\ */}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00217}00217\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga879e3f1c919c02990736730275367115}{TIM\_Base\_MspDeInit}}(TIM\_HandleTypeDef*\ htim);\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00218}00218\ \textcolor{comment}{/**\ MYLIBS\_TIM\_GENERAL}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00219}00219\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00220}00220\ \textcolor{comment}{\ \ */}\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00221}00221\ \textcolor{comment}{///////////////////////////-\/-\/-\/FUNCTIONS-\/-\/-\////////////////////////////}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00222}00222\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00223}00223\ } -\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00224}00224\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ \_\_TIM\_GENERAL\_H\_}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00196}00196\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00197}00197\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00198}00198\ \textcolor{comment}{\ \ *\ @addtogroup\ MYLIBS\_TIM\_DELAY\ \ Delay\ tools}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00199}00199\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MY\_LIBS\_TIM}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00200}00200\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Функции\ для\ формирования\ задержек\ с\ помощью\ таймеров}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00201}00201\ \textcolor{comment}{\ \ *\ @par\ Пример\ использования:}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00202}00202\ \textcolor{comment}{\ \ \ \ @code}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00203}00203\ \textcolor{comment}{\ \ \ \ TIM\_HandleTypeDef\ htim2;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00204}00204\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00205}00205\ \textcolor{comment}{\ \ \ \ //\ блокирующая\ задержка\ 500\ тиков\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00206}00206\ \textcolor{comment}{\ \ \ \ LED\_ON();}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00207}00207\ \textcolor{comment}{\ \ \ \ TIM\_Delay(\&htim2,\ 500);}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00208}00208\ \textcolor{comment}{\ \ \ \ LED\_OFF();}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00209}00209\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00210}00210\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00211}00211\ \textcolor{comment}{\ \ \ \ while(1)}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00212}00212\ \textcolor{comment}{\ \ \ \ \{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00213}00213\ \textcolor{comment}{\ \ \ \ \ \ //\ не\ блокирующая\ задержка\ 200\ тиков\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00214}00214\ \textcolor{comment}{\ \ \ \ \ \ if(TIM\_Delay\_NonBlocking(\&htim2,\ 200)\ ==\ HAL\_OK)}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00215}00215\ \textcolor{comment}{\ \ \ \ \ \ \{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00216}00216\ \textcolor{comment}{\ \ \ \ \ \ \ \ TIM\_Delay\_Start(\&htim2);}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00217}00217\ \textcolor{comment}{\ \ \ \ \ \ \ \ LED\_TOOGLE();}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00218}00218\ \textcolor{comment}{\ \ \ \ \ \ \}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00219}00219\ \textcolor{comment}{\ \ \ \ \}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00220}00220\ \textcolor{comment}{\ \ \ \ @endcode}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00221}00221\ \textcolor{comment}{\ \ *\ @\{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00222}00222\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00223}00223\ \textcolor{comment}{/*\ Start\ delay\ via\ TIM\ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00224}00224\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga4c0dfde4e15f677600605348b4e97834}{TIM\_Delay\_Start}}(TIM\_HandleTypeDef\ *htim);} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00225}00225\ \textcolor{comment}{/*\ Delay\ via\ TIM\ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00226}00226\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga88c552a133cb6e3015453cccab74c07e}{TIM\_Delay}}(TIM\_HandleTypeDef\ *htim,\ uint16\_t\ delay);} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00227}00227\ \textcolor{comment}{/*\ Wait\ Delay\ via\ TIM\ without\ blocking\ app\ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00228}00228\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga108637af414bff3373059273b815ce9b}{TIM\_Delay\_NonBlocking}}(TIM\_HandleTypeDef\ *htim,\ uint16\_t\ delay);\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00229}00229\ \textcolor{comment}{/**\ MYLIBS\_TIM\_DELAY}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00230}00230\ \textcolor{comment}{\ \ *\ @\}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00231}00231\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00232}00232\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00233}00233\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00234}00234\ \textcolor{comment}{\ \ *\ @addtogroup\ MYLIBS\_TIM\_OC\ PWM/OC\ Channels\ tools}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00235}00235\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MY\_LIBS\_TIM}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00236}00236\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Функции\ для\ инициализации\ базовых\ функций\ каналов\ таймера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00237}00237\ \textcolor{comment}{\ \ *\ @par\ Пример\ использования:}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00238}00238\ \textcolor{comment}{\ \ \ \ @code}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00239}00239\ \textcolor{comment}{\ \ \ \ void\ PWM\_Channel\_Init\_Example(void)}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00240}00240\ \textcolor{comment}{\ \ \ \ \{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00241}00241\ \textcolor{comment}{\ \ \ \ \ \ \ \ TIM\_HandleTypeDef\ htim3;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00242}00242\ \textcolor{comment}{\ \ \ \ \ \ \ \ TIM\_OC\_InitTypeDef\ sConfigOC;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00243}00243\ \textcolor{comment}{\ \ \ \ \ \ \ \ GPIO\_TypeDef\ *GPIOx\ =\ GPIOB;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00244}00244\ \textcolor{comment}{\ \ \ \ \ \ \ \ uint32\_t\ PWM\_PIN\ =\ GPIO\_PIN\_0;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00245}00245\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00246}00246\ \textcolor{comment}{\ \ \ \ \ \ \ \ //\ Настройка\ таймера\ и\ канала\ PWM}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00247}00247\ \textcolor{comment}{\ \ \ \ \ \ \ \ TIM\_Output\_PWM\_Init(\&htim3,\ \&sConfigOC,\ TIM\_CHANNEL\_1,\ GPIOx,\ PWM\_PIN);}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00248}00248\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00249}00249\ \textcolor{comment}{\ \ \ \ \ \ \ \ //\ Настройка\ компаратора\ OC}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00250}00250\ \textcolor{comment}{\ \ \ \ \ \ \ \ TIM\_OC\_Comparator\_Init(\&htim3,\ TIM\_CHANNEL\_1);}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00251}00251\ \textcolor{comment}{\ \ \ \ \}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00252}00252\ \textcolor{comment}{\ \ \ \ @endcode}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00253}00253\ \textcolor{comment}{\ \ *\ @\{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00254}00254\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00255}00255\ \textcolor{comment}{/*\ Initialize\ PWM\ Channel\ and\ GPIO\ for\ output\ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00256}00256\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___o_c_gadb2f465d89f609e035867e980c3a29c6}{TIM\_Output\_PWM\_Init}}(TIM\_HandleTypeDef\ *htim,\ TIM\_OC\_InitTypeDef\ *sConfigOC,\ uint32\_t\ TIM\_CHANNEL,\ GPIO\_TypeDef\ *GPIOx,\ uint32\_t\ PWM\_PIN);} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00257}00257\ \textcolor{comment}{/*\ Initialize\ OC\ Comparator\ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00258}00258\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___o_c_gae2608ca8023e9a0713af0b4fbfbc1889}{TIM\_OC\_Comparator\_Init}}(TIM\_HandleTypeDef\ *htim,\ uint32\_t\ TIM\_CHANNEL);\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00259}00259\ \textcolor{comment}{/**\ MYLIBS\_TIM\_ENCODER}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00260}00260\ \textcolor{comment}{\ \ *\ @\}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00261}00261\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00262}00262\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00263}00263\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00264}00264\ \textcolor{comment}{\ \ *\ @addtogroup\ MYLIBS\_TIM\_ENCODER\ Encoder\ tools}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00265}00265\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MY\_LIBS\_TIM}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00266}00266\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Функции\ для\ считывания\ энкодера}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00267}00267\ \textcolor{comment}{\ \ *\ @par\ Пример\ использования:}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00268}00268\ \textcolor{comment}{\ \ \ \ @code}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00269}00269\ \textcolor{comment}{\ \ \ \ TIM\_EncoderTypeDef\ henc1;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00270}00270\ \textcolor{comment}{\ \ \ \ TIM\_HandleTypeDef\ htim4;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00271}00271\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00272}00272\ \textcolor{comment}{\ \ \ \ //\ инициализация}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00273}00273\ \textcolor{comment}{\ \ \ \ henc1.htim\ =\ \&htim4;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00274}00274\ \textcolor{comment}{\ \ \ \ henc1.GPIOx\ =\ GPIOA;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00275}00275\ \textcolor{comment}{\ \ \ \ henc1.GPIO\_PIN\_TI1\ =\ GPIO\_PIN\_0;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00276}00276\ \textcolor{comment}{\ \ \ \ henc1.GPIO\_PIN\_TI2\ =\ GPIO\_PIN\_1;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00277}00277\ \textcolor{comment}{\ \ \ \ TIM\_Encoder\_Init(\&henc1,\ \&htim4);}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00278}00278\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00279}00279\ \textcolor{comment}{\ \ \ \ //\ считывание\ энкодера\ и\ кнопки}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00280}00280\ \textcolor{comment}{\ \ \ \ int16\_t\ delta\ =\ TIM\_Encoder\_Read(\&henc1);}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00281}00281\ \textcolor{comment}{\ \ \ \ setpoint\_tmp\ +=\ delta;}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00282}00282\ \textcolor{comment}{\ \ \ \ if(TIM\_Encoder\_ReadSwitch(\&henc1))}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00283}00283\ \textcolor{comment}{\ \ \ \ \{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00284}00284\ \textcolor{comment}{\ \ \ \ \ \ setpoint\ =\ setpoint\_tmp;\ //\ подтвердить\ новое\ значение}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00285}00285\ \textcolor{comment}{\ \ \ \ \}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00286}00286\ \textcolor{comment}{\ \ \ \ @endcode}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00287}00287\ \textcolor{comment}{\ \ *\ @\{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00288}00288\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00289}00289\ \textcolor{comment}{/*\ Initialize\ TIM\ Encoder\ functional\ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00290}00290\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc}{TIM\_Encoder\_Init}}(\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\_EncoderTypeDef}}\ *henc1,\ TIM\_HandleTypeDef\ *htim);} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00291}00291\ \textcolor{comment}{/*\ Считать\ энкодер\ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00292}00292\ HAL\_StatusTypeDef\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_gac3bc6525f88c275e47eb864e6d567501}{TIM\_Encoder\_Read}}(\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\_EncoderTypeDef}}\ *henc);} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00293}00293\ \textcolor{comment}{/*\ Считать\ кнопку\ энкодера\ */}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00294}00294\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga117b795017e9e3a357ddefe323412761}{TIM\_Encoder\_ReadSwitch}}(\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\_EncoderTypeDef}}\ *henc);\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00295}00295\ \textcolor{comment}{/**\ MYLIBS\_TIM\_ENCODER}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00296}00296\ \textcolor{comment}{\ \ *\ @\}}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00297}00297\ \textcolor{comment}{\ \ */}\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00298}00298\ \textcolor{comment}{///////////////////////////-\/-\/-\/FUNCTIONS-\/-\/-\////////////////////////////}} +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00299}00299\ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00300}00300\ } +\DoxyCodeLine{\Hypertarget{general__tim_8h_source_l00301}00301\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ \_\_TIM\_GENERAL\_H\_}} \end{DoxyCode} diff --git a/Doc/latex/group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.tex b/Doc/latex/group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.tex index d4a1132..4038bb6 100644 --- a/Doc/latex/group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.tex +++ b/Doc/latex/group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s.tex @@ -1,4 +1,4 @@ -\doxysubsubsection{Bit access defines} +\doxysubsubsection{Bit access defines } \hypertarget{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s}{}\label{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s}\index{Bit access defines@{Bit access defines}} @@ -26,13 +26,13 @@ union \mbox{\hyperlink{unionuint64___bit_type_def}{uint64\+\_\+\+Bit\+Type\+Def} \doxysubsubsubsubsection*{Macros} \begin{DoxyCompactItemize} \item -\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga57dc3bb3472a66fc92312f89d42d2396}{uint8\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+)~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint8___bit_type_def}{uint8\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+ +\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga57dc3bb3472a66fc92312f89d42d2396}{uint8\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+) \begin{DoxyCompactList}\small\item\em Получить n-\/й бит из uint8\+\_\+t. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga6a122b536ad99ae611c8cf01437af086}{uint16\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+)~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint16___bit_type_def}{uint16\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+ +\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga6a122b536ad99ae611c8cf01437af086}{uint16\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+) \begin{DoxyCompactList}\small\item\em Получить n-\/й бит из uint16\+\_\+t. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_gafaa2080168b1b6f7281e8bfabab022d1}{uint32\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+)~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint32___bit_type_def}{uint32\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+ +\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_gafaa2080168b1b6f7281e8bfabab022d1}{uint32\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+) \begin{DoxyCompactList}\small\item\em Получить n-\/й бит из uint32\+\_\+t. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga47eb69ce9330a1c73fe8031240f02f0a}{uint64\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+)~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint64___bit_type_def}{uint64\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+ +\#define \mbox{\hyperlink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga47eb69ce9330a1c73fe8031240f02f0a}{uint64\+\_\+bit}}(\+\_\+uint8\+\_\+, \+\_\+bit\+\_\+) \begin{DoxyCompactList}\small\item\em Получить n-\/й бит из uint64\+\_\+t. \end{DoxyCompactList}\end{DoxyCompactItemize} @@ -68,13 +68,20 @@ union \mbox{\hyperlink{unionuint64___bit_type_def}{uint64\+\_\+\+Bit\+Type\+Def} \item Доступ реализован через приведение к {\ttfamily union} с битовыми полями, поэтому это безопасный способ работы с отдельными битами без ручного сдвига и маскирования. \end{DoxyItemize} +\label{doc-define-members} +\Hypertarget{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_doc-define-members} \doxysubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga57dc3bb3472a66fc92312f89d42d2396}\label{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga57dc3bb3472a66fc92312f89d42d2396} -\index{Bit access defines@{Bit access defines}!uint8\_bit@{uint8\_bit}} +\Hypertarget{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga57dc3bb3472a66fc92312f89d42d2396}\index{Bit access defines@{Bit access defines}!uint8\_bit@{uint8\_bit}} \index{uint8\_bit@{uint8\_bit}!Bit access defines@{Bit access defines}} \doxysubsubsubsubsection{\texorpdfstring{uint8\_bit}{uint8\_bit}} -{\footnotesize\ttfamily \#define uint8\+\_\+bit(\begin{DoxyParamCaption}\item[{}]{\+\_\+uint8\+\_\+, }\item[{}]{\+\_\+bit\+\_\+ }\end{DoxyParamCaption})~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint8___bit_type_def}{uint8\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+} +{\footnotesize\ttfamily \label{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga57dc3bb3472a66fc92312f89d42d2396} +\#define uint8\+\_\+bit(\begin{DoxyParamCaption}\item[{}]{\+\_\+uint8\+\_\+}{, }\item[{}]{\+\_\+bit\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(*(\mbox{\hyperlink{unionuint8___bit_type_def}{uint8\_BitTypeDef}}\ *)(\&(\_uint8\_))).bit.bit\#\#\_bit\_} + +\end{DoxyCode} Получить n-\/й бит из uint8\+\_\+t. @@ -96,12 +103,17 @@ union \mbox{\hyperlink{unionuint64___bit_type_def}{uint64\+\_\+\+Bit\+Type\+Def} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00129}{129}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga6a122b536ad99ae611c8cf01437af086}\label{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga6a122b536ad99ae611c8cf01437af086} -\index{Bit access defines@{Bit access defines}!uint16\_bit@{uint16\_bit}} +\Hypertarget{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga6a122b536ad99ae611c8cf01437af086}\index{Bit access defines@{Bit access defines}!uint16\_bit@{uint16\_bit}} \index{uint16\_bit@{uint16\_bit}!Bit access defines@{Bit access defines}} \doxysubsubsubsubsection{\texorpdfstring{uint16\_bit}{uint16\_bit}} -{\footnotesize\ttfamily \#define uint16\+\_\+bit(\begin{DoxyParamCaption}\item[{}]{\+\_\+uint8\+\_\+, }\item[{}]{\+\_\+bit\+\_\+ }\end{DoxyParamCaption})~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint16___bit_type_def}{uint16\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+} +{\footnotesize\ttfamily \label{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga6a122b536ad99ae611c8cf01437af086} +\#define uint16\+\_\+bit(\begin{DoxyParamCaption}\item[{}]{\+\_\+uint8\+\_\+}{, }\item[{}]{\+\_\+bit\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(*(\mbox{\hyperlink{unionuint16___bit_type_def}{uint16\_BitTypeDef}}\ *)(\&(\_uint8\_))).bit.bit\#\#\_bit\_} + +\end{DoxyCode} Получить n-\/й бит из uint16\+\_\+t. @@ -123,12 +135,17 @@ Definition at line \mbox{\hyperlink{bit__access_8h_source_l00129}{129}} of file Definition at line \mbox{\hyperlink{bit__access_8h_source_l00137}{137}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_gafaa2080168b1b6f7281e8bfabab022d1}\label{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_gafaa2080168b1b6f7281e8bfabab022d1} -\index{Bit access defines@{Bit access defines}!uint32\_bit@{uint32\_bit}} +\Hypertarget{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_gafaa2080168b1b6f7281e8bfabab022d1}\index{Bit access defines@{Bit access defines}!uint32\_bit@{uint32\_bit}} \index{uint32\_bit@{uint32\_bit}!Bit access defines@{Bit access defines}} \doxysubsubsubsubsection{\texorpdfstring{uint32\_bit}{uint32\_bit}} -{\footnotesize\ttfamily \#define uint32\+\_\+bit(\begin{DoxyParamCaption}\item[{}]{\+\_\+uint8\+\_\+, }\item[{}]{\+\_\+bit\+\_\+ }\end{DoxyParamCaption})~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint32___bit_type_def}{uint32\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+} +{\footnotesize\ttfamily \label{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_gafaa2080168b1b6f7281e8bfabab022d1} +\#define uint32\+\_\+bit(\begin{DoxyParamCaption}\item[{}]{\+\_\+uint8\+\_\+}{, }\item[{}]{\+\_\+bit\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(*(\mbox{\hyperlink{unionuint32___bit_type_def}{uint32\_BitTypeDef}}\ *)(\&(\_uint8\_))).bit.bit\#\#\_bit\_} + +\end{DoxyCode} Получить n-\/й бит из uint32\+\_\+t. @@ -150,12 +167,17 @@ Definition at line \mbox{\hyperlink{bit__access_8h_source_l00137}{137}} of file Definition at line \mbox{\hyperlink{bit__access_8h_source_l00145}{145}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga47eb69ce9330a1c73fe8031240f02f0a}\label{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga47eb69ce9330a1c73fe8031240f02f0a} -\index{Bit access defines@{Bit access defines}!uint64\_bit@{uint64\_bit}} +\Hypertarget{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga47eb69ce9330a1c73fe8031240f02f0a}\index{Bit access defines@{Bit access defines}!uint64\_bit@{uint64\_bit}} \index{uint64\_bit@{uint64\_bit}!Bit access defines@{Bit access defines}} \doxysubsubsubsubsection{\texorpdfstring{uint64\_bit}{uint64\_bit}} -{\footnotesize\ttfamily \#define uint64\+\_\+bit(\begin{DoxyParamCaption}\item[{}]{\+\_\+uint8\+\_\+, }\item[{}]{\+\_\+bit\+\_\+ }\end{DoxyParamCaption})~(\texorpdfstring{$\ast$}{*}(\mbox{\hyperlink{unionuint64___bit_type_def}{uint64\+\_\+\+Bit\+Type\+Def}} \texorpdfstring{$\ast$}{*})(\&(\+\_\+uint8\+\_\+))).bit.\+bit\#\#\+\_\+bit\+\_\+} +{\footnotesize\ttfamily \label{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s_ga47eb69ce9330a1c73fe8031240f02f0a} +\#define uint64\+\_\+bit(\begin{DoxyParamCaption}\item[{}]{\+\_\+uint8\+\_\+}{, }\item[{}]{\+\_\+bit\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(*(\mbox{\hyperlink{unionuint64___bit_type_def}{uint64\_BitTypeDef}}\ *)(\&(\_uint8\_))).bit.bit\#\#\_bit\_} + +\end{DoxyCode} Получить n-\/й бит из uint64\+\_\+t. diff --git a/Doc/latex/group___d_e_l_a_y_s___d_e_f_i_n_e_s.tex b/Doc/latex/group___d_e_l_a_y_s___d_e_f_i_n_e_s.tex index e127538..483828b 100644 --- a/Doc/latex/group___d_e_l_a_y_s___d_e_f_i_n_e_s.tex +++ b/Doc/latex/group___d_e_l_a_y_s___d_e_f_i_n_e_s.tex @@ -1,4 +1,4 @@ -\doxysubsubsection{Delays defines} +\doxysubsubsection{Delays defines } \hypertarget{group___d_e_l_a_y_s___d_e_f_i_n_e_s}{}\label{group___d_e_l_a_y_s___d_e_f_i_n_e_s}\index{Delays defines@{Delays defines}} @@ -15,13 +15,13 @@ Collaboration diagram for Delays defines\+:\nopagebreak \doxysubsubsubsubsection*{Macros} \begin{DoxyCompactItemize} \item -\#define \mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gabeb97579daeb622c6651ed03c4a27479}{ms\+Delay}}(\+\_\+ms\+\_\+)~HAL\+\_\+\+Delay(\+\_\+ms\+\_\+) -\begin{DoxyCompactList}\small\item\em Задержка на указанное количество миллисекунд. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga8a5051b1292d1019fe8dd3fc5521ab25}{ms\+Delay\+Start}}(\+\_\+pvar\+\_\+)~\texorpdfstring{$\ast$}{*}(\+\_\+pvar\+\_\+) = HAL\+\_\+\+Get\+Tick() +\#define \mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gabeb97579daeb622c6651ed03c4a27479}{ms\+Delay}}(\+\_\+ms\+\_\+) +\begin{DoxyCompactList}\small\item\em Блокирующая задержка на указанное количество миллисекунд. \end{DoxyCompactList}\item +\#define \mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga8a5051b1292d1019fe8dd3fc5521ab25}{ms\+Delay\+Start}}(\+\_\+pvar\+\_\+) \begin{DoxyCompactList}\small\item\em Начать отсчет задержки. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga0b97e172659a59ee4fa56f851643ae85}{ms\+Delay\+While\+Active}}(\+\_\+ms\+\_\+, \+\_\+pvar\+\_\+)~(HAL\+\_\+\+Get\+Tick() -\/ \texorpdfstring{$\ast$}{*}(\+\_\+pvar\+\_\+) $<$ \+\_\+ms\+\_\+) +\#define \mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga0b97e172659a59ee4fa56f851643ae85}{ms\+Delay\+While\+Active}}(\+\_\+ms\+\_\+, \+\_\+pvar\+\_\+) \begin{DoxyCompactList}\small\item\em Проверяет, активна ли задержка. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gaed082c07b9fc4d1894330d885b9b5518}{ms\+Delay\+Wait\+Done}}(\+\_\+ms\+\_\+, \+\_\+pvar\+\_\+)~(HAL\+\_\+\+Get\+Tick() -\/ \texorpdfstring{$\ast$}{*}(\+\_\+pvar\+\_\+) $>$= \+\_\+ms\+\_\+) +\#define \mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gaed082c07b9fc4d1894330d885b9b5518}{ms\+Delay\+Wait\+Done}}(\+\_\+ms\+\_\+, \+\_\+pvar\+\_\+) \begin{DoxyCompactList}\small\item\em Проверяет, завершилась ли задержка. \end{DoxyCompactList}\end{DoxyCompactItemize} @@ -36,16 +36,23 @@ Collaboration diagram for Delays defines\+:\nopagebreak \item \doxylink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gaed082c07b9fc4d1894330d885b9b5518}{ms\+Delay\+Wait\+Done} — проверка, завершена ли задержка. Эти макросы удобны для реализации неблокирующих задержек. \end{DoxyItemize} +\label{doc-define-members} +\Hypertarget{group___d_e_l_a_y_s___d_e_f_i_n_e_s_doc-define-members} \doxysubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gabeb97579daeb622c6651ed03c4a27479}\label{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gabeb97579daeb622c6651ed03c4a27479} -\index{Delays defines@{Delays defines}!msDelay@{msDelay}} +\Hypertarget{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gabeb97579daeb622c6651ed03c4a27479}\index{Delays defines@{Delays defines}!msDelay@{msDelay}} \index{msDelay@{msDelay}!Delays defines@{Delays defines}} \doxysubsubsubsubsection{\texorpdfstring{msDelay}{msDelay}} -{\footnotesize\ttfamily \#define ms\+Delay(\begin{DoxyParamCaption}\item[{}]{\+\_\+ms\+\_\+ }\end{DoxyParamCaption})~HAL\+\_\+\+Delay(\+\_\+ms\+\_\+)} +{\footnotesize\ttfamily \label{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gabeb97579daeb622c6651ed03c4a27479} +\#define ms\+Delay(\begin{DoxyParamCaption}\item[{}]{\+\_\+ms\+\_\+}{}\end{DoxyParamCaption})} + +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{osDelay(\_ms\_)} + +\end{DoxyCode} - -Задержка на указанное количество миллисекунд. +Блокирующая задержка на указанное количество миллисекунд. \begin{DoxyParams}{Parameters} @@ -53,18 +60,23 @@ Collaboration diagram for Delays defines\+:\nopagebreak \hline \end{DoxyParams} \begin{DoxyNote}{Note} -Использует HAL\+\_\+\+Delay или os\+Delay в зависимости от FREERTOS\+\_\+\+DELAY. +Использует задержку через \doxylink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\+\_\+time} или os\+Delay в зависимости от \doxylink{group___l_i_b_s___c_o_n_f_i_g_ga57c369737d5c0cfdb7baeecba0a4b151}{FREERTOS\+\_\+\+DELAY}. \end{DoxyNote} -Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00082}{82}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00080}{80}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. -\Hypertarget{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga8a5051b1292d1019fe8dd3fc5521ab25}\label{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga8a5051b1292d1019fe8dd3fc5521ab25} -\index{Delays defines@{Delays defines}!msDelayStart@{msDelayStart}} +\Hypertarget{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga8a5051b1292d1019fe8dd3fc5521ab25}\index{Delays defines@{Delays defines}!msDelayStart@{msDelayStart}} \index{msDelayStart@{msDelayStart}!Delays defines@{Delays defines}} \doxysubsubsubsubsection{\texorpdfstring{msDelayStart}{msDelayStart}} -{\footnotesize\ttfamily \#define ms\+Delay\+Start(\begin{DoxyParamCaption}\item[{}]{\+\_\+pvar\+\_\+ }\end{DoxyParamCaption})~\texorpdfstring{$\ast$}{*}(\+\_\+pvar\+\_\+) = HAL\+\_\+\+Get\+Tick()} +{\footnotesize\ttfamily \label{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga8a5051b1292d1019fe8dd3fc5521ab25} +\#define ms\+Delay\+Start(\begin{DoxyParamCaption}\item[{}]{\+\_\+pvar\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{*(\_pvar\_)\ =\ \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\_time}}()} + +\end{DoxyCode} Начать отсчет задержки. @@ -74,18 +86,23 @@ Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00082}{82}} of file {\em \+\_\+pvar\+\_\+} & Указатель на переменную типа uint32\+\_\+t для хранения времени старта.\\ \hline \end{DoxyParams} -После вызова этого макроса переменная {\itshape pvar} содержит текущее количество миллисекунд с момента запуска системы (HAL\+\_\+\+Get\+Tick). +После вызова этого макроса переменная {\itshape pvar} содержит текущее количество миллисекунд с момента запуска системы (\doxylink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\+\_\+time}). Используется для реализации неблокирующих задержек. -Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00094}{94}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00098}{98}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. -\Hypertarget{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga0b97e172659a59ee4fa56f851643ae85}\label{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga0b97e172659a59ee4fa56f851643ae85} -\index{Delays defines@{Delays defines}!msDelayWhileActive@{msDelayWhileActive}} +\Hypertarget{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga0b97e172659a59ee4fa56f851643ae85}\index{Delays defines@{Delays defines}!msDelayWhileActive@{msDelayWhileActive}} \index{msDelayWhileActive@{msDelayWhileActive}!Delays defines@{Delays defines}} \doxysubsubsubsubsection{\texorpdfstring{msDelayWhileActive}{msDelayWhileActive}} -{\footnotesize\ttfamily \#define ms\+Delay\+While\+Active(\begin{DoxyParamCaption}\item[{}]{\+\_\+ms\+\_\+, }\item[{}]{\+\_\+pvar\+\_\+ }\end{DoxyParamCaption})~(HAL\+\_\+\+Get\+Tick() -\/ \texorpdfstring{$\ast$}{*}(\+\_\+pvar\+\_\+) $<$ \+\_\+ms\+\_\+)} +{\footnotesize\ttfamily \label{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga0b97e172659a59ee4fa56f851643ae85} +\#define ms\+Delay\+While\+Active(\begin{DoxyParamCaption}\item[{}]{\+\_\+ms\+\_\+}{, }\item[{}]{\+\_\+pvar\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\_time}}()\ -\/\ *(\_pvar\_)\ <\ \_ms\_)} + +\end{DoxyCode} Проверяет, активна ли задержка. @@ -113,14 +130,19 @@ Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00094}{94}} of file \end{DoxyCode} -Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00111}{111}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00115}{115}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. -\Hypertarget{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gaed082c07b9fc4d1894330d885b9b5518}\label{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gaed082c07b9fc4d1894330d885b9b5518} -\index{Delays defines@{Delays defines}!msDelayWaitDone@{msDelayWaitDone}} +\Hypertarget{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gaed082c07b9fc4d1894330d885b9b5518}\index{Delays defines@{Delays defines}!msDelayWaitDone@{msDelayWaitDone}} \index{msDelayWaitDone@{msDelayWaitDone}!Delays defines@{Delays defines}} \doxysubsubsubsubsection{\texorpdfstring{msDelayWaitDone}{msDelayWaitDone}} -{\footnotesize\ttfamily \#define ms\+Delay\+Wait\+Done(\begin{DoxyParamCaption}\item[{}]{\+\_\+ms\+\_\+, }\item[{}]{\+\_\+pvar\+\_\+ }\end{DoxyParamCaption})~(HAL\+\_\+\+Get\+Tick() -\/ \texorpdfstring{$\ast$}{*}(\+\_\+pvar\+\_\+) $>$= \+\_\+ms\+\_\+)} +{\footnotesize\ttfamily \label{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gaed082c07b9fc4d1894330d885b9b5518} +\#define ms\+Delay\+Wait\+Done(\begin{DoxyParamCaption}\item[{}]{\+\_\+ms\+\_\+}{, }\item[{}]{\+\_\+pvar\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\_time}}()\ -\/\ *(\_pvar\_)\ >=\ \_ms\_)} + +\end{DoxyCode} Проверяет, завершилась ли задержка. @@ -148,5 +170,5 @@ Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00111}{111}} of file \end{DoxyCode} -Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00128}{128}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00132}{132}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. diff --git a/Doc/latex/group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.tex b/Doc/latex/group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.tex index 54906b7..c4cbba2 100644 --- a/Doc/latex/group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.tex +++ b/Doc/latex/group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s.tex @@ -1,4 +1,4 @@ -\doxysubsubsection{Error Handler defines} +\doxysubsubsection{Error Handler defines } \hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s}{}\label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s}\index{Error Handler defines@{Error Handler defines}} @@ -15,17 +15,17 @@ Collaboration diagram for Error Handler defines\+:\nopagebreak \doxysubsubsubsubsection*{Macros} \begin{DoxyCompactItemize} \item -\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gae110df81afd885a390bbeb152d7b709f}{My\+Libs\+\_\+\+Error\+\_\+\+Handler}}(params)~Error\+\_\+\+Handler(params) +\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gae110df81afd885a390bbeb152d7b709f}{My\+Libs\+\_\+\+Error\+\_\+\+Handler}}(params) \begin{DoxyCompactList}\small\item\em Error\+\_\+\+Handler который будет вызыватся в библиотеке \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga5d066a5b9781f9437e75d98677489eb9}{check\+\_\+null\+\_\+ptr\+\_\+1}}(p1)~(p1 == NULL) +\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga5d066a5b9781f9437e75d98677489eb9}{check\+\_\+null\+\_\+ptr\+\_\+1}}(p1) \begin{DoxyCompactList}\small\item\em Проверить один указатель на NULL. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga27b363f333cacdccc15f5174e096b5b3}{check\+\_\+null\+\_\+ptr\+\_\+2}}(p1, p2)~((p1 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p1 != NULL \&\& p2 == NULL)) +\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga27b363f333cacdccc15f5174e096b5b3}{check\+\_\+null\+\_\+ptr\+\_\+2}}(p1, p2) \begin{DoxyCompactList}\small\item\em Проверить два указателя на NULL. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga838b40542faa9aa273d18f921b21fda2}{check\+\_\+null\+\_\+ptr\+\_\+3}}(p1, p2, p3)~((p1 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p1 != NULL \&\& ((p2 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p2 != NULL \&\& p3 == NULL)))) +\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga838b40542faa9aa273d18f921b21fda2}{check\+\_\+null\+\_\+ptr\+\_\+3}}(p1, p2, p3) \begin{DoxyCompactList}\small\item\em Проверить три указателя на NULL. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga590973be111afc3f9ba15e6939530254}{check\+\_\+null\+\_\+ptr\+\_\+4}}(p1, p2, p3, p4)~((p1 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p1 != NULL \&\& ((p2 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p2 != NULL \&\& ((p3 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p3 != NULL \&\& p4 == NULL)))))) +\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga590973be111afc3f9ba15e6939530254}{check\+\_\+null\+\_\+ptr\+\_\+4}}(p1, p2, p3, p4) \begin{DoxyCompactList}\small\item\em Проверить четыре указателя на NULL. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gaab0aafd7a4a21ec4f338b19269f65490}{check\+\_\+null\+\_\+ptr\+\_\+5}}(p1, p2, p3, p4, p5)~((p1 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p1 != NULL \&\& ((p2 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p2 != NULL \&\& ((p3 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p3 != NULL \&\& ((p4 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p4 != NULL \&\& p5 == NULL)))))))) +\#define \mbox{\hyperlink{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gaab0aafd7a4a21ec4f338b19269f65490}{check\+\_\+null\+\_\+ptr\+\_\+5}}(p1, p2, p3, p4, p5) \begin{DoxyCompactList}\small\item\em Проверить пять указателей на NULL. \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsubsubsubsection*{Functions} \begin{DoxyCompactItemize} @@ -40,13 +40,20 @@ void {\bfseries Error\+\_\+\+Handler} (void) +\label{doc-define-members} +\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_doc-define-members} \doxysubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gae110df81afd885a390bbeb152d7b709f}\label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gae110df81afd885a390bbeb152d7b709f} -\index{Error Handler defines@{Error Handler defines}!MyLibs\_Error\_Handler@{MyLibs\_Error\_Handler}} +\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gae110df81afd885a390bbeb152d7b709f}\index{Error Handler defines@{Error Handler defines}!MyLibs\_Error\_Handler@{MyLibs\_Error\_Handler}} \index{MyLibs\_Error\_Handler@{MyLibs\_Error\_Handler}!Error Handler defines@{Error Handler defines}} \doxysubsubsubsubsection{\texorpdfstring{MyLibs\_Error\_Handler}{MyLibs\_Error\_Handler}} -{\footnotesize\ttfamily \#define My\+Libs\+\_\+\+Error\+\_\+\+Handler(\begin{DoxyParamCaption}\item[{}]{params }\end{DoxyParamCaption})~Error\+\_\+\+Handler(params)} +{\footnotesize\ttfamily \label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gae110df81afd885a390bbeb152d7b709f} +\#define My\+Libs\+\_\+\+Error\+\_\+\+Handler(\begin{DoxyParamCaption}\item[{}]{params}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{Error\_Handler(params)} + +\end{DoxyCode} Error\+\_\+\+Handler который будет вызыватся в библиотеке @@ -55,12 +62,17 @@ Error\+\_\+\+Handler который будет вызыватся в библи Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00031}{31}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. -\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga5d066a5b9781f9437e75d98677489eb9}\label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga5d066a5b9781f9437e75d98677489eb9} -\index{Error Handler defines@{Error Handler defines}!check\_null\_ptr\_1@{check\_null\_ptr\_1}} +\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga5d066a5b9781f9437e75d98677489eb9}\index{Error Handler defines@{Error Handler defines}!check\_null\_ptr\_1@{check\_null\_ptr\_1}} \index{check\_null\_ptr\_1@{check\_null\_ptr\_1}!Error Handler defines@{Error Handler defines}} \doxysubsubsubsubsection{\texorpdfstring{check\_null\_ptr\_1}{check\_null\_ptr\_1}} -{\footnotesize\ttfamily \#define check\+\_\+null\+\_\+ptr\+\_\+1(\begin{DoxyParamCaption}\item[{}]{p1 }\end{DoxyParamCaption})~(p1 == NULL)} +{\footnotesize\ttfamily \label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga5d066a5b9781f9437e75d98677489eb9} +\#define check\+\_\+null\+\_\+ptr\+\_\+1(\begin{DoxyParamCaption}\item[{}]{p1}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(p1\ ==\ NULL)} + +\end{DoxyCode} Проверить один указатель на NULL. @@ -69,12 +81,17 @@ Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00031}{31}} of file Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00038}{38}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. -\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga27b363f333cacdccc15f5174e096b5b3}\label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga27b363f333cacdccc15f5174e096b5b3} -\index{Error Handler defines@{Error Handler defines}!check\_null\_ptr\_2@{check\_null\_ptr\_2}} +\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga27b363f333cacdccc15f5174e096b5b3}\index{Error Handler defines@{Error Handler defines}!check\_null\_ptr\_2@{check\_null\_ptr\_2}} \index{check\_null\_ptr\_2@{check\_null\_ptr\_2}!Error Handler defines@{Error Handler defines}} \doxysubsubsubsubsection{\texorpdfstring{check\_null\_ptr\_2}{check\_null\_ptr\_2}} -{\footnotesize\ttfamily \#define check\+\_\+null\+\_\+ptr\+\_\+2(\begin{DoxyParamCaption}\item[{}]{p1, }\item[{}]{p2 }\end{DoxyParamCaption})~((p1 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p1 != NULL \&\& p2 == NULL))} +{\footnotesize\ttfamily \label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga27b363f333cacdccc15f5174e096b5b3} +\#define check\+\_\+null\+\_\+ptr\+\_\+2(\begin{DoxyParamCaption}\item[{}]{p1}{, }\item[{}]{p2}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{((p1\ ==\ NULL)\ ||\ (p1\ !=\ NULL\ \&\&\ p2\ ==\ NULL))} + +\end{DoxyCode} Проверить два указателя на NULL. @@ -83,12 +100,17 @@ Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00038}{38}} of file Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00041}{41}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. -\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga838b40542faa9aa273d18f921b21fda2}\label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga838b40542faa9aa273d18f921b21fda2} -\index{Error Handler defines@{Error Handler defines}!check\_null\_ptr\_3@{check\_null\_ptr\_3}} +\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga838b40542faa9aa273d18f921b21fda2}\index{Error Handler defines@{Error Handler defines}!check\_null\_ptr\_3@{check\_null\_ptr\_3}} \index{check\_null\_ptr\_3@{check\_null\_ptr\_3}!Error Handler defines@{Error Handler defines}} \doxysubsubsubsubsection{\texorpdfstring{check\_null\_ptr\_3}{check\_null\_ptr\_3}} -{\footnotesize\ttfamily \#define check\+\_\+null\+\_\+ptr\+\_\+3(\begin{DoxyParamCaption}\item[{}]{p1, }\item[{}]{p2, }\item[{}]{p3 }\end{DoxyParamCaption})~((p1 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p1 != NULL \&\& ((p2 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p2 != NULL \&\& p3 == NULL))))} +{\footnotesize\ttfamily \label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga838b40542faa9aa273d18f921b21fda2} +\#define check\+\_\+null\+\_\+ptr\+\_\+3(\begin{DoxyParamCaption}\item[{}]{p1}{, }\item[{}]{p2}{, }\item[{}]{p3}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{((p1\ ==\ NULL)\ ||\ (p1\ !=\ NULL\ \&\&\ ((p2\ ==\ NULL)\ ||\ (p2\ !=\ NULL\ \&\&\ p3\ ==\ NULL))))} + +\end{DoxyCode} Проверить три указателя на NULL. @@ -97,12 +119,17 @@ Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00041}{41}} of file Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00044}{44}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. -\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga590973be111afc3f9ba15e6939530254}\label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga590973be111afc3f9ba15e6939530254} -\index{Error Handler defines@{Error Handler defines}!check\_null\_ptr\_4@{check\_null\_ptr\_4}} +\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga590973be111afc3f9ba15e6939530254}\index{Error Handler defines@{Error Handler defines}!check\_null\_ptr\_4@{check\_null\_ptr\_4}} \index{check\_null\_ptr\_4@{check\_null\_ptr\_4}!Error Handler defines@{Error Handler defines}} \doxysubsubsubsubsection{\texorpdfstring{check\_null\_ptr\_4}{check\_null\_ptr\_4}} -{\footnotesize\ttfamily \#define check\+\_\+null\+\_\+ptr\+\_\+4(\begin{DoxyParamCaption}\item[{}]{p1, }\item[{}]{p2, }\item[{}]{p3, }\item[{}]{p4 }\end{DoxyParamCaption})~((p1 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p1 != NULL \&\& ((p2 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p2 != NULL \&\& ((p3 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p3 != NULL \&\& p4 == NULL))))))} +{\footnotesize\ttfamily \label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_ga590973be111afc3f9ba15e6939530254} +\#define check\+\_\+null\+\_\+ptr\+\_\+4(\begin{DoxyParamCaption}\item[{}]{p1}{, }\item[{}]{p2}{, }\item[{}]{p3}{, }\item[{}]{p4}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{((p1\ ==\ NULL)\ ||\ (p1\ !=\ NULL\ \&\&\ ((p2\ ==\ NULL)\ ||\ (p2\ !=\ NULL\ \&\&\ ((p3\ ==\ NULL)\ ||\ (p3\ !=\ NULL\ \&\&\ p4\ ==\ NULL))))))} + +\end{DoxyCode} Проверить четыре указателя на NULL. @@ -111,12 +138,17 @@ Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00044}{44}} of file Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00047}{47}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. -\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gaab0aafd7a4a21ec4f338b19269f65490}\label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gaab0aafd7a4a21ec4f338b19269f65490} -\index{Error Handler defines@{Error Handler defines}!check\_null\_ptr\_5@{check\_null\_ptr\_5}} +\Hypertarget{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gaab0aafd7a4a21ec4f338b19269f65490}\index{Error Handler defines@{Error Handler defines}!check\_null\_ptr\_5@{check\_null\_ptr\_5}} \index{check\_null\_ptr\_5@{check\_null\_ptr\_5}!Error Handler defines@{Error Handler defines}} \doxysubsubsubsubsection{\texorpdfstring{check\_null\_ptr\_5}{check\_null\_ptr\_5}} -{\footnotesize\ttfamily \#define check\+\_\+null\+\_\+ptr\+\_\+5(\begin{DoxyParamCaption}\item[{}]{p1, }\item[{}]{p2, }\item[{}]{p3, }\item[{}]{p4, }\item[{}]{p5 }\end{DoxyParamCaption})~((p1 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p1 != NULL \&\& ((p2 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p2 != NULL \&\& ((p3 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p3 != NULL \&\& ((p4 == NULL) \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|} (p4 != NULL \&\& p5 == NULL))))))))} +{\footnotesize\ttfamily \label{group___e_r_r_o_r___h_a_n_d_l_e_r___d_e_f_i_n_e_s_gaab0aafd7a4a21ec4f338b19269f65490} +\#define check\+\_\+null\+\_\+ptr\+\_\+5(\begin{DoxyParamCaption}\item[{}]{p1}{, }\item[{}]{p2}{, }\item[{}]{p3}{, }\item[{}]{p4}{, }\item[{}]{p5}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{((p1\ ==\ NULL)\ ||\ (p1\ !=\ NULL\ \&\&\ ((p2\ ==\ NULL)\ ||\ (p2\ !=\ NULL\ \&\&\ ((p3\ ==\ NULL)\ ||\ (p3\ !=\ NULL\ \&\&\ ((p4\ ==\ NULL)\ ||\ (p4\ !=\ NULL\ \&\&\ p5\ ==\ NULL))))))))} + +\end{DoxyCode} Проверить пять указателей на NULL. diff --git a/Doc/latex/group___e_v_o_l_v_e___c_o_n_f_i_g.tex b/Doc/latex/group___e_v_o_l_v_e___c_o_n_f_i_g.tex index 82a20c6..e26da1c 100644 --- a/Doc/latex/group___e_v_o_l_v_e___c_o_n_f_i_g.tex +++ b/Doc/latex/group___e_v_o_l_v_e___c_o_n_f_i_g.tex @@ -1,4 +1,4 @@ -\doxysubsubsection{Evolve configs} +\doxysubsubsection{Evolve configs } \hypertarget{group___e_v_o_l_v_e___c_o_n_f_i_g}{}\label{group___e_v_o_l_v_e___c_o_n_f_i_g}\index{Evolve configs@{Evolve configs}} @@ -28,12 +28,14 @@ Collaboration diagram for Evolve configs\+:\nopagebreak +\label{doc-define-members} +\Hypertarget{group___e_v_o_l_v_e___c_o_n_f_i_g_doc-define-members} \doxysubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___e_v_o_l_v_e___c_o_n_f_i_g_ga2cac097081444a7a9b040f4b11550e47}\label{group___e_v_o_l_v_e___c_o_n_f_i_g_ga2cac097081444a7a9b040f4b11550e47} -\index{Evolve configs@{Evolve configs}!ENABLE\_EVOLVE\_OPTIMIZATION@{ENABLE\_EVOLVE\_OPTIMIZATION}} +\Hypertarget{group___e_v_o_l_v_e___c_o_n_f_i_g_ga2cac097081444a7a9b040f4b11550e47}\index{Evolve configs@{Evolve configs}!ENABLE\_EVOLVE\_OPTIMIZATION@{ENABLE\_EVOLVE\_OPTIMIZATION}} \index{ENABLE\_EVOLVE\_OPTIMIZATION@{ENABLE\_EVOLVE\_OPTIMIZATION}!Evolve configs@{Evolve configs}} \doxysubsubsubsubsection{\texorpdfstring{ENABLE\_EVOLVE\_OPTIMIZATION}{ENABLE\_EVOLVE\_OPTIMIZATION}} -{\footnotesize\ttfamily \#define ENABLE\+\_\+\+EVOLVE\+\_\+\+OPTIMIZATION} +{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___c_o_n_f_i_g_ga2cac097081444a7a9b040f4b11550e47} +\#define ENABLE\+\_\+\+EVOLVE\+\_\+\+OPTIMIZATION} @@ -43,11 +45,11 @@ Collaboration diagram for Evolve configs\+:\nopagebreak Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00064}{64}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___e_v_o_l_v_e___c_o_n_f_i_g_ga80d6162495fc3776d8902610657d4fee}\label{group___e_v_o_l_v_e___c_o_n_f_i_g_ga80d6162495fc3776d8902610657d4fee} -\index{Evolve configs@{Evolve configs}!EVOLVE\_MAX\_PARAMS@{EVOLVE\_MAX\_PARAMS}} +\Hypertarget{group___e_v_o_l_v_e___c_o_n_f_i_g_ga80d6162495fc3776d8902610657d4fee}\index{Evolve configs@{Evolve configs}!EVOLVE\_MAX\_PARAMS@{EVOLVE\_MAX\_PARAMS}} \index{EVOLVE\_MAX\_PARAMS@{EVOLVE\_MAX\_PARAMS}!Evolve configs@{Evolve configs}} \doxysubsubsubsubsection{\texorpdfstring{EVOLVE\_MAX\_PARAMS}{EVOLVE\_MAX\_PARAMS}} -{\footnotesize\ttfamily \#define EVOLVE\+\_\+\+MAX\+\_\+\+PARAMS~20} +{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___c_o_n_f_i_g_ga80d6162495fc3776d8902610657d4fee} +\#define EVOLVE\+\_\+\+MAX\+\_\+\+PARAMS~20} @@ -57,11 +59,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00064}{64}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00065}{65}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}\label{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971} -\index{Evolve configs@{Evolve configs}!EVOLVE\_MAX\_CANDIDATES@{EVOLVE\_MAX\_CANDIDATES}} +\Hypertarget{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}\index{Evolve configs@{Evolve configs}!EVOLVE\_MAX\_CANDIDATES@{EVOLVE\_MAX\_CANDIDATES}} \index{EVOLVE\_MAX\_CANDIDATES@{EVOLVE\_MAX\_CANDIDATES}!Evolve configs@{Evolve configs}} \doxysubsubsubsubsection{\texorpdfstring{EVOLVE\_MAX\_CANDIDATES}{EVOLVE\_MAX\_CANDIDATES}} -{\footnotesize\ttfamily \#define EVOLVE\+\_\+\+MAX\+\_\+\+CANDIDATES~100} +{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971} +\#define EVOLVE\+\_\+\+MAX\+\_\+\+CANDIDATES~100} diff --git a/Doc/latex/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.tex b/Doc/latex/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.tex index 5d69cd9..0a8f274 100644 --- a/Doc/latex/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.tex +++ b/Doc/latex/group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r.tex @@ -1,4 +1,4 @@ -\doxysubsubsection{Evolve optimizer} +\doxysubsubsection{Evolve optimizer } \hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r}{}\label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r}\index{Evolve optimizer@{Evolve optimizer}} @@ -20,12 +20,10 @@ struct \mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} \doxysubsubsubsubsection*{Macros} \begin{DoxyCompactItemize} \item -\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga83abbcabaff9111c03ae2475ee72ea3e}{PARAM\+\_\+\+SCALE}}(x, min\+\_\+val, max\+\_\+val)~(((float)(x) -\/ (float)(min\+\_\+val)) / ((float)(max\+\_\+val) -\/ (float)(min\+\_\+val))) +\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga83abbcabaff9111c03ae2475ee72ea3e}{PARAM\+\_\+\+SCALE}}(x, min\+\_\+val, max\+\_\+val) \begin{DoxyCompactList}\small\item\em Линейное масштабирование x из диапазона \mbox{[}min\+\_\+val, max\+\_\+val\mbox{]} в диапазон \mbox{[}0, 1) \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaa1d5510fe5f0bd989473f3ebe324bde3}{PARAM\+\_\+\+UNSCALE}}(val, min\+\_\+val, max\+\_\+val)~(((float)(val)) \texorpdfstring{$\ast$}{*} ((float)(max\+\_\+val) -\/ (float)(min\+\_\+val)) + (float)(min\+\_\+val)) +\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaa1d5510fe5f0bd989473f3ebe324bde3}{PARAM\+\_\+\+UNSCALE}}(val, min\+\_\+val, max\+\_\+val) \begin{DoxyCompactList}\small\item\em Обратное линейное масштабирование значения из \mbox{[}0, 1) в диапазон \mbox{[}min\+\_\+val, max\+\_\+val\mbox{]}. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga9c853b02c22f26023c34d1d404b6d653}{local\+\_\+time}}()~HAL\+\_\+\+Get\+Tick() -\begin{DoxyCompactList}\small\item\em Локальное время \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga2f2b1be34ad4eb1bf3267237200cd6c6}{EVOLVE\+\_\+\+MUTATION\+\_\+\+MIN\+\_\+\+PCT}}~10 \begin{DoxyCompactList}\small\item\em Минимальная мутация (в процентах от Loss) \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga861c1c6a503c21441abcec0d57b848bc}{EVOLVE\+\_\+\+MUTATION\+\_\+\+MAX\+\_\+\+PCT}}~100 @@ -97,18 +95,24 @@ struct \mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} \DoxyCodeLine{param\_i16\ =\ \mbox{\hyperlink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaa1d5510fe5f0bd989473f3ebe324bde3}{PARAM\_UNSCALE}}(params[3],\ \ 500.0f,\ 5000.0f);} \end{DoxyCode} - ~\newline \end{DoxyParagraph} +\label{doc-define-members} +\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_doc-define-members} \doxysubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga83abbcabaff9111c03ae2475ee72ea3e}\label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga83abbcabaff9111c03ae2475ee72ea3e} -\index{Evolve optimizer@{Evolve optimizer}!PARAM\_SCALE@{PARAM\_SCALE}} +\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga83abbcabaff9111c03ae2475ee72ea3e}\index{Evolve optimizer@{Evolve optimizer}!PARAM\_SCALE@{PARAM\_SCALE}} \index{PARAM\_SCALE@{PARAM\_SCALE}!Evolve optimizer@{Evolve optimizer}} \doxysubsubsubsubsection{\texorpdfstring{PARAM\_SCALE}{PARAM\_SCALE}} -{\footnotesize\ttfamily \#define PARAM\+\_\+\+SCALE(\begin{DoxyParamCaption}\item[{}]{x, }\item[{}]{min\+\_\+val, }\item[{}]{max\+\_\+val }\end{DoxyParamCaption})~(((float)(x) -\/ (float)(min\+\_\+val)) / ((float)(max\+\_\+val) -\/ (float)(min\+\_\+val)))} +{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga83abbcabaff9111c03ae2475ee72ea3e} +\#define PARAM\+\_\+\+SCALE(\begin{DoxyParamCaption}\item[{}]{x}{, }\item[{}]{min\+\_\+val}{, }\item[{}]{max\+\_\+val}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(((float)(x)\ -\/\ (float)(min\_val))\ /\ ((float)(max\_val)\ -\/\ (float)(min\_val)))} + +\end{DoxyCode} Линейное масштабирование x из диапазона \mbox{[}min\+\_\+val, max\+\_\+val\mbox{]} в диапазон \mbox{[}0, 1) @@ -117,12 +121,17 @@ struct \mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00073}{73}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaa1d5510fe5f0bd989473f3ebe324bde3}\label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaa1d5510fe5f0bd989473f3ebe324bde3} -\index{Evolve optimizer@{Evolve optimizer}!PARAM\_UNSCALE@{PARAM\_UNSCALE}} +\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaa1d5510fe5f0bd989473f3ebe324bde3}\index{Evolve optimizer@{Evolve optimizer}!PARAM\_UNSCALE@{PARAM\_UNSCALE}} \index{PARAM\_UNSCALE@{PARAM\_UNSCALE}!Evolve optimizer@{Evolve optimizer}} \doxysubsubsubsubsection{\texorpdfstring{PARAM\_UNSCALE}{PARAM\_UNSCALE}} -{\footnotesize\ttfamily \#define PARAM\+\_\+\+UNSCALE(\begin{DoxyParamCaption}\item[{}]{val, }\item[{}]{min\+\_\+val, }\item[{}]{max\+\_\+val }\end{DoxyParamCaption})~(((float)(val)) \texorpdfstring{$\ast$}{*} ((float)(max\+\_\+val) -\/ (float)(min\+\_\+val)) + (float)(min\+\_\+val))} +{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaa1d5510fe5f0bd989473f3ebe324bde3} +\#define PARAM\+\_\+\+UNSCALE(\begin{DoxyParamCaption}\item[{}]{val}{, }\item[{}]{min\+\_\+val}{, }\item[{}]{max\+\_\+val}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(((float)(val))\ *\ ((float)(max\_val)\ -\/\ (float)(min\_val))\ +\ (float)(min\_val))} + +\end{DoxyCode} Обратное линейное масштабирование значения из \mbox{[}0, 1) в диапазон \mbox{[}min\+\_\+val, max\+\_\+val\mbox{]}. @@ -131,25 +140,11 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00073}{73}} of Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00079}{79}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga9c853b02c22f26023c34d1d404b6d653}\label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga9c853b02c22f26023c34d1d404b6d653} -\index{Evolve optimizer@{Evolve optimizer}!local\_time@{local\_time}} -\index{local\_time@{local\_time}!Evolve optimizer@{Evolve optimizer}} -\doxysubsubsubsubsection{\texorpdfstring{local\_time}{local\_time}} -{\footnotesize\ttfamily \#define local\+\_\+time(\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})~HAL\+\_\+\+Get\+Tick()} - - - -Локальное время - - - -Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00083}{83}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. - -\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga2f2b1be34ad4eb1bf3267237200cd6c6}\label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga2f2b1be34ad4eb1bf3267237200cd6c6} -\index{Evolve optimizer@{Evolve optimizer}!EVOLVE\_MUTATION\_MIN\_PCT@{EVOLVE\_MUTATION\_MIN\_PCT}} +\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga2f2b1be34ad4eb1bf3267237200cd6c6}\index{Evolve optimizer@{Evolve optimizer}!EVOLVE\_MUTATION\_MIN\_PCT@{EVOLVE\_MUTATION\_MIN\_PCT}} \index{EVOLVE\_MUTATION\_MIN\_PCT@{EVOLVE\_MUTATION\_MIN\_PCT}!Evolve optimizer@{Evolve optimizer}} \doxysubsubsubsubsection{\texorpdfstring{EVOLVE\_MUTATION\_MIN\_PCT}{EVOLVE\_MUTATION\_MIN\_PCT}} -{\footnotesize\ttfamily \#define EVOLVE\+\_\+\+MUTATION\+\_\+\+MIN\+\_\+\+PCT~10} +{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga2f2b1be34ad4eb1bf3267237200cd6c6} +\#define EVOLVE\+\_\+\+MUTATION\+\_\+\+MIN\+\_\+\+PCT~10} @@ -159,11 +154,11 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00083}{83}} of Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00089}{89}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga861c1c6a503c21441abcec0d57b848bc}\label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga861c1c6a503c21441abcec0d57b848bc} -\index{Evolve optimizer@{Evolve optimizer}!EVOLVE\_MUTATION\_MAX\_PCT@{EVOLVE\_MUTATION\_MAX\_PCT}} +\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga861c1c6a503c21441abcec0d57b848bc}\index{Evolve optimizer@{Evolve optimizer}!EVOLVE\_MUTATION\_MAX\_PCT@{EVOLVE\_MUTATION\_MAX\_PCT}} \index{EVOLVE\_MUTATION\_MAX\_PCT@{EVOLVE\_MUTATION\_MAX\_PCT}!Evolve optimizer@{Evolve optimizer}} \doxysubsubsubsubsection{\texorpdfstring{EVOLVE\_MUTATION\_MAX\_PCT}{EVOLVE\_MUTATION\_MAX\_PCT}} -{\footnotesize\ttfamily \#define EVOLVE\+\_\+\+MUTATION\+\_\+\+MAX\+\_\+\+PCT~100} +{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga861c1c6a503c21441abcec0d57b848bc} +\#define EVOLVE\+\_\+\+MUTATION\+\_\+\+MAX\+\_\+\+PCT~100} @@ -173,11 +168,11 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00089}{89}} of Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00092}{92}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga38607e23d9234524bc7de5869b15b8eb}\label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga38607e23d9234524bc7de5869b15b8eb} -\index{Evolve optimizer@{Evolve optimizer}!ELOVLE\_N\_ELITE\_CANDIDATE@{ELOVLE\_N\_ELITE\_CANDIDATE}} +\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga38607e23d9234524bc7de5869b15b8eb}\index{Evolve optimizer@{Evolve optimizer}!ELOVLE\_N\_ELITE\_CANDIDATE@{ELOVLE\_N\_ELITE\_CANDIDATE}} \index{ELOVLE\_N\_ELITE\_CANDIDATE@{ELOVLE\_N\_ELITE\_CANDIDATE}!Evolve optimizer@{Evolve optimizer}} \doxysubsubsubsubsection{\texorpdfstring{ELOVLE\_N\_ELITE\_CANDIDATE}{ELOVLE\_N\_ELITE\_CANDIDATE}} -{\footnotesize\ttfamily \#define ELOVLE\+\_\+\+N\+\_\+\+ELITE\+\_\+\+CANDIDATE~2} +{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga38607e23d9234524bc7de5869b15b8eb} +\#define ELOVLE\+\_\+\+N\+\_\+\+ELITE\+\_\+\+CANDIDATE~2} @@ -189,12 +184,14 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00095}{95}} of +\label{doc-func-members} +\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_doc-func-members} \doxysubsubsubsection{Function Documentation} -\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga4e3ea118b5b9068619c57724a925ba21}\label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga4e3ea118b5b9068619c57724a925ba21} -\index{Evolve optimizer@{Evolve optimizer}!EvolveOptimizer\_Init@{EvolveOptimizer\_Init}} +\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga4e3ea118b5b9068619c57724a925ba21}\index{Evolve optimizer@{Evolve optimizer}!EvolveOptimizer\_Init@{EvolveOptimizer\_Init}} \index{EvolveOptimizer\_Init@{EvolveOptimizer\_Init}!Evolve optimizer@{Evolve optimizer}} \doxysubsubsubsubsection{\texorpdfstring{EvolveOptimizer\_Init()}{EvolveOptimizer\_Init()}} -{\footnotesize\ttfamily \+\_\+\+\_\+\+STATIC\+\_\+\+INLINE int Evolve\+Optimizer\+\_\+\+Init (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} \texorpdfstring{$\ast$}{*}}]{opt, }\item[{uint16\+\_\+t}]{n\+\_\+params, }\item[{uint16\+\_\+t}]{n\+\_\+cand, }\item[{uint16\+\_\+t}]{n\+\_\+best, }\item[{float}]{mutation\+\_\+amp, }\item[{float \texorpdfstring{$\ast$}{*}}]{start\+\_\+params }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_ga4e3ea118b5b9068619c57724a925ba21} +\+\_\+\+\_\+\+STATIC\+\_\+\+INLINE int Evolve\+Optimizer\+\_\+\+Init (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} \texorpdfstring{$\ast$}{*}}]{opt}{, }\item[{uint16\+\_\+t}]{n\+\_\+params}{, }\item[{uint16\+\_\+t}]{n\+\_\+cand}{, }\item[{uint16\+\_\+t}]{n\+\_\+best}{, }\item[{float}]{mutation\+\_\+amp}{, }\item[{float \texorpdfstring{$\ast$}{*}}]{start\+\_\+params}{}\end{DoxyParamCaption})} @@ -220,13 +217,13 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00095}{95}} of \end{DoxyReturn} -Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00148}{148}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00155}{155}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaef44a1f3298514569cc2b396a92101ef}\label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaef44a1f3298514569cc2b396a92101ef} -\index{Evolve optimizer@{Evolve optimizer}!EvolveOptimizer\_Step@{EvolveOptimizer\_Step}} +\Hypertarget{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaef44a1f3298514569cc2b396a92101ef}\index{Evolve optimizer@{Evolve optimizer}!EvolveOptimizer\_Step@{EvolveOptimizer\_Step}} \index{EvolveOptimizer\_Step@{EvolveOptimizer\_Step}!Evolve optimizer@{Evolve optimizer}} \doxysubsubsubsubsection{\texorpdfstring{EvolveOptimizer\_Step()}{EvolveOptimizer\_Step()}} -{\footnotesize\ttfamily \+\_\+\+\_\+\+STATIC\+\_\+\+INLINE int Evolve\+Optimizer\+\_\+\+Step (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} \texorpdfstring{$\ast$}{*}}]{opt, }\item[{float \texorpdfstring{$\ast$}{*}}]{params, }\item[{float}]{loss }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r_gaef44a1f3298514569cc2b396a92101ef} +\+\_\+\+\_\+\+STATIC\+\_\+\+INLINE int Evolve\+Optimizer\+\_\+\+Step (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_evolve_optimizer__t}{Evolve\+Optimizer\+\_\+t}} \texorpdfstring{$\ast$}{*}}]{opt}{, }\item[{float \texorpdfstring{$\ast$}{*}}]{params}{, }\item[{float}]{loss}{}\end{DoxyParamCaption})} @@ -251,5 +248,5 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00148}{148}} of \end{DoxyNote} -Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00216}{216}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00225}{225}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. diff --git a/Doc/latex/group___g_p_i_o___i_n_i_t.tex b/Doc/latex/group___g_p_i_o___i_n_i_t.tex index 860c2ce..d70cca7 100644 --- a/Doc/latex/group___g_p_i_o___i_n_i_t.tex +++ b/Doc/latex/group___g_p_i_o___i_n_i_t.tex @@ -1,4 +1,4 @@ -\doxysubsubsubsubsection{Init defines} +\doxysubsubsubsubsection{Init defines } \hypertarget{group___g_p_i_o___i_n_i_t}{}\label{group___g_p_i_o___i_n_i_t}\index{Init defines@{Init defines}} @@ -32,12 +32,14 @@ Collaboration diagram for Init defines\+:\nopagebreak +\label{doc-define-members} +\Hypertarget{group___g_p_i_o___i_n_i_t_doc-define-members} \doxysubsubsubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___g_p_i_o___i_n_i_t_ga1d42e219765ec526d99e306638ac0023}\label{group___g_p_i_o___i_n_i_t_ga1d42e219765ec526d99e306638ac0023} -\index{Init defines@{Init defines}!LED\_PWM\_TICKS@{LED\_PWM\_TICKS}} +\Hypertarget{group___g_p_i_o___i_n_i_t_ga1d42e219765ec526d99e306638ac0023}\index{Init defines@{Init defines}!LED\_PWM\_TICKS@{LED\_PWM\_TICKS}} \index{LED\_PWM\_TICKS@{LED\_PWM\_TICKS}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{LED\_PWM\_TICKS}{LED\_PWM\_TICKS}} -{\footnotesize\ttfamily \#define LED\+\_\+\+PWM\+\_\+\+TICKS~15} +{\footnotesize\ttfamily \label{group___g_p_i_o___i_n_i_t_ga1d42e219765ec526d99e306638ac0023} +\#define LED\+\_\+\+PWM\+\_\+\+TICKS~15} @@ -45,13 +47,13 @@ Collaboration diagram for Init defines\+:\nopagebreak -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00031}{31}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00035}{35}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{group___g_p_i_o___i_n_i_t_gaf2e697ac60e05813d45ea2c9c9e79c25}\label{group___g_p_i_o___i_n_i_t_gaf2e697ac60e05813d45ea2c9c9e79c25} -\index{Init defines@{Init defines}!LED\_ON@{LED\_ON}} +\Hypertarget{group___g_p_i_o___i_n_i_t_gaf2e697ac60e05813d45ea2c9c9e79c25}\index{Init defines@{Init defines}!LED\_ON@{LED\_ON}} \index{LED\_ON@{LED\_ON}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{LED\_ON}{LED\_ON}} -{\footnotesize\ttfamily \#define LED\+\_\+\+ON~1} +{\footnotesize\ttfamily \label{group___g_p_i_o___i_n_i_t_gaf2e697ac60e05813d45ea2c9c9e79c25} +\#define LED\+\_\+\+ON~1} @@ -59,13 +61,13 @@ Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00031}{31}} of file -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00035}{35}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00039}{39}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{group___g_p_i_o___i_n_i_t_ga80700bb63bd56ebabbb4728aa433fd29}\label{group___g_p_i_o___i_n_i_t_ga80700bb63bd56ebabbb4728aa433fd29} -\index{Init defines@{Init defines}!LED\_OFF@{LED\_OFF}} +\Hypertarget{group___g_p_i_o___i_n_i_t_ga80700bb63bd56ebabbb4728aa433fd29}\index{Init defines@{Init defines}!LED\_OFF@{LED\_OFF}} \index{LED\_OFF@{LED\_OFF}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{LED\_OFF}{LED\_OFF}} -{\footnotesize\ttfamily \#define LED\+\_\+\+OFF~0} +{\footnotesize\ttfamily \label{group___g_p_i_o___i_n_i_t_ga80700bb63bd56ebabbb4728aa433fd29} +\#define LED\+\_\+\+OFF~0} @@ -73,13 +75,13 @@ Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00035}{35}} of file -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00038}{38}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00042}{42}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{group___g_p_i_o___i_n_i_t_ga19d9e3aced311179a2914e0c9b13d0f9}\label{group___g_p_i_o___i_n_i_t_ga19d9e3aced311179a2914e0c9b13d0f9} -\index{Init defines@{Init defines}!SW\_ON@{SW\_ON}} +\Hypertarget{group___g_p_i_o___i_n_i_t_ga19d9e3aced311179a2914e0c9b13d0f9}\index{Init defines@{Init defines}!SW\_ON@{SW\_ON}} \index{SW\_ON@{SW\_ON}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{SW\_ON}{SW\_ON}} -{\footnotesize\ttfamily \#define SW\+\_\+\+ON~1} +{\footnotesize\ttfamily \label{group___g_p_i_o___i_n_i_t_ga19d9e3aced311179a2914e0c9b13d0f9} +\#define SW\+\_\+\+ON~1} @@ -87,13 +89,13 @@ Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00038}{38}} of file -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00042}{42}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00046}{46}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{group___g_p_i_o___i_n_i_t_gacd8900c9ec0efde1da3253b718574067}\label{group___g_p_i_o___i_n_i_t_gacd8900c9ec0efde1da3253b718574067} -\index{Init defines@{Init defines}!SW\_OFF@{SW\_OFF}} +\Hypertarget{group___g_p_i_o___i_n_i_t_gacd8900c9ec0efde1da3253b718574067}\index{Init defines@{Init defines}!SW\_OFF@{SW\_OFF}} \index{SW\_OFF@{SW\_OFF}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{SW\_OFF}{SW\_OFF}} -{\footnotesize\ttfamily \#define SW\+\_\+\+OFF~0} +{\footnotesize\ttfamily \label{group___g_p_i_o___i_n_i_t_gacd8900c9ec0efde1da3253b718574067} +\#define SW\+\_\+\+OFF~0} @@ -101,5 +103,5 @@ Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00042}{42}} of file -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00045}{45}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00049}{49}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. diff --git a/Doc/latex/group___l_i_b_s___c_o_n_f_i_g.tex b/Doc/latex/group___l_i_b_s___c_o_n_f_i_g.tex index 07a864c..5bee9ab 100644 --- a/Doc/latex/group___l_i_b_s___c_o_n_f_i_g.tex +++ b/Doc/latex/group___l_i_b_s___c_o_n_f_i_g.tex @@ -1,4 +1,4 @@ -\doxysubsubsection{Libraries configs} +\doxysubsubsection{Libraries configs } \hypertarget{group___l_i_b_s___c_o_n_f_i_g}{}\label{group___l_i_b_s___c_o_n_f_i_g}\index{Libraries configs@{Libraries configs}} @@ -15,6 +15,8 @@ Collaboration diagram for Libraries configs\+:\nopagebreak \doxysubsubsubsubsection*{Macros} \begin{DoxyCompactItemize} \item +\#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\+\_\+time}}() +\begin{DoxyCompactList}\small\item\em Локальное время \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga66560656d080d6551627a19dfb847c66}{INCLUDE\+\_\+\+EVOLVE\+\_\+\+OPTIMIZER}} \begin{DoxyCompactList}\small\item\em Подключить библиотеку для оптимизации параметров \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_gaf4ddb2a71ec0d05c2480e197cd17c0be}{INCLUDE\+\_\+\+BIT\+\_\+\+ACCESS\+\_\+\+LIB}} @@ -24,7 +26,9 @@ Collaboration diagram for Libraries configs\+:\nopagebreak \#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga0a3ca94b616997069dd53e2c6c2687d7}{INCLUDE\+\_\+\+TRACE\+\_\+\+LIB}} \begin{DoxyCompactList}\small\item\em Подключить библиотеку с трейсами \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga181a46326e46b60afb160190832c7281}{INCLUDE\+\_\+\+GENERAL\+\_\+\+PERIPH\+\_\+\+LIBS}} -\begin{DoxyCompactList}\small\item\em Подключить библиотеку с периферией \end{DoxyCompactList}\end{DoxyCompactItemize} +\begin{DoxyCompactList}\small\item\em Подключить библиотеку с периферией \end{DoxyCompactList}\item +\#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga57c369737d5c0cfdb7baeecba0a4b151}{FREERTOS\+\_\+\+DELAY}} +\begin{DoxyCompactList}\small\item\em Использовать Free\+RTOS задержку, вместо HAL. \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsubsubsection{Detailed Description} @@ -32,12 +36,33 @@ Collaboration diagram for Libraries configs\+:\nopagebreak +\label{doc-define-members} +\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_doc-define-members} \doxysubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_ga66560656d080d6551627a19dfb847c66}\label{group___l_i_b_s___c_o_n_f_i_g_ga66560656d080d6551627a19dfb847c66} -\index{Libraries configs@{Libraries configs}!INCLUDE\_EVOLVE\_OPTIMIZER@{INCLUDE\_EVOLVE\_OPTIMIZER}} +\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}\index{Libraries configs@{Libraries configs}!local\_time@{local\_time}} +\index{local\_time@{local\_time}!Libraries configs@{Libraries configs}} +\doxysubsubsubsubsection{\texorpdfstring{local\_time}{local\_time}} +{\footnotesize\ttfamily \label{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653} +\#define local\+\_\+time(\begin{DoxyParamCaption}{}{}\end{DoxyParamCaption})} + +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{uwTick} + +\end{DoxyCode} + + +Локальное время + + + +Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00080}{80}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. + +\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_ga66560656d080d6551627a19dfb847c66}\index{Libraries configs@{Libraries configs}!INCLUDE\_EVOLVE\_OPTIMIZER@{INCLUDE\_EVOLVE\_OPTIMIZER}} \index{INCLUDE\_EVOLVE\_OPTIMIZER@{INCLUDE\_EVOLVE\_OPTIMIZER}!Libraries configs@{Libraries configs}} \doxysubsubsubsubsection{\texorpdfstring{INCLUDE\_EVOLVE\_OPTIMIZER}{INCLUDE\_EVOLVE\_OPTIMIZER}} -{\footnotesize\ttfamily \#define INCLUDE\+\_\+\+EVOLVE\+\_\+\+OPTIMIZER} +{\footnotesize\ttfamily \label{group___l_i_b_s___c_o_n_f_i_g_ga66560656d080d6551627a19dfb847c66} +\#define INCLUDE\+\_\+\+EVOLVE\+\_\+\+OPTIMIZER} @@ -45,13 +70,13 @@ Collaboration diagram for Libraries configs\+:\nopagebreak -Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00080}{80}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00082}{82}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_gaf4ddb2a71ec0d05c2480e197cd17c0be}\label{group___l_i_b_s___c_o_n_f_i_g_gaf4ddb2a71ec0d05c2480e197cd17c0be} -\index{Libraries configs@{Libraries configs}!INCLUDE\_BIT\_ACCESS\_LIB@{INCLUDE\_BIT\_ACCESS\_LIB}} +\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_gaf4ddb2a71ec0d05c2480e197cd17c0be}\index{Libraries configs@{Libraries configs}!INCLUDE\_BIT\_ACCESS\_LIB@{INCLUDE\_BIT\_ACCESS\_LIB}} \index{INCLUDE\_BIT\_ACCESS\_LIB@{INCLUDE\_BIT\_ACCESS\_LIB}!Libraries configs@{Libraries configs}} \doxysubsubsubsubsection{\texorpdfstring{INCLUDE\_BIT\_ACCESS\_LIB}{INCLUDE\_BIT\_ACCESS\_LIB}} -{\footnotesize\ttfamily \#define INCLUDE\+\_\+\+BIT\+\_\+\+ACCESS\+\_\+\+LIB} +{\footnotesize\ttfamily \label{group___l_i_b_s___c_o_n_f_i_g_gaf4ddb2a71ec0d05c2480e197cd17c0be} +\#define INCLUDE\+\_\+\+BIT\+\_\+\+ACCESS\+\_\+\+LIB} @@ -59,13 +84,13 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00080}{80}} of fil -Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00081}{81}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00083}{83}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_ga4403055986b70bb02b8d37073a122e32}\label{group___l_i_b_s___c_o_n_f_i_g_ga4403055986b70bb02b8d37073a122e32} -\index{Libraries configs@{Libraries configs}!INCLUDE\_TRACKERS\_LIB@{INCLUDE\_TRACKERS\_LIB}} +\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_ga4403055986b70bb02b8d37073a122e32}\index{Libraries configs@{Libraries configs}!INCLUDE\_TRACKERS\_LIB@{INCLUDE\_TRACKERS\_LIB}} \index{INCLUDE\_TRACKERS\_LIB@{INCLUDE\_TRACKERS\_LIB}!Libraries configs@{Libraries configs}} \doxysubsubsubsubsection{\texorpdfstring{INCLUDE\_TRACKERS\_LIB}{INCLUDE\_TRACKERS\_LIB}} -{\footnotesize\ttfamily \#define INCLUDE\+\_\+\+TRACKERS\+\_\+\+LIB} +{\footnotesize\ttfamily \label{group___l_i_b_s___c_o_n_f_i_g_ga4403055986b70bb02b8d37073a122e32} +\#define INCLUDE\+\_\+\+TRACKERS\+\_\+\+LIB} @@ -73,13 +98,13 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00081}{81}} of fil -Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00082}{82}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00084}{84}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_ga0a3ca94b616997069dd53e2c6c2687d7}\label{group___l_i_b_s___c_o_n_f_i_g_ga0a3ca94b616997069dd53e2c6c2687d7} -\index{Libraries configs@{Libraries configs}!INCLUDE\_TRACE\_LIB@{INCLUDE\_TRACE\_LIB}} +\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_ga0a3ca94b616997069dd53e2c6c2687d7}\index{Libraries configs@{Libraries configs}!INCLUDE\_TRACE\_LIB@{INCLUDE\_TRACE\_LIB}} \index{INCLUDE\_TRACE\_LIB@{INCLUDE\_TRACE\_LIB}!Libraries configs@{Libraries configs}} \doxysubsubsubsubsection{\texorpdfstring{INCLUDE\_TRACE\_LIB}{INCLUDE\_TRACE\_LIB}} -{\footnotesize\ttfamily \#define INCLUDE\+\_\+\+TRACE\+\_\+\+LIB} +{\footnotesize\ttfamily \label{group___l_i_b_s___c_o_n_f_i_g_ga0a3ca94b616997069dd53e2c6c2687d7} +\#define INCLUDE\+\_\+\+TRACE\+\_\+\+LIB} @@ -87,13 +112,13 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00082}{82}} of fil -Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00083}{83}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00085}{85}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_ga181a46326e46b60afb160190832c7281}\label{group___l_i_b_s___c_o_n_f_i_g_ga181a46326e46b60afb160190832c7281} -\index{Libraries configs@{Libraries configs}!INCLUDE\_GENERAL\_PERIPH\_LIBS@{INCLUDE\_GENERAL\_PERIPH\_LIBS}} +\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_ga181a46326e46b60afb160190832c7281}\index{Libraries configs@{Libraries configs}!INCLUDE\_GENERAL\_PERIPH\_LIBS@{INCLUDE\_GENERAL\_PERIPH\_LIBS}} \index{INCLUDE\_GENERAL\_PERIPH\_LIBS@{INCLUDE\_GENERAL\_PERIPH\_LIBS}!Libraries configs@{Libraries configs}} \doxysubsubsubsubsection{\texorpdfstring{INCLUDE\_GENERAL\_PERIPH\_LIBS}{INCLUDE\_GENERAL\_PERIPH\_LIBS}} -{\footnotesize\ttfamily \#define INCLUDE\+\_\+\+GENERAL\+\_\+\+PERIPH\+\_\+\+LIBS} +{\footnotesize\ttfamily \label{group___l_i_b_s___c_o_n_f_i_g_ga181a46326e46b60afb160190832c7281} +\#define INCLUDE\+\_\+\+GENERAL\+\_\+\+PERIPH\+\_\+\+LIBS} @@ -101,5 +126,19 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00083}{83}} of fil -Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00084}{84}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00086}{86}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. + +\Hypertarget{group___l_i_b_s___c_o_n_f_i_g_ga57c369737d5c0cfdb7baeecba0a4b151}\index{Libraries configs@{Libraries configs}!FREERTOS\_DELAY@{FREERTOS\_DELAY}} +\index{FREERTOS\_DELAY@{FREERTOS\_DELAY}!Libraries configs@{Libraries configs}} +\doxysubsubsubsubsection{\texorpdfstring{FREERTOS\_DELAY}{FREERTOS\_DELAY}} +{\footnotesize\ttfamily \label{group___l_i_b_s___c_o_n_f_i_g_ga57c369737d5c0cfdb7baeecba0a4b151} +\#define FREERTOS\+\_\+\+DELAY} + + + +Использовать Free\+RTOS задержку, вместо HAL. + + + +Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00087}{87}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. diff --git a/Doc/latex/group___m_y___l_i_b_s___g_p_i_o.tex b/Doc/latex/group___m_y___l_i_b_s___g_p_i_o.tex index 9604806..775dad4 100644 --- a/Doc/latex/group___m_y___l_i_b_s___g_p_i_o.tex +++ b/Doc/latex/group___m_y___l_i_b_s___g_p_i_o.tex @@ -1,4 +1,4 @@ -\doxysubsubsection{GPIO Tools} +\doxysubsubsection{GPIO Tools } \hypertarget{group___m_y___l_i_b_s___g_p_i_o}{}\label{group___m_y___l_i_b_s___g_p_i_o}\index{GPIO Tools@{GPIO Tools}} diff --git a/Doc/latex/group___m_y___l_i_b_s___t_i_m.md5 b/Doc/latex/group___m_y___l_i_b_s___t_i_m.md5 index 588e808..ab26041 100644 --- a/Doc/latex/group___m_y___l_i_b_s___t_i_m.md5 +++ b/Doc/latex/group___m_y___l_i_b_s___t_i_m.md5 @@ -1 +1 @@ -bddd90356fb04fa1e92560356c210866 \ No newline at end of file +936137dd7521a28e69e9d997087dab56 \ No newline at end of file diff --git a/Doc/latex/group___m_y___l_i_b_s___t_i_m.pdf b/Doc/latex/group___m_y___l_i_b_s___t_i_m.pdf index fec6f21626aa73dad74d6a86905b993fea2372d0..9f0f3425ece710e8e1bc8ae6d52419615a5716eb 100644 GIT binary patch delta 194 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 diff --git a/Doc/latex/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.tex b/Doc/latex/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.tex index 34a3794..f146bd7 100644 --- a/Doc/latex/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.tex +++ b/Doc/latex/group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l.tex @@ -1,15 +1,16 @@ -\doxysubsection{Peripheral} +\doxysubsection{Peripheral } \hypertarget{group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l}{}\label{group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l}\index{Peripheral@{Peripheral}} Модули для управления периферией -Collaboration diagram for Peripheral\+:\nopagebreak +Collaboration diagram for Peripheral\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode -\includegraphics[width=328pt]{group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l} +\includegraphics[width=331pt]{group___m_y_l_i_b_s___p_e_r_i_p_h_e_r_a_l} \end{center} \end{figure} \doxysubsubsubsection*{Topics} @@ -17,12 +18,18 @@ Collaboration diagram for Peripheral\+:\nopagebreak \item \mbox{\hyperlink{group___m_y___l_i_b_s___g_p_i_o}{GPIO Tools}} \begin{DoxyCompactList}\small\item\em Функции и макросы для удобной работы с GPIO. \end{DoxyCompactList}\item +\mbox{\hyperlink{group___m_y___l_i_b_s___s_p_i}{SPI Tools}} +\begin{DoxyCompactList}\small\item\em Функции и макросы для удобной работы с SPI. \end{DoxyCompactList}\item \mbox{\hyperlink{group___m_y___l_i_b_s___t_i_m}{TIM Tools}} -\begin{DoxyCompactList}\small\item\em Функции и макросы для удобной работы с TIM. \end{DoxyCompactList}\end{DoxyCompactItemize} +\begin{DoxyCompactList}\small\item\em Функции и макросы для удобной работы с TIM. \end{DoxyCompactList}\item +\mbox{\hyperlink{group___m_y___l_i_b_s___u_a_r_t}{UART Tools}} +\begin{DoxyCompactList}\small\item\em Функции и макросы для удобной работы с UART. \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsubsection{Detailed Description} Модули для управления периферией \input{group___m_y___l_i_b_s___g_p_i_o} +\input{group___m_y___l_i_b_s___s_p_i} \input{group___m_y___l_i_b_s___t_i_m} +\input{group___m_y___l_i_b_s___u_a_r_t} diff --git a/Doc/latex/group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.tex b/Doc/latex/group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.tex index 36b886e..e3c4d71 100644 --- a/Doc/latex/group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.tex +++ b/Doc/latex/group___m_y_l_i_b_s___t_i_m___d_e_l_a_y.tex @@ -1,4 +1,4 @@ -\doxysubsubsubsection{Delay tools} +\doxysubsubsubsection{Delay tools } \hypertarget{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y}{}\label{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y}\index{Delay tools@{Delay tools}} @@ -26,14 +26,40 @@ HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_ \doxysubsubsubsubsection{Detailed Description} Функции для формирования задержек с помощью таймеров +\begin{DoxyParagraph}{Пример использования\+:} + +\begin{DoxyCode}{0} +\DoxyCodeLine{TIM\_HandleTypeDef\ htim2;} +\DoxyCodeLine{} +\DoxyCodeLine{\textcolor{comment}{//\ блокирующая\ задержка\ 500\ тиков\ таймера}} +\DoxyCodeLine{\mbox{\hyperlink{group___g_p_i_o___i_n_i_t_gaf2e697ac60e05813d45ea2c9c9e79c25}{LED\_ON}}();} +\DoxyCodeLine{\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga88c552a133cb6e3015453cccab74c07e}{TIM\_Delay}}(\&htim2,\ 500);} +\DoxyCodeLine{\mbox{\hyperlink{group___g_p_i_o___i_n_i_t_ga80700bb63bd56ebabbb4728aa433fd29}{LED\_OFF}}();} +\DoxyCodeLine{} +\DoxyCodeLine{} +\DoxyCodeLine{\textcolor{keywordflow}{while}(1)} +\DoxyCodeLine{\{} +\DoxyCodeLine{\ \ \textcolor{comment}{//\ не\ блокирующая\ задержка\ 200\ тиков\ таймера}} +\DoxyCodeLine{\ \ \textcolor{keywordflow}{if}(\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga108637af414bff3373059273b815ce9b}{TIM\_Delay\_NonBlocking}}(\&htim2,\ 200)\ ==\ HAL\_OK)} +\DoxyCodeLine{\ \ \{} +\DoxyCodeLine{\ \ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga4c0dfde4e15f677600605348b4e97834}{TIM\_Delay\_Start}}(\&htim2);} +\DoxyCodeLine{\ \ \ \ LED\_TOOGLE();} +\DoxyCodeLine{\ \ \}} +\DoxyCodeLine{\}} + +\end{DoxyCode} + +\end{DoxyParagraph} +\label{doc-func-members} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_doc-func-members} \doxysubsubsubsubsection{Function Documentation} -\Hypertarget{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga4c0dfde4e15f677600605348b4e97834}\label{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga4c0dfde4e15f677600605348b4e97834} -\index{Delay tools@{Delay tools}!TIM\_Delay\_Start@{TIM\_Delay\_Start}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga4c0dfde4e15f677600605348b4e97834}\index{Delay tools@{Delay tools}!TIM\_Delay\_Start@{TIM\_Delay\_Start}} \index{TIM\_Delay\_Start@{TIM\_Delay\_Start}!Delay tools@{Delay tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_Delay\_Start()}{TIM\_Delay\_Start()}} -{\footnotesize\ttfamily HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Delay\+\_\+\+Start (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga4c0dfde4e15f677600605348b4e97834} +HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Delay\+\_\+\+Start (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim}{}\end{DoxyParamCaption})} @@ -51,11 +77,11 @@ HAL status. Definition at line \mbox{\hyperlink{general__tim_8c_source_l00363}{363}} of file \mbox{\hyperlink{general__tim_8c_source}{general\+\_\+tim.\+c}}. -\Hypertarget{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga88c552a133cb6e3015453cccab74c07e}\label{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga88c552a133cb6e3015453cccab74c07e} -\index{Delay tools@{Delay tools}!TIM\_Delay@{TIM\_Delay}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga88c552a133cb6e3015453cccab74c07e}\index{Delay tools@{Delay tools}!TIM\_Delay@{TIM\_Delay}} \index{TIM\_Delay@{TIM\_Delay}!Delay tools@{Delay tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_Delay()}{TIM\_Delay()}} -{\footnotesize\ttfamily HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Delay (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim, }\item[{uint16\+\_\+t}]{delay }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga88c552a133cb6e3015453cccab74c07e} +HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Delay (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim}{, }\item[{uint16\+\_\+t}]{delay}{}\end{DoxyParamCaption})} @@ -75,11 +101,11 @@ HAL status. Definition at line \mbox{\hyperlink{general__tim_8c_source_l00337}{337}} of file \mbox{\hyperlink{general__tim_8c_source}{general\+\_\+tim.\+c}}. -\Hypertarget{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga108637af414bff3373059273b815ce9b}\label{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga108637af414bff3373059273b815ce9b} -\index{Delay tools@{Delay tools}!TIM\_Delay\_NonBlocking@{TIM\_Delay\_NonBlocking}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga108637af414bff3373059273b815ce9b}\index{Delay tools@{Delay tools}!TIM\_Delay\_NonBlocking@{TIM\_Delay\_NonBlocking}} \index{TIM\_Delay\_NonBlocking@{TIM\_Delay\_NonBlocking}!Delay tools@{Delay tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_Delay\_NonBlocking()}{TIM\_Delay\_NonBlocking()}} -{\footnotesize\ttfamily HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Delay\+\_\+\+Non\+Blocking (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim, }\item[{uint16\+\_\+t}]{delay }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga108637af414bff3373059273b815ce9b} +HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Delay\+\_\+\+Non\+Blocking (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim}{, }\item[{uint16\+\_\+t}]{delay}{}\end{DoxyParamCaption})} diff --git a/Doc/latex/group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.tex b/Doc/latex/group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.tex index 8654cc5..8ae68bd 100644 --- a/Doc/latex/group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.tex +++ b/Doc/latex/group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r.tex @@ -1,4 +1,4 @@ -\doxysubsubsubsection{Encoder tools} +\doxysubsubsubsection{Encoder tools } \hypertarget{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r}{}\label{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r}\index{Encoder tools@{Encoder tools}} @@ -31,14 +31,40 @@ int \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga117b795017e9e \doxysubsubsubsubsection{Detailed Description} Функции для считывания энкодера +\begin{DoxyParagraph}{Пример использования\+:} + +\begin{DoxyCode}{0} +\DoxyCodeLine{\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\_EncoderTypeDef}}\ henc1;} +\DoxyCodeLine{TIM\_HandleTypeDef\ htim4;} +\DoxyCodeLine{} +\DoxyCodeLine{\textcolor{comment}{//\ инициализация}} +\DoxyCodeLine{henc1.\mbox{\hyperlink{struct_t_i_m___encoder_type_def_adc80bd5a90444c31d84157f35c59b95c}{htim}}\ =\ \&htim4;} +\DoxyCodeLine{henc1.\mbox{\hyperlink{struct_t_i_m___encoder_type_def_ad29873fc8cdc71462e6d8744621120e9}{GPIOx}}\ =\ GPIOA;} +\DoxyCodeLine{henc1.\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a4fc05ef011205a6702cb3d006bab677e}{GPIO\_PIN\_TI1}}\ =\ GPIO\_PIN\_0;} +\DoxyCodeLine{henc1.\mbox{\hyperlink{struct_t_i_m___encoder_type_def_a67ad037b92162546763fc9c425b5e3c5}{GPIO\_PIN\_TI2}}\ =\ GPIO\_PIN\_1;} +\DoxyCodeLine{\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc}{TIM\_Encoder\_Init}}(\&henc1,\ \&htim4);} +\DoxyCodeLine{} +\DoxyCodeLine{\textcolor{comment}{//\ считывание\ энкодера\ и\ кнопки}} +\DoxyCodeLine{int16\_t\ delta\ =\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_gac3bc6525f88c275e47eb864e6d567501}{TIM\_Encoder\_Read}}(\&henc1);} +\DoxyCodeLine{setpoint\_tmp\ +=\ delta;} +\DoxyCodeLine{\textcolor{keywordflow}{if}(\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga117b795017e9e3a357ddefe323412761}{TIM\_Encoder\_ReadSwitch}}(\&henc1))} +\DoxyCodeLine{\{} +\DoxyCodeLine{\ \ setpoint\ =\ setpoint\_tmp;\ \textcolor{comment}{//\ подтвердить\ новое\ значение}} +\DoxyCodeLine{\}} + +\end{DoxyCode} + +\end{DoxyParagraph} +\label{doc-func-members} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_doc-func-members} \doxysubsubsubsubsection{Function Documentation} -\Hypertarget{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc}\label{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc} -\index{Encoder tools@{Encoder tools}!TIM\_Encoder\_Init@{TIM\_Encoder\_Init}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc}\index{Encoder tools@{Encoder tools}!TIM\_Encoder\_Init@{TIM\_Encoder\_Init}} \index{TIM\_Encoder\_Init@{TIM\_Encoder\_Init}!Encoder tools@{Encoder tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_Encoder\_Init()}{TIM\_Encoder\_Init()}} -{\footnotesize\ttfamily HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Encoder\+\_\+\+Init (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\+\_\+\+Encoder\+Type\+Def}} \texorpdfstring{$\ast$}{*}}]{henc, }\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga8d16c3b7e7c6decc54c5c3d1a8bf0fbc} +HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Encoder\+\_\+\+Init (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\+\_\+\+Encoder\+Type\+Def}} \texorpdfstring{$\ast$}{*}}]{henc}{, }\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim}{}\end{DoxyParamCaption})} @@ -61,11 +87,11 @@ HAL status. Definition at line \mbox{\hyperlink{general__tim_8c_source_l00168}{168}} of file \mbox{\hyperlink{general__tim_8c_source}{general\+\_\+tim.\+c}}. -\Hypertarget{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_gac3bc6525f88c275e47eb864e6d567501}\label{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_gac3bc6525f88c275e47eb864e6d567501} -\index{Encoder tools@{Encoder tools}!TIM\_Encoder\_Read@{TIM\_Encoder\_Read}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_gac3bc6525f88c275e47eb864e6d567501}\index{Encoder tools@{Encoder tools}!TIM\_Encoder\_Read@{TIM\_Encoder\_Read}} \index{TIM\_Encoder\_Read@{TIM\_Encoder\_Read}!Encoder tools@{Encoder tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_Encoder\_Read()}{TIM\_Encoder\_Read()}} -{\footnotesize\ttfamily HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Encoder\+\_\+\+Read (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\+\_\+\+Encoder\+Type\+Def}} \texorpdfstring{$\ast$}{*}}]{henc }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_gac3bc6525f88c275e47eb864e6d567501} +HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Encoder\+\_\+\+Read (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\+\_\+\+Encoder\+Type\+Def}} \texorpdfstring{$\ast$}{*}}]{henc}{}\end{DoxyParamCaption})} @@ -83,11 +109,11 @@ HAL status. Definition at line \mbox{\hyperlink{general__tim_8c_source_l00303}{303}} of file \mbox{\hyperlink{general__tim_8c_source}{general\+\_\+tim.\+c}}. -\Hypertarget{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga117b795017e9e3a357ddefe323412761}\label{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga117b795017e9e3a357ddefe323412761} -\index{Encoder tools@{Encoder tools}!TIM\_Encoder\_ReadSwitch@{TIM\_Encoder\_ReadSwitch}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga117b795017e9e3a357ddefe323412761}\index{Encoder tools@{Encoder tools}!TIM\_Encoder\_ReadSwitch@{TIM\_Encoder\_ReadSwitch}} \index{TIM\_Encoder\_ReadSwitch@{TIM\_Encoder\_ReadSwitch}!Encoder tools@{Encoder tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_Encoder\_ReadSwitch()}{TIM\_Encoder\_ReadSwitch()}} -{\footnotesize\ttfamily int TIM\+\_\+\+Encoder\+\_\+\+Read\+Switch (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\+\_\+\+Encoder\+Type\+Def}} \texorpdfstring{$\ast$}{*}}]{henc }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga117b795017e9e3a357ddefe323412761} +int TIM\+\_\+\+Encoder\+\_\+\+Read\+Switch (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\+\_\+\+Encoder\+Type\+Def}} \texorpdfstring{$\ast$}{*}}]{henc}{}\end{DoxyParamCaption})} diff --git a/Doc/latex/group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.tex b/Doc/latex/group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.tex index 345eb21..e615c4a 100644 --- a/Doc/latex/group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.tex +++ b/Doc/latex/group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l.tex @@ -1,4 +1,4 @@ -\doxysubsubsubsection{General tools} +\doxysubsubsubsection{General tools } \hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l}{}\label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l}\index{General tools@{General tools}} @@ -54,20 +54,46 @@ void \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga879e3f1c919c \doxysubsubsubsubsection{Detailed Description} Функции для базовой инициализации таймеров +\begin{DoxyParagraph}{Пример использования\+:} + +\begin{DoxyCode}{0} +\DoxyCodeLine{\mbox{\hyperlink{struct_t_i_m___settings_type_def}{TIM\_SettingsTypeDef}}\ tim2Settings;} +\DoxyCodeLine{} +\DoxyCodeLine{\textcolor{keywordtype}{void}\ TIM2\_Init(\textcolor{keywordtype}{void})} +\DoxyCodeLine{\{} +\DoxyCodeLine{\ \ \ \ \textcolor{comment}{//\ Настройка\ таймера\ TIM2\ на\ 1\ кГц\ с\ прерываниями\ с\ шагом\ таймера\ 10\ мкс}} +\DoxyCodeLine{\ \ \ \ tim2Settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_ada49efdbd35a8e442c3cff630d42f34c}{htim}}.Instance\ =\ TIM2;} +\DoxyCodeLine{\ \ \ \ tim2Settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_ab90e370c3edda88e76583293c250d2b0}{sTimMode}}\ =\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaeb611874216a4661fb83366b99b9e787a89ecf1ef6d45ead2efcb7dd30396114c}{TIM\_IT\_MODE}};} +\DoxyCodeLine{\ \ \ \ tim2Settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_a58da1b4c0f6d12d7d9fb2f170b9b9e6e}{sTickBaseUS}}\ =\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a060b01e890891fd17c8f95b55a94139f}{TIM\_TickBase\_10US}};} +\DoxyCodeLine{\ \ \ \ tim2Settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_a11151fe125960cb8e61328ffd06b7718}{sTickBasePrescaler}}\ =\ 1;} +\DoxyCodeLine{\ \ \ \ tim2Settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_af6057ff3f60f5e01b41d4a347b79a5e4}{sTimFreqHz}}\ =\ 1000;\ \textcolor{comment}{//\ 1\ кГц}} +\DoxyCodeLine{\ \ \ \ tim2Settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_a7073358fd3a722687eb85238ab570014}{sTimAHBFreqMHz}}\ =\ 72000000;\ \textcolor{comment}{//\ Hz}} +\DoxyCodeLine{} +\DoxyCodeLine{\ \ \ \ \textcolor{keywordflow}{if}(\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga7044214f24a9868ba7e1650b55e639ec}{TIM\_Base\_Init}}(\&tim2Settings)\ !=\ HAL\_OK)} +\DoxyCodeLine{\ \ \ \ \{} +\DoxyCodeLine{\ \ \ \ \ \ \ \ Error\_Handler();} +\DoxyCodeLine{\ \ \ \ \}} +\DoxyCodeLine{\}} + +\end{DoxyCode} + +\end{DoxyParagraph} +\label{doc-enum-members} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_doc-enum-members} \doxysubsubsubsubsection{Enumeration Type Documentation} -\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}\label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787} -\index{General tools@{General tools}!TIM\_ITModeTypeDef@{TIM\_ITModeTypeDef}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}\index{General tools@{General tools}!TIM\_ITModeTypeDef@{TIM\_ITModeTypeDef}} \index{TIM\_ITModeTypeDef@{TIM\_ITModeTypeDef}!General tools@{General tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_ITModeTypeDef}{TIM\_ITModeTypeDef}} -{\footnotesize\ttfamily enum \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\+\_\+\+ITMode\+Type\+Def}}} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787} +enum \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\+\_\+\+ITMode\+Type\+Def}}} Режим прерываний таймера -\begin{DoxyEnumFields}{Enumerator} +\begin{DoxyEnumFields}[2]{Enumerator} \raisebox{\heightof{T}}[0pt][0pt]{\index{TIM\_DEFAULT@{TIM\_DEFAULT}!General tools@{General tools}}\index{General tools@{General tools}!TIM\_DEFAULT@{TIM\_DEFAULT}}}\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaeb611874216a4661fb83366b99b9e787ab0869828a4dfd62eaa44868ca27835f8}\label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaeb611874216a4661fb83366b99b9e787ab0869828a4dfd62eaa44868ca27835f8} TIM\+\_\+\+DEFAULT&Прерываний отключены \\ \hline @@ -79,19 +105,19 @@ TIM\+\_\+\+IT\+\_\+\+MODE&Прерываний включены \\ \end{DoxyEnumFields} -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00076}{76}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00077}{77}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800}\label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800} -\index{General tools@{General tools}!TIM\_MHzTickBaseTypeDef@{TIM\_MHzTickBaseTypeDef}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800}\index{General tools@{General tools}!TIM\_MHzTickBaseTypeDef@{TIM\_MHzTickBaseTypeDef}} \index{TIM\_MHzTickBaseTypeDef@{TIM\_MHzTickBaseTypeDef}!General tools@{General tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_MHzTickBaseTypeDef}{TIM\_MHzTickBaseTypeDef}} -{\footnotesize\ttfamily enum \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800}{TIM\+\_\+\+MHz\+Tick\+Base\+Type\+Def}}} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800} +enum \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325217ac099881f09dd0800}{TIM\+\_\+\+MHz\+Tick\+Base\+Type\+Def}}} Длительность тика таймера (частота тактирования таймера) -enum дает базовые длительности, но можно выставить другие (напр 500 -\/ 0.\+5 мс) \begin{DoxyEnumFields}{Enumerator} +enum дает базовые длительности, но можно выставить другие (напр 500 -\/ 0.\+5 мс) \begin{DoxyEnumFields}[2]{Enumerator} \raisebox{\heightof{T}}[0pt][0pt]{\index{TIM\_Base\_Disable@{TIM\_Base\_Disable}!General tools@{General tools}}\index{General tools@{General tools}!TIM\_Base\_Disable@{TIM\_Base\_Disable}}}\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800ae838122c0e83bc57ad31b546bf2f00e5}\label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800ae838122c0e83bc57ad31b546bf2f00e5} TIM\+\_\+\+Base\+\_\+\+Disable&Таймер отключен \\ \hline @@ -123,16 +149,18 @@ TIM\+\_\+\+Tick\+Base\+\_\+100\+MS&Таймер тактируется с час \end{DoxyEnumFields} -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00090}{90}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00091}{91}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +\label{doc-func-members} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_doc-func-members} \doxysubsubsubsubsection{Function Documentation} -\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga7044214f24a9868ba7e1650b55e639ec}\label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga7044214f24a9868ba7e1650b55e639ec} -\index{General tools@{General tools}!TIM\_Base\_Init@{TIM\_Base\_Init}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga7044214f24a9868ba7e1650b55e639ec}\index{General tools@{General tools}!TIM\_Base\_Init@{TIM\_Base\_Init}} \index{TIM\_Base\_Init@{TIM\_Base\_Init}!General tools@{General tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_Base\_Init()}{TIM\_Base\_Init()}} -{\footnotesize\ttfamily HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Base\+\_\+\+Init (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_t_i_m___settings_type_def}{TIM\+\_\+\+Settings\+Type\+Def}} \texorpdfstring{$\ast$}{*}}]{stim }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga7044214f24a9868ba7e1650b55e639ec} +HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Base\+\_\+\+Init (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{struct_t_i_m___settings_type_def}{TIM\+\_\+\+Settings\+Type\+Def}} \texorpdfstring{$\ast$}{*}}]{stim}{}\end{DoxyParamCaption})} @@ -162,11 +190,11 @@ HAL status. Definition at line \mbox{\hyperlink{general__tim_8c_source_l00034}{34}} of file \mbox{\hyperlink{general__tim_8c_source}{general\+\_\+tim.\+c}}. -\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaad47337be7ba2f6c0777c40d7278c931}\label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaad47337be7ba2f6c0777c40d7278c931} -\index{General tools@{General tools}!TIM\_Base\_MspInit@{TIM\_Base\_MspInit}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaad47337be7ba2f6c0777c40d7278c931}\index{General tools@{General tools}!TIM\_Base\_MspInit@{TIM\_Base\_MspInit}} \index{TIM\_Base\_MspInit@{TIM\_Base\_MspInit}!General tools@{General tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_Base\_MspInit()}{TIM\_Base\_MspInit()}} -{\footnotesize\ttfamily void TIM\+\_\+\+Base\+\_\+\+Msp\+Init (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim, }\item[{\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\+\_\+\+ITMode\+Type\+Def}}}]{it\+\_\+mode }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaad47337be7ba2f6c0777c40d7278c931} +void TIM\+\_\+\+Base\+\_\+\+Msp\+Init (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim}{, }\item[{\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\+\_\+\+ITMode\+Type\+Def}}}]{it\+\_\+mode}{}\end{DoxyParamCaption})} @@ -178,17 +206,17 @@ Definition at line \mbox{\hyperlink{general__tim_8c_source_l00034}{34}} of file \hline \end{DoxyParams} \begin{DoxyNote}{Note} -Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров, дефайнами в \doxylink{general__tim_8h}{general\+\_\+tim.\+h} определяются используемые таймеры. +Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров, дефайнами \doxylink{group___t_i_m___i_n_i_t}{Init defines} в \doxylink{general__tim_8h}{general\+\_\+tim.\+h} определяются используемые таймеры. \end{DoxyNote} Definition at line \mbox{\hyperlink{general__tim_8c_source_l00408}{408}} of file \mbox{\hyperlink{general__tim_8c_source}{general\+\_\+tim.\+c}}. -\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga879e3f1c919c02990736730275367115}\label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga879e3f1c919c02990736730275367115} -\index{General tools@{General tools}!TIM\_Base\_MspDeInit@{TIM\_Base\_MspDeInit}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga879e3f1c919c02990736730275367115}\index{General tools@{General tools}!TIM\_Base\_MspDeInit@{TIM\_Base\_MspDeInit}} \index{TIM\_Base\_MspDeInit@{TIM\_Base\_MspDeInit}!General tools@{General tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_Base\_MspDeInit()}{TIM\_Base\_MspDeInit()}} -{\footnotesize\ttfamily void TIM\+\_\+\+Base\+\_\+\+Msp\+De\+Init (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga879e3f1c919c02990736730275367115} +void TIM\+\_\+\+Base\+\_\+\+Msp\+De\+Init (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim}{}\end{DoxyParamCaption})} @@ -200,7 +228,7 @@ Definition at line \mbox{\hyperlink{general__tim_8c_source_l00408}{408}} of file \hline \end{DoxyParams} \begin{DoxyNote}{Note} -Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров, дефайнами в \doxylink{general__tim_8h}{general\+\_\+tim.\+h} определяются используемые таймеры. +Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров, дефайнами \doxylink{group___t_i_m___i_n_i_t}{Init defines} в \doxylink{general__tim_8h}{general\+\_\+tim.\+h} определяются используемые таймеры. \end{DoxyNote} diff --git a/Doc/latex/group___m_y_l_i_b_s___t_i_m___o_c.tex b/Doc/latex/group___m_y_l_i_b_s___t_i_m___o_c.tex index b760e6e..8773efc 100644 --- a/Doc/latex/group___m_y_l_i_b_s___t_i_m___o_c.tex +++ b/Doc/latex/group___m_y_l_i_b_s___t_i_m___o_c.tex @@ -1,4 +1,4 @@ -\doxysubsubsubsection{PWM/\+OC Channels tools} +\doxysubsubsubsection{PWM/\+OC Channels tools } \hypertarget{group___m_y_l_i_b_s___t_i_m___o_c}{}\label{group___m_y_l_i_b_s___t_i_m___o_c}\index{PWM/OC Channels tools@{PWM/OC Channels tools}} @@ -24,14 +24,36 @@ HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___o_c_ \doxysubsubsubsubsection{Detailed Description} Функции для инициализации базовых функций каналов таймера +\begin{DoxyParagraph}{Пример использования\+:} + +\begin{DoxyCode}{0} +\DoxyCodeLine{\textcolor{keywordtype}{void}\ PWM\_Channel\_Init\_Example(\textcolor{keywordtype}{void})} +\DoxyCodeLine{\{} +\DoxyCodeLine{\ \ \ \ TIM\_HandleTypeDef\ htim3;} +\DoxyCodeLine{\ \ \ \ TIM\_OC\_InitTypeDef\ sConfigOC;} +\DoxyCodeLine{\ \ \ \ GPIO\_TypeDef\ *GPIOx\ =\ GPIOB;} +\DoxyCodeLine{\ \ \ \ uint32\_t\ PWM\_PIN\ =\ GPIO\_PIN\_0;} +\DoxyCodeLine{} +\DoxyCodeLine{\ \ \ \ \textcolor{comment}{//\ Настройка\ таймера\ и\ канала\ PWM}} +\DoxyCodeLine{\ \ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___o_c_gadb2f465d89f609e035867e980c3a29c6}{TIM\_Output\_PWM\_Init}}(\&htim3,\ \&sConfigOC,\ TIM\_CHANNEL\_1,\ GPIOx,\ PWM\_PIN);} +\DoxyCodeLine{} +\DoxyCodeLine{\ \ \ \ \textcolor{comment}{//\ Настройка\ компаратора\ OC}} +\DoxyCodeLine{\ \ \ \ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___o_c_gae2608ca8023e9a0713af0b4fbfbc1889}{TIM\_OC\_Comparator\_Init}}(\&htim3,\ TIM\_CHANNEL\_1);} +\DoxyCodeLine{\}} + +\end{DoxyCode} + +\end{DoxyParagraph} +\label{doc-func-members} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___o_c_doc-func-members} \doxysubsubsubsubsection{Function Documentation} -\Hypertarget{group___m_y_l_i_b_s___t_i_m___o_c_gadb2f465d89f609e035867e980c3a29c6}\label{group___m_y_l_i_b_s___t_i_m___o_c_gadb2f465d89f609e035867e980c3a29c6} -\index{PWM/OC Channels tools@{PWM/OC Channels tools}!TIM\_Output\_PWM\_Init@{TIM\_Output\_PWM\_Init}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___o_c_gadb2f465d89f609e035867e980c3a29c6}\index{PWM/OC Channels tools@{PWM/OC Channels tools}!TIM\_Output\_PWM\_Init@{TIM\_Output\_PWM\_Init}} \index{TIM\_Output\_PWM\_Init@{TIM\_Output\_PWM\_Init}!PWM/OC Channels tools@{PWM/OC Channels tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_Output\_PWM\_Init()}{TIM\_Output\_PWM\_Init()}} -{\footnotesize\ttfamily HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Output\+\_\+\+PWM\+\_\+\+Init (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim, }\item[{TIM\+\_\+\+OC\+\_\+\+Init\+Type\+Def \texorpdfstring{$\ast$}{*}}]{s\+Config\+OC, }\item[{uint32\+\_\+t}]{TIM\+\_\+\+CHANNEL, }\item[{GPIO\+\_\+\+Type\+Def \texorpdfstring{$\ast$}{*}}]{GPIOx, }\item[{uint32\+\_\+t}]{GPIO\+\_\+\+PIN }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___o_c_gadb2f465d89f609e035867e980c3a29c6} +HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+Output\+\_\+\+PWM\+\_\+\+Init (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim}{, }\item[{TIM\+\_\+\+OC\+\_\+\+Init\+Type\+Def \texorpdfstring{$\ast$}{*}}]{s\+Config\+OC}{, }\item[{uint32\+\_\+t}]{TIM\+\_\+\+CHANNEL}{, }\item[{GPIO\+\_\+\+Type\+Def \texorpdfstring{$\ast$}{*}}]{GPIOx}{, }\item[{uint32\+\_\+t}]{GPIO\+\_\+\+PIN}{}\end{DoxyParamCaption})} @@ -60,11 +82,11 @@ HAL status. Definition at line \mbox{\hyperlink{general__tim_8c_source_l00226}{226}} of file \mbox{\hyperlink{general__tim_8c_source}{general\+\_\+tim.\+c}}. -\Hypertarget{group___m_y_l_i_b_s___t_i_m___o_c_gae2608ca8023e9a0713af0b4fbfbc1889}\label{group___m_y_l_i_b_s___t_i_m___o_c_gae2608ca8023e9a0713af0b4fbfbc1889} -\index{PWM/OC Channels tools@{PWM/OC Channels tools}!TIM\_OC\_Comparator\_Init@{TIM\_OC\_Comparator\_Init}} +\Hypertarget{group___m_y_l_i_b_s___t_i_m___o_c_gae2608ca8023e9a0713af0b4fbfbc1889}\index{PWM/OC Channels tools@{PWM/OC Channels tools}!TIM\_OC\_Comparator\_Init@{TIM\_OC\_Comparator\_Init}} \index{TIM\_OC\_Comparator\_Init@{TIM\_OC\_Comparator\_Init}!PWM/OC Channels tools@{PWM/OC Channels tools}} \doxysubsubsubsubsubsection{\texorpdfstring{TIM\_OC\_Comparator\_Init()}{TIM\_OC\_Comparator\_Init()}} -{\footnotesize\ttfamily HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+OC\+\_\+\+Comparator\+\_\+\+Init (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim, }\item[{uint32\+\_\+t}]{TIM\+\_\+\+CHANNEL }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___m_y_l_i_b_s___t_i_m___o_c_gae2608ca8023e9a0713af0b4fbfbc1889} +HAL\+\_\+\+Status\+Type\+Def TIM\+\_\+\+OC\+\_\+\+Comparator\+\_\+\+Init (\begin{DoxyParamCaption}\item[{TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}}]{htim}{, }\item[{uint32\+\_\+t}]{TIM\+\_\+\+CHANNEL}{}\end{DoxyParamCaption})} diff --git a/Doc/latex/group___t_i_m___i_n_i_t.tex b/Doc/latex/group___t_i_m___i_n_i_t.tex index cce8c68..8453b3d 100644 --- a/Doc/latex/group___t_i_m___i_n_i_t.tex +++ b/Doc/latex/group___t_i_m___i_n_i_t.tex @@ -1,4 +1,4 @@ -\doxysubsubsubsubsection{Init defines} +\doxysubsubsubsubsection{Init defines } \hypertarget{group___t_i_m___i_n_i_t}{}\label{group___t_i_m___i_n_i_t}\index{Init defines@{Init defines}} @@ -52,22 +52,24 @@ Collaboration diagram for Init defines\+:\nopagebreak +\label{doc-define-members} +\Hypertarget{group___t_i_m___i_n_i_t_doc-define-members} \doxysubsubsubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___t_i_m___i_n_i_t_ga23382b8f04b3e6db2c59dfa1ef5ea4a2}\label{group___t_i_m___i_n_i_t_ga23382b8f04b3e6db2c59dfa1ef5ea4a2} -\index{Init defines@{Init defines}!HAL\_TIM\_MODULE\_ENABLED@{HAL\_TIM\_MODULE\_ENABLED}} +\Hypertarget{group___t_i_m___i_n_i_t_ga23382b8f04b3e6db2c59dfa1ef5ea4a2}\index{Init defines@{Init defines}!HAL\_TIM\_MODULE\_ENABLED@{HAL\_TIM\_MODULE\_ENABLED}} \index{HAL\_TIM\_MODULE\_ENABLED@{HAL\_TIM\_MODULE\_ENABLED}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{HAL\_TIM\_MODULE\_ENABLED}{HAL\_TIM\_MODULE\_ENABLED}} -{\footnotesize\ttfamily \#define HAL\+\_\+\+TIM\+\_\+\+MODULE\+\_\+\+ENABLED} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga23382b8f04b3e6db2c59dfa1ef5ea4a2} +\#define HAL\+\_\+\+TIM\+\_\+\+MODULE\+\_\+\+ENABLED} -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00031}{31}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00032}{32}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga54a98c21365e0bc45b81555d2b101f2b}\label{group___t_i_m___i_n_i_t_ga54a98c21365e0bc45b81555d2b101f2b} -\index{Init defines@{Init defines}!USE\_TIM1@{USE\_TIM1}} +\Hypertarget{group___t_i_m___i_n_i_t_ga54a98c21365e0bc45b81555d2b101f2b}\index{Init defines@{Init defines}!USE\_TIM1@{USE\_TIM1}} \index{USE\_TIM1@{USE\_TIM1}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM1}{USE\_TIM1}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM1} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga54a98c21365e0bc45b81555d2b101f2b} +\#define USE\+\_\+\+TIM1} @@ -75,13 +77,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00031}{31}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00033}{33}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00034}{34}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga72535a44955b43cbcd56e25039ab32eb}\label{group___t_i_m___i_n_i_t_ga72535a44955b43cbcd56e25039ab32eb} -\index{Init defines@{Init defines}!USE\_TIM2@{USE\_TIM2}} +\Hypertarget{group___t_i_m___i_n_i_t_ga72535a44955b43cbcd56e25039ab32eb}\index{Init defines@{Init defines}!USE\_TIM2@{USE\_TIM2}} \index{USE\_TIM2@{USE\_TIM2}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM2}{USE\_TIM2}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM2} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga72535a44955b43cbcd56e25039ab32eb} +\#define USE\+\_\+\+TIM2} @@ -89,13 +91,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00033}{33}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00034}{34}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00035}{35}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga5b5685a43273b6e37242a4aba3ee0617}\label{group___t_i_m___i_n_i_t_ga5b5685a43273b6e37242a4aba3ee0617} -\index{Init defines@{Init defines}!USE\_TIM3@{USE\_TIM3}} +\Hypertarget{group___t_i_m___i_n_i_t_ga5b5685a43273b6e37242a4aba3ee0617}\index{Init defines@{Init defines}!USE\_TIM3@{USE\_TIM3}} \index{USE\_TIM3@{USE\_TIM3}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM3}{USE\_TIM3}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM3} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga5b5685a43273b6e37242a4aba3ee0617} +\#define USE\+\_\+\+TIM3} @@ -103,13 +105,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00034}{34}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00035}{35}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00036}{36}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga1493b39c9214501180b81b4c892f9be0}\label{group___t_i_m___i_n_i_t_ga1493b39c9214501180b81b4c892f9be0} -\index{Init defines@{Init defines}!USE\_TIM4@{USE\_TIM4}} +\Hypertarget{group___t_i_m___i_n_i_t_ga1493b39c9214501180b81b4c892f9be0}\index{Init defines@{Init defines}!USE\_TIM4@{USE\_TIM4}} \index{USE\_TIM4@{USE\_TIM4}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM4}{USE\_TIM4}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM4} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga1493b39c9214501180b81b4c892f9be0} +\#define USE\+\_\+\+TIM4} @@ -117,13 +119,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00035}{35}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00036}{36}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00037}{37}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga252f4fba93fc265110e83760e0590af3}\label{group___t_i_m___i_n_i_t_ga252f4fba93fc265110e83760e0590af3} -\index{Init defines@{Init defines}!USE\_TIM5@{USE\_TIM5}} +\Hypertarget{group___t_i_m___i_n_i_t_ga252f4fba93fc265110e83760e0590af3}\index{Init defines@{Init defines}!USE\_TIM5@{USE\_TIM5}} \index{USE\_TIM5@{USE\_TIM5}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM5}{USE\_TIM5}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM5} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga252f4fba93fc265110e83760e0590af3} +\#define USE\+\_\+\+TIM5} @@ -131,13 +133,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00036}{36}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00037}{37}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00038}{38}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga8fe31b98160627d19038222910be3f46}\label{group___t_i_m___i_n_i_t_ga8fe31b98160627d19038222910be3f46} -\index{Init defines@{Init defines}!USE\_TIM6@{USE\_TIM6}} +\Hypertarget{group___t_i_m___i_n_i_t_ga8fe31b98160627d19038222910be3f46}\index{Init defines@{Init defines}!USE\_TIM6@{USE\_TIM6}} \index{USE\_TIM6@{USE\_TIM6}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM6}{USE\_TIM6}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM6} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga8fe31b98160627d19038222910be3f46} +\#define USE\+\_\+\+TIM6} @@ -145,13 +147,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00037}{37}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00038}{38}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00039}{39}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga7cdc54cc8cbbb6e9f60001f1e3e6ec67}\label{group___t_i_m___i_n_i_t_ga7cdc54cc8cbbb6e9f60001f1e3e6ec67} -\index{Init defines@{Init defines}!USE\_TIM7@{USE\_TIM7}} +\Hypertarget{group___t_i_m___i_n_i_t_ga7cdc54cc8cbbb6e9f60001f1e3e6ec67}\index{Init defines@{Init defines}!USE\_TIM7@{USE\_TIM7}} \index{USE\_TIM7@{USE\_TIM7}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM7}{USE\_TIM7}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM7} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga7cdc54cc8cbbb6e9f60001f1e3e6ec67} +\#define USE\+\_\+\+TIM7} @@ -159,13 +161,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00038}{38}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00039}{39}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00040}{40}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga28ba33d7c6bf22821dafa5bcee4854be}\label{group___t_i_m___i_n_i_t_ga28ba33d7c6bf22821dafa5bcee4854be} -\index{Init defines@{Init defines}!USE\_TIM8@{USE\_TIM8}} +\Hypertarget{group___t_i_m___i_n_i_t_ga28ba33d7c6bf22821dafa5bcee4854be}\index{Init defines@{Init defines}!USE\_TIM8@{USE\_TIM8}} \index{USE\_TIM8@{USE\_TIM8}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM8}{USE\_TIM8}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM8} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga28ba33d7c6bf22821dafa5bcee4854be} +\#define USE\+\_\+\+TIM8} @@ -173,13 +175,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00039}{39}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00040}{40}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00041}{41}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_gaac627c0e98c9594cc41b1b46eb39e44a}\label{group___t_i_m___i_n_i_t_gaac627c0e98c9594cc41b1b46eb39e44a} -\index{Init defines@{Init defines}!USE\_TIM9@{USE\_TIM9}} +\Hypertarget{group___t_i_m___i_n_i_t_gaac627c0e98c9594cc41b1b46eb39e44a}\index{Init defines@{Init defines}!USE\_TIM9@{USE\_TIM9}} \index{USE\_TIM9@{USE\_TIM9}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM9}{USE\_TIM9}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM9} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_gaac627c0e98c9594cc41b1b46eb39e44a} +\#define USE\+\_\+\+TIM9} @@ -187,13 +189,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00040}{40}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00041}{41}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00042}{42}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga98c0691052d1da2c4053dd3586ff7ce9}\label{group___t_i_m___i_n_i_t_ga98c0691052d1da2c4053dd3586ff7ce9} -\index{Init defines@{Init defines}!USE\_TIM10@{USE\_TIM10}} +\Hypertarget{group___t_i_m___i_n_i_t_ga98c0691052d1da2c4053dd3586ff7ce9}\index{Init defines@{Init defines}!USE\_TIM10@{USE\_TIM10}} \index{USE\_TIM10@{USE\_TIM10}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM10}{USE\_TIM10}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM10} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga98c0691052d1da2c4053dd3586ff7ce9} +\#define USE\+\_\+\+TIM10} @@ -201,13 +203,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00041}{41}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00042}{42}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00043}{43}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga176c97f06ebcf14e06e5c5bdbfac44c2}\label{group___t_i_m___i_n_i_t_ga176c97f06ebcf14e06e5c5bdbfac44c2} -\index{Init defines@{Init defines}!USE\_TIM11@{USE\_TIM11}} +\Hypertarget{group___t_i_m___i_n_i_t_ga176c97f06ebcf14e06e5c5bdbfac44c2}\index{Init defines@{Init defines}!USE\_TIM11@{USE\_TIM11}} \index{USE\_TIM11@{USE\_TIM11}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM11}{USE\_TIM11}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM11} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga176c97f06ebcf14e06e5c5bdbfac44c2} +\#define USE\+\_\+\+TIM11} @@ -215,13 +217,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00042}{42}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00043}{43}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00044}{44}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga4e2b0e6cdf9eed74581b575c3fd9516b}\label{group___t_i_m___i_n_i_t_ga4e2b0e6cdf9eed74581b575c3fd9516b} -\index{Init defines@{Init defines}!USE\_TIM12@{USE\_TIM12}} +\Hypertarget{group___t_i_m___i_n_i_t_ga4e2b0e6cdf9eed74581b575c3fd9516b}\index{Init defines@{Init defines}!USE\_TIM12@{USE\_TIM12}} \index{USE\_TIM12@{USE\_TIM12}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM12}{USE\_TIM12}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM12} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga4e2b0e6cdf9eed74581b575c3fd9516b} +\#define USE\+\_\+\+TIM12} @@ -229,13 +231,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00043}{43}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00044}{44}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00045}{45}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_gaf48ef87650517652ddec039a189507ac}\label{group___t_i_m___i_n_i_t_gaf48ef87650517652ddec039a189507ac} -\index{Init defines@{Init defines}!USE\_TIM13@{USE\_TIM13}} +\Hypertarget{group___t_i_m___i_n_i_t_gaf48ef87650517652ddec039a189507ac}\index{Init defines@{Init defines}!USE\_TIM13@{USE\_TIM13}} \index{USE\_TIM13@{USE\_TIM13}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM13}{USE\_TIM13}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM13} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_gaf48ef87650517652ddec039a189507ac} +\#define USE\+\_\+\+TIM13} @@ -243,13 +245,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00044}{44}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00045}{45}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00046}{46}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{group___t_i_m___i_n_i_t_ga9ae40be31d5271abe3e49f896d916d5c}\label{group___t_i_m___i_n_i_t_ga9ae40be31d5271abe3e49f896d916d5c} -\index{Init defines@{Init defines}!USE\_TIM14@{USE\_TIM14}} +\Hypertarget{group___t_i_m___i_n_i_t_ga9ae40be31d5271abe3e49f896d916d5c}\index{Init defines@{Init defines}!USE\_TIM14@{USE\_TIM14}} \index{USE\_TIM14@{USE\_TIM14}!Init defines@{Init defines}} \doxysubsubsubsubsubsubsection{\texorpdfstring{USE\_TIM14}{USE\_TIM14}} -{\footnotesize\ttfamily \#define USE\+\_\+\+TIM14} +{\footnotesize\ttfamily \label{group___t_i_m___i_n_i_t_ga9ae40be31d5271abe3e49f896d916d5c} +\#define USE\+\_\+\+TIM14} @@ -257,5 +259,5 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00045}{45}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00046}{46}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00047}{47}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. diff --git a/Doc/latex/group___t_r_a_c_e.tex b/Doc/latex/group___t_r_a_c_e.tex index 96c475c..3dbdd57 100644 --- a/Doc/latex/group___t_r_a_c_e.tex +++ b/Doc/latex/group___t_r_a_c_e.tex @@ -1,4 +1,4 @@ -\doxysubsubsection{Trace defines} +\doxysubsubsection{Trace defines } \hypertarget{group___t_r_a_c_e}{}\label{group___t_r_a_c_e}\index{Trace defines@{Trace defines}} diff --git a/Doc/latex/group___t_r_a_c_e___c_o_n_f_i_g.tex b/Doc/latex/group___t_r_a_c_e___c_o_n_f_i_g.tex index 500562a..cf8e2ac 100644 --- a/Doc/latex/group___t_r_a_c_e___c_o_n_f_i_g.tex +++ b/Doc/latex/group___t_r_a_c_e___c_o_n_f_i_g.tex @@ -1,4 +1,4 @@ -\doxysubsubsection{Trace configs} +\doxysubsubsection{Trace configs } \hypertarget{group___t_r_a_c_e___c_o_n_f_i_g}{}\label{group___t_r_a_c_e___c_o_n_f_i_g}\index{Trace configs@{Trace configs}} @@ -54,12 +54,14 @@ Collaboration diagram for Trace configs\+:\nopagebreak +\label{doc-define-members} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_doc-define-members} \doxysubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gac9eaedc31ab023ce7d6403999216e496}\label{group___t_r_a_c_e___c_o_n_f_i_g_gac9eaedc31ab023ce7d6403999216e496} -\index{Trace configs@{Trace configs}!TRACKERS\_ENABLE@{TRACKERS\_ENABLE}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gac9eaedc31ab023ce7d6403999216e496}\index{Trace configs@{Trace configs}!TRACKERS\_ENABLE@{TRACKERS\_ENABLE}} \index{TRACKERS\_ENABLE@{TRACKERS\_ENABLE}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{TRACKERS\_ENABLE}{TRACKERS\_ENABLE}} -{\footnotesize\ttfamily \#define TRACKERS\+\_\+\+ENABLE} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_gac9eaedc31ab023ce7d6403999216e496} +\#define TRACKERS\+\_\+\+ENABLE} @@ -69,11 +71,11 @@ Collaboration diagram for Trace configs\+:\nopagebreak Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00025}{25}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga76936505ca200d2e61226b7ba68f27c6}\label{group___t_r_a_c_e___c_o_n_f_i_g_ga76936505ca200d2e61226b7ba68f27c6} -\index{Trace configs@{Trace configs}!SERIAL\_TRACE\_ENABLE@{SERIAL\_TRACE\_ENABLE}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga76936505ca200d2e61226b7ba68f27c6}\index{Trace configs@{Trace configs}!SERIAL\_TRACE\_ENABLE@{SERIAL\_TRACE\_ENABLE}} \index{SERIAL\_TRACE\_ENABLE@{SERIAL\_TRACE\_ENABLE}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{SERIAL\_TRACE\_ENABLE}{SERIAL\_TRACE\_ENABLE}} -{\footnotesize\ttfamily \#define SERIAL\+\_\+\+TRACE\+\_\+\+ENABLE} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_ga76936505ca200d2e61226b7ba68f27c6} +\#define SERIAL\+\_\+\+TRACE\+\_\+\+ENABLE} @@ -83,11 +85,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00025}{25}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00026}{26}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga00ff2175bdc1fb11c8ec970ea3010dd8}\label{group___t_r_a_c_e___c_o_n_f_i_g_ga00ff2175bdc1fb11c8ec970ea3010dd8} -\index{Trace configs@{Trace configs}!RTT\_TRACE\_ENABLE@{RTT\_TRACE\_ENABLE}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga00ff2175bdc1fb11c8ec970ea3010dd8}\index{Trace configs@{Trace configs}!RTT\_TRACE\_ENABLE@{RTT\_TRACE\_ENABLE}} \index{RTT\_TRACE\_ENABLE@{RTT\_TRACE\_ENABLE}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{RTT\_TRACE\_ENABLE}{RTT\_TRACE\_ENABLE}} -{\footnotesize\ttfamily \#define RTT\+\_\+\+TRACE\+\_\+\+ENABLE} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_ga00ff2175bdc1fb11c8ec970ea3010dd8} +\#define RTT\+\_\+\+TRACE\+\_\+\+ENABLE} @@ -97,11 +99,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00026}{26}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00027}{27}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gab8db9704b5d11858aa879689b9d36336}\label{group___t_r_a_c_e___c_o_n_f_i_g_gab8db9704b5d11858aa879689b9d36336} -\index{Trace configs@{Trace configs}!SWO\_TRACE\_ENABLE@{SWO\_TRACE\_ENABLE}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gab8db9704b5d11858aa879689b9d36336}\index{Trace configs@{Trace configs}!SWO\_TRACE\_ENABLE@{SWO\_TRACE\_ENABLE}} \index{SWO\_TRACE\_ENABLE@{SWO\_TRACE\_ENABLE}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{SWO\_TRACE\_ENABLE}{SWO\_TRACE\_ENABLE}} -{\footnotesize\ttfamily \#define SWO\+\_\+\+TRACE\+\_\+\+ENABLE} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_gab8db9704b5d11858aa879689b9d36336} +\#define SWO\+\_\+\+TRACE\+\_\+\+ENABLE} @@ -111,11 +113,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00027}{27}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00028}{28}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga0b87e0d3bf5853bcbb0b66a7c48fdc05}\label{group___t_r_a_c_e___c_o_n_f_i_g_ga0b87e0d3bf5853bcbb0b66a7c48fdc05} -\index{Trace configs@{Trace configs}!LOG\_LEVEL@{LOG\_LEVEL}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga0b87e0d3bf5853bcbb0b66a7c48fdc05}\index{Trace configs@{Trace configs}!LOG\_LEVEL@{LOG\_LEVEL}} \index{LOG\_LEVEL@{LOG\_LEVEL}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{LOG\_LEVEL}{LOG\_LEVEL}} -{\footnotesize\ttfamily \#define LOG\+\_\+\+LEVEL~1} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_ga0b87e0d3bf5853bcbb0b66a7c48fdc05} +\#define LOG\+\_\+\+LEVEL~1} @@ -130,11 +132,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00028}{28}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00035}{35}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}\label{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3} -\index{Trace configs@{Trace configs}!RTT\_FLASH\_BUFFER\_SIZE@{RTT\_FLASH\_BUFFER\_SIZE}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}\index{Trace configs@{Trace configs}!RTT\_FLASH\_BUFFER\_SIZE@{RTT\_FLASH\_BUFFER\_SIZE}} \index{RTT\_FLASH\_BUFFER\_SIZE@{RTT\_FLASH\_BUFFER\_SIZE}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{RTT\_FLASH\_BUFFER\_SIZE}{RTT\_FLASH\_BUFFER\_SIZE}} -{\footnotesize\ttfamily \#define RTT\+\_\+\+FLASH\+\_\+\+BUFFER\+\_\+\+SIZE~1024} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3} +\#define RTT\+\_\+\+FLASH\+\_\+\+BUFFER\+\_\+\+SIZE~1024} @@ -144,11 +146,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00035}{35}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00037}{37}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga3bc1b76864e1d32cbdd174d4caae7724}\label{group___t_r_a_c_e___c_o_n_f_i_g_ga3bc1b76864e1d32cbdd174d4caae7724} -\index{Trace configs@{Trace configs}!RTT\_FLASH\_SECTOR@{RTT\_FLASH\_SECTOR}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga3bc1b76864e1d32cbdd174d4caae7724}\index{Trace configs@{Trace configs}!RTT\_FLASH\_SECTOR@{RTT\_FLASH\_SECTOR}} \index{RTT\_FLASH\_SECTOR@{RTT\_FLASH\_SECTOR}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{RTT\_FLASH\_SECTOR}{RTT\_FLASH\_SECTOR}} -{\footnotesize\ttfamily \#define RTT\+\_\+\+FLASH\+\_\+\+SECTOR~FLASH\+\_\+\+SECTOR\+\_\+11} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_ga3bc1b76864e1d32cbdd174d4caae7724} +\#define RTT\+\_\+\+FLASH\+\_\+\+SECTOR~FLASH\+\_\+\+SECTOR\+\_\+11} @@ -158,11 +160,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00037}{37}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00038}{38}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga8e56f75d3ab8a89ddde1404ae23c3297}\label{group___t_r_a_c_e___c_o_n_f_i_g_ga8e56f75d3ab8a89ddde1404ae23c3297} -\index{Trace configs@{Trace configs}!RTT\_FLASH\_SECTOR\_START@{RTT\_FLASH\_SECTOR\_START}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga8e56f75d3ab8a89ddde1404ae23c3297}\index{Trace configs@{Trace configs}!RTT\_FLASH\_SECTOR\_START@{RTT\_FLASH\_SECTOR\_START}} \index{RTT\_FLASH\_SECTOR\_START@{RTT\_FLASH\_SECTOR\_START}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{RTT\_FLASH\_SECTOR\_START}{RTT\_FLASH\_SECTOR\_START}} -{\footnotesize\ttfamily \#define RTT\+\_\+\+FLASH\+\_\+\+SECTOR\+\_\+\+START~0x080\+E0000} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_ga8e56f75d3ab8a89ddde1404ae23c3297} +\#define RTT\+\_\+\+FLASH\+\_\+\+SECTOR\+\_\+\+START~0x080\+E0000} @@ -172,11 +174,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00038}{38}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00039}{39}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gafeca0be3688dea07ff443f894668003d}\label{group___t_r_a_c_e___c_o_n_f_i_g_gafeca0be3688dea07ff443f894668003d} -\index{Trace configs@{Trace configs}!RTT\_FLASH\_SECTOR\_END@{RTT\_FLASH\_SECTOR\_END}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gafeca0be3688dea07ff443f894668003d}\index{Trace configs@{Trace configs}!RTT\_FLASH\_SECTOR\_END@{RTT\_FLASH\_SECTOR\_END}} \index{RTT\_FLASH\_SECTOR\_END@{RTT\_FLASH\_SECTOR\_END}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{RTT\_FLASH\_SECTOR\_END}{RTT\_FLASH\_SECTOR\_END}} -{\footnotesize\ttfamily \#define RTT\+\_\+\+FLASH\+\_\+\+SECTOR\+\_\+\+END~0x080\+FFFFF} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_gafeca0be3688dea07ff443f894668003d} +\#define RTT\+\_\+\+FLASH\+\_\+\+SECTOR\+\_\+\+END~0x080\+FFFFF} @@ -186,11 +188,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00039}{39}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00040}{40}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga47f454f804b4dbc26cae079e8d8641e6}\label{group___t_r_a_c_e___c_o_n_f_i_g_ga47f454f804b4dbc26cae079e8d8641e6} -\index{Trace configs@{Trace configs}!HARDFAULT\_SERIAL\_TRACE@{HARDFAULT\_SERIAL\_TRACE}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga47f454f804b4dbc26cae079e8d8641e6}\index{Trace configs@{Trace configs}!HARDFAULT\_SERIAL\_TRACE@{HARDFAULT\_SERIAL\_TRACE}} \index{HARDFAULT\_SERIAL\_TRACE@{HARDFAULT\_SERIAL\_TRACE}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{HARDFAULT\_SERIAL\_TRACE}{HARDFAULT\_SERIAL\_TRACE}} -{\footnotesize\ttfamily \#define HARDFAULT\+\_\+\+SERIAL\+\_\+\+TRACE} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_ga47f454f804b4dbc26cae079e8d8641e6} +\#define HARDFAULT\+\_\+\+SERIAL\+\_\+\+TRACE} @@ -200,11 +202,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00040}{40}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00043}{43}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gadc960255719c7eff4bdfaa850be9b313}\label{group___t_r_a_c_e___c_o_n_f_i_g_gadc960255719c7eff4bdfaa850be9b313} -\index{Trace configs@{Trace configs}!HF\_RTT\_TAG\_BASE@{HF\_RTT\_TAG\_BASE}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gadc960255719c7eff4bdfaa850be9b313}\index{Trace configs@{Trace configs}!HF\_RTT\_TAG\_BASE@{HF\_RTT\_TAG\_BASE}} \index{HF\_RTT\_TAG\_BASE@{HF\_RTT\_TAG\_BASE}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{HF\_RTT\_TAG\_BASE}{HF\_RTT\_TAG\_BASE}} -{\footnotesize\ttfamily \#define HF\+\_\+\+RTT\+\_\+\+TAG\+\_\+\+BASE~0x\+DEAD0000} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_gadc960255719c7eff4bdfaa850be9b313} +\#define HF\+\_\+\+RTT\+\_\+\+TAG\+\_\+\+BASE~0x\+DEAD0000} @@ -214,11 +216,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00043}{43}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00044}{44}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gafcc7ea03d4df8f1909e580b519a7f3ca}\label{group___t_r_a_c_e___c_o_n_f_i_g_gafcc7ea03d4df8f1909e580b519a7f3ca} -\index{Trace configs@{Trace configs}!HF\_RTT\_TAIL\_SIZE@{HF\_RTT\_TAIL\_SIZE}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gafcc7ea03d4df8f1909e580b519a7f3ca}\index{Trace configs@{Trace configs}!HF\_RTT\_TAIL\_SIZE@{HF\_RTT\_TAIL\_SIZE}} \index{HF\_RTT\_TAIL\_SIZE@{HF\_RTT\_TAIL\_SIZE}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{HF\_RTT\_TAIL\_SIZE}{HF\_RTT\_TAIL\_SIZE}} -{\footnotesize\ttfamily \#define HF\+\_\+\+RTT\+\_\+\+TAIL\+\_\+\+SIZE~\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\+\_\+\+FLASH\+\_\+\+BUFFER\+\_\+\+SIZE}}} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_gafcc7ea03d4df8f1909e580b519a7f3ca} +\#define HF\+\_\+\+RTT\+\_\+\+TAIL\+\_\+\+SIZE~\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\+\_\+\+FLASH\+\_\+\+BUFFER\+\_\+\+SIZE}}} @@ -228,11 +230,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00044}{44}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00045}{45}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gaa31234688b333a505aaa57b8ecdedf5b}\label{group___t_r_a_c_e___c_o_n_f_i_g_gaa31234688b333a505aaa57b8ecdedf5b} -\index{Trace configs@{Trace configs}!HF\_STACK\_DUMP\_WORDS@{HF\_STACK\_DUMP\_WORDS}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_gaa31234688b333a505aaa57b8ecdedf5b}\index{Trace configs@{Trace configs}!HF\_STACK\_DUMP\_WORDS@{HF\_STACK\_DUMP\_WORDS}} \index{HF\_STACK\_DUMP\_WORDS@{HF\_STACK\_DUMP\_WORDS}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{HF\_STACK\_DUMP\_WORDS}{HF\_STACK\_DUMP\_WORDS}} -{\footnotesize\ttfamily \#define HF\+\_\+\+STACK\+\_\+\+DUMP\+\_\+\+WORDS~32} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_gaa31234688b333a505aaa57b8ecdedf5b} +\#define HF\+\_\+\+STACK\+\_\+\+DUMP\+\_\+\+WORDS~32} @@ -242,11 +244,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00045}{45}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00046}{46}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga0c602733a4a359bf8c095d71cd4d0f63}\label{group___t_r_a_c_e___c_o_n_f_i_g_ga0c602733a4a359bf8c095d71cd4d0f63} -\index{Trace configs@{Trace configs}!HF\_FLASH\_ADDR@{HF\_FLASH\_ADDR}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga0c602733a4a359bf8c095d71cd4d0f63}\index{Trace configs@{Trace configs}!HF\_FLASH\_ADDR@{HF\_FLASH\_ADDR}} \index{HF\_FLASH\_ADDR@{HF\_FLASH\_ADDR}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{HF\_FLASH\_ADDR}{HF\_FLASH\_ADDR}} -{\footnotesize\ttfamily \#define HF\+\_\+\+FLASH\+\_\+\+ADDR~((uint32\+\_\+t)0x080\+FF000)} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_ga0c602733a4a359bf8c095d71cd4d0f63} +\#define HF\+\_\+\+FLASH\+\_\+\+ADDR~((uint32\+\_\+t)0x080\+FF000)} @@ -256,11 +258,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00046}{46}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00047}{47}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga92d0d14732edb7dfa21d483304bdb051}\label{group___t_r_a_c_e___c_o_n_f_i_g_ga92d0d14732edb7dfa21d483304bdb051} -\index{Trace configs@{Trace configs}!HF\_RAM\_END@{HF\_RAM\_END}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga92d0d14732edb7dfa21d483304bdb051}\index{Trace configs@{Trace configs}!HF\_RAM\_END@{HF\_RAM\_END}} \index{HF\_RAM\_END@{HF\_RAM\_END}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{HF\_RAM\_END}{HF\_RAM\_END}} -{\footnotesize\ttfamily \#define HF\+\_\+\+RAM\+\_\+\+END~0x20030000} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_ga92d0d14732edb7dfa21d483304bdb051} +\#define HF\+\_\+\+RAM\+\_\+\+END~0x20030000} @@ -270,11 +272,11 @@ Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00047}{47}} of fil Definition at line \mbox{\hyperlink{mylibs__config_8h_source_l00048}{48}} of file \mbox{\hyperlink{mylibs__config_8h_source}{mylibs\+\_\+config.\+h}}. -\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga4222e0e400ad81737cefcabeb03fd23b}\label{group___t_r_a_c_e___c_o_n_f_i_g_ga4222e0e400ad81737cefcabeb03fd23b} -\index{Trace configs@{Trace configs}!GPIO\_TRACE\_ENABLE@{GPIO\_TRACE\_ENABLE}} +\Hypertarget{group___t_r_a_c_e___c_o_n_f_i_g_ga4222e0e400ad81737cefcabeb03fd23b}\index{Trace configs@{Trace configs}!GPIO\_TRACE\_ENABLE@{GPIO\_TRACE\_ENABLE}} \index{GPIO\_TRACE\_ENABLE@{GPIO\_TRACE\_ENABLE}!Trace configs@{Trace configs}} \doxysubsubsubsubsection{\texorpdfstring{GPIO\_TRACE\_ENABLE}{GPIO\_TRACE\_ENABLE}} -{\footnotesize\ttfamily \#define GPIO\+\_\+\+TRACE\+\_\+\+ENABLE} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___c_o_n_f_i_g_ga4222e0e400ad81737cefcabeb03fd23b} +\#define GPIO\+\_\+\+TRACE\+\_\+\+ENABLE} diff --git a/Doc/latex/group___t_r_a_c_e___g_p_i_o.tex b/Doc/latex/group___t_r_a_c_e___g_p_i_o.tex index 1b2279c..c8a24d6 100644 --- a/Doc/latex/group___t_r_a_c_e___g_p_i_o.tex +++ b/Doc/latex/group___t_r_a_c_e___g_p_i_o.tex @@ -1,4 +1,4 @@ -\doxysubsubsubsection{GPIO trace defines} +\doxysubsubsubsection{GPIO trace defines } \hypertarget{group___t_r_a_c_e___g_p_i_o}{}\label{group___t_r_a_c_e___g_p_i_o}\index{GPIO trace defines@{GPIO trace defines}} @@ -15,9 +15,9 @@ Collaboration diagram for GPIO trace defines\+:\nopagebreak \doxysubsubsubsubsubsection*{Macros} \begin{DoxyCompactItemize} \item -\#define \mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga69741d88c991112e99fe7a62e025108a}{TRACE\+\_\+\+GPIO\+\_\+\+RESET}}(\+\_\+gpio\+\_\+, \+\_\+pin\+\_\+)~(\+\_\+gpio\+\_\+)-\/$>$BSRR = ((\+\_\+pin\+\_\+)$<$$<$16) +\#define \mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga69741d88c991112e99fe7a62e025108a}{TRACE\+\_\+\+GPIO\+\_\+\+RESET}}(\+\_\+gpio\+\_\+, \+\_\+pin\+\_\+) \begin{DoxyCompactList}\small\item\em Сбросить указанную ножку GPIO. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga02a6a7b273766121db8ad4a1371373eb}{TRACE\+\_\+\+GPIO\+\_\+\+SET}}(\+\_\+gpio\+\_\+, \+\_\+pin\+\_\+)~(\+\_\+gpio\+\_\+)-\/$>$BSRR = (((\+\_\+pin\+\_\+))) +\#define \mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga02a6a7b273766121db8ad4a1371373eb}{TRACE\+\_\+\+GPIO\+\_\+\+SET}}(\+\_\+gpio\+\_\+, \+\_\+pin\+\_\+) \begin{DoxyCompactList}\small\item\em Установить указанную ножку GPIO. \end{DoxyCompactList}\end{DoxyCompactItemize} @@ -28,17 +28,23 @@ Collaboration diagram for GPIO trace defines\+:\nopagebreak \begin{DoxyItemize} \item \doxylink{group___t_r_a_c_e___g_p_i_o_ga69741d88c991112e99fe7a62e025108a}{TRACE\+\_\+\+GPIO\+\_\+\+RESET()} -\/ для сброса ножки GPIO (через BSRR) \item \doxylink{group___t_r_a_c_e___g_p_i_o_ga02a6a7b273766121db8ad4a1371373eb}{TRACE\+\_\+\+GPIO\+\_\+\+SET()} -\/ для выставления ножки GPIO (через BSRR) -\item Если трассировка \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_ga4222e0e400ad81737cefcabeb03fd23b}{GPIO\+\_\+\+TRACE\+\_\+\+ENABLE} отключена, то все дефайны определяются как \textquotesingle{}ничего\textquotesingle{} и на производительность кода не влияют ~\newline - +\item Если трассировка \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_ga4222e0e400ad81737cefcabeb03fd23b}{GPIO\+\_\+\+TRACE\+\_\+\+ENABLE} отключена, то все дефайны определяются как \textquotesingle{}ничего\textquotesingle{} и на производительность кода не влияют \end{DoxyItemize} +\label{doc-define-members} +\Hypertarget{group___t_r_a_c_e___g_p_i_o_doc-define-members} \doxysubsubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___t_r_a_c_e___g_p_i_o_ga69741d88c991112e99fe7a62e025108a}\label{group___t_r_a_c_e___g_p_i_o_ga69741d88c991112e99fe7a62e025108a} -\index{GPIO trace defines@{GPIO trace defines}!TRACE\_GPIO\_RESET@{TRACE\_GPIO\_RESET}} +\Hypertarget{group___t_r_a_c_e___g_p_i_o_ga69741d88c991112e99fe7a62e025108a}\index{GPIO trace defines@{GPIO trace defines}!TRACE\_GPIO\_RESET@{TRACE\_GPIO\_RESET}} \index{TRACE\_GPIO\_RESET@{TRACE\_GPIO\_RESET}!GPIO trace defines@{GPIO trace defines}} \doxysubsubsubsubsubsection{\texorpdfstring{TRACE\_GPIO\_RESET}{TRACE\_GPIO\_RESET}} -{\footnotesize\ttfamily \#define TRACE\+\_\+\+GPIO\+\_\+\+RESET(\begin{DoxyParamCaption}\item[{}]{\+\_\+gpio\+\_\+, }\item[{}]{\+\_\+pin\+\_\+ }\end{DoxyParamCaption})~(\+\_\+gpio\+\_\+)-\/$>$BSRR = ((\+\_\+pin\+\_\+)$<$$<$16)} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___g_p_i_o_ga69741d88c991112e99fe7a62e025108a} +\#define TRACE\+\_\+\+GPIO\+\_\+\+RESET(\begin{DoxyParamCaption}\item[{}]{\+\_\+gpio\+\_\+}{, }\item[{}]{\+\_\+pin\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_gpio\_)-\/>BSRR\ =\ ((\_pin\_)<<16)} + +\end{DoxyCode} Сбросить указанную ножку GPIO. @@ -56,14 +62,19 @@ Collaboration diagram for GPIO trace defines\+:\nopagebreak \item GPIO\+\_\+\+TRACE\+\_\+\+ENABLE определён -\/ устанавливает бит сброса через BSRR (({\itshape pin})\texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<}16) \end{DoxyItemize} -Definition at line \mbox{\hyperlink{trace_8h_source_l00142}{142}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00155}{155}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{group___t_r_a_c_e___g_p_i_o_ga02a6a7b273766121db8ad4a1371373eb}\label{group___t_r_a_c_e___g_p_i_o_ga02a6a7b273766121db8ad4a1371373eb} -\index{GPIO trace defines@{GPIO trace defines}!TRACE\_GPIO\_SET@{TRACE\_GPIO\_SET}} +\Hypertarget{group___t_r_a_c_e___g_p_i_o_ga02a6a7b273766121db8ad4a1371373eb}\index{GPIO trace defines@{GPIO trace defines}!TRACE\_GPIO\_SET@{TRACE\_GPIO\_SET}} \index{TRACE\_GPIO\_SET@{TRACE\_GPIO\_SET}!GPIO trace defines@{GPIO trace defines}} \doxysubsubsubsubsubsection{\texorpdfstring{TRACE\_GPIO\_SET}{TRACE\_GPIO\_SET}} -{\footnotesize\ttfamily \#define TRACE\+\_\+\+GPIO\+\_\+\+SET(\begin{DoxyParamCaption}\item[{}]{\+\_\+gpio\+\_\+, }\item[{}]{\+\_\+pin\+\_\+ }\end{DoxyParamCaption})~(\+\_\+gpio\+\_\+)-\/$>$BSRR = (((\+\_\+pin\+\_\+)))} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___g_p_i_o_ga02a6a7b273766121db8ad4a1371373eb} +\#define TRACE\+\_\+\+GPIO\+\_\+\+SET(\begin{DoxyParamCaption}\item[{}]{\+\_\+gpio\+\_\+}{, }\item[{}]{\+\_\+pin\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_gpio\_)-\/>BSRR\ =\ (((\_pin\_)))} + +\end{DoxyCode} Установить указанную ножку GPIO. @@ -81,5 +92,5 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00142}{142}} of file \mbox{ \item GPIO\+\_\+\+TRACE\+\_\+\+ENABLE определён -\/ устанавливает бит установки через BSRR ({\itshape pin}) \end{DoxyItemize} -Definition at line \mbox{\hyperlink{trace_8h_source_l00141}{141}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00154}{154}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. diff --git a/Doc/latex/group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.tex b/Doc/latex/group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.tex index 612592f..0c67ade 100644 --- a/Doc/latex/group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.tex +++ b/Doc/latex/group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.tex @@ -1,4 +1,4 @@ -\doxysubsubsubsection{Hardfault trace defines} +\doxysubsubsubsection{Hardfault trace defines } \hypertarget{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t}{}\label{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t}\index{Hardfault trace defines@{Hardfault trace defines}} @@ -78,12 +78,14 @@ struct \mbox{\hyperlink{struct_h_f___stack_frame__t}{HF\+\_\+\+Stack\+Frame\+\_\ \end{DoxyCode} +\label{doc-func-members} +\Hypertarget{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_doc-func-members} \doxysubsubsubsubsection{Function Documentation} -\Hypertarget{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_ga03f8b6f3b537ee1c8e91065c60db504f}\label{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_ga03f8b6f3b537ee1c8e91065c60db504f} -\index{Hardfault trace defines@{Hardfault trace defines}!HF\_CheckRecovered@{HF\_CheckRecovered}} +\Hypertarget{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_ga03f8b6f3b537ee1c8e91065c60db504f}\index{Hardfault trace defines@{Hardfault trace defines}!HF\_CheckRecovered@{HF\_CheckRecovered}} \index{HF\_CheckRecovered@{HF\_CheckRecovered}!Hardfault trace defines@{Hardfault trace defines}} \doxysubsubsubsubsubsection{\texorpdfstring{HF\_CheckRecovered()}{HF\_CheckRecovered()}} -{\footnotesize\ttfamily \+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE int HF\+\_\+\+Check\+Recovered (\begin{DoxyParamCaption}\item[{int}]{erase }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_ga03f8b6f3b537ee1c8e91065c60db504f} +\+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE int HF\+\_\+\+Check\+Recovered (\begin{DoxyParamCaption}\item[{int}]{erase}{}\end{DoxyParamCaption})} @@ -103,13 +105,13 @@ int \end{DoxyNote} -Definition at line \mbox{\hyperlink{trace_8h_source_l00486}{486}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00499}{499}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_gadd8e10e7ec3b0204f7f92062ecd452f7}\label{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_gadd8e10e7ec3b0204f7f92062ecd452f7} -\index{Hardfault trace defines@{Hardfault trace defines}!HF\_HandleFault@{HF\_HandleFault}} +\Hypertarget{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_gadd8e10e7ec3b0204f7f92062ecd452f7}\index{Hardfault trace defines@{Hardfault trace defines}!HF\_HandleFault@{HF\_HandleFault}} \index{HF\_HandleFault@{HF\_HandleFault}!Hardfault trace defines@{Hardfault trace defines}} \doxysubsubsubsubsubsection{\texorpdfstring{HF\_HandleFault()}{HF\_HandleFault()}} -{\footnotesize\ttfamily \+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE void HF\+\_\+\+Handle\+Fault (\begin{DoxyParamCaption}\item[{void}]{ }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_gadd8e10e7ec3b0204f7f92062ecd452f7} +\+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE void HF\+\_\+\+Handle\+Fault (\begin{DoxyParamCaption}\item[{void}]{}{}\end{DoxyParamCaption})} @@ -130,5 +132,5 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00486}{486}} of file \mbox{ \end{DoxyNote} -Definition at line \mbox{\hyperlink{trace_8h_source_l00527}{527}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00540}{540}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. diff --git a/Doc/latex/group___t_r_a_c_e___r_t_t___f_l_a_s_h.tex b/Doc/latex/group___t_r_a_c_e___r_t_t___f_l_a_s_h.tex index 67d4bf1..bb0d50f 100644 --- a/Doc/latex/group___t_r_a_c_e___r_t_t___f_l_a_s_h.tex +++ b/Doc/latex/group___t_r_a_c_e___r_t_t___f_l_a_s_h.tex @@ -1,4 +1,4 @@ -\doxysubsubsubsection{Flash RTT Buffer} +\doxysubsubsubsection{Flash RTT Buffer } \hypertarget{group___t_r_a_c_e___r_t_t___f_l_a_s_h}{}\label{group___t_r_a_c_e___r_t_t___f_l_a_s_h}\index{Flash RTT Buffer@{Flash RTT Buffer}} @@ -56,12 +56,14 @@ struct \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\+\_\+\+Flash\+Header \item \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_gafeca0be3688dea07ff443f894668003d}{RTT\+\_\+\+FLASH\+\_\+\+SECTOR\+\_\+\+END} -\/ Конец сектора RTT\+\_\+\+FLASH\+\_\+\+SECTOR \end{DoxyItemize} +\label{doc-func-members} +\Hypertarget{group___t_r_a_c_e___r_t_t___f_l_a_s_h_doc-func-members} \doxysubsubsubsubsection{Function Documentation} -\Hypertarget{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6}\label{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6} -\index{Flash RTT Buffer@{Flash RTT Buffer}!RTT\_FlashPrepare@{RTT\_FlashPrepare}} +\Hypertarget{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6}\index{Flash RTT Buffer@{Flash RTT Buffer}!RTT\_FlashPrepare@{RTT\_FlashPrepare}} \index{RTT\_FlashPrepare@{RTT\_FlashPrepare}!Flash RTT Buffer@{Flash RTT Buffer}} \doxysubsubsubsubsubsection{\texorpdfstring{RTT\_FlashPrepare()}{RTT\_FlashPrepare()}} -{\footnotesize\ttfamily \+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE void RTT\+\_\+\+Flash\+Prepare (\begin{DoxyParamCaption}\item[{void}]{ }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6} +\+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE void RTT\+\_\+\+Flash\+Prepare (\begin{DoxyParamCaption}\item[{void}]{}{}\end{DoxyParamCaption})} @@ -69,13 +71,13 @@ struct \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\+\_\+\+Flash\+Header Сбрасывает ошибки Flash и ожидает готовности перед записью -Definition at line \mbox{\hyperlink{trace_8h_source_l00190}{190}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00203}{203}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga79f222c8ab644de4d47f07528d1edd63}\label{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga79f222c8ab644de4d47f07528d1edd63} -\index{Flash RTT Buffer@{Flash RTT Buffer}!RTT\_SaveToFlash@{RTT\_SaveToFlash}} +\Hypertarget{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga79f222c8ab644de4d47f07528d1edd63}\index{Flash RTT Buffer@{Flash RTT Buffer}!RTT\_SaveToFlash@{RTT\_SaveToFlash}} \index{RTT\_SaveToFlash@{RTT\_SaveToFlash}!Flash RTT Buffer@{Flash RTT Buffer}} \doxysubsubsubsubsubsection{\texorpdfstring{RTT\_SaveToFlash()}{RTT\_SaveToFlash()}} -{\footnotesize\ttfamily \+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE int RTT\+\_\+\+Save\+To\+Flash (\begin{DoxyParamCaption}\item[{uint32\+\_\+t}]{tag, }\item[{uint32\+\_\+t}]{tail\+\_\+size }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga79f222c8ab644de4d47f07528d1edd63} +\+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE int RTT\+\_\+\+Save\+To\+Flash (\begin{DoxyParamCaption}\item[{uint32\+\_\+t}]{tag}{, }\item[{uint32\+\_\+t}]{tail\+\_\+size}{}\end{DoxyParamCaption})} @@ -99,13 +101,13 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00190}{190}} of file \mbox{ \item Если конкретный (младший байт != 0) — запись выполняется только с этим тегом, иначе ошибка. \end{DoxyItemize} -Definition at line \mbox{\hyperlink{trace_8h_source_l00214}{214}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00227}{227}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga734b2ebbf0c77699b739013878cfd146}\label{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga734b2ebbf0c77699b739013878cfd146} -\index{Flash RTT Buffer@{Flash RTT Buffer}!RTT\_ReadFromFlash@{RTT\_ReadFromFlash}} +\Hypertarget{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga734b2ebbf0c77699b739013878cfd146}\index{Flash RTT Buffer@{Flash RTT Buffer}!RTT\_ReadFromFlash@{RTT\_ReadFromFlash}} \index{RTT\_ReadFromFlash@{RTT\_ReadFromFlash}!Flash RTT Buffer@{Flash RTT Buffer}} \doxysubsubsubsubsubsection{\texorpdfstring{RTT\_ReadFromFlash()}{RTT\_ReadFromFlash()}} -{\footnotesize\ttfamily \+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE int RTT\+\_\+\+Read\+From\+Flash (\begin{DoxyParamCaption}\item[{uint32\+\_\+t}]{tag, }\item[{char \texorpdfstring{$\ast$}{*}}]{Buffer, }\item[{uint32\+\_\+t}]{tail\+\_\+size, }\item[{uint32\+\_\+t \texorpdfstring{$\ast$}{*}}]{read\+\_\+size }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga734b2ebbf0c77699b739013878cfd146} +\+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE int RTT\+\_\+\+Read\+From\+Flash (\begin{DoxyParamCaption}\item[{uint32\+\_\+t}]{tag}{, }\item[{char \texorpdfstring{$\ast$}{*}}]{Buffer}{, }\item[{uint32\+\_\+t}]{tail\+\_\+size}{, }\item[{uint32\+\_\+t \texorpdfstring{$\ast$}{*}}]{read\+\_\+size}{}\end{DoxyParamCaption})} @@ -131,13 +133,13 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00214}{214}} of file \mbox{ \item Если конкретный (младший байт != 0) — прочитывается именно эта запись. \end{DoxyItemize} -Definition at line \mbox{\hyperlink{trace_8h_source_l00311}{311}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00324}{324}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga8d8c6850e32b42871faefce3352012d1}\label{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga8d8c6850e32b42871faefce3352012d1} -\index{Flash RTT Buffer@{Flash RTT Buffer}!RTT\_EraseFlash@{RTT\_EraseFlash}} +\Hypertarget{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga8d8c6850e32b42871faefce3352012d1}\index{Flash RTT Buffer@{Flash RTT Buffer}!RTT\_EraseFlash@{RTT\_EraseFlash}} \index{RTT\_EraseFlash@{RTT\_EraseFlash}!Flash RTT Buffer@{Flash RTT Buffer}} \doxysubsubsubsubsubsection{\texorpdfstring{RTT\_EraseFlash()}{RTT\_EraseFlash()}} -{\footnotesize\ttfamily \+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE int RTT\+\_\+\+Erase\+Flash (\begin{DoxyParamCaption}\item[{void}]{ }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga8d8c6850e32b42871faefce3352012d1} +\+\_\+\+\_\+\+STATIC\+\_\+\+FORCEINLINE int RTT\+\_\+\+Erase\+Flash (\begin{DoxyParamCaption}\item[{void}]{}{}\end{DoxyParamCaption})} @@ -145,5 +147,5 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00311}{311}} of file \mbox{ -Definition at line \mbox{\hyperlink{trace_8h_source_l00375}{375}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00388}{388}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. diff --git a/Doc/latex/group___t_r_a_c_e___s_e_r_i_a_l.tex b/Doc/latex/group___t_r_a_c_e___s_e_r_i_a_l.tex index be600cd..ac7dce5 100644 --- a/Doc/latex/group___t_r_a_c_e___s_e_r_i_a_l.tex +++ b/Doc/latex/group___t_r_a_c_e___s_e_r_i_a_l.tex @@ -1,4 +1,4 @@ -\doxysubsubsubsection{Serial trace defines} +\doxysubsubsubsection{Serial trace defines } \hypertarget{group___t_r_a_c_e___s_e_r_i_a_l}{}\label{group___t_r_a_c_e___s_e_r_i_a_l}\index{Serial trace defines@{Serial trace defines}} @@ -15,10 +15,10 @@ Collaboration diagram for Serial trace defines\+:\nopagebreak \doxysubsubsubsubsubsection*{Macros} \begin{DoxyCompactItemize} \item -\#define \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\+\_\+printf}}(...)~SEGGER\+\_\+\+RTT\+\_\+printf(0, \+\_\+\+\_\+\+VA\+\_\+\+ARGS\+\_\+\+\_\+) +\#define \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\+\_\+printf}}(...) \begin{DoxyCompactList}\small\item\em Универсальный макрос для вывода трассировки \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_ga730fb7b8d0bbb348dca73c15bd0e0b26}{log\+\_\+printf}}(TAG, fmt, ...) -\begin{DoxyCompactList}\small\item\em Макрос логирования с поддержкой уровней LOG\+\_\+\+LEVEL. \end{DoxyCompactList}\end{DoxyCompactItemize} +\begin{DoxyCompactList}\small\item\em Макрос логирования с поддержкой уровней \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_ga0b87e0d3bf5853bcbb0b66a7c48fdc05}{LOG\+\_\+\+LEVEL}. \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsubsubsubsection{Detailed Description} @@ -27,18 +27,22 @@ Collaboration diagram for Serial trace defines\+:\nopagebreak В зависимости от настроек определяется дефайн \doxylink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\+\_\+printf()} и \doxylink{group___t_r_a_c_e___s_e_r_i_a_l_ga730fb7b8d0bbb348dca73c15bd0e0b26}{log\+\_\+printf()} для работы с трассировкой\+: \begin{DoxyItemize} \item \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_ga76936505ca200d2e61226b7ba68f27c6}{SERIAL\+\_\+\+TRACE\+\_\+\+ENABLE} -\/ Если трассировка отключена, то все дефайны определяются как \textquotesingle{}ничего\textquotesingle{} и на производительность кода не влияют -\item \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_ga00ff2175bdc1fb11c8ec970ea3010dd8}{RTT\+\_\+\+TRACE\+\_\+\+ENABLE} -\/ для RTT это будет вызов функции SEGGER\+\_\+\+RTT\+\_\+printf(), с подключением библиотеки SEGGER\+\_\+\+RTT.\+h Предварительно надо подключить библиотеку SEGGER RTT и вызвать функцию SEGGER\+\_\+\+RTT\+\_\+\+Init() +\item \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_ga00ff2175bdc1fb11c8ec970ea3010dd8}{RTT\+\_\+\+TRACE\+\_\+\+ENABLE} -\/ для RTT это будет вызов функции SEGGER\+\_\+\+RTT\+\_\+printf() + +Предварительно надо подключить библиотеку SEGGER RTT (SEGGER\+\_\+\+RTT.\+h) и вызвать функцию SEGGER\+\_\+\+RTT\+\_\+\+Init() \item \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_gab8db9704b5d11858aa879689b9d36336}{SWO\+\_\+\+TRACE\+\_\+\+ENABLE} для SWO это будет просто printf() -Но библиотеку STDOUT надо подключить самостоятельно\+: +Предварительно надо подключить библиотеку STDOUT и retarget под ITM\+: -\begin{DoxyVerb} Manage Run-Time Environment -> Compiler -> I/O -> STDOUT \end{DoxyVerb} +\begin{DoxyVerb} Manage Run-Time Environment -> Compiler -> I/O -> STDOUT -> ITM +\end{DoxyVerb} Для SWO также надо включить трассировку\+: ~\newline -\begin{DoxyVerb} Options For Target -> Debug -> Debugger Settings\end{DoxyVerb} +\begin{DoxyVerb} Options For Target -> Debug -> Debugger Settings +\end{DoxyVerb} В вкладке Debug\+: @@ -46,18 +50,24 @@ Collaboration diagram for Serial trace defines\+:\nopagebreak \item Port = SW В вкладке Trace\+: \item Указать Core Clock \item Выставить Trace Port = SWO -\item ITM -\/ выбрать нужный порт (для Keil нулевой порт) ~\newline - +\item ITM -\/ выбрать нужный порт (для Keil нулевой порт) \end{DoxyItemize} \end{DoxyItemize} +\label{doc-define-members} +\Hypertarget{group___t_r_a_c_e___s_e_r_i_a_l_doc-define-members} \doxysubsubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}\label{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa} -\index{Serial trace defines@{Serial trace defines}!my\_printf@{my\_printf}} +\Hypertarget{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}\index{Serial trace defines@{Serial trace defines}!my\_printf@{my\_printf}} \index{my\_printf@{my\_printf}!Serial trace defines@{Serial trace defines}} \doxysubsubsubsubsubsection{\texorpdfstring{my\_printf}{my\_printf}} -{\footnotesize\ttfamily \#define my\+\_\+printf(\begin{DoxyParamCaption}\item[{}]{... }\end{DoxyParamCaption})~SEGGER\+\_\+\+RTT\+\_\+printf(0, \+\_\+\+\_\+\+VA\+\_\+\+ARGS\+\_\+\+\_\+)} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa} +\#define my\+\_\+printf(\begin{DoxyParamCaption}\item[{}]{}...{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{SEGGER\_RTT\_printf(0,\ \_\_VA\_ARGS\_\_)} + +\end{DoxyCode} Универсальный макрос для вывода трассировки @@ -69,23 +79,23 @@ Collaboration diagram for Serial trace defines\+:\nopagebreak \item NO\+\_\+\+TRACE -\/ пустой макрос \end{DoxyItemize} -Definition at line \mbox{\hyperlink{trace_8h_source_l00071}{71}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00080}{80}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{group___t_r_a_c_e___s_e_r_i_a_l_ga730fb7b8d0bbb348dca73c15bd0e0b26}\label{group___t_r_a_c_e___s_e_r_i_a_l_ga730fb7b8d0bbb348dca73c15bd0e0b26} -\index{Serial trace defines@{Serial trace defines}!log\_printf@{log\_printf}} +\Hypertarget{group___t_r_a_c_e___s_e_r_i_a_l_ga730fb7b8d0bbb348dca73c15bd0e0b26}\index{Serial trace defines@{Serial trace defines}!log\_printf@{log\_printf}} \index{log\_printf@{log\_printf}!Serial trace defines@{Serial trace defines}} \doxysubsubsubsubsubsection{\texorpdfstring{log\_printf}{log\_printf}} -{\footnotesize\ttfamily \#define log\+\_\+printf(\begin{DoxyParamCaption}\item[{}]{TAG, }\item[{}]{fmt, }\item[{}]{... }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___t_r_a_c_e___s_e_r_i_a_l_ga730fb7b8d0bbb348dca73c15bd0e0b26} +\#define log\+\_\+printf(\begin{DoxyParamCaption}\item[{}]{TAG}{, }\item[{}]{fmt}{, }\item[{}]{}...{}\end{DoxyParamCaption})} {\bfseries Value\+:} \begin{DoxyCode}{0} \DoxyCodeLine{\mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}\(\backslash\)n[\%lu]\ [\%s]\ "{}}\ fmt,\ \(\backslash\)} -\DoxyCodeLine{(\textcolor{keywordtype}{unsigned}\ \textcolor{keywordtype}{long})uwTick,\ TAG,\ \#\#\_\_VA\_ARGS\_\_)} +\DoxyCodeLine{(\textcolor{keywordtype}{unsigned}\ \textcolor{keywordtype}{long})\mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\_time}}(),\ TAG,\ \#\#\_\_VA\_ARGS\_\_)} \end{DoxyCode} -Макрос логирования с поддержкой уровней LOG\+\_\+\+LEVEL. +Макрос логирования с поддержкой уровней \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_ga0b87e0d3bf5853bcbb0b66a7c48fdc05}{LOG\+\_\+\+LEVEL}. \begin{DoxyParams}{Parameters} @@ -96,10 +106,22 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00071}{71}} of file \mbox{\ \end{DoxyParams} Варианты реализации\+: \begin{DoxyItemize} -\item LOG\+\_\+\+LEVEL == 0 -\/ логирование отключено (макрос пустой) -\item LOG\+\_\+\+LEVEL == 1 -\/ выводится время и TAG -\item LOG\+\_\+\+LEVEL \texorpdfstring{$>$}{>}= 2 -\/ выводится время, TAG, имя файла и номер строки +\item \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_ga0b87e0d3bf5853bcbb0b66a7c48fdc05}{LOG\+\_\+\+LEVEL} == 0 -\/ логирование отключено (макрос пустой) +\item \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_ga0b87e0d3bf5853bcbb0b66a7c48fdc05}{LOG\+\_\+\+LEVEL} == 1 -\/ выводится время \doxylink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\+\_\+time} и TAG +\begin{DoxyCode}{0} +\DoxyCodeLine{[123]\ [ADC]\ Measure\ Done} +\DoxyCodeLine{[456]\ [ADC]\ Measure\ Err} + +\end{DoxyCode} + +\item \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_ga0b87e0d3bf5853bcbb0b66a7c48fdc05}{LOG\+\_\+\+LEVEL} \texorpdfstring{$>$}{>}= 2 -\/ выводится время, TAG, имя файла и номер строки +\begin{DoxyCode}{0} +\DoxyCodeLine{[123]\ [ADC]\ (../Core/Src/adc.c:75)\ Measure\ Done} +\DoxyCodeLine{[456]\ [ADC]\ (../Core/Src/adc.c:80)\ Measure\ Err} + +\end{DoxyCode} + \end{DoxyItemize} -Definition at line \mbox{\hyperlink{trace_8h_source_l00096}{96}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00109}{109}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. diff --git a/Doc/latex/group___t_r_a_c_k_e_r_s.tex b/Doc/latex/group___t_r_a_c_k_e_r_s.tex index 8d342a4..9f4c6e3 100644 --- a/Doc/latex/group___t_r_a_c_k_e_r_s.tex +++ b/Doc/latex/group___t_r_a_c_k_e_r_s.tex @@ -1,4 +1,4 @@ -\doxysubsubsection{Trackers defines} +\doxysubsubsection{Trackers defines } \hypertarget{group___t_r_a_c_k_e_r_s}{}\label{group___t_r_a_c_k_e_r_s}\index{Trackers defines@{Trackers defines}} @@ -17,43 +17,43 @@ Collaboration diagram for Trackers defines\+:\nopagebreak \item \#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga50ccb119acf302969b7fdcb58f2130e4}{Tracker\+Type\+Def}}(num\+\_\+user\+\_\+vars) \begin{DoxyCompactList}\small\item\em Структура для счетчиков отладки \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc}{num\+\_\+of\+\_\+usercnts}}(\+\_\+user\+\_\+)~(sizeof(\+\_\+user\+\_\+) / sizeof(uint32\+\_\+t)) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc}{num\+\_\+of\+\_\+usercnts}}(\+\_\+user\+\_\+) \begin{DoxyCompactList}\small\item\em Получить количетство пользовательских переменных \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~((\+\_\+uservarnumb\+\_\+) $<$ \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc}{num\+\_\+of\+\_\+usercnts}}((\+\_\+cntstruct\+\_\+).user)) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Проверка существует ли указанная пользовательская переменная \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~if(\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Условие для проверки существует ли указанная пользовательская переменная \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30}{tern\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~(\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)) ? \+\_\+uservarnumb\+\_\+ \+: 0 +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30}{tern\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Тернарный оператор для проверки существует ли указанная пользовательская переменная \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gab880911066605602a966641682090169}{Tracker\+Get\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+ok +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gab880911066605602a966641682090169}{Tracker\+Get\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Считать счетчик успешных событий \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga9dc91e6b798a081f95f2ccef2c288e5e}{Tracker\+Get\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+err +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga9dc91e6b798a081f95f2ccef2c288e5e}{Tracker\+Get\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Считать счетчик ошибок \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga47ac59a406ee74d4cd9fe0fbaf63a758}{Tracker\+Get\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+warn +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga47ac59a406ee74d4cd9fe0fbaf63a758}{Tracker\+Get\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Считать счетчик предупреждений \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga4b08632669043dfdbd219dda03502bdb}{Tracker\+Get\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~(\+\_\+cntstruct\+\_\+).user\mbox{[}\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30}{tern\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)\mbox{]} +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga4b08632669043dfdbd219dda03502bdb}{Tracker\+Get\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Считать пользовательскую переменную \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga23de0006aa08984cfeddb6aa5e512fa1}{Tracker\+Cnt\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+ok++ +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga23de0006aa08984cfeddb6aa5e512fa1}{Tracker\+Cnt\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Инкрементирование счетчика успешных событий \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga49af29ab3927cad105c1d2b018a767e9}{Tracker\+Cnt\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+err++ +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga49af29ab3927cad105c1d2b018a767e9}{Tracker\+Cnt\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Инкрементирование счетчика ошибок \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga8017fb05a56a1b667244f1f786fa9c57}{Tracker\+Cnt\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+warn++ +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga8017fb05a56a1b667244f1f786fa9c57}{Tracker\+Cnt\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Инкрементирование счетчика предупреждений \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga1b7549afc4a1760b54a9b93b0f6d105e}{Tracker\+Cnt\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) (\+\_\+cntstruct\+\_\+).user\mbox{[}\+\_\+uservarnumb\+\_\+\mbox{]}++; +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga1b7549afc4a1760b54a9b93b0f6d105e}{Tracker\+Cnt\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Инкрементирование пользовательской переменной \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad2f4062a9ac8c2ab062a364f640ebc51}{Tracker\+Write\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+, \+\_\+val\+\_\+)~\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) (\+\_\+cntstruct\+\_\+).user\mbox{[}\+\_\+uservarnumb\+\_\+\mbox{]} = (\+\_\+val\+\_\+) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad2f4062a9ac8c2ab062a364f640ebc51}{Tracker\+Write\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+, \+\_\+val\+\_\+) \begin{DoxyCompactList}\small\item\em Запись числа в пользовательскую переменную \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga704f7b9f8c65c9bcec48ce7cb77a2d3b}{Tracker\+Clear\+\_\+\+All}}(\+\_\+cntstruct\+\_\+)~memset(\&(\+\_\+cntstruct\+\_\+), 0, sizeof(\+\_\+cntstruct\+\_\+)) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga704f7b9f8c65c9bcec48ce7cb77a2d3b}{Tracker\+Clear\+\_\+\+All}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка всей структуры \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga5dd8bac8c7ab5832019d55d7a68371b9}{Tracker\+Clear\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+ok = 0 +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga5dd8bac8c7ab5832019d55d7a68371b9}{Tracker\+Clear\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка счетчика успешных событий \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gae860b6947c6e317e14d40bd7b4b8eb74}{Tracker\+Clear\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+err = 0 +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gae860b6947c6e317e14d40bd7b4b8eb74}{Tracker\+Clear\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка счетчика ошибок \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga365a8c60bd13b75154feda649dd21ead}{Tracker\+Clear\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+warn = 0 +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga365a8c60bd13b75154feda649dd21ead}{Tracker\+Clear\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка счетчика предупреждений \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga063dab1067005e1600ea32531fdf3f8d}{Tracker\+Clear\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) (\+\_\+cntstruct\+\_\+).user\mbox{[}\+\_\+uservarnumb\+\_\+\mbox{]} = 0; +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga063dab1067005e1600ea32531fdf3f8d}{Tracker\+Clear\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка пользовательской переменной \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gaaec7ec19977bb26fa1919dfe920b82d5}{Tracker\+Clear\+\_\+\+User\+All}}(\+\_\+cntstruct\+\_\+)~memset(\&(\+\_\+cntstruct\+\_\+).user, 0, sizeof((\+\_\+cntstruct\+\_\+).user)) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gaaec7ec19977bb26fa1919dfe920b82d5}{Tracker\+Clear\+\_\+\+User\+All}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка всех пользовательских переменных \end{DoxyCompactList}\end{DoxyCompactItemize} @@ -111,17 +111,18 @@ Collaboration diagram for Trackers defines\+:\nopagebreak \item \doxylink{group___t_r_a_c_k_e_r_s_gae860b6947c6e317e14d40bd7b4b8eb74}{Tracker\+Clear\+\_\+\+Err()} \item \doxylink{group___t_r_a_c_k_e_r_s_ga365a8c60bd13b75154feda649dd21ead}{Tracker\+Clear\+\_\+\+Warn()} \item \doxylink{group___t_r_a_c_k_e_r_s_ga063dab1067005e1600ea32531fdf3f8d}{Tracker\+Clear\+\_\+\+User(n)} -\item \doxylink{group___t_r_a_c_k_e_r_s_gaaec7ec19977bb26fa1919dfe920b82d5}{Tracker\+Clear\+\_\+\+User\+All()} ~\newline - +\item \doxylink{group___t_r_a_c_k_e_r_s_gaaec7ec19977bb26fa1919dfe920b82d5}{Tracker\+Clear\+\_\+\+User\+All()} \end{DoxyItemize} \end{DoxyItemize} +\label{doc-define-members} +\Hypertarget{group___t_r_a_c_k_e_r_s_doc-define-members} \doxysubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___t_r_a_c_k_e_r_s_ga50ccb119acf302969b7fdcb58f2130e4}\label{group___t_r_a_c_k_e_r_s_ga50ccb119acf302969b7fdcb58f2130e4} -\index{Trackers defines@{Trackers defines}!TrackerTypeDef@{TrackerTypeDef}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga50ccb119acf302969b7fdcb58f2130e4}\index{Trackers defines@{Trackers defines}!TrackerTypeDef@{TrackerTypeDef}} \index{TrackerTypeDef@{TrackerTypeDef}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerTypeDef}{TrackerTypeDef}} -{\footnotesize\ttfamily \#define Tracker\+Type\+Def(\begin{DoxyParamCaption}\item[{}]{num\+\_\+user\+\_\+vars }\end{DoxyParamCaption})} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga50ccb119acf302969b7fdcb58f2130e4} +\#define Tracker\+Type\+Def(\begin{DoxyParamCaption}\item[{}]{num\+\_\+user\+\_\+vars}{}\end{DoxyParamCaption})} {\bfseries Value\+:} \begin{DoxyCode}{0} @@ -149,12 +150,17 @@ Collaboration diagram for Trackers defines\+:\nopagebreak Definition at line \mbox{\hyperlink{trackers_8h_source_l00070}{70}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc}\label{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc} -\index{Trackers defines@{Trackers defines}!num\_of\_usercnts@{num\_of\_usercnts}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc}\index{Trackers defines@{Trackers defines}!num\_of\_usercnts@{num\_of\_usercnts}} \index{num\_of\_usercnts@{num\_of\_usercnts}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{num\_of\_usercnts}{num\_of\_usercnts}} -{\footnotesize\ttfamily \#define num\+\_\+of\+\_\+usercnts(\begin{DoxyParamCaption}\item[{}]{\+\_\+user\+\_\+ }\end{DoxyParamCaption})~(sizeof(\+\_\+user\+\_\+) / sizeof(uint32\+\_\+t))} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc} +\#define num\+\_\+of\+\_\+usercnts(\begin{DoxyParamCaption}\item[{}]{\+\_\+user\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\textcolor{keyword}{sizeof}(\_user\_)\ /\ \textcolor{keyword}{sizeof}(uint32\_t))} + +\end{DoxyCode} Получить количетство пользовательских переменных @@ -163,12 +169,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00070}{70}} of file \mbo Definition at line \mbox{\hyperlink{trackers_8h_source_l00080}{80}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}\label{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e} -\index{Trackers defines@{Trackers defines}!assert\_usertracker@{assert\_usertracker}} +\Hypertarget{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}\index{Trackers defines@{Trackers defines}!assert\_usertracker@{assert\_usertracker}} \index{assert\_usertracker@{assert\_usertracker}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{assert\_usertracker}{assert\_usertracker}} -{\footnotesize\ttfamily \#define assert\+\_\+usertracker(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+, }\item[{}]{\+\_\+uservarnumb\+\_\+ }\end{DoxyParamCaption})~((\+\_\+uservarnumb\+\_\+) $<$ \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc}{num\+\_\+of\+\_\+usercnts}}((\+\_\+cntstruct\+\_\+).user))} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e} +\#define assert\+\_\+usertracker(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{, }\item[{}]{\+\_\+uservarnumb\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{((\_uservarnumb\_)\ <\ \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc}{num\_of\_usercnts}}((\_cntstruct\_).user))} + +\end{DoxyCode} Проверка существует ли указанная пользовательская переменная @@ -177,12 +188,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00080}{80}} of file \mbo Definition at line \mbox{\hyperlink{trackers_8h_source_l00082}{82}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}\label{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07} -\index{Trackers defines@{Trackers defines}!if\_assert\_usertracker@{if\_assert\_usertracker}} +\Hypertarget{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}\index{Trackers defines@{Trackers defines}!if\_assert\_usertracker@{if\_assert\_usertracker}} \index{if\_assert\_usertracker@{if\_assert\_usertracker}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{if\_assert\_usertracker}{if\_assert\_usertracker}} -{\footnotesize\ttfamily \#define if\+\_\+assert\+\_\+usertracker(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+, }\item[{}]{\+\_\+uservarnumb\+\_\+ }\end{DoxyParamCaption})~if(\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+))} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07} +\#define if\+\_\+assert\+\_\+usertracker(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{, }\item[{}]{\+\_\+uservarnumb\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{\textcolor{keywordflow}{if}(\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\_usertracker}}(\_cntstruct\_,\ \_uservarnumb\_))} + +\end{DoxyCode} Условие для проверки существует ли указанная пользовательская переменная @@ -191,12 +207,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00082}{82}} of file \mbo Definition at line \mbox{\hyperlink{trackers_8h_source_l00084}{84}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30}\label{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30} -\index{Trackers defines@{Trackers defines}!tern\_assert\_usertracker@{tern\_assert\_usertracker}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30}\index{Trackers defines@{Trackers defines}!tern\_assert\_usertracker@{tern\_assert\_usertracker}} \index{tern\_assert\_usertracker@{tern\_assert\_usertracker}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{tern\_assert\_usertracker}{tern\_assert\_usertracker}} -{\footnotesize\ttfamily \#define tern\+\_\+assert\+\_\+usertracker(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+, }\item[{}]{\+\_\+uservarnumb\+\_\+ }\end{DoxyParamCaption})~(\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)) ? \+\_\+uservarnumb\+\_\+ \+: 0} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30} +\#define tern\+\_\+assert\+\_\+usertracker(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{, }\item[{}]{\+\_\+uservarnumb\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\_usertracker}}(\_cntstruct\_,\ \_uservarnumb\_))\ ?\ \_uservarnumb\_\ :\ 0} + +\end{DoxyCode} Тернарный оператор для проверки существует ли указанная пользовательская переменная @@ -205,12 +226,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00084}{84}} of file \mbo Definition at line \mbox{\hyperlink{trackers_8h_source_l00086}{86}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_gab880911066605602a966641682090169}\label{group___t_r_a_c_k_e_r_s_gab880911066605602a966641682090169} -\index{Trackers defines@{Trackers defines}!TrackerGet\_Ok@{TrackerGet\_Ok}} +\Hypertarget{group___t_r_a_c_k_e_r_s_gab880911066605602a966641682090169}\index{Trackers defines@{Trackers defines}!TrackerGet\_Ok@{TrackerGet\_Ok}} \index{TrackerGet\_Ok@{TrackerGet\_Ok}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerGet\_Ok}{TrackerGet\_Ok}} -{\footnotesize\ttfamily \#define Tracker\+Get\+\_\+\+Ok(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+ }\end{DoxyParamCaption})~(\+\_\+cntstruct\+\_\+).cnt\+\_\+ok} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_gab880911066605602a966641682090169} +\#define Tracker\+Get\+\_\+\+Ok(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_cntstruct\_).cnt\_ok} + +\end{DoxyCode} Считать счетчик успешных событий @@ -219,12 +245,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00086}{86}} of file \mbo Definition at line \mbox{\hyperlink{trackers_8h_source_l00090}{90}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga9dc91e6b798a081f95f2ccef2c288e5e}\label{group___t_r_a_c_k_e_r_s_ga9dc91e6b798a081f95f2ccef2c288e5e} -\index{Trackers defines@{Trackers defines}!TrackerGet\_Err@{TrackerGet\_Err}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga9dc91e6b798a081f95f2ccef2c288e5e}\index{Trackers defines@{Trackers defines}!TrackerGet\_Err@{TrackerGet\_Err}} \index{TrackerGet\_Err@{TrackerGet\_Err}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerGet\_Err}{TrackerGet\_Err}} -{\footnotesize\ttfamily \#define Tracker\+Get\+\_\+\+Err(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+ }\end{DoxyParamCaption})~(\+\_\+cntstruct\+\_\+).cnt\+\_\+err} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga9dc91e6b798a081f95f2ccef2c288e5e} +\#define Tracker\+Get\+\_\+\+Err(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_cntstruct\_).cnt\_err} + +\end{DoxyCode} Считать счетчик ошибок @@ -233,12 +264,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00090}{90}} of file \mbo Definition at line \mbox{\hyperlink{trackers_8h_source_l00092}{92}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga47ac59a406ee74d4cd9fe0fbaf63a758}\label{group___t_r_a_c_k_e_r_s_ga47ac59a406ee74d4cd9fe0fbaf63a758} -\index{Trackers defines@{Trackers defines}!TrackerGet\_Warn@{TrackerGet\_Warn}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga47ac59a406ee74d4cd9fe0fbaf63a758}\index{Trackers defines@{Trackers defines}!TrackerGet\_Warn@{TrackerGet\_Warn}} \index{TrackerGet\_Warn@{TrackerGet\_Warn}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerGet\_Warn}{TrackerGet\_Warn}} -{\footnotesize\ttfamily \#define Tracker\+Get\+\_\+\+Warn(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+ }\end{DoxyParamCaption})~(\+\_\+cntstruct\+\_\+).cnt\+\_\+warn} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga47ac59a406ee74d4cd9fe0fbaf63a758} +\#define Tracker\+Get\+\_\+\+Warn(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_cntstruct\_).cnt\_warn} + +\end{DoxyCode} Считать счетчик предупреждений @@ -247,12 +283,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00092}{92}} of file \mbo Definition at line \mbox{\hyperlink{trackers_8h_source_l00094}{94}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga4b08632669043dfdbd219dda03502bdb}\label{group___t_r_a_c_k_e_r_s_ga4b08632669043dfdbd219dda03502bdb} -\index{Trackers defines@{Trackers defines}!TrackerGet\_User@{TrackerGet\_User}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga4b08632669043dfdbd219dda03502bdb}\index{Trackers defines@{Trackers defines}!TrackerGet\_User@{TrackerGet\_User}} \index{TrackerGet\_User@{TrackerGet\_User}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerGet\_User}{TrackerGet\_User}} -{\footnotesize\ttfamily \#define Tracker\+Get\+\_\+\+User(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+, }\item[{}]{\+\_\+uservarnumb\+\_\+ }\end{DoxyParamCaption})~(\+\_\+cntstruct\+\_\+).user\mbox{[}\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30}{tern\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)\mbox{]}} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga4b08632669043dfdbd219dda03502bdb} +\#define Tracker\+Get\+\_\+\+User(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{, }\item[{}]{\+\_\+uservarnumb\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_cntstruct\_).user[\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30}{tern\_assert\_usertracker}}(\_cntstruct\_,\ \_uservarnumb\_)]} + +\end{DoxyCode} Считать пользовательскую переменную @@ -268,12 +309,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00094}{94}} of file \mbo Definition at line \mbox{\hyperlink{trackers_8h_source_l00106}{106}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga23de0006aa08984cfeddb6aa5e512fa1}\label{group___t_r_a_c_k_e_r_s_ga23de0006aa08984cfeddb6aa5e512fa1} -\index{Trackers defines@{Trackers defines}!TrackerCnt\_Ok@{TrackerCnt\_Ok}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga23de0006aa08984cfeddb6aa5e512fa1}\index{Trackers defines@{Trackers defines}!TrackerCnt\_Ok@{TrackerCnt\_Ok}} \index{TrackerCnt\_Ok@{TrackerCnt\_Ok}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerCnt\_Ok}{TrackerCnt\_Ok}} -{\footnotesize\ttfamily \#define Tracker\+Cnt\+\_\+\+Ok(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+ }\end{DoxyParamCaption})~(\+\_\+cntstruct\+\_\+).cnt\+\_\+ok++} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga23de0006aa08984cfeddb6aa5e512fa1} +\#define Tracker\+Cnt\+\_\+\+Ok(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_cntstruct\_).cnt\_ok++} + +\end{DoxyCode} Инкрементирование счетчика успешных событий @@ -282,12 +328,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00106}{106}} of file \mb Definition at line \mbox{\hyperlink{trackers_8h_source_l00111}{111}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga49af29ab3927cad105c1d2b018a767e9}\label{group___t_r_a_c_k_e_r_s_ga49af29ab3927cad105c1d2b018a767e9} -\index{Trackers defines@{Trackers defines}!TrackerCnt\_Err@{TrackerCnt\_Err}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga49af29ab3927cad105c1d2b018a767e9}\index{Trackers defines@{Trackers defines}!TrackerCnt\_Err@{TrackerCnt\_Err}} \index{TrackerCnt\_Err@{TrackerCnt\_Err}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerCnt\_Err}{TrackerCnt\_Err}} -{\footnotesize\ttfamily \#define Tracker\+Cnt\+\_\+\+Err(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+ }\end{DoxyParamCaption})~(\+\_\+cntstruct\+\_\+).cnt\+\_\+err++} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga49af29ab3927cad105c1d2b018a767e9} +\#define Tracker\+Cnt\+\_\+\+Err(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_cntstruct\_).cnt\_err++} + +\end{DoxyCode} Инкрементирование счетчика ошибок @@ -296,12 +347,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00111}{111}} of file \mb Definition at line \mbox{\hyperlink{trackers_8h_source_l00113}{113}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga8017fb05a56a1b667244f1f786fa9c57}\label{group___t_r_a_c_k_e_r_s_ga8017fb05a56a1b667244f1f786fa9c57} -\index{Trackers defines@{Trackers defines}!TrackerCnt\_Warn@{TrackerCnt\_Warn}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga8017fb05a56a1b667244f1f786fa9c57}\index{Trackers defines@{Trackers defines}!TrackerCnt\_Warn@{TrackerCnt\_Warn}} \index{TrackerCnt\_Warn@{TrackerCnt\_Warn}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerCnt\_Warn}{TrackerCnt\_Warn}} -{\footnotesize\ttfamily \#define Tracker\+Cnt\+\_\+\+Warn(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+ }\end{DoxyParamCaption})~(\+\_\+cntstruct\+\_\+).cnt\+\_\+warn++} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga8017fb05a56a1b667244f1f786fa9c57} +\#define Tracker\+Cnt\+\_\+\+Warn(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_cntstruct\_).cnt\_warn++} + +\end{DoxyCode} Инкрементирование счетчика предупреждений @@ -310,12 +366,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00113}{113}} of file \mb Definition at line \mbox{\hyperlink{trackers_8h_source_l00115}{115}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga1b7549afc4a1760b54a9b93b0f6d105e}\label{group___t_r_a_c_k_e_r_s_ga1b7549afc4a1760b54a9b93b0f6d105e} -\index{Trackers defines@{Trackers defines}!TrackerCnt\_User@{TrackerCnt\_User}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga1b7549afc4a1760b54a9b93b0f6d105e}\index{Trackers defines@{Trackers defines}!TrackerCnt\_User@{TrackerCnt\_User}} \index{TrackerCnt\_User@{TrackerCnt\_User}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerCnt\_User}{TrackerCnt\_User}} -{\footnotesize\ttfamily \#define Tracker\+Cnt\+\_\+\+User(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+, }\item[{}]{\+\_\+uservarnumb\+\_\+ }\end{DoxyParamCaption})~\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) (\+\_\+cntstruct\+\_\+).user\mbox{[}\+\_\+uservarnumb\+\_\+\mbox{]}++;} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga1b7549afc4a1760b54a9b93b0f6d105e} +\#define Tracker\+Cnt\+\_\+\+User(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{, }\item[{}]{\+\_\+uservarnumb\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\_assert\_usertracker}}(\_cntstruct\_,\ \_uservarnumb\_)\ (\_cntstruct\_).user[\_uservarnumb\_]++;} + +\end{DoxyCode} Инкрементирование пользовательской переменной @@ -324,12 +385,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00115}{115}} of file \mb Definition at line \mbox{\hyperlink{trackers_8h_source_l00117}{117}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_gad2f4062a9ac8c2ab062a364f640ebc51}\label{group___t_r_a_c_k_e_r_s_gad2f4062a9ac8c2ab062a364f640ebc51} -\index{Trackers defines@{Trackers defines}!TrackerWrite\_User@{TrackerWrite\_User}} +\Hypertarget{group___t_r_a_c_k_e_r_s_gad2f4062a9ac8c2ab062a364f640ebc51}\index{Trackers defines@{Trackers defines}!TrackerWrite\_User@{TrackerWrite\_User}} \index{TrackerWrite\_User@{TrackerWrite\_User}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerWrite\_User}{TrackerWrite\_User}} -{\footnotesize\ttfamily \#define Tracker\+Write\+\_\+\+User(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+, }\item[{}]{\+\_\+uservarnumb\+\_\+, }\item[{}]{\+\_\+val\+\_\+ }\end{DoxyParamCaption})~\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) (\+\_\+cntstruct\+\_\+).user\mbox{[}\+\_\+uservarnumb\+\_\+\mbox{]} = (\+\_\+val\+\_\+)} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_gad2f4062a9ac8c2ab062a364f640ebc51} +\#define Tracker\+Write\+\_\+\+User(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{, }\item[{}]{\+\_\+uservarnumb\+\_\+}{, }\item[{}]{\+\_\+val\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\_assert\_usertracker}}(\_cntstruct\_,\ \_uservarnumb\_)\ (\_cntstruct\_).user[\_uservarnumb\_]\ =\ (\_val\_)} + +\end{DoxyCode} Запись числа в пользовательскую переменную @@ -338,12 +404,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00117}{117}} of file \mb Definition at line \mbox{\hyperlink{trackers_8h_source_l00119}{119}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga704f7b9f8c65c9bcec48ce7cb77a2d3b}\label{group___t_r_a_c_k_e_r_s_ga704f7b9f8c65c9bcec48ce7cb77a2d3b} -\index{Trackers defines@{Trackers defines}!TrackerClear\_All@{TrackerClear\_All}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga704f7b9f8c65c9bcec48ce7cb77a2d3b}\index{Trackers defines@{Trackers defines}!TrackerClear\_All@{TrackerClear\_All}} \index{TrackerClear\_All@{TrackerClear\_All}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerClear\_All}{TrackerClear\_All}} -{\footnotesize\ttfamily \#define Tracker\+Clear\+\_\+\+All(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+ }\end{DoxyParamCaption})~memset(\&(\+\_\+cntstruct\+\_\+), 0, sizeof(\+\_\+cntstruct\+\_\+))} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga704f7b9f8c65c9bcec48ce7cb77a2d3b} +\#define Tracker\+Clear\+\_\+\+All(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{memset(\&(\_cntstruct\_),\ 0,\ \textcolor{keyword}{sizeof}(\_cntstruct\_))} + +\end{DoxyCode} Очистка всей структуры @@ -352,12 +423,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00119}{119}} of file \mb Definition at line \mbox{\hyperlink{trackers_8h_source_l00122}{122}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga5dd8bac8c7ab5832019d55d7a68371b9}\label{group___t_r_a_c_k_e_r_s_ga5dd8bac8c7ab5832019d55d7a68371b9} -\index{Trackers defines@{Trackers defines}!TrackerClear\_Ok@{TrackerClear\_Ok}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga5dd8bac8c7ab5832019d55d7a68371b9}\index{Trackers defines@{Trackers defines}!TrackerClear\_Ok@{TrackerClear\_Ok}} \index{TrackerClear\_Ok@{TrackerClear\_Ok}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerClear\_Ok}{TrackerClear\_Ok}} -{\footnotesize\ttfamily \#define Tracker\+Clear\+\_\+\+Ok(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+ }\end{DoxyParamCaption})~(\+\_\+cntstruct\+\_\+).cnt\+\_\+ok = 0} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga5dd8bac8c7ab5832019d55d7a68371b9} +\#define Tracker\+Clear\+\_\+\+Ok(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_cntstruct\_).cnt\_ok\ =\ 0} + +\end{DoxyCode} Очистка счетчика успешных событий @@ -366,12 +442,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00122}{122}} of file \mb Definition at line \mbox{\hyperlink{trackers_8h_source_l00124}{124}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_gae860b6947c6e317e14d40bd7b4b8eb74}\label{group___t_r_a_c_k_e_r_s_gae860b6947c6e317e14d40bd7b4b8eb74} -\index{Trackers defines@{Trackers defines}!TrackerClear\_Err@{TrackerClear\_Err}} +\Hypertarget{group___t_r_a_c_k_e_r_s_gae860b6947c6e317e14d40bd7b4b8eb74}\index{Trackers defines@{Trackers defines}!TrackerClear\_Err@{TrackerClear\_Err}} \index{TrackerClear\_Err@{TrackerClear\_Err}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerClear\_Err}{TrackerClear\_Err}} -{\footnotesize\ttfamily \#define Tracker\+Clear\+\_\+\+Err(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+ }\end{DoxyParamCaption})~(\+\_\+cntstruct\+\_\+).cnt\+\_\+err = 0} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_gae860b6947c6e317e14d40bd7b4b8eb74} +\#define Tracker\+Clear\+\_\+\+Err(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_cntstruct\_).cnt\_err\ =\ 0} + +\end{DoxyCode} Очистка счетчика ошибок @@ -380,12 +461,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00124}{124}} of file \mb Definition at line \mbox{\hyperlink{trackers_8h_source_l00126}{126}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga365a8c60bd13b75154feda649dd21ead}\label{group___t_r_a_c_k_e_r_s_ga365a8c60bd13b75154feda649dd21ead} -\index{Trackers defines@{Trackers defines}!TrackerClear\_Warn@{TrackerClear\_Warn}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga365a8c60bd13b75154feda649dd21ead}\index{Trackers defines@{Trackers defines}!TrackerClear\_Warn@{TrackerClear\_Warn}} \index{TrackerClear\_Warn@{TrackerClear\_Warn}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerClear\_Warn}{TrackerClear\_Warn}} -{\footnotesize\ttfamily \#define Tracker\+Clear\+\_\+\+Warn(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+ }\end{DoxyParamCaption})~(\+\_\+cntstruct\+\_\+).cnt\+\_\+warn = 0} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga365a8c60bd13b75154feda649dd21ead} +\#define Tracker\+Clear\+\_\+\+Warn(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\_cntstruct\_).cnt\_warn\ =\ 0} + +\end{DoxyCode} Очистка счетчика предупреждений @@ -394,12 +480,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00126}{126}} of file \mb Definition at line \mbox{\hyperlink{trackers_8h_source_l00128}{128}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_ga063dab1067005e1600ea32531fdf3f8d}\label{group___t_r_a_c_k_e_r_s_ga063dab1067005e1600ea32531fdf3f8d} -\index{Trackers defines@{Trackers defines}!TrackerClear\_User@{TrackerClear\_User}} +\Hypertarget{group___t_r_a_c_k_e_r_s_ga063dab1067005e1600ea32531fdf3f8d}\index{Trackers defines@{Trackers defines}!TrackerClear\_User@{TrackerClear\_User}} \index{TrackerClear\_User@{TrackerClear\_User}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerClear\_User}{TrackerClear\_User}} -{\footnotesize\ttfamily \#define Tracker\+Clear\+\_\+\+User(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+, }\item[{}]{\+\_\+uservarnumb\+\_\+ }\end{DoxyParamCaption})~\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) (\+\_\+cntstruct\+\_\+).user\mbox{[}\+\_\+uservarnumb\+\_\+\mbox{]} = 0;} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_ga063dab1067005e1600ea32531fdf3f8d} +\#define Tracker\+Clear\+\_\+\+User(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{, }\item[{}]{\+\_\+uservarnumb\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\_assert\_usertracker}}(\_cntstruct\_,\ \_uservarnumb\_)\ (\_cntstruct\_).user[\_uservarnumb\_]\ =\ 0;} + +\end{DoxyCode} Очистка пользовательской переменной @@ -408,12 +499,17 @@ Definition at line \mbox{\hyperlink{trackers_8h_source_l00128}{128}} of file \mb Definition at line \mbox{\hyperlink{trackers_8h_source_l00130}{130}} of file \mbox{\hyperlink{trackers_8h_source}{trackers.\+h}}. -\Hypertarget{group___t_r_a_c_k_e_r_s_gaaec7ec19977bb26fa1919dfe920b82d5}\label{group___t_r_a_c_k_e_r_s_gaaec7ec19977bb26fa1919dfe920b82d5} -\index{Trackers defines@{Trackers defines}!TrackerClear\_UserAll@{TrackerClear\_UserAll}} +\Hypertarget{group___t_r_a_c_k_e_r_s_gaaec7ec19977bb26fa1919dfe920b82d5}\index{Trackers defines@{Trackers defines}!TrackerClear\_UserAll@{TrackerClear\_UserAll}} \index{TrackerClear\_UserAll@{TrackerClear\_UserAll}!Trackers defines@{Trackers defines}} \doxysubsubsubsubsection{\texorpdfstring{TrackerClear\_UserAll}{TrackerClear\_UserAll}} -{\footnotesize\ttfamily \#define Tracker\+Clear\+\_\+\+User\+All(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+ }\end{DoxyParamCaption})~memset(\&(\+\_\+cntstruct\+\_\+).user, 0, sizeof((\+\_\+cntstruct\+\_\+).user))} +{\footnotesize\ttfamily \label{group___t_r_a_c_k_e_r_s_gaaec7ec19977bb26fa1919dfe920b82d5} +\#define Tracker\+Clear\+\_\+\+User\+All(\begin{DoxyParamCaption}\item[{}]{\+\_\+cntstruct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{memset(\&(\_cntstruct\_).user,\ 0,\ \textcolor{keyword}{sizeof}((\_cntstruct\_).user))} + +\end{DoxyCode} Очистка всех пользовательских переменных diff --git a/Doc/latex/group___u_t_i_l_s___d_e_f_i_n_e_s.tex b/Doc/latex/group___u_t_i_l_s___d_e_f_i_n_e_s.tex index 58c3c5a..956f6f4 100644 --- a/Doc/latex/group___u_t_i_l_s___d_e_f_i_n_e_s.tex +++ b/Doc/latex/group___u_t_i_l_s___d_e_f_i_n_e_s.tex @@ -1,4 +1,4 @@ -\doxysubsubsection{Utils defines} +\doxysubsubsection{Utils defines } \hypertarget{group___u_t_i_l_s___d_e_f_i_n_e_s}{}\label{group___u_t_i_l_s___d_e_f_i_n_e_s}\index{Utils defines@{Utils defines}} @@ -15,13 +15,13 @@ Collaboration diagram for Utils defines\+:\nopagebreak \doxysubsubsubsubsection*{Macros} \begin{DoxyCompactItemize} \item -\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gaf5e598848326d48e86167e5099a029be}{Clear\+Struct}}(\+\_\+struct\+\_\+)~memset(\&(\+\_\+struct\+\_\+), 0, sizeof(\+\_\+struct\+\_\+)) +\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gaf5e598848326d48e86167e5099a029be}{Clear\+Struct}}(\+\_\+struct\+\_\+) \begin{DoxyCompactList}\small\item\em Обнуление структуры. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gabf45f2b60eedf80cf9d1dbe4302a741e}{Divide\+\_\+\+Up}}(\+\_\+val\+\_\+, \+\_\+div\+\_\+)~((\+\_\+val\+\_\+ -\/ 1) / \+\_\+div\+\_\+) + 1 /\texorpdfstring{$\ast$}{*} через мат выражение \texorpdfstring{$\ast$}{*}/ +\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gabf45f2b60eedf80cf9d1dbe4302a741e}{Divide\+\_\+\+Up}}(\+\_\+val\+\_\+, \+\_\+div\+\_\+) \begin{DoxyCompactList}\small\item\em Деление с округлением вверх \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga0f22e895ac7781c3d1b68fee182c4291}{Byte\+Swap16}}(v)~(((v\&0x\+FF00) $>$$>$ (8)) \texorpdfstring{$\vert$}{|} ((v\&0x00\+FF) $<$$<$ (8))) +\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga0f22e895ac7781c3d1b68fee182c4291}{Byte\+Swap16}}(v) \begin{DoxyCompactList}\small\item\em Swap between Little Endian and Big Endian. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga996f7be338ccb40d1a2a5abc1ad61759}{ABS}}(x)~( ((x) $>$ 0)? (x) \+: -\/(x)) +\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga996f7be338ccb40d1a2a5abc1ad61759}{ABS}}(x) \begin{DoxyCompactList}\small\item\em Абсолютное значение числа \end{DoxyCompactList}\end{DoxyCompactItemize} @@ -30,13 +30,20 @@ Collaboration diagram for Utils defines\+:\nopagebreak +\label{doc-define-members} +\Hypertarget{group___u_t_i_l_s___d_e_f_i_n_e_s_doc-define-members} \doxysubsubsubsection{Macro Definition Documentation} -\Hypertarget{group___u_t_i_l_s___d_e_f_i_n_e_s_gaf5e598848326d48e86167e5099a029be}\label{group___u_t_i_l_s___d_e_f_i_n_e_s_gaf5e598848326d48e86167e5099a029be} -\index{Utils defines@{Utils defines}!ClearStruct@{ClearStruct}} +\Hypertarget{group___u_t_i_l_s___d_e_f_i_n_e_s_gaf5e598848326d48e86167e5099a029be}\index{Utils defines@{Utils defines}!ClearStruct@{ClearStruct}} \index{ClearStruct@{ClearStruct}!Utils defines@{Utils defines}} \doxysubsubsubsubsection{\texorpdfstring{ClearStruct}{ClearStruct}} -{\footnotesize\ttfamily \#define Clear\+Struct(\begin{DoxyParamCaption}\item[{}]{\+\_\+struct\+\_\+ }\end{DoxyParamCaption})~memset(\&(\+\_\+struct\+\_\+), 0, sizeof(\+\_\+struct\+\_\+))} +{\footnotesize\ttfamily \label{group___u_t_i_l_s___d_e_f_i_n_e_s_gaf5e598848326d48e86167e5099a029be} +\#define Clear\+Struct(\begin{DoxyParamCaption}\item[{}]{\+\_\+struct\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{memset(\&(\_struct\_),\ 0,\ \textcolor{keyword}{sizeof}(\_struct\_))} + +\end{DoxyCode} Обнуление структуры. @@ -48,14 +55,19 @@ Collaboration diagram for Utils defines\+:\nopagebreak \end{DoxyParams} Макрос использует memset для обнуления всей памяти структуры. Используется для быстрой и безопасной инициализации переменных структур до нуля. -Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00151}{151}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00155}{155}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. -\Hypertarget{group___u_t_i_l_s___d_e_f_i_n_e_s_gabf45f2b60eedf80cf9d1dbe4302a741e}\label{group___u_t_i_l_s___d_e_f_i_n_e_s_gabf45f2b60eedf80cf9d1dbe4302a741e} -\index{Utils defines@{Utils defines}!Divide\_Up@{Divide\_Up}} +\Hypertarget{group___u_t_i_l_s___d_e_f_i_n_e_s_gabf45f2b60eedf80cf9d1dbe4302a741e}\index{Utils defines@{Utils defines}!Divide\_Up@{Divide\_Up}} \index{Divide\_Up@{Divide\_Up}!Utils defines@{Utils defines}} \doxysubsubsubsubsection{\texorpdfstring{Divide\_Up}{Divide\_Up}} -{\footnotesize\ttfamily \#define Divide\+\_\+\+Up(\begin{DoxyParamCaption}\item[{}]{\+\_\+val\+\_\+, }\item[{}]{\+\_\+div\+\_\+ }\end{DoxyParamCaption})~((\+\_\+val\+\_\+ -\/ 1) / \+\_\+div\+\_\+) + 1 /\texorpdfstring{$\ast$}{*} через мат выражение \texorpdfstring{$\ast$}{*}/} +{\footnotesize\ttfamily \label{group___u_t_i_l_s___d_e_f_i_n_e_s_gabf45f2b60eedf80cf9d1dbe4302a741e} +\#define Divide\+\_\+\+Up(\begin{DoxyParamCaption}\item[{}]{\+\_\+val\+\_\+}{, }\item[{}]{\+\_\+div\+\_\+}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{((\_val\_\ -\/\ 1)\ /\ \_div\_)\ +\ 1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{/*\ через\ мат\ выражение\ */}} + +\end{DoxyCode} Деление с округлением вверх @@ -72,14 +84,19 @@ Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00151}{151}} of file \end{DoxyReturn} Если результат деления без остатка\+: он возвращается как есть Если с остатком -\/ округляется вверх -Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00162}{162}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00166}{166}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. -\Hypertarget{group___u_t_i_l_s___d_e_f_i_n_e_s_ga0f22e895ac7781c3d1b68fee182c4291}\label{group___u_t_i_l_s___d_e_f_i_n_e_s_ga0f22e895ac7781c3d1b68fee182c4291} -\index{Utils defines@{Utils defines}!ByteSwap16@{ByteSwap16}} +\Hypertarget{group___u_t_i_l_s___d_e_f_i_n_e_s_ga0f22e895ac7781c3d1b68fee182c4291}\index{Utils defines@{Utils defines}!ByteSwap16@{ByteSwap16}} \index{ByteSwap16@{ByteSwap16}!Utils defines@{Utils defines}} \doxysubsubsubsubsection{\texorpdfstring{ByteSwap16}{ByteSwap16}} -{\footnotesize\ttfamily \#define Byte\+Swap16(\begin{DoxyParamCaption}\item[{}]{v }\end{DoxyParamCaption})~(((v\&0x\+FF00) $>$$>$ (8)) \texorpdfstring{$\vert$}{|} ((v\&0x00\+FF) $<$$<$ (8)))} +{\footnotesize\ttfamily \label{group___u_t_i_l_s___d_e_f_i_n_e_s_ga0f22e895ac7781c3d1b68fee182c4291} +\#define Byte\+Swap16(\begin{DoxyParamCaption}\item[{}]{v}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(((v\&0xFF00)\ >>\ (8))\ |\ ((v\&0x00FF)\ <<\ (8)))} + +\end{DoxyCode} Swap between Little Endian and Big Endian. @@ -94,14 +111,19 @@ Swap between Little Endian and Big Endian. \end{DoxyReturn} Переключения между двумя типами хранения слова\+: HI-\/\+LO байты и LO-\/\+HI байты. -Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00170}{170}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00174}{174}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. -\Hypertarget{group___u_t_i_l_s___d_e_f_i_n_e_s_ga996f7be338ccb40d1a2a5abc1ad61759}\label{group___u_t_i_l_s___d_e_f_i_n_e_s_ga996f7be338ccb40d1a2a5abc1ad61759} -\index{Utils defines@{Utils defines}!ABS@{ABS}} +\Hypertarget{group___u_t_i_l_s___d_e_f_i_n_e_s_ga996f7be338ccb40d1a2a5abc1ad61759}\index{Utils defines@{Utils defines}!ABS@{ABS}} \index{ABS@{ABS}!Utils defines@{Utils defines}} \doxysubsubsubsubsection{\texorpdfstring{ABS}{ABS}} -{\footnotesize\ttfamily \#define ABS(\begin{DoxyParamCaption}\item[{}]{x }\end{DoxyParamCaption})~( ((x) $>$ 0)? (x) \+: -\/(x))} +{\footnotesize\ttfamily \label{group___u_t_i_l_s___d_e_f_i_n_e_s_ga996f7be338ccb40d1a2a5abc1ad61759} +\#define ABS(\begin{DoxyParamCaption}\item[{}]{x}{}\end{DoxyParamCaption})} +{\bfseries Value\+:} +\begin{DoxyCode}{0} +\DoxyCodeLine{(\ ((x)\ >\ 0)?\ (x)\ :\ -\/(x))} + +\end{DoxyCode} Абсолютное значение числа @@ -116,5 +138,5 @@ Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00170}{170}} of file \end{DoxyReturn} Берет число по модулю. Хз как работает библиотечный abs в stdlib.\+h, мб это быстрее, но вряд ли конечно. -Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00178}{178}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. +Definition at line \mbox{\hyperlink{mylibs__defs_8h_source_l00182}{182}} of file \mbox{\hyperlink{mylibs__defs_8h_source}{mylibs\+\_\+defs.\+h}}. diff --git a/Doc/latex/index.tex b/Doc/latex/index.tex index 87fb315..ae07843 100644 --- a/Doc/latex/index.tex +++ b/Doc/latex/index.tex @@ -1,34 +1,42 @@ -\chapter{My\+Libs} +\chapter{My\+Libs } \hypertarget{index}{}\label{index}\index{MyLibs@{MyLibs}} \hypertarget{index_overview}{}\doxysection{\texorpdfstring{Обзор}{Обзор}}\label{index_overview} -My\+Libs -\/ это набор библиотек для удобной работы с периферией микроконтроллеров STM32.\hypertarget{index_features}{}\doxysubsection{\texorpdfstring{Основные возможности}{Основные возможности}}\label{index_features} -\hypertarget{index_utils_module}{}\doxysubsubsection{\texorpdfstring{Общие утилиты (\doxylink{group___m_y_l_i_b_s___d_e_f_i_n_e_s}{General Tools})}{Общие утилиты (\doxylink{group___m_y_l_i_b_s___d_e_f_i_n_e_s}{General Tools})}}\label{index_utils_module} +My\+Libs -\/ это набор библиотек для удобной работы с STM32.\hypertarget{index_features}{}\doxysubsection{\texorpdfstring{Основные возможности}{Основные возможности}}\label{index_features} +\hypertarget{index_utils_module}{}\doxysubsubsection{\texorpdfstring{Общие утилиты (\protect\doxylink{group___m_y_l_i_b_s___d_e_f_i_n_e_s}{General Tools})}{Общие утилиты ({General Tools})}}\label{index_utils_module} \begin{DoxyItemize} \item Макросы для задержек и утилит (\doxylink{group___d_e_l_a_y_s___d_e_f_i_n_e_s}{Delays defines} и \doxylink{group___u_t_i_l_s___d_e_f_i_n_e_s}{Utils defines}) \item Трекеры для статистики и отладки (\doxylink{group___t_r_a_c_k_e_r_s}{Trackers defines} и \doxylink{group___t_r_a_c_e}{Trace defines}) \item Эволюционный алгоритм для оптимизации параметров (\doxylink{group___e_v_o_l_v_e___o_p_t_i_m_i_z_e_r}{Evolve optimizer}) \item Битовый доступ к регистрам через union (\doxylink{group___b_i_t___a_c_c_e_s_s___d_e_f_i_n_e_s}{Bit access defines}) -\end{DoxyItemize}\hypertarget{index_trace_module}{}\doxysubsubsection{\texorpdfstring{Трассировка \doxylink{group___t_r_a_c_e}{Trace defines}}{Трассировка \doxylink{group___t_r_a_c_e}{Trace defines}}}\label{index_trace_module} +\end{DoxyItemize}\hypertarget{index_trace_module}{}\doxysubsubsection{\texorpdfstring{Трассировка \protect\doxylink{group___t_r_a_c_e}{Trace defines}}{Трассировка {Trace defines}}}\label{index_trace_module} \begin{DoxyItemize} \item Serial трассировка через SWO и RTT (\doxylink{group___t_r_a_c_e___s_e_r_i_a_l}{Serial trace defines}) \item GPIO трассировка для отладки (\doxylink{group___t_r_a_c_e___g_p_i_o}{GPIO trace defines}) \item Сохранение логов в Flash память (\doxylink{group___t_r_a_c_e___r_t_t___f_l_a_s_h}{Flash RTT Buffer}) \item Обработка Hard\+Fault с сохранением контекста (\doxylink{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t}{Hardfault trace defines}) -\end{DoxyItemize}\hypertarget{index_gpio_module}{}\doxysubsubsection{\texorpdfstring{Модуль GPIO \doxylink{group___m_y___l_i_b_s___g_p_i_o}{GPIO Tools}}{Модуль GPIO \doxylink{group___m_y___l_i_b_s___g_p_i_o}{GPIO Tools}}}\label{index_gpio_module} +\end{DoxyItemize}\hypertarget{index_gpio_module}{}\doxysubsubsection{\texorpdfstring{Модуль GPIO \protect\doxylink{group___m_y___l_i_b_s___g_p_i_o}{GPIO Tools}}{Модуль GPIO {GPIO Tools}}}\label{index_gpio_module} \begin{DoxyItemize} \item Инициализация портов и тактирования (\doxylink{group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l}{General tools}) \item Управление светодиодами (включение/выключение, моргание, плавное затухание) (\doxylink{group___m_y_l_i_b_s___g_p_i_o___l_e_d_s}{LED tools}) \item Работа с кнопками (чтение состояния, фильтрация дребезга) (\doxylink{group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h}{Switch tools}) -\end{DoxyItemize}\hypertarget{index_tim_module}{}\doxysubsubsection{\texorpdfstring{Модуль таймеров \doxylink{group___m_y___l_i_b_s___t_i_m}{TIM Tools}}{Модуль таймеров \doxylink{group___m_y___l_i_b_s___t_i_m}{TIM Tools}}}\label{index_tim_module} +\end{DoxyItemize}\hypertarget{index_tim_module}{}\doxysubsubsection{\texorpdfstring{Модуль таймеров \protect\doxylink{group___m_y___l_i_b_s___t_i_m}{TIM Tools}}{Модуль таймеров {TIM Tools}}}\label{index_tim_module} \begin{DoxyItemize} \item Базовая инициализация таймеров (\doxylink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l}{General tools}) \item Формирование задержек (блокирующие и неблокирующие) (\doxylink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y}{Delay tools}) \item Работа с энкодерами (чтение положения, обработка кнопок) (\doxylink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r}{Encoder tools}) \item Настройка ШИМ и Output Compare (\doxylink{group___m_y_l_i_b_s___t_i_m___o_c}{PWM/\+OC Channels tools}) +\end{DoxyItemize}\hypertarget{index_uart_module}{}\doxysubsubsection{\texorpdfstring{Модуль UART \protect\doxylink{group___m_y___l_i_b_s___u_a_r_t}{UART Tools}}{Модуль UART {UART Tools}}}\label{index_uart_module} + +\begin{DoxyItemize} +\item Базовая инициализация UART и его пинов одной функцией (\doxylink{group___m_y___l_i_b_s___u_a_r_t_gab9f07396b778505c934143e89953e154}{UART\+\_\+\+Base\+\_\+\+Init}) +\end{DoxyItemize}\hypertarget{index_spi_module}{}\doxysubsubsection{\texorpdfstring{Модуль SPI \protect\doxylink{group___m_y___l_i_b_s___s_p_i}{SPI Tools}}{Модуль SPI {SPI Tools}}}\label{index_spi_module} + +\begin{DoxyItemize} +\item Базовая инициализация SPI и пинов одной функцией (\doxylink{group___m_y___l_i_b_s___s_p_i_ga0e177e3c57a8fcdc73b5602e72ec66ba}{SPI\+\_\+\+Base\+\_\+\+Init}) \end{DoxyItemize}\hypertarget{index_structure}{}\doxysubsection{\texorpdfstring{Структура проекта}{Структура проекта}}\label{index_structure} \begin{DoxyCode}{0} @@ -37,13 +45,18 @@ My\+Libs -\/ это набор библиотек для удобной рабо \DoxyCodeLine{│\ \ \ ├──\ mylibs\_config.h\ \ \ \ \ \ \#\ Конфигурация\ библиотек} \DoxyCodeLine{│\ \ \ ├──\ mylibs\_defs.h\ \ \ \ \ \ \ \ \#\ Общие\ определения\ и\ макросы} \DoxyCodeLine{│\ \ \ ├──\ bit\_access.h\ \ \ \ \ \ \ \ \ \#\ Битовый\ доступ\ к\ регистрам} +\DoxyCodeLine{│\ \ \ ├──\ evolve\_optimizer.h\ \ \ \#\ Оптимизатор\ (генетический\ алгоритм)} \DoxyCodeLine{│\ \ \ ├──\ trackers.h\ \ \ \ \ \ \ \ \ \ \ \#\ Трекеры\ для\ отладки} \DoxyCodeLine{│\ \ \ ├──\ trace.h\ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ Трассировка\ и\ логирование} \DoxyCodeLine{│\ \ \ ├──\ general\_gpio.h\ \ \ \ \ \ \ \#\ Работа\ с\ GPIO} +\DoxyCodeLine{\ \ \ \ ├──\ general\_spi.h\ \ \ \ \ \ \ \ \#\ Работа\ с\ SPI} \DoxyCodeLine{│\ \ \ └──\ general\_tim.h\ \ \ \ \ \ \ \ \#\ Работа\ с\ таймерами} +\DoxyCodeLine{\ \ \ \ ├──\ general\_uart.h\ \ \ \ \ \ \ \#\ Работа\ с\ UART} \DoxyCodeLine{└──\ src/\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ Исходные\ файлы} \DoxyCodeLine{\ \ \ \ ├──\ general\_gpio.c\ \ \ \ \ \ \ \#\ Реализация\ GPIO} +\DoxyCodeLine{\ \ \ \ ├──\ general\_spi.c\ \ \ \ \ \ \ \ \#\ Реализация\ SPI} \DoxyCodeLine{\ \ \ \ └──\ general\_tim.c\ \ \ \ \ \ \ \ \#\ Реализация\ TIM} +\DoxyCodeLine{\ \ \ \ ├──\ general\_uart.c\ \ \ \ \ \ \ \#\ Реализация\ UART} \end{DoxyCode} \hypertarget{index_usage_basic}{}\doxysubsection{\texorpdfstring{Использование}{Использование}}\label{index_usage_basic} @@ -58,46 +71,5 @@ My\+Libs -\/ это набор библиотек для удобной рабо \end{DoxyCode} -\item Используйте нужные модули в своем коде -\end{DoxyEnumerate}\hypertarget{index_gpio_example}{}\doxysubsubsection{\texorpdfstring{Пример работы с GPIO}{Пример работы с GPIO}}\label{index_gpio_example} - -\begin{DoxyCode}{0} -\DoxyCodeLine{\textcolor{comment}{//\ Инициализация\ светодиода}} -\DoxyCodeLine{MX\_GPIO\_Init();} -\DoxyCodeLine{\mbox{\hyperlink{struct_g_p_i_o___l_e_d_type_def}{GPIO\_LEDTypeDef}}\ led;} -\DoxyCodeLine{\mbox{\hyperlink{group___m_y_l_i_b_s___g_p_i_o___l_e_d_s_gac936453c7a0841c0b17bcfdae4958084}{GPIO\_LED\_Init}}(\&led,\ GPIOA,\ GPIO\_PIN\_5,\ 1);} -\DoxyCodeLine{} -\DoxyCodeLine{\textcolor{comment}{//\ Включение\ светодиода}} -\DoxyCodeLine{\mbox{\hyperlink{group___m_y_l_i_b_s___g_p_i_o___l_e_d_s_ga4b9572949326b050694cd55d0a7e5f6c}{GPIO\_LED\_On}}(\&led);} -\DoxyCodeLine{} -\DoxyCodeLine{\textcolor{comment}{//\ Запуск\ моргания}} -\DoxyCodeLine{\mbox{\hyperlink{group___m_y_l_i_b_s___g_p_i_o___l_e_d_s_gaf22f44ecaf6a1932b47edc5a845b03a9}{GPIO\_LED\_Blink\_Start}}(\&led,\ 500);\ \textcolor{comment}{//\ Период\ 500\ мс}} -\DoxyCodeLine{} -\DoxyCodeLine{\textcolor{comment}{//\ В\ основном\ цикле}} -\DoxyCodeLine{\textcolor{keywordflow}{while}\ (1)\ \{} -\DoxyCodeLine{\mbox{\hyperlink{group___m_y_l_i_b_s___g_p_i_o___l_e_d_s_gad6e6189824406c4d472b6340c7f19bb2}{GPIO\_LED\_Dynamic\_Handle}}(\&led);} -\DoxyCodeLine{\}} - -\end{DoxyCode} -\hypertarget{index_tim_example}{}\doxysubsubsection{\texorpdfstring{Пример работы с таймером}{Пример работы с таймером}}\label{index_tim_example} - -\begin{DoxyCode}{0} -\DoxyCodeLine{\textcolor{comment}{//\ Настройка\ таймера}} -\DoxyCodeLine{\mbox{\hyperlink{struct_t_i_m___settings_type_def}{TIM\_SettingsTypeDef}}\ tim\_settings\ =\ \{0\};} -\DoxyCodeLine{tim\_settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_ada49efdbd35a8e442c3cff630d42f34c}{htim}}.Instance\ =\ TIM2;} -\DoxyCodeLine{tim\_settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_a7073358fd3a722687eb85238ab570014}{sTimAHBFreqMHz}}\ =\ SystemCoreClock;} -\DoxyCodeLine{tim\_settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_a58da1b4c0f6d12d7d9fb2f170b9b9e6e}{sTickBaseUS}}\ =\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ggaa0a51c870325217ac099881f09dd0800a6a66c5ed1d966c9e30f0219b664d2b25}{TIM\_TickBase\_1MS}};} -\DoxyCodeLine{tim\_settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_af6057ff3f60f5e01b41d4a347b79a5e4}{sTimFreqHz}}\ =\ 1000;\ \textcolor{comment}{//\ 1\ кГц}} -\DoxyCodeLine{tim\_settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_ab90e370c3edda88e76583293c250d2b0}{sTimMode}}\ =\ TIM\_IT\_CONF;} -\DoxyCodeLine{} -\DoxyCodeLine{\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga7044214f24a9868ba7e1650b55e639ec}{TIM\_Base\_Init}}(\&tim\_settings);} -\DoxyCodeLine{HAL\_TIM\_Base\_Start(\&tim\_settings.\mbox{\hyperlink{struct_t_i_m___settings_type_def_ada49efdbd35a8e442c3cff630d42f34c}{htim}});} - -\end{DoxyCode} -\hypertarget{index_dependencies}{}\doxysubsection{\texorpdfstring{Зависимости}{Зависимости}}\label{index_dependencies} - -\begin{DoxyItemize} -\item HAL библиотека STM32 -\item SEGGER RTT (опционально, для RTT трассировки) -\item Free\+RTOS (опционально, для Free\+RTOS задержек) -\end{DoxyItemize} \ No newline at end of file +\item Используйте нужные модули в своем коде. Примеры использования приведены в соответствующей теме +\end{DoxyEnumerate} \ No newline at end of file diff --git a/Doc/latex/longtable_doxygen.sty b/Doc/latex/longtable_doxygen.sty index e94b78b..39a44b8 100644 --- a/Doc/latex/longtable_doxygen.sty +++ b/Doc/latex/longtable_doxygen.sty @@ -164,7 +164,7 @@ \ifdim \dimen@>\z@\vfil\break\fi \global\@colroom\@colht \ifvoid\LT@foot\else - \advance\vsize-\ht\LT@foot + \global\advance\vsize-\ht\LT@foot \global\advance\@colroom-\ht\LT@foot \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@ \maxdepth\z@ @@ -193,9 +193,13 @@ \LT@final@warn \fi \endgraf\penalty -\LT@end@pen + \ifvoid\LT@foot\else + \global\advance\vsize\ht\LT@foot + \global\advance\@colroom\ht\LT@foot + \dimen@\pagegoal\advance\dimen@\ht\LT@foot\pagegoal\dimen@ + \fi \endgroup \global\@mparbottom\z@ - \pagegoal\vsize \endgraf\penalty\z@\addvspace\LTpost \ifvoid\footins\else\insert\footins{}\fi} \def\LT@nofcols#1&{% @@ -392,18 +396,17 @@ \setbox\z@\vbox{\unvbox\@cclv}% \ifdim \ht\LT@lastfoot>\ht\LT@foot \dimen@\pagegoal + \advance\dimen@\ht\LT@foot \advance\dimen@-\ht\LT@lastfoot \ifdim\dimen@<\ht\z@ \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}% \@makecol \@outputpage + \global\vsize\@colroom \setbox\z@\vbox{\box\LT@head}% \fi \fi - \global\@colroom\@colht - \global\vsize\@colht - \vbox - {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}% + \unvbox\z@\ifvoid\LT@lastfoot\copy\LT@foot\else\box\LT@lastfoot\fi \fi \else \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}% diff --git a/Doc/latex/mainpage_8h_source.tex b/Doc/latex/mainpage_8h_source.tex index 7067a67..f9eba08 100644 --- a/Doc/latex/mainpage_8h_source.tex +++ b/Doc/latex/mainpage_8h_source.tex @@ -1,5 +1,5 @@ \doxysection{mainpage.\+h} -\hypertarget{mainpage_8h_source}{}\label{mainpage_8h_source}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/mainpage.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/mainpage.h}} +\hypertarget{mainpage_8h_source}{}\label{mainpage_8h_source}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/mainpage.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/mainpage.h}} \begin{DoxyCode}{0} \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00001}00001\ \textcolor{comment}{}} @@ -7,7 +7,7 @@ \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00003}00003\ \textcolor{comment}{@mainpage}} \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00004}00004\ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00005}00005\ \textcolor{comment}{@section\ overview\ Обзор}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00006}00006\ \textcolor{comment}{MyLibs\ -\/\ это\ набор\ библиотек\ для\ удобной\ работы\ с\ периферией\ микроконтроллеров\ STM32.}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00006}00006\ \textcolor{comment}{MyLibs\ -\/\ это\ набор\ библиотек\ для\ удобной\ работы\ с\ STM32.}} \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00007}00007\ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00008}00008\ \textcolor{comment}{@subsection\ features\ Основные\ возможности}} \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00009}00009\ \textcolor{comment}{}} @@ -34,77 +34,47 @@ \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00030}00030\ \textcolor{comment}{-\/\ Работа\ с\ энкодерами\ (чтение\ положения,\ обработка\ кнопок)\ (@ref\ MYLIBS\_TIM\_ENCODER)}} \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00031}00031\ \textcolor{comment}{-\/\ Настройка\ ШИМ\ и\ Output\ Compare\ (@ref\ MYLIBS\_TIM\_OC)}} \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00032}00032\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00033}00033\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00034}00034\ \textcolor{comment}{@subsection\ structure\ Структура\ проекта}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00033}00033\ \textcolor{comment}{@subsubsection\ uart\_module\ Модуль\ UART\ @ref\ MY\_LIBS\_UART}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00034}00034\ \textcolor{comment}{-\/\ Базовая\ инициализация\ UART\ и\ его\ пинов\ одной\ функцией\ (@ref\ UART\_Base\_Init)}} \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00035}00035\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00036}00036\ \textcolor{comment}{@code}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00037}00037\ \textcolor{comment}{├──\ inc/\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ Заголовочные\ файлы}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00038}00038\ \textcolor{comment}{│\ \ \ ├──\ mylibs\_include.h\ \ \ \ \ \#\ Главный\ include\ файл}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00039}00039\ \textcolor{comment}{│\ \ \ ├──\ mylibs\_config.h\ \ \ \ \ \ \#\ Конфигурация\ библиотек}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00040}00040\ \textcolor{comment}{│\ \ \ ├──\ mylibs\_defs.h\ \ \ \ \ \ \ \ \#\ Общие\ определения\ и\ макросы}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00041}00041\ \textcolor{comment}{│\ \ \ ├──\ bit\_access.h\ \ \ \ \ \ \ \ \ \#\ Битовый\ доступ\ к\ регистрам}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00042}00042\ \textcolor{comment}{│\ \ \ ├──\ trackers.h\ \ \ \ \ \ \ \ \ \ \ \#\ Трекеры\ для\ отладки}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00043}00043\ \textcolor{comment}{│\ \ \ ├──\ trace.h\ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ Трассировка\ и\ логирование}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00044}00044\ \textcolor{comment}{│\ \ \ ├──\ general\_gpio.h\ \ \ \ \ \ \ \#\ Работа\ с\ GPIO}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00045}00045\ \textcolor{comment}{│\ \ \ └──\ general\_tim.h\ \ \ \ \ \ \ \ \#\ Работа\ с\ таймерами}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00046}00046\ \textcolor{comment}{└──\ src/\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ Исходные\ файлы}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00047}00047\ \textcolor{comment}{\ \ \ \ ├──\ general\_gpio.c\ \ \ \ \ \ \ \#\ Реализация\ GPIO}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00048}00048\ \textcolor{comment}{\ \ \ \ └──\ general\_tim.c\ \ \ \ \ \ \ \ \#\ Реализация\ TIM}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00049}00049\ \textcolor{comment}{@endcode}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00050}00050\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00051}00051\ \textcolor{comment}{@subsection\ usage\_basic\ Использование}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00052}00052\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00053}00053\ \textcolor{comment}{Инструкция\ по\ подключению:}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00054}00054\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00055}00055\ \textcolor{comment}{1.\ Настройте\ конфигурацию\ @ref\ MYLIBS\_CONFIG\ в\ @ref\ mylibs\_config.h\ }} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00056}00056\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00057}00057\ \textcolor{comment}{2.\ Подключите\ главный\ заголовочный\ файл:}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00058}00058\ \textcolor{comment}{@code}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00059}00059\ \textcolor{comment}{\#include\ "{}mylibs\_include.h"{}}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00060}00060\ \textcolor{comment}{@endcode}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00061}00061\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00062}00062\ \textcolor{comment}{3.\ Используйте\ нужные\ модули\ в\ своем\ коде}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00063}00063\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00064}00064\ \textcolor{comment}{@subsubsection\ gpio\_example\ Пример\ работы\ с\ GPIO}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00065}00065\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00066}00066\ \textcolor{comment}{@code}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00067}00067\ \textcolor{comment}{//\ Инициализация\ светодиода}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00068}00068\ \textcolor{comment}{MX\_GPIO\_Init();}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00069}00069\ \textcolor{comment}{GPIO\_LEDTypeDef\ led;}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00070}00070\ \textcolor{comment}{GPIO\_LED\_Init(\&led,\ GPIOA,\ GPIO\_PIN\_5,\ 1);}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00036}00036\ \textcolor{comment}{@subsubsection\ spi\_module\ Модуль\ SPI\ @ref\ MY\_LIBS\_SPI}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00037}00037\ \textcolor{comment}{-\/\ Базовая\ инициализация\ SPI\ и\ пинов\ одной\ функцией\ (@ref\ SPI\_Base\_Init)}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00038}00038\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00039}00039\ \textcolor{comment}{@subsection\ structure\ Структура\ проекта}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00040}00040\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00041}00041\ \textcolor{comment}{@code}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00042}00042\ \textcolor{comment}{├──\ inc/\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ Заголовочные\ файлы}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00043}00043\ \textcolor{comment}{│\ \ \ ├──\ mylibs\_include.h\ \ \ \ \ \#\ Главный\ include\ файл}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00044}00044\ \textcolor{comment}{│\ \ \ ├──\ mylibs\_config.h\ \ \ \ \ \ \#\ Конфигурация\ библиотек}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00045}00045\ \textcolor{comment}{│\ \ \ ├──\ mylibs\_defs.h\ \ \ \ \ \ \ \ \#\ Общие\ определения\ и\ макросы}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00046}00046\ \textcolor{comment}{│\ \ \ ├──\ bit\_access.h\ \ \ \ \ \ \ \ \ \#\ Битовый\ доступ\ к\ регистрам}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00047}00047\ \textcolor{comment}{│\ \ \ ├──\ evolve\_optimizer.h\ \ \ \#\ Оптимизатор\ (генетический\ алгоритм)}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00048}00048\ \textcolor{comment}{│\ \ \ ├──\ trackers.h\ \ \ \ \ \ \ \ \ \ \ \#\ Трекеры\ для\ отладки}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00049}00049\ \textcolor{comment}{│\ \ \ ├──\ trace.h\ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ Трассировка\ и\ логирование}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00050}00050\ \textcolor{comment}{│\ \ \ ├──\ general\_gpio.h\ \ \ \ \ \ \ \#\ Работа\ с\ GPIO}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00051}00051\ \textcolor{comment}{\ \ \ \ ├──\ general\_spi.h\ \ \ \ \ \ \ \ \#\ Работа\ с\ SPI}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00052}00052\ \textcolor{comment}{│\ \ \ └──\ general\_tim.h\ \ \ \ \ \ \ \ \#\ Работа\ с\ таймерами}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00053}00053\ \textcolor{comment}{\ \ \ \ ├──\ general\_uart.h\ \ \ \ \ \ \ \#\ Работа\ с\ UART}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00054}00054\ \textcolor{comment}{└──\ src/\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ Исходные\ файлы}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00055}00055\ \textcolor{comment}{\ \ \ \ ├──\ general\_gpio.c\ \ \ \ \ \ \ \#\ Реализация\ GPIO}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00056}00056\ \textcolor{comment}{\ \ \ \ ├──\ general\_spi.c\ \ \ \ \ \ \ \ \#\ Реализация\ SPI}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00057}00057\ \textcolor{comment}{\ \ \ \ └──\ general\_tim.c\ \ \ \ \ \ \ \ \#\ Реализация\ TIM}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00058}00058\ \textcolor{comment}{\ \ \ \ ├──\ general\_uart.c\ \ \ \ \ \ \ \#\ Реализация\ UART}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00059}00059\ \textcolor{comment}{@endcode}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00060}00060\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00061}00061\ \textcolor{comment}{@subsection\ usage\_basic\ Использование}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00062}00062\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00063}00063\ \textcolor{comment}{Инструкция\ по\ подключению:}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00064}00064\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00065}00065\ \textcolor{comment}{1.\ Настройте\ конфигурацию\ @ref\ MYLIBS\_CONFIG\ в\ @ref\ mylibs\_config.h\ }} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00066}00066\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00067}00067\ \textcolor{comment}{2.\ Подключите\ главный\ заголовочный\ файл:}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00068}00068\ \textcolor{comment}{@code}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00069}00069\ \textcolor{comment}{\#include\ "{}mylibs\_include.h"{}}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00070}00070\ \textcolor{comment}{@endcode}} \DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00071}00071\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00072}00072\ \textcolor{comment}{//\ Включение\ светодиода}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00073}00073\ \textcolor{comment}{GPIO\_LED\_On(\&led);}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00074}00074\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00075}00075\ \textcolor{comment}{//\ Запуск\ моргания}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00076}00076\ \textcolor{comment}{GPIO\_LED\_Blink\_Start(\&led,\ 500);\ //\ Период\ 500\ мс}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00077}00077\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00078}00078\ \textcolor{comment}{//\ В\ основном\ цикле}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00079}00079\ \textcolor{comment}{while\ (1)\ \{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00080}00080\ \textcolor{comment}{GPIO\_LED\_Dynamic\_Handle(\&led);}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00081}00081\ \textcolor{comment}{\}}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00082}00082\ \textcolor{comment}{@endcode}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00083}00083\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00084}00084\ \textcolor{comment}{@subsubsection\ tim\_example\ Пример\ работы\ с\ таймером}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00085}00085\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00086}00086\ \textcolor{comment}{@code}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00087}00087\ \textcolor{comment}{//\ Настройка\ таймера}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00088}00088\ \textcolor{comment}{TIM\_SettingsTypeDef\ tim\_settings\ =\ \{0\};}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00089}00089\ \textcolor{comment}{tim\_settings.htim.Instance\ =\ TIM2;}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00090}00090\ \textcolor{comment}{tim\_settings.sTimAHBFreqMHz\ =\ SystemCoreClock;}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00091}00091\ \textcolor{comment}{tim\_settings.sTickBaseUS\ =\ TIM\_TickBase\_1MS;}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00092}00092\ \textcolor{comment}{tim\_settings.sTimFreqHz\ =\ 1000;\ //\ 1\ кГц}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00093}00093\ \textcolor{comment}{tim\_settings.sTimMode\ =\ TIM\_IT\_CONF;}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00094}00094\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00095}00095\ \textcolor{comment}{TIM\_Base\_Init(\&tim\_settings);}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00096}00096\ \textcolor{comment}{HAL\_TIM\_Base\_Start(\&tim\_settings.htim);}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00097}00097\ \textcolor{comment}{@endcode}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00098}00098\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00099}00099\ \textcolor{comment}{@subsection\ dependencies\ Зависимости}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00100}00100\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00101}00101\ \textcolor{comment}{-\/\ HAL\ библиотека\ STM32}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00102}00102\ \textcolor{comment}{-\/\ SEGGER\ RTT\ (опционально,\ для\ RTT\ трассировки)}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00103}00103\ \textcolor{comment}{-\/\ FreeRTOS\ (опционально,\ для\ FreeRTOS\ задержек)}} -\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00104}00104\ \textcolor{comment}{\ */}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00072}00072\ \textcolor{comment}{3.\ Используйте\ нужные\ модули\ в\ своем\ коде.\ Примеры\ использования\ приведены\ в\ соответствующей\ теме}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00073}00073\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mainpage_8h_source_l00074}00074\ \textcolor{comment}{\ */}} \end{DoxyCode} diff --git a/Doc/latex/make.bat b/Doc/latex/make.bat index 96da1c8..ccd0c1b 100644 --- a/Doc/latex/make.bat +++ b/Doc/latex/make.bat @@ -1,5 +1,5 @@ pushd %~dp0 -if not %errorlevel% == 0 goto :end +if not %errorlevel% == 0 goto :end1 set ORG_LATEX_CMD=%LATEX_CMD% set ORG_MKIDX_CMD=%MKIDX_CMD% @@ -16,10 +16,12 @@ del /s /f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl %LATEX_CMD% %MANUAL_FILE% +@if ERRORLEVEL 1 goto :error echo ---- %MKIDX_CMD% %MANUAL_FILE%.idx echo ---- %LATEX_CMD% %MANUAL_FILE% +@if ERRORLEVEL 1 goto :error setlocal enabledelayedexpansion set count=%LATEX_COUNT% @@ -34,12 +36,21 @@ if !count! EQU 0 goto :skip echo ---- %LATEX_CMD% %MANUAL_FILE% +@if ERRORLEVEL 1 goto :error goto :repeat :skip endlocal %MKIDX_CMD% %MANUAL_FILE%.idx %LATEX_CMD% %MANUAL_FILE% +@if ERRORLEVEL 1 goto :error +goto :end +:error +@echo =============== +@echo Please consult %MANUAL_FILE%.log to see the error messages +@echo =============== + +:end @REM reset environment popd set LATEX_CMD=%ORG_LATEX_CMD% @@ -53,4 +64,4 @@ set ORG_MANUAL_FILE= set LATEX_COUNT=%ORG_LATEX_COUNT% set ORG_LATEX_COUNT= -:end +:end1 diff --git a/Doc/latex/mylibs__config_8h.tex b/Doc/latex/mylibs__config_8h.tex index a5b9c86..ebfbb44 100644 --- a/Doc/latex/mylibs__config_8h.tex +++ b/Doc/latex/mylibs__config_8h.tex @@ -1,19 +1,21 @@ -\doxysection{F\+:/\+Work/\+Projects/\+STM/.Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/mylibs\+\_\+config.h File Reference} -\hypertarget{mylibs__config_8h}{}\label{mylibs__config_8h}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_config.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_config.h}} +\doxysection{E\+:/.WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/mylibs\+\_\+config.h File Reference} +\hypertarget{mylibs__config_8h}{}\label{mylibs__config_8h}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_config.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_config.h}} Конфигурации для библиотек My\+Libs. {\ttfamily \#include "{}stm32f4xx\+\_\+hal.\+h"{}}\newline -Include dependency graph for mylibs\+\_\+config.\+h\+:\nopagebreak +Include dependency graph for mylibs\+\_\+config.\+h\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode -\includegraphics[width=233pt]{mylibs__config_8h__incl} +\includegraphics[width=229pt]{mylibs__config_8h__incl} \end{center} \end{figure} -This graph shows which files directly or indirectly include this file\+:\nopagebreak +This graph shows which files directly or indirectly include this file\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode @@ -61,6 +63,8 @@ This graph shows which files directly or indirectly include this file\+:\nopageb \begin{DoxyCompactList}\small\item\em Максимальное количество параметров \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___e_v_o_l_v_e___c_o_n_f_i_g_ga7c1396e5c95c766afccdb45cbfcf5971}{EVOLVE\+\_\+\+MAX\+\_\+\+CANDIDATES}}~100 \begin{DoxyCompactList}\small\item\em Максимальное количество кандидатов для обучения \end{DoxyCompactList}\item +\#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga9c853b02c22f26023c34d1d404b6d653}{local\+\_\+time}}() +\begin{DoxyCompactList}\small\item\em Локальное время \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga66560656d080d6551627a19dfb847c66}{INCLUDE\+\_\+\+EVOLVE\+\_\+\+OPTIMIZER}} \begin{DoxyCompactList}\small\item\em Подключить библиотеку для оптимизации параметров \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_gaf4ddb2a71ec0d05c2480e197cd17c0be}{INCLUDE\+\_\+\+BIT\+\_\+\+ACCESS\+\_\+\+LIB}} @@ -70,7 +74,9 @@ This graph shows which files directly or indirectly include this file\+:\nopageb \#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga0a3ca94b616997069dd53e2c6c2687d7}{INCLUDE\+\_\+\+TRACE\+\_\+\+LIB}} \begin{DoxyCompactList}\small\item\em Подключить библиотеку с трейсами \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga181a46326e46b60afb160190832c7281}{INCLUDE\+\_\+\+GENERAL\+\_\+\+PERIPH\+\_\+\+LIBS}} -\begin{DoxyCompactList}\small\item\em Подключить библиотеку с периферией \end{DoxyCompactList}\end{DoxyCompactItemize} +\begin{DoxyCompactList}\small\item\em Подключить библиотеку с периферией \end{DoxyCompactList}\item +\#define \mbox{\hyperlink{group___l_i_b_s___c_o_n_f_i_g_ga57c369737d5c0cfdb7baeecba0a4b151}{FREERTOS\+\_\+\+DELAY}} +\begin{DoxyCompactList}\small\item\em Использовать Free\+RTOS задержку, вместо HAL. \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsection{Detailed Description} diff --git a/Doc/latex/mylibs__config_8h__dep__incl.md5 b/Doc/latex/mylibs__config_8h__dep__incl.md5 index 1bc1f47..77d2196 100644 --- a/Doc/latex/mylibs__config_8h__dep__incl.md5 +++ b/Doc/latex/mylibs__config_8h__dep__incl.md5 @@ -1 +1 @@ -dfdd61dc82258e402e33665df3248b95 \ No newline at end of file +082ebf45da1eebb6c29f7ba296f9fb91 \ No newline at end of file diff --git a/Doc/latex/mylibs__config_8h__dep__incl.pdf b/Doc/latex/mylibs__config_8h__dep__incl.pdf index 220546e6feababd686c5f1b7a5653a1bea6df595..55fcc32a4e4949d4635dc063e6fbf391f7131972 100644 GIT binary patch delta 25783 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 h_P^ZzkJnz_)!5Ee7@YaL~*{{_oiD7ydv diff --git a/Doc/latex/mylibs__config_8h__incl.md5 b/Doc/latex/mylibs__config_8h__incl.md5 index 7d171f1..05972e8 100644 --- a/Doc/latex/mylibs__config_8h__incl.md5 +++ b/Doc/latex/mylibs__config_8h__incl.md5 @@ -1 +1 @@ -427d243444c5f0fad6dcdd2d1fe989d2 \ No newline at end of file +7f343940c93fbed727067d075d8fdd8d \ No newline at end of file diff --git a/Doc/latex/mylibs__config_8h__incl.pdf b/Doc/latex/mylibs__config_8h__incl.pdf index 7e62295a0a153bdeb636fe44272aa50775f79be6..a46ec9c4f9066106226ed3df25ef3dfb8df7af0c 100644 GIT binary patch delta 20160 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 shzezHWOH$= \+\_\+ms\+\_\+) +\#define \mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gaed082c07b9fc4d1894330d885b9b5518}{ms\+Delay\+Wait\+Done}}(\+\_\+ms\+\_\+, \+\_\+pvar\+\_\+) \begin{DoxyCompactList}\small\item\em Проверяет, завершилась ли задержка. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gaf5e598848326d48e86167e5099a029be}{Clear\+Struct}}(\+\_\+struct\+\_\+)~memset(\&(\+\_\+struct\+\_\+), 0, sizeof(\+\_\+struct\+\_\+)) +\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gaf5e598848326d48e86167e5099a029be}{Clear\+Struct}}(\+\_\+struct\+\_\+) \begin{DoxyCompactList}\small\item\em Обнуление структуры. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gabf45f2b60eedf80cf9d1dbe4302a741e}{Divide\+\_\+\+Up}}(\+\_\+val\+\_\+, \+\_\+div\+\_\+)~((\+\_\+val\+\_\+ -\/ 1) / \+\_\+div\+\_\+) + 1 /\texorpdfstring{$\ast$}{*} через мат выражение \texorpdfstring{$\ast$}{*}/ +\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gabf45f2b60eedf80cf9d1dbe4302a741e}{Divide\+\_\+\+Up}}(\+\_\+val\+\_\+, \+\_\+div\+\_\+) \begin{DoxyCompactList}\small\item\em Деление с округлением вверх \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga0f22e895ac7781c3d1b68fee182c4291}{Byte\+Swap16}}(v)~(((v\&0x\+FF00) $>$$>$ (8)) \texorpdfstring{$\vert$}{|} ((v\&0x00\+FF) $<$$<$ (8))) +\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga0f22e895ac7781c3d1b68fee182c4291}{Byte\+Swap16}}(v) \begin{DoxyCompactList}\small\item\em Swap between Little Endian and Big Endian. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga996f7be338ccb40d1a2a5abc1ad61759}{ABS}}(x)~( ((x) $>$ 0)? (x) \+: -\/(x)) +\#define \mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga996f7be338ccb40d1a2a5abc1ad61759}{ABS}}(x) \begin{DoxyCompactList}\small\item\em Абсолютное значение числа \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsubsection*{Functions} \begin{DoxyCompactItemize} diff --git a/Doc/latex/mylibs__defs_8h__dep__incl.md5 b/Doc/latex/mylibs__defs_8h__dep__incl.md5 index 5c2d1b7..2454bdf 100644 --- a/Doc/latex/mylibs__defs_8h__dep__incl.md5 +++ b/Doc/latex/mylibs__defs_8h__dep__incl.md5 @@ -1 +1 @@ -a0add19dd86a580c165837823a871204 \ No newline at end of file +0085824f98ba0aa8e935c0ada2fd3b2e \ No newline at end of file diff --git a/Doc/latex/mylibs__defs_8h__dep__incl.pdf b/Doc/latex/mylibs__defs_8h__dep__incl.pdf index 65f15a3364729b0e8a533a0eca274c246647608f..75731ace979e1469b2d9fa26dd677492602b012b 100644 GIT binary patch delta 25644 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
    jJGCR;$Yk~?R)ud`!=n$e*QC4 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 delta 24826 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 delta 20436 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%0Dof!yvt}$cTF=_^j7R3#%rLa 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 PRUZj4H3}sqMNdWw;a%Se diff --git a/Doc/latex/mylibs__defs_8h_source.tex b/Doc/latex/mylibs__defs_8h_source.tex index 366b229..a44b4a6 100644 --- a/Doc/latex/mylibs__defs_8h_source.tex +++ b/Doc/latex/mylibs__defs_8h_source.tex @@ -1,5 +1,5 @@ \doxysection{mylibs\+\_\+defs.\+h} -\hypertarget{mylibs__defs_8h_source}{}\label{mylibs__defs_8h_source}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_defs.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_defs.h}} +\hypertarget{mylibs__defs_8h_source}{}\label{mylibs__defs_8h_source}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_defs.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_defs.h}} \mbox{\hyperlink{mylibs__defs_8h}{Go to the documentation of this file.}} \begin{DoxyCode}{0} \DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00001}00001\ \textcolor{comment}{/**\ }} @@ -76,115 +76,137 @@ \DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00072}00072\ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00073}00073\ \textcolor{comment}{/**\ }} \DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00074}00074\ \textcolor{comment}{\ \ *\ @def\ msDelay(\_ms\_)}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00075}00075\ \textcolor{comment}{\ \ *\ @brief\ Задержка\ на\ указанное\ количество\ миллисекунд.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00075}00075\ \textcolor{comment}{\ \ *\ @brief\ Блокирующая\ задержка\ на\ указанное\ количество\ миллисекунд.}} \DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00076}00076\ \textcolor{comment}{\ \ *\ @param\ \_ms\_\ Время\ задержки\ в\ миллисекундах.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00077}00077\ \textcolor{comment}{\ \ *\ @note\ Использует\ HAL\_Delay\ или\ osDelay\ в\ зависимости\ от\ @ref\ FREERTOS\_DELAY.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00077}00077\ \textcolor{comment}{\ \ *\ @note\ Использует\ задержку\ через\ @ref\ local\_time\ или\ osDelay\ в\ зависимости\ от\ @ref\ FREERTOS\_DELAY.}} \DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00078}00078\ \textcolor{comment}{\ \ */}} \DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00079}00079\ \textcolor{preprocessor}{\#ifdef\ FREERTOS\_DELAY}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00080}00080\ \textcolor{preprocessor}{\ \ \#define\ msDelay(\_ms\_)\ \ \ \ \ \ \ osDelay(\_ms\_)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00080}\mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gabeb97579daeb622c6651ed03c4a27479}{00080}}\ \textcolor{preprocessor}{\ \ \#define\ msDelay(\_ms\_)\ \ \ \ \ \ \ osDelay(\_ms\_)}} \DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00081}00081\ \textcolor{preprocessor}{\#else}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00082}\mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gabeb97579daeb622c6651ed03c4a27479}{00082}}\ \textcolor{preprocessor}{\ \ \#define\ msDelay(\_ms\_)\ \ \ \ \ \ \ HAL\_Delay(\_ms\_)}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00083}00083\ \textcolor{preprocessor}{\#endif}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00084}00084\ } -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00085}00085\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00086}00086\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00087}00087\ \textcolor{comment}{\ \ *\ @brief\ Начать\ отсчет\ задержки.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00088}00088\ \textcolor{comment}{\ \ *\ @param\ \_pvar\_\ Указатель\ на\ переменную\ типа\ uint32\_t\ для\ хранения\ времени\ старта.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00089}00089\ \textcolor{comment}{\ \ *\ @details\ После\ вызова\ этого\ макроса\ переменная\ \_pvar\_\ содержит\ текущее\ количество\ миллисекунд}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00090}00090\ \textcolor{comment}{\ \ *\ с\ момента\ запуска\ системы\ (HAL\_GetTick).\ }} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00091}00091\ \textcolor{comment}{\ \ *\ }} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00092}00092\ \textcolor{comment}{\ \ *\ Используется\ для\ реализации\ неблокирующих\ задержек.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00093}00093\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00094}\mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga8a5051b1292d1019fe8dd3fc5521ab25}{00094}}\ \textcolor{preprocessor}{\#define\ msDelayStart(\_pvar\_)\ \ \ \ \ \ \ \ \ \ \ \ *(\_pvar\_)\ =\ HAL\_GetTick()}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00095}00095\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00096}00096\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00097}00097\ \textcolor{comment}{\ *\ @brief\ Проверяет,\ активна\ ли\ задержка.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00098}00098\ \textcolor{comment}{\ *\ @param\ \_ms\_\ Длительность\ задержки\ в\ миллисекундах.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00099}00099\ \textcolor{comment}{\ *\ @param\ \_pvar\_\ Указатель\ на\ переменную,\ в\ которой\ сохранено\ время\ начала\ (@ref\ msDelayStart).}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00100}00100\ \textcolor{comment}{\ *\ @retval\ 1\ Задержка\ еще\ активна.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00101}00101\ \textcolor{comment}{\ *\ @retval\ 0\ Задержка\ завершена.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00102}00102\ \textcolor{comment}{\ *\ @details}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00103}00103\ \textcolor{comment}{\ *\ Возвращает\ true,\ пока\ время\ задержки\ не\ истекло.\ Используется\ в\ проверках,}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00104}00104\ \textcolor{comment}{\ *\ когда\ нужно\ **действовать,\ пока\ задержка\ выполняется**.\ Пример:}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00105}00105\ \textcolor{comment}{\ *\ @code}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00106}00106\ \textcolor{comment}{\ *\ while(msDelayWhileActive(1000,\ \&tick))\ \{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00107}00107\ \textcolor{comment}{\ *\ \ \ \ \ //\ выполняем\ другие\ задачи,\ задержка\ не\ блокирует\ поток}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00108}00108\ \textcolor{comment}{\ *\ \}}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00109}00109\ \textcolor{comment}{\ *\ @endcode}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00110}00110\ \textcolor{comment}{\ */}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00111}\mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga0b97e172659a59ee4fa56f851643ae85}{00111}}\ \textcolor{preprocessor}{\#define\ msDelayWhileActive(\_ms\_,\ \_pvar\_)\ \ \ \ (HAL\_GetTick()\ -\/\ *(\_pvar\_)\ <\ \_ms\_)}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00112}00112\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00113}00113\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00114}00114\ \textcolor{comment}{\ *\ @brief\ Проверяет,\ завершилась\ ли\ задержка.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00115}00115\ \textcolor{comment}{\ *\ @param\ \_ms\_\ Длительность\ задержки\ в\ миллисекундах.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00116}00116\ \textcolor{comment}{\ *\ @param\ \_pvar\_\ Указатель\ на\ переменную,\ в\ которой\ сохранено\ время\ начала\ (msDelayStart).}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00117}00117\ \textcolor{comment}{\ *\ @retval\ 1\ Задержка\ завершена.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00118}00118\ \textcolor{comment}{\ *\ @retval\ 0\ Задержка\ еще\ активна.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00119}00119\ \textcolor{comment}{\ *\ @details}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00120}00120\ \textcolor{comment}{\ *\ Возвращает\ true,\ когда\ задержка\ уже\ завершена.\ Используется\ в\ проверках,}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00121}00121\ \textcolor{comment}{\ *\ когда\ нужно\ **выполнить\ действие\ только\ после\ окончания\ задержки**.\ Пример:}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00122}00122\ \textcolor{comment}{\ *\ @code}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00123}00123\ \textcolor{comment}{\ *\ if(msDelayWaitDone(1000,\ \&tick))\ \{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00124}00124\ \textcolor{comment}{\ *\ \ \ \ \ //\ выполняем\ действие\ после\ завершения\ задержки}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00125}00125\ \textcolor{comment}{\ *\ \}}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00126}00126\ \textcolor{comment}{\ *\ @endcode}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00127}00127\ \textcolor{comment}{\ */}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00128}\mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gaed082c07b9fc4d1894330d885b9b5518}{00128}}\ \textcolor{preprocessor}{\#define\ msDelayWaitDone(\_ms\_,\ \_pvar\_)\ \ \ \ (HAL\_GetTick()\ -\/\ *(\_pvar\_)\ >=\ \_ms\_)}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00129}00129\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00130}00130\ \textcolor{comment}{/**\ DELAYS\_DEFINES}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00131}00131\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00132}00132\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00133}00133\ } -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00134}00134\ } -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00135}00135\ \textcolor{comment}{/***************************************************************************}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00136}00136\ \textcolor{comment}{*******************************UTIL\_DEFINES********************************/}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00137}00137\ \textcolor{keyword}{static}\ \textcolor{keywordtype}{int}\ dummy;\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00138}00138\ \textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00139}00139\ \textcolor{comment}{\ \ *\ @addtogroup\ UTILS\_DEFINES\ \ \ \ \ \ Utils\ defines}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00140}00140\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MYLIBS\_DEFINES}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00141}00141\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Общие\ вспомогательные\ макросы}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00142}00142\ \textcolor{comment}{\ \ *\ @\{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00143}00143\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00144}00144\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00145}00145\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00146}00146\ \textcolor{comment}{\ *\ @brief\ Обнуление\ структуры.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00147}00147\ \textcolor{comment}{\ *\ @param\ \_struct\_\ Структура,\ которую\ нужно\ обнулить.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00148}00148\ \textcolor{comment}{\ *\ @details\ Макрос\ использует\ memset\ для\ обнуления\ всей\ памяти\ структуры.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00149}00149\ \textcolor{comment}{\ *\ Используется\ для\ быстрой\ и\ безопасной\ инициализации\ переменных\ структур\ до\ нуля.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00150}00150\ \textcolor{comment}{\ */}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00151}\mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gaf5e598848326d48e86167e5099a029be}{00151}}\ \textcolor{preprocessor}{\#define\ ClearStruct(\_struct\_)\ \ \ \ \ memset(\&(\_struct\_),\ 0,\ sizeof(\_struct\_))}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00152}00152\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00153}00153\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00154}00154\ \textcolor{comment}{\ \ *\ @brief\ \ Деление\ с\ округлением\ вверх}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00155}00155\ \textcolor{comment}{\ \ *\ @param\ \_val\_\ Делимое.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00156}00156\ \textcolor{comment}{\ \ *\ @param\ \_div\_\ Делитель.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00157}00157\ \textcolor{comment}{\ \ *\ @return\ Результат\ деления,\ округленный\ вверх.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00158}00158\ \textcolor{comment}{\ \ *\ @details\ \ Если\ результат\ деления\ без\ остатка:\ он\ возвращается\ как\ есть}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00159}00159\ \textcolor{comment}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ Если\ с\ остатком\ -\/\ округляется\ вверх}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00160}00160\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00161}00161\ \textcolor{comment}{//\#define\ Divide\_Up(\_val\_,\ \_div\_)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (((\_val\_)\%(\_div\_))?\ (\_val\_)/(\_div\_)+1\ :\ (\_val\_)/\_div\_)\ \ /*\ через\ тернарный\ оператор\ */}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00162}\mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gabf45f2b60eedf80cf9d1dbe4302a741e}{00162}}\ \textcolor{preprocessor}{\#define\ Divide\_Up(\_val\_,\ \_div\_)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ((\_val\_\ -\/\ 1)\ /\ \_div\_)\ +\ 1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\textcolor{comment}{/*\ через\ мат\ выражение\ */}\textcolor{preprocessor}{\ }} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00163}00163\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00164}00164\ \textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00165}00165\ \textcolor{comment}{\ \ *\ @brief\ \ Swap\ between\ Little\ Endian\ and\ Big\ Endian}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00166}00166\ \textcolor{comment}{\ \ *\ @param\ v\ Исходное\ 16-\/битное\ значение.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00167}00167\ \textcolor{comment}{\ \ *\ @return\ Результат\ с\ поменяными\ местами\ старшим\ и\ младшим\ байтом.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00168}00168\ \textcolor{comment}{\ \ *\ @details\ \ Переключения\ между\ двумя\ типами\ хранения\ слова:\ HI-\/LO\ байты\ и\ LO-\/HI\ байты.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00169}00169\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00170}\mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga0f22e895ac7781c3d1b68fee182c4291}{00170}}\ \textcolor{preprocessor}{\#define\ ByteSwap16(v)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (((v\&0xFF00)\ >>\ (8))\ |\ ((v\&0x00FF)\ <<\ (8)))}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00171}00171\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00172}00172\ \textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00173}00173\ \textcolor{comment}{\ \ *\ @brief\ \ Абсолютное\ значение\ числа}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00174}00174\ \textcolor{comment}{\ \ *\ @param\ x\ Число.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00175}00175\ \textcolor{comment}{\ \ *\ @return\ Абсолютное\ значение\ числа\ x.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00176}00176\ \textcolor{comment}{\ \ *\ @details\ \ Берет\ число\ по\ модулю.\ Хз\ как\ работает\ библиотечный\ abs\ в\ stdlib.h,\ мб\ это\ быстрее,\ но\ вряд\ ли\ конечно.}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00177}00177\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00178}\mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga996f7be338ccb40d1a2a5abc1ad61759}{00178}}\ \textcolor{preprocessor}{\#define\ ABS(x)\ (\ ((x)\ >\ 0)?\ (x)\ :\ -\/(x))}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00179}00179\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00180}00180\ \textcolor{comment}{/**\ UTILS\_DEFINES}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00181}00181\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00182}00182\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00183}00183\ \ \ } -\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00184}00184\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\_\_MYLIBS\_DEFINES\_H\_}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00082}00082\ \textcolor{preprocessor}{\ \ \#define\ msDelay(\_ms\_)\ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00083}00083\ \textcolor{preprocessor}{\ \ \ \ do\ \{\ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00084}00084\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ uint32\_t\ \_start\_\ =\ local\_time();\ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00085}00085\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ while\ (local\_time()\ -\/\ \_start\_\ <\ (\_ms\_))\ \{\}\ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00086}00086\ \textcolor{preprocessor}{\ \ \ \ \}\ while(0)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00087}00087\ \textcolor{preprocessor}{\#endif}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00088}00088\ } +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00089}00089\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00090}00090\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00091}00091\ \textcolor{comment}{\ \ *\ @brief\ Начать\ отсчет\ задержки.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00092}00092\ \textcolor{comment}{\ \ *\ @param\ \_pvar\_\ Указатель\ на\ переменную\ типа\ uint32\_t\ для\ хранения\ времени\ старта.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00093}00093\ \textcolor{comment}{\ \ *\ @details\ После\ вызова\ этого\ макроса\ переменная\ \_pvar\_\ содержит\ текущее\ количество\ миллисекунд}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00094}00094\ \textcolor{comment}{\ \ *\ с\ момента\ запуска\ системы\ (@ref\ local\_time).\ }} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00095}00095\ \textcolor{comment}{\ \ *\ }} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00096}00096\ \textcolor{comment}{\ \ *\ Используется\ для\ реализации\ неблокирующих\ задержек.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00097}00097\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00098}\mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga8a5051b1292d1019fe8dd3fc5521ab25}{00098}}\ \textcolor{preprocessor}{\#define\ msDelayStart(\_pvar\_)\ \ \ \ \ \ \ \ \ \ \ \ *(\_pvar\_)\ =\ local\_time()}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00099}00099\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00100}00100\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00101}00101\ \textcolor{comment}{\ *\ @brief\ Проверяет,\ активна\ ли\ задержка.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00102}00102\ \textcolor{comment}{\ *\ @param\ \_ms\_\ Длительность\ задержки\ в\ миллисекундах.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00103}00103\ \textcolor{comment}{\ *\ @param\ \_pvar\_\ Указатель\ на\ переменную,\ в\ которой\ сохранено\ время\ начала\ (@ref\ msDelayStart).}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00104}00104\ \textcolor{comment}{\ *\ @retval\ 1\ Задержка\ еще\ активна.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00105}00105\ \textcolor{comment}{\ *\ @retval\ 0\ Задержка\ завершена.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00106}00106\ \textcolor{comment}{\ *\ @details}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00107}00107\ \textcolor{comment}{\ *\ Возвращает\ true,\ пока\ время\ задержки\ не\ истекло.\ Используется\ в\ проверках,}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00108}00108\ \textcolor{comment}{\ *\ когда\ нужно\ **действовать,\ пока\ задержка\ выполняется**.\ Пример:}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00109}00109\ \textcolor{comment}{\ *\ @code}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00110}00110\ \textcolor{comment}{\ *\ while(msDelayWhileActive(1000,\ \&tick))\ \{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00111}00111\ \textcolor{comment}{\ *\ \ \ \ \ //\ выполняем\ другие\ задачи,\ задержка\ не\ блокирует\ поток}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00112}00112\ \textcolor{comment}{\ *\ \}}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00113}00113\ \textcolor{comment}{\ *\ @endcode}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00114}00114\ \textcolor{comment}{\ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00115}\mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_ga0b97e172659a59ee4fa56f851643ae85}{00115}}\ \textcolor{preprocessor}{\#define\ msDelayWhileActive(\_ms\_,\ \_pvar\_)\ \ \ \ (local\_time()\ -\/\ *(\_pvar\_)\ <\ \_ms\_)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00116}00116\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00117}00117\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00118}00118\ \textcolor{comment}{\ *\ @brief\ Проверяет,\ завершилась\ ли\ задержка.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00119}00119\ \textcolor{comment}{\ *\ @param\ \_ms\_\ Длительность\ задержки\ в\ миллисекундах.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00120}00120\ \textcolor{comment}{\ *\ @param\ \_pvar\_\ Указатель\ на\ переменную,\ в\ которой\ сохранено\ время\ начала\ (msDelayStart).}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00121}00121\ \textcolor{comment}{\ *\ @retval\ 1\ Задержка\ завершена.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00122}00122\ \textcolor{comment}{\ *\ @retval\ 0\ Задержка\ еще\ активна.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00123}00123\ \textcolor{comment}{\ *\ @details}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00124}00124\ \textcolor{comment}{\ *\ Возвращает\ true,\ когда\ задержка\ уже\ завершена.\ Используется\ в\ проверках,}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00125}00125\ \textcolor{comment}{\ *\ когда\ нужно\ **выполнить\ действие\ только\ после\ окончания\ задержки**.\ Пример:}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00126}00126\ \textcolor{comment}{\ *\ @code}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00127}00127\ \textcolor{comment}{\ *\ if(msDelayWaitDone(1000,\ \&tick))\ \{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00128}00128\ \textcolor{comment}{\ *\ \ \ \ \ //\ выполняем\ действие\ после\ завершения\ задержки}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00129}00129\ \textcolor{comment}{\ *\ \}}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00130}00130\ \textcolor{comment}{\ *\ @endcode}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00131}00131\ \textcolor{comment}{\ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00132}\mbox{\hyperlink{group___d_e_l_a_y_s___d_e_f_i_n_e_s_gaed082c07b9fc4d1894330d885b9b5518}{00132}}\ \textcolor{preprocessor}{\#define\ msDelayWaitDone(\_ms\_,\ \_pvar\_)\ \ \ \ (local\_time()\ -\/\ *(\_pvar\_)\ >=\ \_ms\_)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00133}00133\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00134}00134\ \textcolor{comment}{/**\ DELAYS\_DEFINES}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00135}00135\ \textcolor{comment}{\ \ *\ @\}}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00136}00136\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00137}00137\ } +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00138}00138\ } +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00139}00139\ \textcolor{comment}{/***************************************************************************}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00140}00140\ \textcolor{comment}{*******************************UTIL\_DEFINES********************************/}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00141}00141\ \textcolor{keyword}{static}\ \textcolor{keywordtype}{int}\ dummy;\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00142}00142\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00143}00143\ \textcolor{comment}{\ \ *\ @addtogroup\ UTILS\_DEFINES\ \ \ \ \ \ Utils\ defines}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00144}00144\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ MYLIBS\_DEFINES}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00145}00145\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Общие\ вспомогательные\ макросы}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00146}00146\ \textcolor{comment}{\ \ *\ @\{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00147}00147\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00148}00148\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00149}00149\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00150}00150\ \textcolor{comment}{\ *\ @brief\ Обнуление\ структуры.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00151}00151\ \textcolor{comment}{\ *\ @param\ \_struct\_\ Структура,\ которую\ нужно\ обнулить.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00152}00152\ \textcolor{comment}{\ *\ @details\ Макрос\ использует\ memset\ для\ обнуления\ всей\ памяти\ структуры.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00153}00153\ \textcolor{comment}{\ *\ Используется\ для\ быстрой\ и\ безопасной\ инициализации\ переменных\ структур\ до\ нуля.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00154}00154\ \textcolor{comment}{\ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00155}\mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gaf5e598848326d48e86167e5099a029be}{00155}}\ \textcolor{preprocessor}{\#define\ ClearStruct(\_struct\_)\ \ \ \ \ memset(\&(\_struct\_),\ 0,\ sizeof(\_struct\_))}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00156}00156\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00157}00157\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00158}00158\ \textcolor{comment}{\ \ *\ @brief\ \ Деление\ с\ округлением\ вверх}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00159}00159\ \textcolor{comment}{\ \ *\ @param\ \_val\_\ Делимое.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00160}00160\ \textcolor{comment}{\ \ *\ @param\ \_div\_\ Делитель.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00161}00161\ \textcolor{comment}{\ \ *\ @return\ Результат\ деления,\ округленный\ вверх.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00162}00162\ \textcolor{comment}{\ \ *\ @details\ \ Если\ результат\ деления\ без\ остатка:\ он\ возвращается\ как\ есть}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00163}00163\ \textcolor{comment}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ Если\ с\ остатком\ -\/\ округляется\ вверх}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00164}00164\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00165}00165\ \textcolor{comment}{//\#define\ Divide\_Up(\_val\_,\ \_div\_)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (((\_val\_)\%(\_div\_))?\ (\_val\_)/(\_div\_)+1\ :\ (\_val\_)/\_div\_)\ \ /*\ через\ тернарный\ оператор\ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00166}\mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_gabf45f2b60eedf80cf9d1dbe4302a741e}{00166}}\ \textcolor{preprocessor}{\#define\ Divide\_Up(\_val\_,\ \_div\_)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ((\_val\_\ -\/\ 1)\ /\ \_div\_)\ +\ 1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\textcolor{comment}{/*\ через\ мат\ выражение\ */}\textcolor{preprocessor}{\ }} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00167}00167\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00168}00168\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00169}00169\ \textcolor{comment}{\ \ *\ @brief\ \ Swap\ between\ Little\ Endian\ and\ Big\ Endian}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00170}00170\ \textcolor{comment}{\ \ *\ @param\ v\ Исходное\ 16-\/битное\ значение.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00171}00171\ \textcolor{comment}{\ \ *\ @return\ Результат\ с\ поменяными\ местами\ старшим\ и\ младшим\ байтом.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00172}00172\ \textcolor{comment}{\ \ *\ @details\ \ Переключения\ между\ двумя\ типами\ хранения\ слова:\ HI-\/LO\ байты\ и\ LO-\/HI\ байты.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00173}00173\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00174}\mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga0f22e895ac7781c3d1b68fee182c4291}{00174}}\ \textcolor{preprocessor}{\#define\ ByteSwap16(v)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (((v\&0xFF00)\ >>\ (8))\ |\ ((v\&0x00FF)\ <<\ (8)))}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00175}00175\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00176}00176\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00177}00177\ \textcolor{comment}{\ \ *\ @brief\ \ Абсолютное\ значение\ числа}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00178}00178\ \textcolor{comment}{\ \ *\ @param\ x\ Число.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00179}00179\ \textcolor{comment}{\ \ *\ @return\ Абсолютное\ значение\ числа\ x.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00180}00180\ \textcolor{comment}{\ \ *\ @details\ \ Берет\ число\ по\ модулю.\ Хз\ как\ работает\ библиотечный\ abs\ в\ stdlib.h,\ мб\ это\ быстрее,\ но\ вряд\ ли\ конечно.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00181}00181\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00182}\mbox{\hyperlink{group___u_t_i_l_s___d_e_f_i_n_e_s_ga996f7be338ccb40d1a2a5abc1ad61759}{00182}}\ \textcolor{preprocessor}{\#define\ ABS(x)\ (\ ((x)\ >\ 0)?\ (x)\ :\ -\/(x))}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00183}00183\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00184}00184\ \textcolor{comment}{/**\ UTILS\_DEFINES}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00185}00185\ \textcolor{comment}{\ \ *\ @\}}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00186}00186\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00187}00187\ \ \ } +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00188}00188\ } +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00189}00189\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00190}00190\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00191}00191\ \textcolor{comment}{\ *\ @cond\ LIBS\_INTERNAL}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00192}00192\ \textcolor{comment}{\ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00193}00193\ } +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00194}00194\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00195}00195\ \textcolor{comment}{/**\ \ }} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00196}00196\ \textcolor{comment}{\ \ *\ @brief\ \ Аналог\ HAL\ макроса\ для\ привязки\ DMA\ к\ UART.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00197}00197\ \textcolor{comment}{\ \ *\ @note\ \ \ @ref\ \_\_HAL\_LINKDMA.}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00198}00198\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00199}00199\ \textcolor{preprocessor}{\#define\ \_\_USER\_LINKDMA(\_\_HANDLE\_\_,\ \_\_PPP\_DMA\_FIELD\_\_,\ \_\_DMA\_HANDLE\_\_)\ \ \ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00200}00200\ \textcolor{preprocessor}{do\{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00201}00201\ \textcolor{preprocessor}{(\_\_HANDLE\_\_)-\/>\_\_PPP\_DMA\_FIELD\_\_\ =\ (\_\_DMA\_HANDLE\_\_);\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00202}00202\ \textcolor{preprocessor}{(\_\_DMA\_HANDLE\_\_)-\/>Parent\ =\ (\_\_HANDLE\_\_);\}\ while(0U)}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00203}00203\ } +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00204}00204\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00205}00205\ \textcolor{comment}{/**\ @endcond\ */}} +\DoxyCodeLine{\Hypertarget{mylibs__defs_8h_source_l00206}00206\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\_\_MYLIBS\_DEFINES\_H\_}} \end{DoxyCode} diff --git a/Doc/latex/mylibs__include_8h.tex b/Doc/latex/mylibs__include_8h.tex index 76892b9..6b0b211 100644 --- a/Doc/latex/mylibs__include_8h.tex +++ b/Doc/latex/mylibs__include_8h.tex @@ -1,5 +1,5 @@ -\doxysection{F\+:/\+Work/\+Projects/\+STM/.Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/mylibs\+\_\+include.h File Reference} -\hypertarget{mylibs__include_8h}{}\label{mylibs__include_8h}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_include.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_include.h}} +\doxysection{E\+:/.WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/mylibs\+\_\+include.h File Reference} +\hypertarget{mylibs__include_8h}{}\label{mylibs__include_8h}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_include.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_include.h}} Заголочный файл для всех библиотек @@ -11,10 +11,11 @@ {\ttfamily \#include "{}trackers.\+h"{}}\newline {\ttfamily \#include "{}trace.\+h"{}}\newline {\ttfamily \#include "{}evolve\+\_\+optimizer.\+h"{}}\newline -{\ttfamily \#include "{}general\+\_\+flash.\+h"{}}\newline +{\ttfamily \#include "{}\+\_\+\+\_\+general\+\_\+flash.\+h"{}}\newline {\ttfamily \#include "{}general\+\_\+gpio.\+h"{}}\newline {\ttfamily \#include "{}general\+\_\+tim.\+h"{}}\newline -Include dependency graph for mylibs\+\_\+include.\+h\+:\nopagebreak +Include dependency graph for mylibs\+\_\+include.\+h\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode diff --git a/Doc/latex/mylibs__include_8h__incl.md5 b/Doc/latex/mylibs__include_8h__incl.md5 index f52fb61..c15d6e6 100644 --- a/Doc/latex/mylibs__include_8h__incl.md5 +++ b/Doc/latex/mylibs__include_8h__incl.md5 @@ -1 +1 @@ -8121715bde1cc32481a3a48c6e1c486d \ No newline at end of file +eb944b0f31d4c04035027b6a55300940 \ No newline at end of file diff --git a/Doc/latex/mylibs__include_8h__incl.pdf b/Doc/latex/mylibs__include_8h__incl.pdf index 882ee8f11ca49771f1179ffa97990441420cf8f7..49c65883f1cf65ca3c9733bb665a85f97de10b2d 100644 GIT binary patch delta 25444 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 delta 25185 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 VC(v9wS}cBk5Ee7DthyZ5{{pDg3OxV- diff --git a/Doc/latex/mylibs__include_8h_source.tex b/Doc/latex/mylibs__include_8h_source.tex index 46d0545..37dcfd4 100644 --- a/Doc/latex/mylibs__include_8h_source.tex +++ b/Doc/latex/mylibs__include_8h_source.tex @@ -1,5 +1,5 @@ \doxysection{mylibs\+\_\+include.\+h} -\hypertarget{mylibs__include_8h_source}{}\label{mylibs__include_8h_source}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_include.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_include.h}} +\hypertarget{mylibs__include_8h_source}{}\label{mylibs__include_8h_source}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_include.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/mylibs\_include.h}} \mbox{\hyperlink{mylibs__include_8h}{Go to the documentation of this file.}} \begin{DoxyCode}{0} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00001}00001\ \textcolor{comment}{/**\ }} @@ -102,13 +102,13 @@ \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00098}00098\ } \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00099}00099\ \textcolor{preprocessor}{\#ifdef\ INCLUDE\_GENERAL\_PERIPH\_LIBS}} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00100}00100\ } -\DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00101}00101\ \textcolor{preprocessor}{\#include\ "{}general\_flash.h"{}}} +\DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00101}00101\ \textcolor{preprocessor}{\#include\ "{}\_\_general\_flash.h"{}}} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00102}00102\ \textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{general__gpio_8h}{general\_gpio.h}}"{}}} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00103}00103\ \textcolor{preprocessor}{\#ifdef\ HAL\_SPI\_MODULE\_ENABLED}} -\DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00104}00104\ \textcolor{preprocessor}{\#include\ "{}general\_spi.h"{}}} +\DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00104}00104\ \textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{general__spi_8h}{general\_spi.h}}"{}}} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00105}00105\ \textcolor{preprocessor}{\#endif}} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00106}00106\ \textcolor{preprocessor}{\#ifdef\ HAL\_UART\_MODULE\_ENABLED}} -\DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00107}00107\ \textcolor{preprocessor}{\#include\ "{}general\_uart.h"{}}} +\DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00107}00107\ \textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{general__uart_8h}{general\_uart.h}}"{}}} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00108}00108\ \textcolor{preprocessor}{\#endif}} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00109}00109\ \textcolor{preprocessor}{\#ifdef\ HAL\_TIM\_MODULE\_ENABLED}} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00110}00110\ \textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{general__tim_8h}{general\_tim.h}}"{}}} @@ -120,11 +120,11 @@ \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00116}00116\ } \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00117}00117\ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00118}00118\ \textcolor{comment}{/////////////////////////-\/-\/-\/USER\ SETTINGS-\/-\/-\//////////////////////////}} -\DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00119}00119\ \textcolor{comment}{}\textcolor{comment}{//\ user\ includes}} +\DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00119}00119\ \textcolor{comment}{//\ user\ includes}} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00120}00120\ } \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00121}00121\ \textcolor{comment}{//\ user\ settings}\textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00122}00122\ \textcolor{comment}{/////////////////////////-\/-\/-\/USER\ SETTINGS-\/-\/-\//////////////////////////}} -\DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00123}00123\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00123}00123\ } \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00124}00124\ } \DoxyCodeLine{\Hypertarget{mylibs__include_8h_source_l00125}00125\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ \_\_MYLIBS\_INCLUDE\_H\_}} diff --git a/Doc/latex/refman.tex b/Doc/latex/refman.tex index 1555761..f372478 100644 --- a/Doc/latex/refman.tex +++ b/Doc/latex/refman.tex @@ -1,7 +1,16 @@ % Handle batch mode % to overcome problems with too many open files \let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage} - \pdfminorversion=7 + \RequirePackage{iftex} + \ifLuaTeX + \directlua{pdf.setminorversion(7)} + \fi + \ifXeTeX + \special{pdf:minorversion 7} + \fi + \ifPDFTeX + \pdfminorversion=7 + \fi % Set document class depending on configuration \documentclass[twoside]{book} %% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package @@ -22,10 +31,18 @@ \let\protected@wlog\@@protected@wlog \makeatother \IfFormatAtLeastTF{2016/01/01}{}{\usepackage{fixltx2e}} % for \textsubscript - \IfFormatAtLeastTF{2015/01/01}{\pdfsuppresswarningpagegroup=1}{} + \ifPDFTeX + \IfFormatAtLeastTF{2015/01/01}{\pdfsuppresswarningpagegroup=1}{} + \fi \usepackage{doxygen} \usepackage{graphicx} - \usepackage[utf8]{inputenc} + \iftutex + \usepackage{fontspec} + \defaultfontfeatures{Ligatures={TeX}} + \usepackage{unicode-math} + \else + \usepackage[utf8]{inputenc} + \fi \usepackage{makeidx} \PassOptionsToPackage{warn}{textcomp} \usepackage{textcomp} @@ -34,7 +51,10 @@ % NLS support packages % Define default fonts % Font selection - \usepackage[T1]{fontenc} + \iftutex + \else + \usepackage[T1]{fontenc} + \fi % set main and monospaced font \usepackage[scaled=.90]{helvet} \usepackage{courier} @@ -115,13 +135,14 @@ } % ToC, LoF, LoT, bibliography, and index % Indices & bibliography - \usepackage{natbib} + \usepackage[numbers]{natbib} \usepackage[titles]{tocloft} \setcounter{tocdepth}{3} \setcounter{secnumdepth}{5} % creating indexes \makeindex - \usepackage{newunicodechar} + \ifPDFTeX +\usepackage{newunicodechar} \makeatletter \def\doxynewunicodechar#1#2{% \@tempswafalse @@ -140,15 +161,20 @@ \doxynewunicodechar{⁻}{${}^{-}$}% Superscript minus \doxynewunicodechar{²}{${}^{2}$}% Superscript two \doxynewunicodechar{³}{${}^{3}$}% Superscript three +\fi % Hyperlinks % Hyperlinks (required, but should be loaded last) - \ifpdf + \ifPDFTeX \usepackage[pdftex,pagebackref=true]{hyperref} \else - \ifxetex - \usepackage[pagebackref=true]{hyperref} + \ifXeTeX + \usepackage[xetex,pagebackref=true]{hyperref} \else - \usepackage[ps2pdf,pagebackref=true]{hyperref} + \ifLuaTeX + \usepackage[luatex,pagebackref=true]{hyperref} + \else + \usepackage[ps2pdf,pagebackref=true]{hyperref} + \fi \fi \fi \hypersetup{% @@ -196,7 +222,7 @@ {\Large My\+Libs}\\ [1ex]\large 1.\+0 \\ \vspace*{1cm} - {\large Generated by Doxygen 1.10.0}\\ + {\large Generated by Doxygen 1.14.0}\\ \end{center} \end{titlepage} \clearemptydoublepage @@ -232,16 +258,18 @@ \input{unionuint8___bit_type_def} \chapter{File Documentation} \input{____general__flash_8h_source} -\input{____general__spi_8h_source} -\input{____general__uart_8h_source} \input{bit__access_8h} \input{bit__access_8h_source} \input{evolve__optimizer_8h} \input{evolve__optimizer_8h_source} \input{general__gpio_8h} \input{general__gpio_8h_source} +\input{general__spi_8h} +\input{general__spi_8h_source} \input{general__tim_8h} \input{general__tim_8h_source} +\input{general__uart_8h} +\input{general__uart_8h_source} \input{mylibs__config_8h} \input{mylibs__config_8h_source} \input{mylibs__defs_8h} @@ -254,12 +282,14 @@ \input{trackers_8h_source} \input{mainpage_8h_source} \input{____general__flash_8c_source} -\input{____general__spi_8c_source} -\input{____general__uart_8c_source} \input{general__gpio_8c} \input{general__gpio_8c_source} +\input{general__spi_8c} +\input{general__spi_8c_source} \input{general__tim_8c} \input{general__tim_8c_source} +\input{general__uart_8c} +\input{general__uart_8c_source} %--- End generated contents --- % Index \backmatter diff --git a/Doc/latex/struct_evolve_optimizer__t.tex b/Doc/latex/struct_evolve_optimizer__t.tex index 3cfe9cd..ae00363 100644 --- a/Doc/latex/struct_evolve_optimizer__t.tex +++ b/Doc/latex/struct_evolve_optimizer__t.tex @@ -24,6 +24,10 @@ float \mbox{\hyperlink{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f \begin{DoxyCompactList}\small\item\em Амплитуда мутации (0..1) \end{DoxyCompactList}\item uint16\+\_\+t \mbox{\hyperlink{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}{cand\+\_\+index}} \begin{DoxyCompactList}\small\item\em Индекс кандидата для обработки \end{DoxyCompactList}\item +uint16\+\_\+t \mbox{\hyperlink{struct_evolve_optimizer__t_ad0f464d7048a9ed0753b61f76f563108}{gen\+\_\+index}} +\begin{DoxyCompactList}\small\item\em Индекс популяции \end{DoxyCompactList}\item +float \mbox{\hyperlink{struct_evolve_optimizer__t_a3be8c0c34db8429210ff470497a56727}{gen\+\_\+mut}} +\begin{DoxyCompactList}\small\item\em Амплитуда мутации у текущей популяции \end{DoxyCompactList}\item float \mbox{\hyperlink{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}{loss}} \mbox{[}100\mbox{]} \begin{DoxyCompactList}\small\item\em Loss для каждого кандидата \end{DoxyCompactList}\item float \mbox{\hyperlink{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}{candidates}} \mbox{[}100\mbox{]}\mbox{[}20\mbox{]} @@ -39,12 +43,14 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00102}{102}} of +\label{doc-variable-members} +\Hypertarget{struct_evolve_optimizer__t_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}\label{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c} -\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!stability@{stability}} +\Hypertarget{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c}\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!stability@{stability}} \index{stability@{stability}!EvolveOptimizer\_t@{EvolveOptimizer\_t}} \doxysubsubsection{\texorpdfstring{stability}{stability}} -{\footnotesize\ttfamily float Evolve\+Optimizer\+\_\+t\+::stability} +{\footnotesize\ttfamily \label{struct_evolve_optimizer__t_a80eb0b8525b6bb838484f5922b9d8f7c} +float Evolve\+Optimizer\+\_\+t\+::stability} @@ -54,11 +60,11 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00102}{102}} of Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00103}{103}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}\label{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8} -\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!n\_params@{n\_params}} +\Hypertarget{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8}\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!n\_params@{n\_params}} \index{n\_params@{n\_params}!EvolveOptimizer\_t@{EvolveOptimizer\_t}} \doxysubsubsection{\texorpdfstring{n\_params}{n\_params}} -{\footnotesize\ttfamily uint16\+\_\+t Evolve\+Optimizer\+\_\+t\+::n\+\_\+params} +{\footnotesize\ttfamily \label{struct_evolve_optimizer__t_a1c270fce82e0c97e6c88fd0971c1eed8} +uint16\+\_\+t Evolve\+Optimizer\+\_\+t\+::n\+\_\+params} @@ -66,13 +72,13 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00103}{103}} of -Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00104}{104}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00105}{105}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}\label{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1} -\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!n\_cand@{n\_cand}} +\Hypertarget{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1}\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!n\_cand@{n\_cand}} \index{n\_cand@{n\_cand}!EvolveOptimizer\_t@{EvolveOptimizer\_t}} \doxysubsubsection{\texorpdfstring{n\_cand}{n\_cand}} -{\footnotesize\ttfamily uint16\+\_\+t Evolve\+Optimizer\+\_\+t\+::n\+\_\+cand} +{\footnotesize\ttfamily \label{struct_evolve_optimizer__t_ac35c7ca8cede4ab9c53a2845a91cd1b1} +uint16\+\_\+t Evolve\+Optimizer\+\_\+t\+::n\+\_\+cand} @@ -80,13 +86,13 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00104}{104}} of -Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00105}{105}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00106}{106}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}\label{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6} -\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!n\_best@{n\_best}} +\Hypertarget{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6}\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!n\_best@{n\_best}} \index{n\_best@{n\_best}!EvolveOptimizer\_t@{EvolveOptimizer\_t}} \doxysubsubsection{\texorpdfstring{n\_best}{n\_best}} -{\footnotesize\ttfamily uint16\+\_\+t Evolve\+Optimizer\+\_\+t\+::n\+\_\+best} +{\footnotesize\ttfamily \label{struct_evolve_optimizer__t_a950cd70cb6bff33b78ad35ee58c729a6} +uint16\+\_\+t Evolve\+Optimizer\+\_\+t\+::n\+\_\+best} @@ -94,13 +100,13 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00105}{105}} of -Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00106}{106}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00107}{107}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8}\label{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8} -\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!mutation\_amp@{mutation\_amp}} +\Hypertarget{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8}\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!mutation\_amp@{mutation\_amp}} \index{mutation\_amp@{mutation\_amp}!EvolveOptimizer\_t@{EvolveOptimizer\_t}} \doxysubsubsection{\texorpdfstring{mutation\_amp}{mutation\_amp}} -{\footnotesize\ttfamily float Evolve\+Optimizer\+\_\+t\+::mutation\+\_\+amp} +{\footnotesize\ttfamily \label{struct_evolve_optimizer__t_af779c7aeba0053e36cee7aade160f1c8} +float Evolve\+Optimizer\+\_\+t\+::mutation\+\_\+amp} @@ -108,13 +114,13 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00106}{106}} of -Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00107}{107}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00108}{108}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}\label{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae} -\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!cand\_index@{cand\_index}} +\Hypertarget{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae}\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!cand\_index@{cand\_index}} \index{cand\_index@{cand\_index}!EvolveOptimizer\_t@{EvolveOptimizer\_t}} \doxysubsubsection{\texorpdfstring{cand\_index}{cand\_index}} -{\footnotesize\ttfamily uint16\+\_\+t Evolve\+Optimizer\+\_\+t\+::cand\+\_\+index} +{\footnotesize\ttfamily \label{struct_evolve_optimizer__t_a0ae0e63ba351335d4445d927991c64ae} +uint16\+\_\+t Evolve\+Optimizer\+\_\+t\+::cand\+\_\+index} @@ -122,13 +128,41 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00107}{107}} of -Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00108}{108}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00110}{110}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}\label{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df} -\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!loss@{loss}} +\Hypertarget{struct_evolve_optimizer__t_ad0f464d7048a9ed0753b61f76f563108}\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!gen\_index@{gen\_index}} +\index{gen\_index@{gen\_index}!EvolveOptimizer\_t@{EvolveOptimizer\_t}} +\doxysubsubsection{\texorpdfstring{gen\_index}{gen\_index}} +{\footnotesize\ttfamily \label{struct_evolve_optimizer__t_ad0f464d7048a9ed0753b61f76f563108} +uint16\+\_\+t Evolve\+Optimizer\+\_\+t\+::gen\+\_\+index} + + + +Индекс популяции + + + +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00111}{111}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. + +\Hypertarget{struct_evolve_optimizer__t_a3be8c0c34db8429210ff470497a56727}\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!gen\_mut@{gen\_mut}} +\index{gen\_mut@{gen\_mut}!EvolveOptimizer\_t@{EvolveOptimizer\_t}} +\doxysubsubsection{\texorpdfstring{gen\_mut}{gen\_mut}} +{\footnotesize\ttfamily \label{struct_evolve_optimizer__t_a3be8c0c34db8429210ff470497a56727} +float Evolve\+Optimizer\+\_\+t\+::gen\+\_\+mut} + + + +Амплитуда мутации у текущей популяции + + + +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00114}{114}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. + +\Hypertarget{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df}\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!loss@{loss}} \index{loss@{loss}!EvolveOptimizer\_t@{EvolveOptimizer\_t}} \doxysubsubsection{\texorpdfstring{loss}{loss}} -{\footnotesize\ttfamily float Evolve\+Optimizer\+\_\+t\+::loss\mbox{[}100\mbox{]}} +{\footnotesize\ttfamily \label{struct_evolve_optimizer__t_a93f628397c2f8d4027f2906752b650df} +float Evolve\+Optimizer\+\_\+t\+::loss\mbox{[}100\mbox{]}} @@ -136,13 +170,13 @@ Loss для каждого кандидата -Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00109}{109}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00116}{116}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}\label{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4} -\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!candidates@{candidates}} +\Hypertarget{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4}\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!candidates@{candidates}} \index{candidates@{candidates}!EvolveOptimizer\_t@{EvolveOptimizer\_t}} \doxysubsubsection{\texorpdfstring{candidates}{candidates}} -{\footnotesize\ttfamily float Evolve\+Optimizer\+\_\+t\+::candidates\mbox{[}100\mbox{]}\mbox{[}20\mbox{]}} +{\footnotesize\ttfamily \label{struct_evolve_optimizer__t_aec67667fd1f1533e693e41c79bc28da4} +float Evolve\+Optimizer\+\_\+t\+::candidates\mbox{[}100\mbox{]}\mbox{[}20\mbox{]}} @@ -150,13 +184,13 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00109}{109}} of -Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00110}{110}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00117}{117}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. -\Hypertarget{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}\label{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a} -\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!sorted\_idx@{sorted\_idx}} +\Hypertarget{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a}\index{EvolveOptimizer\_t@{EvolveOptimizer\_t}!sorted\_idx@{sorted\_idx}} \index{sorted\_idx@{sorted\_idx}!EvolveOptimizer\_t@{EvolveOptimizer\_t}} \doxysubsubsection{\texorpdfstring{sorted\_idx}{sorted\_idx}} -{\footnotesize\ttfamily uint16\+\_\+t Evolve\+Optimizer\+\_\+t\+::sorted\+\_\+idx\mbox{[}100\mbox{]}} +{\footnotesize\ttfamily \label{struct_evolve_optimizer__t_a74b81df1c298c99162310f3f7d91735a} +uint16\+\_\+t Evolve\+Optimizer\+\_\+t\+::sorted\+\_\+idx\mbox{[}100\mbox{]}} @@ -164,10 +198,10 @@ Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00110}{110}} of -Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00111}{111}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. +Definition at line \mbox{\hyperlink{evolve__optimizer_8h_source_l00118}{118}} of file \mbox{\hyperlink{evolve__optimizer_8h_source}{evolve\+\_\+optimizer.\+h}}. The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{evolve__optimizer_8h}{evolve\+\_\+optimizer.\+h}}\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{evolve__optimizer_8h}{evolve\+\_\+optimizer.\+h}}\end{DoxyCompactItemize} diff --git a/Doc/latex/struct_g_p_i_o___l_e_d_type_def.tex b/Doc/latex/struct_g_p_i_o___l_e_d_type_def.tex index 3ea2200..d77e973 100644 --- a/Doc/latex/struct_g_p_i_o___l_e_d_type_def.tex +++ b/Doc/latex/struct_g_p_i_o___l_e_d_type_def.tex @@ -29,16 +29,18 @@ uint32\+\_\+t \mbox{\hyperlink{struct_g_p_i_o___l_e_d_type_def_a8c43c12787f4a89f \doxysubsection{Detailed Description} Структура светодиода -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00093}{93}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00073}{73}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +\label{doc-variable-members} +\Hypertarget{struct_g_p_i_o___l_e_d_type_def_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{struct_g_p_i_o___l_e_d_type_def_ad28d93023a00e3c5669bd3deda122435}\label{struct_g_p_i_o___l_e_d_type_def_ad28d93023a00e3c5669bd3deda122435} -\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!state@{state}} +\Hypertarget{struct_g_p_i_o___l_e_d_type_def_ad28d93023a00e3c5669bd3deda122435}\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!state@{state}} \index{state@{state}!GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}} \doxysubsubsection{\texorpdfstring{state}{state}} -{\footnotesize\ttfamily \mbox{\hyperlink{group___m_y_l_i_b_s___g_p_i_o___l_e_d_s_gaac2b90d8b8c9579b6aa5d3bbda9b1ff1}{GPIO\+\_\+\+LEDState\+Type\+Def}} GPIO\+\_\+\+LEDType\+Def\+::state} +{\footnotesize\ttfamily \label{struct_g_p_i_o___l_e_d_type_def_ad28d93023a00e3c5669bd3deda122435} +\mbox{\hyperlink{group___m_y_l_i_b_s___g_p_i_o___l_e_d_s_gaac2b90d8b8c9579b6aa5d3bbda9b1ff1}{GPIO\+\_\+\+LEDState\+Type\+Def}} GPIO\+\_\+\+LEDType\+Def\+::state} @@ -46,13 +48,13 @@ Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00093}{93}} of file -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00095}{95}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00075}{75}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{struct_g_p_i_o___l_e_d_type_def_a831923d4d157267ecc2f1add1c49adcf}\label{struct_g_p_i_o___l_e_d_type_def_a831923d4d157267ecc2f1add1c49adcf} -\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!LED\_Port@{LED\_Port}} +\Hypertarget{struct_g_p_i_o___l_e_d_type_def_a831923d4d157267ecc2f1add1c49adcf}\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!LED\_Port@{LED\_Port}} \index{LED\_Port@{LED\_Port}!GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}} \doxysubsubsection{\texorpdfstring{LED\_Port}{LED\_Port}} -{\footnotesize\ttfamily GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} GPIO\+\_\+\+LEDType\+Def\+::\+LED\+\_\+\+Port} +{\footnotesize\ttfamily \label{struct_g_p_i_o___l_e_d_type_def_a831923d4d157267ecc2f1add1c49adcf} +GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} GPIO\+\_\+\+LEDType\+Def\+::\+LED\+\_\+\+Port} @@ -60,13 +62,13 @@ GPIO порт ножки светодиода -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00097}{97}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00077}{77}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{struct_g_p_i_o___l_e_d_type_def_a684ff60e4c94daf2221524cdc6fcc978}\label{struct_g_p_i_o___l_e_d_type_def_a684ff60e4c94daf2221524cdc6fcc978} -\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!LED\_Pin@{LED\_Pin}} +\Hypertarget{struct_g_p_i_o___l_e_d_type_def_a684ff60e4c94daf2221524cdc6fcc978}\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!LED\_Pin@{LED\_Pin}} \index{LED\_Pin@{LED\_Pin}!GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}} \doxysubsubsection{\texorpdfstring{LED\_Pin}{LED\_Pin}} -{\footnotesize\ttfamily uint32\+\_\+t GPIO\+\_\+\+LEDType\+Def\+::\+LED\+\_\+\+Pin} +{\footnotesize\ttfamily \label{struct_g_p_i_o___l_e_d_type_def_a684ff60e4c94daf2221524cdc6fcc978} +uint32\+\_\+t GPIO\+\_\+\+LEDType\+Def\+::\+LED\+\_\+\+Pin} @@ -74,13 +76,13 @@ GPIO пин ножки светодиода -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00098}{98}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00078}{78}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{struct_g_p_i_o___l_e_d_type_def_abe9aadc0b28d042267f7155e187a1816}\label{struct_g_p_i_o___l_e_d_type_def_abe9aadc0b28d042267f7155e187a1816} -\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!LED\_ActiveLvl@{LED\_ActiveLvl}} +\Hypertarget{struct_g_p_i_o___l_e_d_type_def_abe9aadc0b28d042267f7155e187a1816}\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!LED\_ActiveLvl@{LED\_ActiveLvl}} \index{LED\_ActiveLvl@{LED\_ActiveLvl}!GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}} \doxysubsubsection{\texorpdfstring{LED\_ActiveLvl}{LED\_ActiveLvl}} -{\footnotesize\ttfamily uint8\+\_\+t GPIO\+\_\+\+LEDType\+Def\+::\+LED\+\_\+\+Active\+Lvl} +{\footnotesize\ttfamily \label{struct_g_p_i_o___l_e_d_type_def_abe9aadc0b28d042267f7155e187a1816} +uint8\+\_\+t GPIO\+\_\+\+LEDType\+Def\+::\+LED\+\_\+\+Active\+Lvl} @@ -88,13 +90,13 @@ Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00098}{98}} of file -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00100}{100}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00080}{80}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{struct_g_p_i_o___l_e_d_type_def_a6cc026931a4681732f9a329ae03098ec}\label{struct_g_p_i_o___l_e_d_type_def_a6cc026931a4681732f9a329ae03098ec} -\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!LED\_Period@{LED\_Period}} +\Hypertarget{struct_g_p_i_o___l_e_d_type_def_a6cc026931a4681732f9a329ae03098ec}\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!LED\_Period@{LED\_Period}} \index{LED\_Period@{LED\_Period}!GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}} \doxysubsubsection{\texorpdfstring{LED\_Period}{LED\_Period}} -{\footnotesize\ttfamily uint32\+\_\+t GPIO\+\_\+\+LEDType\+Def\+::\+LED\+\_\+\+Period} +{\footnotesize\ttfamily \label{struct_g_p_i_o___l_e_d_type_def_a6cc026931a4681732f9a329ae03098ec} +uint32\+\_\+t GPIO\+\_\+\+LEDType\+Def\+::\+LED\+\_\+\+Period} @@ -102,20 +104,20 @@ Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00100}{100}} of fil -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00101}{101}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00081}{81}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{struct_g_p_i_o___l_e_d_type_def_a8c43c12787f4a89f4a785f91a979ba68}\label{struct_g_p_i_o___l_e_d_type_def_a8c43c12787f4a89f4a785f91a979ba68} -\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!tickprev@{tickprev}} +\Hypertarget{struct_g_p_i_o___l_e_d_type_def_a8c43c12787f4a89f4a785f91a979ba68}\index{GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}!tickprev@{tickprev}} \index{tickprev@{tickprev}!GPIO\_LEDTypeDef@{GPIO\_LEDTypeDef}} \doxysubsubsection{\texorpdfstring{tickprev}{tickprev}} -{\footnotesize\ttfamily uint32\+\_\+t GPIO\+\_\+\+LEDType\+Def\+::tickprev} +{\footnotesize\ttfamily \label{struct_g_p_i_o___l_e_d_type_def_a8c43c12787f4a89f4a785f91a979ba68} +uint32\+\_\+t GPIO\+\_\+\+LEDType\+Def\+::tickprev} -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00103}{103}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00083}{83}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__gpio_8h}{general\+\_\+gpio.\+h}}\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__gpio_8h}{general\+\_\+gpio.\+h}}\end{DoxyCompactItemize} diff --git a/Doc/latex/struct_g_p_i_o___switch_type_def.tex b/Doc/latex/struct_g_p_i_o___switch_type_def.tex index 336ccdb..907d240 100644 --- a/Doc/latex/struct_g_p_i_o___switch_type_def.tex +++ b/Doc/latex/struct_g_p_i_o___switch_type_def.tex @@ -29,16 +29,18 @@ uint32\+\_\+t \mbox{\hyperlink{struct_g_p_i_o___switch_type_def_a13f97b867ff1a77 \doxysubsection{Detailed Description} Структура кнопки -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00110}{110}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00090}{90}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +\label{doc-variable-members} +\Hypertarget{struct_g_p_i_o___switch_type_def_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{struct_g_p_i_o___switch_type_def_afb369df75a6065fd89ac4ba97d98ab1a}\label{struct_g_p_i_o___switch_type_def_afb369df75a6065fd89ac4ba97d98ab1a} -\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!Sw\_Port@{Sw\_Port}} +\Hypertarget{struct_g_p_i_o___switch_type_def_afb369df75a6065fd89ac4ba97d98ab1a}\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!Sw\_Port@{Sw\_Port}} \index{Sw\_Port@{Sw\_Port}!GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}} \doxysubsubsection{\texorpdfstring{Sw\_Port}{Sw\_Port}} -{\footnotesize\ttfamily GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} GPIO\+\_\+\+Switch\+Type\+Def\+::\+Sw\+\_\+\+Port} +{\footnotesize\ttfamily \label{struct_g_p_i_o___switch_type_def_afb369df75a6065fd89ac4ba97d98ab1a} +GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} GPIO\+\_\+\+Switch\+Type\+Def\+::\+Sw\+\_\+\+Port} @@ -46,13 +48,13 @@ GPIO порт ножки кнопки -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00112}{112}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00092}{92}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{struct_g_p_i_o___switch_type_def_a63d58d9cba49a5823175585ef2996032}\label{struct_g_p_i_o___switch_type_def_a63d58d9cba49a5823175585ef2996032} -\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!Sw\_Pin@{Sw\_Pin}} +\Hypertarget{struct_g_p_i_o___switch_type_def_a63d58d9cba49a5823175585ef2996032}\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!Sw\_Pin@{Sw\_Pin}} \index{Sw\_Pin@{Sw\_Pin}!GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}} \doxysubsubsection{\texorpdfstring{Sw\_Pin}{Sw\_Pin}} -{\footnotesize\ttfamily uint32\+\_\+t GPIO\+\_\+\+Switch\+Type\+Def\+::\+Sw\+\_\+\+Pin} +{\footnotesize\ttfamily \label{struct_g_p_i_o___switch_type_def_a63d58d9cba49a5823175585ef2996032} +uint32\+\_\+t GPIO\+\_\+\+Switch\+Type\+Def\+::\+Sw\+\_\+\+Pin} @@ -60,13 +62,13 @@ GPIO пин ножки кнопки -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00113}{113}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00093}{93}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{struct_g_p_i_o___switch_type_def_a4fadf5ead3ebccad521a52c064eeb405}\label{struct_g_p_i_o___switch_type_def_a4fadf5ead3ebccad521a52c064eeb405} -\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!Sw\_ActiveLvl@{Sw\_ActiveLvl}} +\Hypertarget{struct_g_p_i_o___switch_type_def_a4fadf5ead3ebccad521a52c064eeb405}\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!Sw\_ActiveLvl@{Sw\_ActiveLvl}} \index{Sw\_ActiveLvl@{Sw\_ActiveLvl}!GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}} \doxysubsubsection{\texorpdfstring{Sw\_ActiveLvl}{Sw\_ActiveLvl}} -{\footnotesize\ttfamily uint8\+\_\+t GPIO\+\_\+\+Switch\+Type\+Def\+::\+Sw\+\_\+\+Active\+Lvl} +{\footnotesize\ttfamily \label{struct_g_p_i_o___switch_type_def_a4fadf5ead3ebccad521a52c064eeb405} +uint8\+\_\+t GPIO\+\_\+\+Switch\+Type\+Def\+::\+Sw\+\_\+\+Active\+Lvl} @@ -74,13 +76,13 @@ Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00113}{113}} of fil -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00115}{115}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00095}{95}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{struct_g_p_i_o___switch_type_def_a245f1dc811279ce5d4598582db979a89}\label{struct_g_p_i_o___switch_type_def_a245f1dc811279ce5d4598582db979a89} -\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!Sw\_PrevState@{Sw\_PrevState}} +\Hypertarget{struct_g_p_i_o___switch_type_def_a245f1dc811279ce5d4598582db979a89}\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!Sw\_PrevState@{Sw\_PrevState}} \index{Sw\_PrevState@{Sw\_PrevState}!GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}} \doxysubsubsection{\texorpdfstring{Sw\_PrevState}{Sw\_PrevState}} -{\footnotesize\ttfamily uint32\+\_\+t GPIO\+\_\+\+Switch\+Type\+Def\+::\+Sw\+\_\+\+Prev\+State} +{\footnotesize\ttfamily \label{struct_g_p_i_o___switch_type_def_a245f1dc811279ce5d4598582db979a89} +uint32\+\_\+t GPIO\+\_\+\+Switch\+Type\+Def\+::\+Sw\+\_\+\+Prev\+State} @@ -88,13 +90,13 @@ Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00115}{115}} of fil -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00116}{116}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00096}{96}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{struct_g_p_i_o___switch_type_def_a2600e599a961af2e280c721894df4c06}\label{struct_g_p_i_o___switch_type_def_a2600e599a961af2e280c721894df4c06} -\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!Sw\_FilterDelay@{Sw\_FilterDelay}} +\Hypertarget{struct_g_p_i_o___switch_type_def_a2600e599a961af2e280c721894df4c06}\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!Sw\_FilterDelay@{Sw\_FilterDelay}} \index{Sw\_FilterDelay@{Sw\_FilterDelay}!GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}} \doxysubsubsection{\texorpdfstring{Sw\_FilterDelay}{Sw\_FilterDelay}} -{\footnotesize\ttfamily uint32\+\_\+t GPIO\+\_\+\+Switch\+Type\+Def\+::\+Sw\+\_\+\+Filter\+Delay} +{\footnotesize\ttfamily \label{struct_g_p_i_o___switch_type_def_a2600e599a961af2e280c721894df4c06} +uint32\+\_\+t GPIO\+\_\+\+Switch\+Type\+Def\+::\+Sw\+\_\+\+Filter\+Delay} @@ -102,20 +104,20 @@ Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00116}{116}} of fil -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00117}{117}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00097}{97}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. -\Hypertarget{struct_g_p_i_o___switch_type_def_a13f97b867ff1a77ef182c9b13d964ca6}\label{struct_g_p_i_o___switch_type_def_a13f97b867ff1a77ef182c9b13d964ca6} -\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!tickprev@{tickprev}} +\Hypertarget{struct_g_p_i_o___switch_type_def_a13f97b867ff1a77ef182c9b13d964ca6}\index{GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}!tickprev@{tickprev}} \index{tickprev@{tickprev}!GPIO\_SwitchTypeDef@{GPIO\_SwitchTypeDef}} \doxysubsubsection{\texorpdfstring{tickprev}{tickprev}} -{\footnotesize\ttfamily uint32\+\_\+t GPIO\+\_\+\+Switch\+Type\+Def\+::tickprev} +{\footnotesize\ttfamily \label{struct_g_p_i_o___switch_type_def_a13f97b867ff1a77ef182c9b13d964ca6} +uint32\+\_\+t GPIO\+\_\+\+Switch\+Type\+Def\+::tickprev} -Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00119}{119}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. +Definition at line \mbox{\hyperlink{general__gpio_8h_source_l00099}{99}} of file \mbox{\hyperlink{general__gpio_8h_source}{general\+\_\+gpio.\+h}}. The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__gpio_8h}{general\+\_\+gpio.\+h}}\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__gpio_8h}{general\+\_\+gpio.\+h}}\end{DoxyCompactItemize} diff --git a/Doc/latex/struct_h_f___stack_frame__t.tex b/Doc/latex/struct_h_f___stack_frame__t.tex index a5f99ad..97e98a2 100644 --- a/Doc/latex/struct_h_f___stack_frame__t.tex +++ b/Doc/latex/struct_h_f___stack_frame__t.tex @@ -35,16 +35,18 @@ uint32\+\_\+t \mbox{\hyperlink{struct_h_f___stack_frame__t_ae47cb051ee3c94471bfd Сохраняет регистры R0-\/\+R3, R12, LR, PC, PSR для последующего анализа. -Definition at line \mbox{\hyperlink{trace_8h_source_l00463}{463}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00476}{476}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +\label{doc-variable-members} +\Hypertarget{struct_h_f___stack_frame__t_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{struct_h_f___stack_frame__t_a4146ed28926b5f234132b7112119a413}\label{struct_h_f___stack_frame__t_a4146ed28926b5f234132b7112119a413} -\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!r0@{r0}} +\Hypertarget{struct_h_f___stack_frame__t_a4146ed28926b5f234132b7112119a413}\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!r0@{r0}} \index{r0@{r0}!HF\_StackFrame\_t@{HF\_StackFrame\_t}} \doxysubsubsection{\texorpdfstring{r0}{r0}} -{\footnotesize\ttfamily uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::r0} +{\footnotesize\ttfamily \label{struct_h_f___stack_frame__t_a4146ed28926b5f234132b7112119a413} +uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::r0} @@ -52,13 +54,13 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00463}{463}} of file \mbox{ -Definition at line \mbox{\hyperlink{trace_8h_source_l00464}{464}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00477}{477}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{struct_h_f___stack_frame__t_a286104d19185714940645a9df814ddea}\label{struct_h_f___stack_frame__t_a286104d19185714940645a9df814ddea} -\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!r1@{r1}} +\Hypertarget{struct_h_f___stack_frame__t_a286104d19185714940645a9df814ddea}\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!r1@{r1}} \index{r1@{r1}!HF\_StackFrame\_t@{HF\_StackFrame\_t}} \doxysubsubsection{\texorpdfstring{r1}{r1}} -{\footnotesize\ttfamily uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::r1} +{\footnotesize\ttfamily \label{struct_h_f___stack_frame__t_a286104d19185714940645a9df814ddea} +uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::r1} @@ -66,13 +68,13 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00464}{464}} of file \mbox{ -Definition at line \mbox{\hyperlink{trace_8h_source_l00465}{465}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00478}{478}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{struct_h_f___stack_frame__t_a5a52e5006dabcf68c0fa4cfb0e03335b}\label{struct_h_f___stack_frame__t_a5a52e5006dabcf68c0fa4cfb0e03335b} -\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!r2@{r2}} +\Hypertarget{struct_h_f___stack_frame__t_a5a52e5006dabcf68c0fa4cfb0e03335b}\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!r2@{r2}} \index{r2@{r2}!HF\_StackFrame\_t@{HF\_StackFrame\_t}} \doxysubsubsection{\texorpdfstring{r2}{r2}} -{\footnotesize\ttfamily uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::r2} +{\footnotesize\ttfamily \label{struct_h_f___stack_frame__t_a5a52e5006dabcf68c0fa4cfb0e03335b} +uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::r2} @@ -80,13 +82,13 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00465}{465}} of file \mbox{ -Definition at line \mbox{\hyperlink{trace_8h_source_l00466}{466}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00479}{479}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{struct_h_f___stack_frame__t_a453c7af42b6928a693af422e17c981d3}\label{struct_h_f___stack_frame__t_a453c7af42b6928a693af422e17c981d3} -\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!r3@{r3}} +\Hypertarget{struct_h_f___stack_frame__t_a453c7af42b6928a693af422e17c981d3}\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!r3@{r3}} \index{r3@{r3}!HF\_StackFrame\_t@{HF\_StackFrame\_t}} \doxysubsubsection{\texorpdfstring{r3}{r3}} -{\footnotesize\ttfamily uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::r3} +{\footnotesize\ttfamily \label{struct_h_f___stack_frame__t_a453c7af42b6928a693af422e17c981d3} +uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::r3} @@ -94,13 +96,13 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00466}{466}} of file \mbox{ -Definition at line \mbox{\hyperlink{trace_8h_source_l00467}{467}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00480}{480}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{struct_h_f___stack_frame__t_a819ee3bc518c460ece1b7c4079f8f80b}\label{struct_h_f___stack_frame__t_a819ee3bc518c460ece1b7c4079f8f80b} -\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!r12@{r12}} +\Hypertarget{struct_h_f___stack_frame__t_a819ee3bc518c460ece1b7c4079f8f80b}\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!r12@{r12}} \index{r12@{r12}!HF\_StackFrame\_t@{HF\_StackFrame\_t}} \doxysubsubsection{\texorpdfstring{r12}{r12}} -{\footnotesize\ttfamily uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::r12} +{\footnotesize\ttfamily \label{struct_h_f___stack_frame__t_a819ee3bc518c460ece1b7c4079f8f80b} +uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::r12} @@ -108,13 +110,13 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00467}{467}} of file \mbox{ -Definition at line \mbox{\hyperlink{trace_8h_source_l00468}{468}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00481}{481}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{struct_h_f___stack_frame__t_a6e51904297f7725e96d5b5fb291ef577}\label{struct_h_f___stack_frame__t_a6e51904297f7725e96d5b5fb291ef577} -\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!lr@{lr}} +\Hypertarget{struct_h_f___stack_frame__t_a6e51904297f7725e96d5b5fb291ef577}\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!lr@{lr}} \index{lr@{lr}!HF\_StackFrame\_t@{HF\_StackFrame\_t}} \doxysubsubsection{\texorpdfstring{lr}{lr}} -{\footnotesize\ttfamily uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::lr} +{\footnotesize\ttfamily \label{struct_h_f___stack_frame__t_a6e51904297f7725e96d5b5fb291ef577} +uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::lr} @@ -122,13 +124,13 @@ Link Register. -Definition at line \mbox{\hyperlink{trace_8h_source_l00469}{469}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00482}{482}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{struct_h_f___stack_frame__t_a16563896004751c90e41c81ae4570732}\label{struct_h_f___stack_frame__t_a16563896004751c90e41c81ae4570732} -\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!pc@{pc}} +\Hypertarget{struct_h_f___stack_frame__t_a16563896004751c90e41c81ae4570732}\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!pc@{pc}} \index{pc@{pc}!HF\_StackFrame\_t@{HF\_StackFrame\_t}} \doxysubsubsection{\texorpdfstring{pc}{pc}} -{\footnotesize\ttfamily uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::pc} +{\footnotesize\ttfamily \label{struct_h_f___stack_frame__t_a16563896004751c90e41c81ae4570732} +uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::pc} @@ -136,13 +138,13 @@ Program Counter. -Definition at line \mbox{\hyperlink{trace_8h_source_l00470}{470}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00483}{483}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{struct_h_f___stack_frame__t_ae47cb051ee3c94471bfd4fe7e49c55f9}\label{struct_h_f___stack_frame__t_ae47cb051ee3c94471bfd4fe7e49c55f9} -\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!psr@{psr}} +\Hypertarget{struct_h_f___stack_frame__t_ae47cb051ee3c94471bfd4fe7e49c55f9}\index{HF\_StackFrame\_t@{HF\_StackFrame\_t}!psr@{psr}} \index{psr@{psr}!HF\_StackFrame\_t@{HF\_StackFrame\_t}} \doxysubsubsection{\texorpdfstring{psr}{psr}} -{\footnotesize\ttfamily uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::psr} +{\footnotesize\ttfamily \label{struct_h_f___stack_frame__t_ae47cb051ee3c94471bfd4fe7e49c55f9} +uint32\+\_\+t HF\+\_\+\+Stack\+Frame\+\_\+t\+::psr} @@ -150,10 +152,10 @@ Program Status Register. -Definition at line \mbox{\hyperlink{trace_8h_source_l00471}{471}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00484}{484}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{trace_8h}{trace.\+h}}\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{trace_8h}{trace.\+h}}\end{DoxyCompactItemize} diff --git a/Doc/latex/struct_r_t_t___flash_header__t.tex b/Doc/latex/struct_r_t_t___flash_header__t.tex index 67dbed1..657aad4 100644 --- a/Doc/latex/struct_r_t_t___flash_header__t.tex +++ b/Doc/latex/struct_r_t_t___flash_header__t.tex @@ -23,16 +23,18 @@ char \mbox{\hyperlink{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d0 \doxysubsection{Detailed Description} Структура RTT, которая будет положена в Flash. -Definition at line \mbox{\hyperlink{trace_8h_source_l00180}{180}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00193}{193}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +\label{doc-variable-members} +\Hypertarget{struct_r_t_t___flash_header__t_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}\label{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57} -\index{RTT\_FlashHeader\_t@{RTT\_FlashHeader\_t}!tag@{tag}} +\Hypertarget{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}\index{RTT\_FlashHeader\_t@{RTT\_FlashHeader\_t}!tag@{tag}} \index{tag@{tag}!RTT\_FlashHeader\_t@{RTT\_FlashHeader\_t}} \doxysubsubsection{\texorpdfstring{tag}{tag}} -{\footnotesize\ttfamily uint32\+\_\+t RTT\+\_\+\+Flash\+Header\+\_\+t\+::tag} +{\footnotesize\ttfamily \label{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57} +uint32\+\_\+t RTT\+\_\+\+Flash\+Header\+\_\+t\+::tag} @@ -40,13 +42,13 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00180}{180}} of file \mbox{ -Definition at line \mbox{\hyperlink{trace_8h_source_l00181}{181}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00194}{194}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}\label{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699} -\index{RTT\_FlashHeader\_t@{RTT\_FlashHeader\_t}!size@{size}} +\Hypertarget{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}\index{RTT\_FlashHeader\_t@{RTT\_FlashHeader\_t}!size@{size}} \index{size@{size}!RTT\_FlashHeader\_t@{RTT\_FlashHeader\_t}} \doxysubsubsection{\texorpdfstring{size}{size}} -{\footnotesize\ttfamily uint32\+\_\+t RTT\+\_\+\+Flash\+Header\+\_\+t\+::size} +{\footnotesize\ttfamily \label{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699} +uint32\+\_\+t RTT\+\_\+\+Flash\+Header\+\_\+t\+::size} @@ -54,13 +56,13 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00181}{181}} of file \mbox{ -Definition at line \mbox{\hyperlink{trace_8h_source_l00182}{182}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00195}{195}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. -\Hypertarget{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d042d52a}\label{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d042d52a} -\index{RTT\_FlashHeader\_t@{RTT\_FlashHeader\_t}!data@{data}} +\Hypertarget{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d042d52a}\index{RTT\_FlashHeader\_t@{RTT\_FlashHeader\_t}!data@{data}} \index{data@{data}!RTT\_FlashHeader\_t@{RTT\_FlashHeader\_t}} \doxysubsubsection{\texorpdfstring{data}{data}} -{\footnotesize\ttfamily char RTT\+\_\+\+Flash\+Header\+\_\+t\+::data\mbox{[}1024\mbox{]}} +{\footnotesize\ttfamily \label{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d042d52a} +char RTT\+\_\+\+Flash\+Header\+\_\+t\+::data\mbox{[}1024\mbox{]}} @@ -68,10 +70,10 @@ Definition at line \mbox{\hyperlink{trace_8h_source_l00182}{182}} of file \mbox{ -Definition at line \mbox{\hyperlink{trace_8h_source_l00183}{183}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. +Definition at line \mbox{\hyperlink{trace_8h_source_l00196}{196}} of file \mbox{\hyperlink{trace_8h_source}{trace.\+h}}. The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{trace_8h}{trace.\+h}}\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{trace_8h}{trace.\+h}}\end{DoxyCompactItemize} diff --git a/Doc/latex/struct_s_p_i___settings_type_def.tex b/Doc/latex/struct_s_p_i___settings_type_def.tex index d337f11..8fd1dbb 100644 --- a/Doc/latex/struct_s_p_i___settings_type_def.tex +++ b/Doc/latex/struct_s_p_i___settings_type_def.tex @@ -1,140 +1,225 @@ \doxysection{SPI\+\_\+\+Settings\+Type\+Def Struct Reference} \hypertarget{struct_s_p_i___settings_type_def}{}\label{struct_s_p_i___settings_type_def}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} + + +Структура настроек SPI. + + + + +{\ttfamily \#include $<$general\+\_\+spi.\+h$>$} + \doxysubsubsection*{Public Attributes} \begin{DoxyCompactItemize} \item SPI\+\_\+\+Handle\+Type\+Def \mbox{\hyperlink{struct_s_p_i___settings_type_def_ad203d8b8d67e4f477d002d15b03ba422}{hspi}} -\item +\begin{DoxyCompactList}\small\item\em HAL handle SPI. \end{DoxyCompactList}\item GPIO\+\_\+\+Type\+Def \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{struct_s_p_i___settings_type_def_a6a15d48eccf92959de3a086031fdc979}{CLK\+\_\+\+GPIOx}} -\item +\begin{DoxyCompactList}\small\item\em Порт CLK. \end{DoxyCompactList}\item uint32\+\_\+t \mbox{\hyperlink{struct_s_p_i___settings_type_def_a3bcb1ed12da3544e02e6d36493669bdc}{CLK\+\_\+\+PIN}} -\item +\begin{DoxyCompactList}\small\item\em Пин CLK. \end{DoxyCompactList}\item uint32\+\_\+t \mbox{\hyperlink{struct_s_p_i___settings_type_def_a3f3748103a0b7861f6700042fd691ba1}{CLK\+\_\+\+GPIO\+\_\+\+Alternage\+Func}} -\item +\begin{DoxyCompactList}\small\item\em Альтернативная функция для CLK. \end{DoxyCompactList}\item GPIO\+\_\+\+Type\+Def \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{struct_s_p_i___settings_type_def_a0d55a2941854f61934487f3d209cfa95}{MISO\+\_\+\+GPIOx}} -\item +\begin{DoxyCompactList}\small\item\em Порт MISO. \end{DoxyCompactList}\item uint32\+\_\+t \mbox{\hyperlink{struct_s_p_i___settings_type_def_a3366c654d7ec6dd41c6a0b504dc8509a}{MISO\+\_\+\+PIN}} -\item +\begin{DoxyCompactList}\small\item\em Пин MISO. \end{DoxyCompactList}\item uint32\+\_\+t \mbox{\hyperlink{struct_s_p_i___settings_type_def_aecd7a5c6e205335b8ed229d74cd35d14}{MISO\+\_\+\+GPIO\+\_\+\+Alternage\+Func}} -\item +\begin{DoxyCompactList}\small\item\em Альтернативная функция для MISO. \end{DoxyCompactList}\item GPIO\+\_\+\+Type\+Def \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{struct_s_p_i___settings_type_def_a0af3bdb273818ff97eb4ff3cff918820}{MOSI\+\_\+\+GPIOx}} -\item +\begin{DoxyCompactList}\small\item\em Порт MOSI. \end{DoxyCompactList}\item uint32\+\_\+t \mbox{\hyperlink{struct_s_p_i___settings_type_def_a961208869faf4a7369aaf4edde75f176}{MOSI\+\_\+\+PIN}} -\item +\begin{DoxyCompactList}\small\item\em Пин MOSI. \end{DoxyCompactList}\item uint32\+\_\+t \mbox{\hyperlink{struct_s_p_i___settings_type_def_afbe75a1c36650a4a9b41fa706a4c7eab}{MOSI\+\_\+\+GPIO\+\_\+\+Alternage\+Func}} -\end{DoxyCompactItemize} +\begin{DoxyCompactList}\small\item\em Альтернативная функция для MOSI. \end{DoxyCompactList}\item +DMA\+\_\+\+Stream\+\_\+\+Type\+Def \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{struct_s_p_i___settings_type_def_a3cfd9469b0617a68bbd2a161ba06bb95}{DMAChannel}} +\begin{DoxyCompactList}\small\item\em Канал DMA (NULL если не нужен) \end{DoxyCompactList}\item +uint32\+\_\+t \mbox{\hyperlink{struct_s_p_i___settings_type_def_aa0edaa145076d2383b3e0095d156d474}{DMA\+\_\+\+CHANNEL\+\_\+X}} +\begin{DoxyCompactList}\small\item\em Номер канала DMA (0 если не нужен) \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsection{Detailed Description} +Структура настроек SPI. +Содержит все необходимые параметры для инициализации SPI, включая GPIO и DMA. -Definition at line \mbox{\hyperlink{____general__spi_8h_source_l00033}{33}} of file \mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}}. +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00103}{103}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. +\label{doc-variable-members} +\Hypertarget{struct_s_p_i___settings_type_def_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{struct_s_p_i___settings_type_def_ad203d8b8d67e4f477d002d15b03ba422}\label{struct_s_p_i___settings_type_def_ad203d8b8d67e4f477d002d15b03ba422} -\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!hspi@{hspi}} +\Hypertarget{struct_s_p_i___settings_type_def_ad203d8b8d67e4f477d002d15b03ba422}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!hspi@{hspi}} \index{hspi@{hspi}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{hspi}{hspi}} -{\footnotesize\ttfamily SPI\+\_\+\+Handle\+Type\+Def SPI\+\_\+\+Settings\+Type\+Def\+::hspi} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_ad203d8b8d67e4f477d002d15b03ba422} +SPI\+\_\+\+Handle\+Type\+Def SPI\+\_\+\+Settings\+Type\+Def\+::hspi} -Definition at line \mbox{\hyperlink{____general__spi_8h_source_l00035}{35}} of file \mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}}. +HAL handle SPI. -\Hypertarget{struct_s_p_i___settings_type_def_a6a15d48eccf92959de3a086031fdc979}\label{struct_s_p_i___settings_type_def_a6a15d48eccf92959de3a086031fdc979} -\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!CLK\_GPIOx@{CLK\_GPIOx}} + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00105}{105}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. + +\Hypertarget{struct_s_p_i___settings_type_def_a6a15d48eccf92959de3a086031fdc979}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!CLK\_GPIOx@{CLK\_GPIOx}} \index{CLK\_GPIOx@{CLK\_GPIOx}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{CLK\_GPIOx}{CLK\_GPIOx}} -{\footnotesize\ttfamily GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} SPI\+\_\+\+Settings\+Type\+Def\+::\+CLK\+\_\+\+GPIOx} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_a6a15d48eccf92959de3a086031fdc979} +GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} SPI\+\_\+\+Settings\+Type\+Def\+::\+CLK\+\_\+\+GPIOx} -Definition at line \mbox{\hyperlink{____general__spi_8h_source_l00037}{37}} of file \mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}}. +Порт CLK. -\Hypertarget{struct_s_p_i___settings_type_def_a3bcb1ed12da3544e02e6d36493669bdc}\label{struct_s_p_i___settings_type_def_a3bcb1ed12da3544e02e6d36493669bdc} -\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!CLK\_PIN@{CLK\_PIN}} + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00107}{107}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. + +\Hypertarget{struct_s_p_i___settings_type_def_a3bcb1ed12da3544e02e6d36493669bdc}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!CLK\_PIN@{CLK\_PIN}} \index{CLK\_PIN@{CLK\_PIN}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{CLK\_PIN}{CLK\_PIN}} -{\footnotesize\ttfamily uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+CLK\+\_\+\+PIN} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_a3bcb1ed12da3544e02e6d36493669bdc} +uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+CLK\+\_\+\+PIN} -Definition at line \mbox{\hyperlink{____general__spi_8h_source_l00038}{38}} of file \mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}}. +Пин CLK. -\Hypertarget{struct_s_p_i___settings_type_def_a3f3748103a0b7861f6700042fd691ba1}\label{struct_s_p_i___settings_type_def_a3f3748103a0b7861f6700042fd691ba1} -\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!CLK\_GPIO\_AlternageFunc@{CLK\_GPIO\_AlternageFunc}} + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00108}{108}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. + +\Hypertarget{struct_s_p_i___settings_type_def_a3f3748103a0b7861f6700042fd691ba1}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!CLK\_GPIO\_AlternageFunc@{CLK\_GPIO\_AlternageFunc}} \index{CLK\_GPIO\_AlternageFunc@{CLK\_GPIO\_AlternageFunc}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{CLK\_GPIO\_AlternageFunc}{CLK\_GPIO\_AlternageFunc}} -{\footnotesize\ttfamily uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+CLK\+\_\+\+GPIO\+\_\+\+Alternage\+Func} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_a3f3748103a0b7861f6700042fd691ba1} +uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+CLK\+\_\+\+GPIO\+\_\+\+Alternage\+Func} -Definition at line \mbox{\hyperlink{____general__spi_8h_source_l00039}{39}} of file \mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}}. +Альтернативная функция для CLK. -\Hypertarget{struct_s_p_i___settings_type_def_a0d55a2941854f61934487f3d209cfa95}\label{struct_s_p_i___settings_type_def_a0d55a2941854f61934487f3d209cfa95} -\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MISO\_GPIOx@{MISO\_GPIOx}} + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00109}{109}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. + +\Hypertarget{struct_s_p_i___settings_type_def_a0d55a2941854f61934487f3d209cfa95}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MISO\_GPIOx@{MISO\_GPIOx}} \index{MISO\_GPIOx@{MISO\_GPIOx}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{MISO\_GPIOx}{MISO\_GPIOx}} -{\footnotesize\ttfamily GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} SPI\+\_\+\+Settings\+Type\+Def\+::\+MISO\+\_\+\+GPIOx} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_a0d55a2941854f61934487f3d209cfa95} +GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} SPI\+\_\+\+Settings\+Type\+Def\+::\+MISO\+\_\+\+GPIOx} -Definition at line \mbox{\hyperlink{____general__spi_8h_source_l00041}{41}} of file \mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}}. +Порт MISO. -\Hypertarget{struct_s_p_i___settings_type_def_a3366c654d7ec6dd41c6a0b504dc8509a}\label{struct_s_p_i___settings_type_def_a3366c654d7ec6dd41c6a0b504dc8509a} -\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MISO\_PIN@{MISO\_PIN}} + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00111}{111}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. + +\Hypertarget{struct_s_p_i___settings_type_def_a3366c654d7ec6dd41c6a0b504dc8509a}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MISO\_PIN@{MISO\_PIN}} \index{MISO\_PIN@{MISO\_PIN}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{MISO\_PIN}{MISO\_PIN}} -{\footnotesize\ttfamily uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+MISO\+\_\+\+PIN} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_a3366c654d7ec6dd41c6a0b504dc8509a} +uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+MISO\+\_\+\+PIN} -Definition at line \mbox{\hyperlink{____general__spi_8h_source_l00042}{42}} of file \mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}}. +Пин MISO. -\Hypertarget{struct_s_p_i___settings_type_def_aecd7a5c6e205335b8ed229d74cd35d14}\label{struct_s_p_i___settings_type_def_aecd7a5c6e205335b8ed229d74cd35d14} -\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MISO\_GPIO\_AlternageFunc@{MISO\_GPIO\_AlternageFunc}} + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00112}{112}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. + +\Hypertarget{struct_s_p_i___settings_type_def_aecd7a5c6e205335b8ed229d74cd35d14}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MISO\_GPIO\_AlternageFunc@{MISO\_GPIO\_AlternageFunc}} \index{MISO\_GPIO\_AlternageFunc@{MISO\_GPIO\_AlternageFunc}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{MISO\_GPIO\_AlternageFunc}{MISO\_GPIO\_AlternageFunc}} -{\footnotesize\ttfamily uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+MISO\+\_\+\+GPIO\+\_\+\+Alternage\+Func} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_aecd7a5c6e205335b8ed229d74cd35d14} +uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+MISO\+\_\+\+GPIO\+\_\+\+Alternage\+Func} -Definition at line \mbox{\hyperlink{____general__spi_8h_source_l00043}{43}} of file \mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}}. +Альтернативная функция для MISO. -\Hypertarget{struct_s_p_i___settings_type_def_a0af3bdb273818ff97eb4ff3cff918820}\label{struct_s_p_i___settings_type_def_a0af3bdb273818ff97eb4ff3cff918820} -\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MOSI\_GPIOx@{MOSI\_GPIOx}} + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00113}{113}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. + +\Hypertarget{struct_s_p_i___settings_type_def_a0af3bdb273818ff97eb4ff3cff918820}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MOSI\_GPIOx@{MOSI\_GPIOx}} \index{MOSI\_GPIOx@{MOSI\_GPIOx}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{MOSI\_GPIOx}{MOSI\_GPIOx}} -{\footnotesize\ttfamily GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} SPI\+\_\+\+Settings\+Type\+Def\+::\+MOSI\+\_\+\+GPIOx} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_a0af3bdb273818ff97eb4ff3cff918820} +GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} SPI\+\_\+\+Settings\+Type\+Def\+::\+MOSI\+\_\+\+GPIOx} -Definition at line \mbox{\hyperlink{____general__spi_8h_source_l00045}{45}} of file \mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}}. +Порт MOSI. -\Hypertarget{struct_s_p_i___settings_type_def_a961208869faf4a7369aaf4edde75f176}\label{struct_s_p_i___settings_type_def_a961208869faf4a7369aaf4edde75f176} -\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MOSI\_PIN@{MOSI\_PIN}} + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00115}{115}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. + +\Hypertarget{struct_s_p_i___settings_type_def_a961208869faf4a7369aaf4edde75f176}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MOSI\_PIN@{MOSI\_PIN}} \index{MOSI\_PIN@{MOSI\_PIN}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{MOSI\_PIN}{MOSI\_PIN}} -{\footnotesize\ttfamily uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+MOSI\+\_\+\+PIN} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_a961208869faf4a7369aaf4edde75f176} +uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+MOSI\+\_\+\+PIN} -Definition at line \mbox{\hyperlink{____general__spi_8h_source_l00046}{46}} of file \mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}}. +Пин MOSI. -\Hypertarget{struct_s_p_i___settings_type_def_afbe75a1c36650a4a9b41fa706a4c7eab}\label{struct_s_p_i___settings_type_def_afbe75a1c36650a4a9b41fa706a4c7eab} -\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MOSI\_GPIO\_AlternageFunc@{MOSI\_GPIO\_AlternageFunc}} + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00116}{116}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. + +\Hypertarget{struct_s_p_i___settings_type_def_afbe75a1c36650a4a9b41fa706a4c7eab}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!MOSI\_GPIO\_AlternageFunc@{MOSI\_GPIO\_AlternageFunc}} \index{MOSI\_GPIO\_AlternageFunc@{MOSI\_GPIO\_AlternageFunc}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{MOSI\_GPIO\_AlternageFunc}{MOSI\_GPIO\_AlternageFunc}} -{\footnotesize\ttfamily uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+MOSI\+\_\+\+GPIO\+\_\+\+Alternage\+Func} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_afbe75a1c36650a4a9b41fa706a4c7eab} +uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+MOSI\+\_\+\+GPIO\+\_\+\+Alternage\+Func} -Definition at line \mbox{\hyperlink{____general__spi_8h_source_l00047}{47}} of file \mbox{\hyperlink{____general__spi_8h_source}{\+\_\+\+\_\+general\+\_\+spi.\+h}}. +Альтернативная функция для MOSI. + + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00117}{117}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. + +\Hypertarget{struct_s_p_i___settings_type_def_a3cfd9469b0617a68bbd2a161ba06bb95}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!DMAChannel@{DMAChannel}} +\index{DMAChannel@{DMAChannel}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} +\doxysubsubsection{\texorpdfstring{DMAChannel}{DMAChannel}} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_a3cfd9469b0617a68bbd2a161ba06bb95} +DMA\+\_\+\+Stream\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} SPI\+\_\+\+Settings\+Type\+Def\+::\+DMAChannel} + + + +Канал DMA (NULL если не нужен) + + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00119}{119}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. + +\Hypertarget{struct_s_p_i___settings_type_def_aa0edaa145076d2383b3e0095d156d474}\index{SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}!DMA\_CHANNEL\_X@{DMA\_CHANNEL\_X}} +\index{DMA\_CHANNEL\_X@{DMA\_CHANNEL\_X}!SPI\_SettingsTypeDef@{SPI\_SettingsTypeDef}} +\doxysubsubsection{\texorpdfstring{DMA\_CHANNEL\_X}{DMA\_CHANNEL\_X}} +{\footnotesize\ttfamily \label{struct_s_p_i___settings_type_def_aa0edaa145076d2383b3e0095d156d474} +uint32\+\_\+t SPI\+\_\+\+Settings\+Type\+Def\+::\+DMA\+\_\+\+CHANNEL\+\_\+X} + + + +Номер канала DMA (0 если не нужен) + + + +Definition at line \mbox{\hyperlink{general__spi_8h_source_l00120}{120}} of file \mbox{\hyperlink{general__spi_8h_source}{general\+\_\+spi.\+h}}. The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\+\_\+\+\_\+general\+\_\+spi.\+h\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__spi_8h}{general\+\_\+spi.\+h}}\end{DoxyCompactItemize} diff --git a/Doc/latex/struct_t_i_m___encoder_type_def.tex b/Doc/latex/struct_t_i_m___encoder_type_def.tex index d67e813..79f641d 100644 --- a/Doc/latex/struct_t_i_m___encoder_type_def.tex +++ b/Doc/latex/struct_t_i_m___encoder_type_def.tex @@ -11,7 +11,8 @@ -Collaboration diagram for TIM\+\_\+\+Encoder\+Type\+Def\+:\nopagebreak +Collaboration diagram for TIM\+\_\+\+Encoder\+Type\+Def\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode @@ -50,16 +51,18 @@ uint32\+\_\+t \mbox{\hyperlink{struct_t_i_m___encoder_type_def_a6973108a83d2a3ea Также высокоуровневые настройки частоты работы таймера. Если какая-\/либо высокоуровневая настройка не задана, то по возможности берется низкоуровневая настройка из структур -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00140}{140}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00141}{141}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +\label{doc-variable-members} +\Hypertarget{struct_t_i_m___encoder_type_def_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{struct_t_i_m___encoder_type_def_a6f769f027b760a4b496e2b2b77bf54a3}\label{struct_t_i_m___encoder_type_def_a6f769f027b760a4b496e2b2b77bf54a3} -\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!Encoder\_Diff@{Encoder\_Diff}} +\Hypertarget{struct_t_i_m___encoder_type_def_a6f769f027b760a4b496e2b2b77bf54a3}\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!Encoder\_Diff@{Encoder\_Diff}} \index{Encoder\_Diff@{Encoder\_Diff}!TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}} \doxysubsubsection{\texorpdfstring{Encoder\_Diff}{Encoder\_Diff}} -{\footnotesize\ttfamily int16\+\_\+t TIM\+\_\+\+Encoder\+Type\+Def\+::\+Encoder\+\_\+\+Diff} +{\footnotesize\ttfamily \label{struct_t_i_m___encoder_type_def_a6f769f027b760a4b496e2b2b77bf54a3} +int16\+\_\+t TIM\+\_\+\+Encoder\+Type\+Def\+::\+Encoder\+\_\+\+Diff} @@ -67,13 +70,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00140}{140}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00142}{142}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00143}{143}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{struct_t_i_m___encoder_type_def_a0dacce3dde7df3122583869d96a372a2}\label{struct_t_i_m___encoder_type_def_a0dacce3dde7df3122583869d96a372a2} -\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!Encoder\_Shdw@{Encoder\_Shdw}} +\Hypertarget{struct_t_i_m___encoder_type_def_a0dacce3dde7df3122583869d96a372a2}\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!Encoder\_Shdw@{Encoder\_Shdw}} \index{Encoder\_Shdw@{Encoder\_Shdw}!TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}} \doxysubsubsection{\texorpdfstring{Encoder\_Shdw}{Encoder\_Shdw}} -{\footnotesize\ttfamily uint16\+\_\+t TIM\+\_\+\+Encoder\+Type\+Def\+::\+Encoder\+\_\+\+Shdw} +{\footnotesize\ttfamily \label{struct_t_i_m___encoder_type_def_a0dacce3dde7df3122583869d96a372a2} +uint16\+\_\+t TIM\+\_\+\+Encoder\+Type\+Def\+::\+Encoder\+\_\+\+Shdw} @@ -81,13 +84,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00142}{142}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00143}{143}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00144}{144}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{struct_t_i_m___encoder_type_def_adc80bd5a90444c31d84157f35c59b95c}\label{struct_t_i_m___encoder_type_def_adc80bd5a90444c31d84157f35c59b95c} -\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!htim@{htim}} +\Hypertarget{struct_t_i_m___encoder_type_def_adc80bd5a90444c31d84157f35c59b95c}\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!htim@{htim}} \index{htim@{htim}!TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}} \doxysubsubsection{\texorpdfstring{htim}{htim}} -{\footnotesize\ttfamily TIM\+\_\+\+Handle\+Type\+Def\texorpdfstring{$\ast$}{*} TIM\+\_\+\+Encoder\+Type\+Def\+::htim} +{\footnotesize\ttfamily \label{struct_t_i_m___encoder_type_def_adc80bd5a90444c31d84157f35c59b95c} +TIM\+\_\+\+Handle\+Type\+Def\texorpdfstring{$\ast$}{*} TIM\+\_\+\+Encoder\+Type\+Def\+::htim} @@ -95,13 +98,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00143}{143}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00145}{145}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00146}{146}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{struct_t_i_m___encoder_type_def_a021f0c585e9e62d68a4b09f630d8b6e5}\label{struct_t_i_m___encoder_type_def_a021f0c585e9e62d68a4b09f630d8b6e5} -\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!sConfig@{sConfig}} +\Hypertarget{struct_t_i_m___encoder_type_def_a021f0c585e9e62d68a4b09f630d8b6e5}\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!sConfig@{sConfig}} \index{sConfig@{sConfig}!TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}} \doxysubsubsection{\texorpdfstring{sConfig}{sConfig}} -{\footnotesize\ttfamily TIM\+\_\+\+Encoder\+\_\+\+Init\+Type\+Def TIM\+\_\+\+Encoder\+Type\+Def\+::s\+Config} +{\footnotesize\ttfamily \label{struct_t_i_m___encoder_type_def_a021f0c585e9e62d68a4b09f630d8b6e5} +TIM\+\_\+\+Encoder\+\_\+\+Init\+Type\+Def TIM\+\_\+\+Encoder\+Type\+Def\+::s\+Config} @@ -109,13 +112,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00145}{145}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00146}{146}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00147}{147}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{struct_t_i_m___encoder_type_def_ad29873fc8cdc71462e6d8744621120e9}\label{struct_t_i_m___encoder_type_def_ad29873fc8cdc71462e6d8744621120e9} -\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!GPIOx@{GPIOx}} +\Hypertarget{struct_t_i_m___encoder_type_def_ad29873fc8cdc71462e6d8744621120e9}\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!GPIOx@{GPIOx}} \index{GPIOx@{GPIOx}!TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}} \doxysubsubsection{\texorpdfstring{GPIOx}{GPIOx}} -{\footnotesize\ttfamily GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} TIM\+\_\+\+Encoder\+Type\+Def\+::\+GPIOx} +{\footnotesize\ttfamily \label{struct_t_i_m___encoder_type_def_ad29873fc8cdc71462e6d8744621120e9} +GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} TIM\+\_\+\+Encoder\+Type\+Def\+::\+GPIOx} @@ -123,13 +126,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00146}{146}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00148}{148}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00149}{149}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{struct_t_i_m___encoder_type_def_a4fc05ef011205a6702cb3d006bab677e}\label{struct_t_i_m___encoder_type_def_a4fc05ef011205a6702cb3d006bab677e} -\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!GPIO\_PIN\_TI1@{GPIO\_PIN\_TI1}} +\Hypertarget{struct_t_i_m___encoder_type_def_a4fc05ef011205a6702cb3d006bab677e}\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!GPIO\_PIN\_TI1@{GPIO\_PIN\_TI1}} \index{GPIO\_PIN\_TI1@{GPIO\_PIN\_TI1}!TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}} \doxysubsubsection{\texorpdfstring{GPIO\_PIN\_TI1}{GPIO\_PIN\_TI1}} -{\footnotesize\ttfamily uint32\+\_\+t TIM\+\_\+\+Encoder\+Type\+Def\+::\+GPIO\+\_\+\+PIN\+\_\+\+TI1} +{\footnotesize\ttfamily \label{struct_t_i_m___encoder_type_def_a4fc05ef011205a6702cb3d006bab677e} +uint32\+\_\+t TIM\+\_\+\+Encoder\+Type\+Def\+::\+GPIO\+\_\+\+PIN\+\_\+\+TI1} @@ -137,13 +140,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00148}{148}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00149}{149}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00150}{150}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{struct_t_i_m___encoder_type_def_a67ad037b92162546763fc9c425b5e3c5}\label{struct_t_i_m___encoder_type_def_a67ad037b92162546763fc9c425b5e3c5} -\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!GPIO\_PIN\_TI2@{GPIO\_PIN\_TI2}} +\Hypertarget{struct_t_i_m___encoder_type_def_a67ad037b92162546763fc9c425b5e3c5}\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!GPIO\_PIN\_TI2@{GPIO\_PIN\_TI2}} \index{GPIO\_PIN\_TI2@{GPIO\_PIN\_TI2}!TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}} \doxysubsubsection{\texorpdfstring{GPIO\_PIN\_TI2}{GPIO\_PIN\_TI2}} -{\footnotesize\ttfamily uint32\+\_\+t TIM\+\_\+\+Encoder\+Type\+Def\+::\+GPIO\+\_\+\+PIN\+\_\+\+TI2} +{\footnotesize\ttfamily \label{struct_t_i_m___encoder_type_def_a67ad037b92162546763fc9c425b5e3c5} +uint32\+\_\+t TIM\+\_\+\+Encoder\+Type\+Def\+::\+GPIO\+\_\+\+PIN\+\_\+\+TI2} @@ -151,13 +154,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00149}{149}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00150}{150}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00151}{151}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{struct_t_i_m___encoder_type_def_a6973108a83d2a3ea4fc3e0e8a501af80}\label{struct_t_i_m___encoder_type_def_a6973108a83d2a3ea4fc3e0e8a501af80} -\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!GPIO\_PIN\_SW@{GPIO\_PIN\_SW}} +\Hypertarget{struct_t_i_m___encoder_type_def_a6973108a83d2a3ea4fc3e0e8a501af80}\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!GPIO\_PIN\_SW@{GPIO\_PIN\_SW}} \index{GPIO\_PIN\_SW@{GPIO\_PIN\_SW}!TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}} \doxysubsubsection{\texorpdfstring{GPIO\_PIN\_SW}{GPIO\_PIN\_SW}} -{\footnotesize\ttfamily uint32\+\_\+t TIM\+\_\+\+Encoder\+Type\+Def\+::\+GPIO\+\_\+\+PIN\+\_\+\+SW} +{\footnotesize\ttfamily \label{struct_t_i_m___encoder_type_def_a6973108a83d2a3ea4fc3e0e8a501af80} +uint32\+\_\+t TIM\+\_\+\+Encoder\+Type\+Def\+::\+GPIO\+\_\+\+PIN\+\_\+\+SW} @@ -165,13 +168,13 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00150}{150}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00151}{151}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00152}{152}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{struct_t_i_m___encoder_type_def_a99295760ff8b27d1e6f1710f29383a45}\label{struct_t_i_m___encoder_type_def_a99295760ff8b27d1e6f1710f29383a45} -\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!Sw@{Sw}} +\Hypertarget{struct_t_i_m___encoder_type_def_a99295760ff8b27d1e6f1710f29383a45}\index{TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}!Sw@{Sw}} \index{Sw@{Sw}!TIM\_EncoderTypeDef@{TIM\_EncoderTypeDef}} \doxysubsubsection{\texorpdfstring{Sw}{Sw}} -{\footnotesize\ttfamily \mbox{\hyperlink{struct_g_p_i_o___switch_type_def}{GPIO\+\_\+\+Switch\+Type\+Def}} TIM\+\_\+\+Encoder\+Type\+Def\+::\+Sw} +{\footnotesize\ttfamily \label{struct_t_i_m___encoder_type_def_a99295760ff8b27d1e6f1710f29383a45} +\mbox{\hyperlink{struct_g_p_i_o___switch_type_def}{GPIO\+\_\+\+Switch\+Type\+Def}} TIM\+\_\+\+Encoder\+Type\+Def\+::\+Sw} @@ -179,10 +182,10 @@ Definition at line \mbox{\hyperlink{general__tim_8h_source_l00151}{151}} of file -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00153}{153}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00154}{154}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__tim_8h}{general\+\_\+tim.\+h}}\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__tim_8h}{general\+\_\+tim.\+h}}\end{DoxyCompactItemize} diff --git a/Doc/latex/struct_t_i_m___encoder_type_def__coll__graph.md5 b/Doc/latex/struct_t_i_m___encoder_type_def__coll__graph.md5 index e513bf2..89dacb9 100644 --- a/Doc/latex/struct_t_i_m___encoder_type_def__coll__graph.md5 +++ b/Doc/latex/struct_t_i_m___encoder_type_def__coll__graph.md5 @@ -1 +1 @@ -ea7ef1dc3c0c867000fb2dc7a8519e34 \ No newline at end of file +7ad33b5006a3bba719adf0e8727fd280 \ No newline at end of file diff --git a/Doc/latex/struct_t_i_m___encoder_type_def__coll__graph.pdf b/Doc/latex/struct_t_i_m___encoder_type_def__coll__graph.pdf index cbfcb96c572101aeb736361cb5edc94ad45c5702..b1e4907bb33a4579d79ffdf36cafc40fbc614e84 100644 GIT binary patch delta 14965 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 + \doxysubsubsection*{Public Attributes} \begin{DoxyCompactItemize} \item UART\+\_\+\+Handle\+Type\+Def \mbox{\hyperlink{struct_u_a_r_t___settings_type_def_accf2c9448a3ea8eb3b8c25a569276fea}{huart}} -\item +\begin{DoxyCompactList}\small\item\em HAL handle UART. \end{DoxyCompactList}\item GPIO\+\_\+\+Type\+Def \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{struct_u_a_r_t___settings_type_def_af6f9910d065bae715cdb4a1024143a8f}{GPIOx}} -\item +\begin{DoxyCompactList}\small\item\em Порт для UART. \end{DoxyCompactList}\item uint16\+\_\+t \mbox{\hyperlink{struct_u_a_r_t___settings_type_def_a3fba2b52788fe453348b5d92ed52ba49}{GPIO\+\_\+\+PIN\+\_\+\+RX}} -\item +\begin{DoxyCompactList}\small\item\em Пин приема \end{DoxyCompactList}\item uint16\+\_\+t \mbox{\hyperlink{struct_u_a_r_t___settings_type_def_a5f1babfcfb436cd77f5614253c0a5bef}{GPIO\+\_\+\+PIN\+\_\+\+TX}} -\item +\begin{DoxyCompactList}\small\item\em Пин передачи \end{DoxyCompactList}\item DMA\+\_\+\+Stream\+\_\+\+Type\+Def \texorpdfstring{$\ast$}{*} \mbox{\hyperlink{struct_u_a_r_t___settings_type_def_a1ecc9ac6a1d2747ade56770cbab6a613}{DMAChannel}} -\item +\begin{DoxyCompactList}\small\item\em Канал DMA (NULL если не нужен) \end{DoxyCompactList}\item uint32\+\_\+t \mbox{\hyperlink{struct_u_a_r_t___settings_type_def_a15ce92b03f7f189bfbe1ab88a5f94d19}{DMA\+\_\+\+CHANNEL\+\_\+X}} -\end{DoxyCompactItemize} +\begin{DoxyCompactList}\small\item\em Номер канала DMA (0 если не нужен) \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsection{Detailed Description} +Структура настроек UART. +Содержит все необходимые параметры для инициализации UART, включая GPIO и DMA. -Definition at line \mbox{\hyperlink{____general__uart_8h_source_l00045}{45}} of file \mbox{\hyperlink{____general__uart_8h_source}{\+\_\+\+\_\+general\+\_\+uart.\+h}}. +Definition at line \mbox{\hyperlink{general__uart_8h_source_l00096}{96}} of file \mbox{\hyperlink{general__uart_8h_source}{general\+\_\+uart.\+h}}. +\label{doc-variable-members} +\Hypertarget{struct_u_a_r_t___settings_type_def_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{struct_u_a_r_t___settings_type_def_accf2c9448a3ea8eb3b8c25a569276fea}\label{struct_u_a_r_t___settings_type_def_accf2c9448a3ea8eb3b8c25a569276fea} -\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!huart@{huart}} +\Hypertarget{struct_u_a_r_t___settings_type_def_accf2c9448a3ea8eb3b8c25a569276fea}\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!huart@{huart}} \index{huart@{huart}!UART\_SettingsTypeDef@{UART\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{huart}{huart}} -{\footnotesize\ttfamily UART\+\_\+\+Handle\+Type\+Def UART\+\_\+\+Settings\+Type\+Def\+::huart} +{\footnotesize\ttfamily \label{struct_u_a_r_t___settings_type_def_accf2c9448a3ea8eb3b8c25a569276fea} +UART\+\_\+\+Handle\+Type\+Def UART\+\_\+\+Settings\+Type\+Def\+::huart} -Definition at line \mbox{\hyperlink{____general__uart_8h_source_l00047}{47}} of file \mbox{\hyperlink{____general__uart_8h_source}{\+\_\+\+\_\+general\+\_\+uart.\+h}}. +HAL handle UART. -\Hypertarget{struct_u_a_r_t___settings_type_def_af6f9910d065bae715cdb4a1024143a8f}\label{struct_u_a_r_t___settings_type_def_af6f9910d065bae715cdb4a1024143a8f} -\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!GPIOx@{GPIOx}} + + +Definition at line \mbox{\hyperlink{general__uart_8h_source_l00098}{98}} of file \mbox{\hyperlink{general__uart_8h_source}{general\+\_\+uart.\+h}}. + +\Hypertarget{struct_u_a_r_t___settings_type_def_af6f9910d065bae715cdb4a1024143a8f}\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!GPIOx@{GPIOx}} \index{GPIOx@{GPIOx}!UART\_SettingsTypeDef@{UART\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{GPIOx}{GPIOx}} -{\footnotesize\ttfamily GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} UART\+\_\+\+Settings\+Type\+Def\+::\+GPIOx} +{\footnotesize\ttfamily \label{struct_u_a_r_t___settings_type_def_af6f9910d065bae715cdb4a1024143a8f} +GPIO\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} UART\+\_\+\+Settings\+Type\+Def\+::\+GPIOx} -Definition at line \mbox{\hyperlink{____general__uart_8h_source_l00049}{49}} of file \mbox{\hyperlink{____general__uart_8h_source}{\+\_\+\+\_\+general\+\_\+uart.\+h}}. +Порт для UART. -\Hypertarget{struct_u_a_r_t___settings_type_def_a3fba2b52788fe453348b5d92ed52ba49}\label{struct_u_a_r_t___settings_type_def_a3fba2b52788fe453348b5d92ed52ba49} -\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!GPIO\_PIN\_RX@{GPIO\_PIN\_RX}} + + +Definition at line \mbox{\hyperlink{general__uart_8h_source_l00100}{100}} of file \mbox{\hyperlink{general__uart_8h_source}{general\+\_\+uart.\+h}}. + +\Hypertarget{struct_u_a_r_t___settings_type_def_a3fba2b52788fe453348b5d92ed52ba49}\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!GPIO\_PIN\_RX@{GPIO\_PIN\_RX}} \index{GPIO\_PIN\_RX@{GPIO\_PIN\_RX}!UART\_SettingsTypeDef@{UART\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{GPIO\_PIN\_RX}{GPIO\_PIN\_RX}} -{\footnotesize\ttfamily uint16\+\_\+t UART\+\_\+\+Settings\+Type\+Def\+::\+GPIO\+\_\+\+PIN\+\_\+\+RX} +{\footnotesize\ttfamily \label{struct_u_a_r_t___settings_type_def_a3fba2b52788fe453348b5d92ed52ba49} +uint16\+\_\+t UART\+\_\+\+Settings\+Type\+Def\+::\+GPIO\+\_\+\+PIN\+\_\+\+RX} -Definition at line \mbox{\hyperlink{____general__uart_8h_source_l00050}{50}} of file \mbox{\hyperlink{____general__uart_8h_source}{\+\_\+\+\_\+general\+\_\+uart.\+h}}. +Пин приема -\Hypertarget{struct_u_a_r_t___settings_type_def_a5f1babfcfb436cd77f5614253c0a5bef}\label{struct_u_a_r_t___settings_type_def_a5f1babfcfb436cd77f5614253c0a5bef} -\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!GPIO\_PIN\_TX@{GPIO\_PIN\_TX}} + + +Definition at line \mbox{\hyperlink{general__uart_8h_source_l00101}{101}} of file \mbox{\hyperlink{general__uart_8h_source}{general\+\_\+uart.\+h}}. + +\Hypertarget{struct_u_a_r_t___settings_type_def_a5f1babfcfb436cd77f5614253c0a5bef}\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!GPIO\_PIN\_TX@{GPIO\_PIN\_TX}} \index{GPIO\_PIN\_TX@{GPIO\_PIN\_TX}!UART\_SettingsTypeDef@{UART\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{GPIO\_PIN\_TX}{GPIO\_PIN\_TX}} -{\footnotesize\ttfamily uint16\+\_\+t UART\+\_\+\+Settings\+Type\+Def\+::\+GPIO\+\_\+\+PIN\+\_\+\+TX} +{\footnotesize\ttfamily \label{struct_u_a_r_t___settings_type_def_a5f1babfcfb436cd77f5614253c0a5bef} +uint16\+\_\+t UART\+\_\+\+Settings\+Type\+Def\+::\+GPIO\+\_\+\+PIN\+\_\+\+TX} -Definition at line \mbox{\hyperlink{____general__uart_8h_source_l00051}{51}} of file \mbox{\hyperlink{____general__uart_8h_source}{\+\_\+\+\_\+general\+\_\+uart.\+h}}. +Пин передачи -\Hypertarget{struct_u_a_r_t___settings_type_def_a1ecc9ac6a1d2747ade56770cbab6a613}\label{struct_u_a_r_t___settings_type_def_a1ecc9ac6a1d2747ade56770cbab6a613} -\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!DMAChannel@{DMAChannel}} + + +Definition at line \mbox{\hyperlink{general__uart_8h_source_l00102}{102}} of file \mbox{\hyperlink{general__uart_8h_source}{general\+\_\+uart.\+h}}. + +\Hypertarget{struct_u_a_r_t___settings_type_def_a1ecc9ac6a1d2747ade56770cbab6a613}\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!DMAChannel@{DMAChannel}} \index{DMAChannel@{DMAChannel}!UART\_SettingsTypeDef@{UART\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{DMAChannel}{DMAChannel}} -{\footnotesize\ttfamily DMA\+\_\+\+Stream\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} UART\+\_\+\+Settings\+Type\+Def\+::\+DMAChannel} +{\footnotesize\ttfamily \label{struct_u_a_r_t___settings_type_def_a1ecc9ac6a1d2747ade56770cbab6a613} +DMA\+\_\+\+Stream\+\_\+\+Type\+Def\texorpdfstring{$\ast$}{*} UART\+\_\+\+Settings\+Type\+Def\+::\+DMAChannel} -Definition at line \mbox{\hyperlink{____general__uart_8h_source_l00053}{53}} of file \mbox{\hyperlink{____general__uart_8h_source}{\+\_\+\+\_\+general\+\_\+uart.\+h}}. +Канал DMA (NULL если не нужен) -\Hypertarget{struct_u_a_r_t___settings_type_def_a15ce92b03f7f189bfbe1ab88a5f94d19}\label{struct_u_a_r_t___settings_type_def_a15ce92b03f7f189bfbe1ab88a5f94d19} -\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!DMA\_CHANNEL\_X@{DMA\_CHANNEL\_X}} + + +Definition at line \mbox{\hyperlink{general__uart_8h_source_l00104}{104}} of file \mbox{\hyperlink{general__uart_8h_source}{general\+\_\+uart.\+h}}. + +\Hypertarget{struct_u_a_r_t___settings_type_def_a15ce92b03f7f189bfbe1ab88a5f94d19}\index{UART\_SettingsTypeDef@{UART\_SettingsTypeDef}!DMA\_CHANNEL\_X@{DMA\_CHANNEL\_X}} \index{DMA\_CHANNEL\_X@{DMA\_CHANNEL\_X}!UART\_SettingsTypeDef@{UART\_SettingsTypeDef}} \doxysubsubsection{\texorpdfstring{DMA\_CHANNEL\_X}{DMA\_CHANNEL\_X}} -{\footnotesize\ttfamily uint32\+\_\+t UART\+\_\+\+Settings\+Type\+Def\+::\+DMA\+\_\+\+CHANNEL\+\_\+X} +{\footnotesize\ttfamily \label{struct_u_a_r_t___settings_type_def_a15ce92b03f7f189bfbe1ab88a5f94d19} +uint32\+\_\+t UART\+\_\+\+Settings\+Type\+Def\+::\+DMA\+\_\+\+CHANNEL\+\_\+X} -Definition at line \mbox{\hyperlink{____general__uart_8h_source_l00054}{54}} of file \mbox{\hyperlink{____general__uart_8h_source}{\+\_\+\+\_\+general\+\_\+uart.\+h}}. +Номер канала DMA (0 если не нужен) + + + +Definition at line \mbox{\hyperlink{general__uart_8h_source_l00105}{105}} of file \mbox{\hyperlink{general__uart_8h_source}{general\+\_\+uart.\+h}}. The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\+\_\+\+\_\+general\+\_\+uart.\+h\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{general__uart_8h}{general\+\_\+uart.\+h}}\end{DoxyCompactItemize} diff --git a/Doc/latex/topics.tex b/Doc/latex/topics.tex index 03634c8..3fddd5c 100644 --- a/Doc/latex/topics.tex +++ b/Doc/latex/topics.tex @@ -35,15 +35,23 @@ Here is a list of all topics with brief descriptions\+:\begin{DoxyCompactList} \item \contentsline{section}{Switch tools}{\pageref{group___m_y_l_i_b_s___g_p_i_o___s_w_i_t_c_h}}{} \item \contentsline{section}{LED tools}{\pageref{group___m_y_l_i_b_s___g_p_i_o___l_e_d_s}}{} \end{DoxyCompactList} +\item \contentsline{section}{SPI Tools}{\pageref{group___m_y___l_i_b_s___s_p_i}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Init defines}{\pageref{group___s_p_i___i_n_i_t}}{} +\end{DoxyCompactList} \item \contentsline{section}{TIM Tools}{\pageref{group___m_y___l_i_b_s___t_i_m}}{} \begin{DoxyCompactList} -\item \contentsline{section}{PWM/\+OC Channels tools}{\pageref{group___m_y_l_i_b_s___t_i_m___o_c}}{} -\item \contentsline{section}{Encoder tools}{\pageref{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r}}{} -\item \contentsline{section}{Delay tools}{\pageref{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y}}{} \item \contentsline{section}{General tools}{\pageref{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l}}{} \begin{DoxyCompactList} \item \contentsline{section}{Init defines}{\pageref{group___t_i_m___i_n_i_t}}{} \end{DoxyCompactList} +\item \contentsline{section}{Delay tools}{\pageref{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y}}{} +\item \contentsline{section}{PWM/\+OC Channels tools}{\pageref{group___m_y_l_i_b_s___t_i_m___o_c}}{} +\item \contentsline{section}{Encoder tools}{\pageref{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r}}{} +\end{DoxyCompactList} +\item \contentsline{section}{UART Tools}{\pageref{group___m_y___l_i_b_s___u_a_r_t}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Init defines}{\pageref{group___u_a_r_t___i_n_i_t}}{} \end{DoxyCompactList} \end{DoxyCompactList} \end{DoxyCompactList} diff --git a/Doc/latex/trace_8h.tex b/Doc/latex/trace_8h.tex index 6e582dc..1502d40 100644 --- a/Doc/latex/trace_8h.tex +++ b/Doc/latex/trace_8h.tex @@ -1,5 +1,5 @@ -\doxysection{F\+:/\+Work/\+Projects/\+STM/.Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/trace.h File Reference} -\hypertarget{trace_8h}{}\label{trace_8h}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trace.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trace.h}} +\doxysection{E\+:/.WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/trace.h File Reference} +\hypertarget{trace_8h}{}\label{trace_8h}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trace.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trace.h}} Заголочный файл для работы с трассировкой. @@ -8,18 +8,20 @@ {\ttfamily \#include "{}mylibs\+\_\+defs.\+h"{}}\newline {\ttfamily \#include $<$string.\+h$>$}\newline {\ttfamily \#include "{}SEGGER\+\_\+\+RTT.\+h"{}}\newline -Include dependency graph for trace.\+h\+:\nopagebreak +Include dependency graph for trace.\+h\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode \includegraphics[width=337pt]{trace_8h__incl} \end{center} \end{figure} -This graph shows which files directly or indirectly include this file\+:\nopagebreak +This graph shows which files directly or indirectly include this file\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode -\includegraphics[width=233pt]{trace_8h__dep__incl} +\includegraphics[width=229pt]{trace_8h__dep__incl} \end{center} \end{figure} \doxysubsubsection*{Classes} @@ -32,13 +34,13 @@ struct \mbox{\hyperlink{struct_h_f___stack_frame__t}{HF\+\_\+\+Stack\+Frame\+\_\ \doxysubsubsection*{Macros} \begin{DoxyCompactItemize} \item -\#define \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\+\_\+printf}}(...)~SEGGER\+\_\+\+RTT\+\_\+printf(0, \+\_\+\+\_\+\+VA\+\_\+\+ARGS\+\_\+\+\_\+) +\#define \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\+\_\+printf}}(...) \begin{DoxyCompactList}\small\item\em Универсальный макрос для вывода трассировки \end{DoxyCompactList}\item \#define \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_ga730fb7b8d0bbb348dca73c15bd0e0b26}{log\+\_\+printf}}(TAG, fmt, ...) -\begin{DoxyCompactList}\small\item\em Макрос логирования с поддержкой уровней LOG\+\_\+\+LEVEL. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga02a6a7b273766121db8ad4a1371373eb}{TRACE\+\_\+\+GPIO\+\_\+\+SET}}(\+\_\+gpio\+\_\+, \+\_\+pin\+\_\+)~(\+\_\+gpio\+\_\+)-\/$>$BSRR = (((\+\_\+pin\+\_\+))) +\begin{DoxyCompactList}\small\item\em Макрос логирования с поддержкой уровней \doxylink{group___t_r_a_c_e___c_o_n_f_i_g_ga0b87e0d3bf5853bcbb0b66a7c48fdc05}{LOG\+\_\+\+LEVEL}. \end{DoxyCompactList}\item +\#define \mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga02a6a7b273766121db8ad4a1371373eb}{TRACE\+\_\+\+GPIO\+\_\+\+SET}}(\+\_\+gpio\+\_\+, \+\_\+pin\+\_\+) \begin{DoxyCompactList}\small\item\em Установить указанную ножку GPIO. \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga69741d88c991112e99fe7a62e025108a}{TRACE\+\_\+\+GPIO\+\_\+\+RESET}}(\+\_\+gpio\+\_\+, \+\_\+pin\+\_\+)~(\+\_\+gpio\+\_\+)-\/$>$BSRR = ((\+\_\+pin\+\_\+)$<$$<$16) +\#define \mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga69741d88c991112e99fe7a62e025108a}{TRACE\+\_\+\+GPIO\+\_\+\+RESET}}(\+\_\+gpio\+\_\+, \+\_\+pin\+\_\+) \begin{DoxyCompactList}\small\item\em Сбросить указанную ножку GPIO. \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsubsection*{Functions} \begin{DoxyCompactItemize} diff --git a/Doc/latex/trace_8h__dep__incl.md5 b/Doc/latex/trace_8h__dep__incl.md5 index 1128197..fc64bec 100644 --- a/Doc/latex/trace_8h__dep__incl.md5 +++ b/Doc/latex/trace_8h__dep__incl.md5 @@ -1 +1 @@ -ed66c693e6b28b2992bca99d933335c9 \ No newline at end of file +d1d9b9839489bb966fdfc05554f4505c \ No newline at end of file diff --git a/Doc/latex/trace_8h__dep__incl.pdf b/Doc/latex/trace_8h__dep__incl.pdf index 005a6b44da92184917b266ea025b2291e645d51f..8bb40481f2e206d65545acab8bc3494f533a131d 100644 GIT binary patch delta 19164 zcmV)BK*PVCqyem<0gz39Q%z3-F%Z4?SIn_JZ0St5Z1G4!h+i?{CLV|}2nre?5j5(* zcc#nY3XR_VK!8znk9?YXH0^~WY?xCw((&1{|QdpHJ6C(s~1C$GY)q2QW#(7XasG;te zEb1eZ5$RTnmZR6#CiAE-3`IR)AnH@$Rg5cHmIhIuo2b3P*5T_oVM+wN5!Lqa;aGJ`(VaMH^P%P*GJ{Zfc@l z8SnK-R`b+ZZm~^&q0wG-lj9Uq+IXWVz)N~Vbq(5_rNTB5W~pe84FDNz#*U|A8~wpL z^#9%+@{X+gy>*MN-dv=1ySlBLP?B0Zo2akNo9!9xtdEg=V1o<7(C)BB^6z49Jv-b9 z;`3s=N9Sz}^tDH_zPat#0ujb=^<(AqK^+iuHdca>VnZ<$R=}KrqRE)UOzkCg)us9b z=@s?5lL-PI0x&eQDFROce>XKYI0`;K3UhRFWnpa!c%0?Dd0QesBKZK6e?|z&r~`3GU3|@= zHGg{L(Jq9hZa|34U%Y99`rP67?n9{QI6~sJSFO4FnlV50rV*O0A!Ny1z3Td_b|yA# zgc^Q=(8Vt=Te@h;-mZwOsc0`bJMYc^c>-N|+v#4m;TovT(a zUWE7?O%Q(_;`dy$f9Se3qTjp+p@r=bSJ$jty5_O&k3WHU2SV0zL}+IPc%Ziun$Sz| zNm1$}JGBBN@FzJWOZ-WU0wz&7Nx0|9NMy!4@d)HkD`)El>ZU7a>ZT3Up?ZLoufQ8w z5p%|zN$@b@(N`+h|CJ`7FOkakBZSf82=N~a2ayGx%4|uue`p?2h?q>0gg8DzFp

    q*tF{9TTc7|e=E3VlauEKp*V^*1kCxaacc7{6MS{VV@>;Wadht7o#t4vgrt z!Ci_(9vnAd;AL7)aQh6vf3FShc&OPA2GwXw9&FBogL!bkfWav98a@;Qz&el`*0hXU z#&6;_^L)Hy3|AAJ%uSarD{Kf&iA^n;$F)d{3NIgaXMr_JB@UHAF$0JjK*9h@3?RzP zXT7lw#0?-}0MPh+YAS_>sfiegaV7DwwyNlqctiQZa8qZw>I8Gom-0$EkMkmk; zpb@p~hQOTx5{SFivZ9hWjtg#q`Uxz|FI7|~7ZtfVro2#_uT{r>nzS+!C_kfLfmB&M zW>w8XBv@D!Fi9fMe-RPKW5rM=3Ppi3e~OaueZaBKxKSBncMe*j;V_zPa$HOUmqME>P`aaB4 zG2CAfF%-avAsi#R{&AoQ<_ISone0dGE{Eaha8P%xjo$8yCtOOK^s;|*B?{T|zl8z-79aIDd~gYo0Yg*4lGD5a7;O3_th}0Qf0~0+)+T`z0lFc;I)RrnWK&O= z$9x9kgJKwyat?C<@5juUMSaC)=Fl?byjh!;Lk-q#L3=nhxx~s1ml; z!s6Fz{ij>sr%YS-V1W{t=iul?CXpj-%{b<{s-V91h&?if?x2%`fkM7>ARwsEKmW!5 z(7AgEe<9HZbEk2$+1!~*%{h-Q0C`5?A<)0i>&R@fs&-JFn128OAeE0(!zg57geBN4 zoQyCr$!04u$wV=W^u2T5AP}Mlm_tZIx^AIwOBgP`3;JA8WAZqQ;2rz=w38?MC@Qn< zLW-$@9D4~-H-Wf7WHHBLp2b2q=Xm@y6{Qeif38A~Y2Ad0Z<#R~#gfy*KVwsFq9hlh zP(r|#u;Qq)u}Gl%$5t~knJ`i4i__j1z&bfXnver&q$#E5e3D{rCG~C*rtfmD{2X;e z)YjG3>Mzrpw{$3Hi`|BZ&EzBj6Tby4;9tU2TBcj3+qmI;TpeL;=C0tksMlL}s3tQJ ze@r#%SnDj($W4(_rWxuatMU-p%{?GJV0xN+N)jE!X0?tIh*J=V36zylf(byAWv*>5 z)dh*kBr9gKs#>iYU8gojhl4l{lcxc>M|TThQwERTZ;=(_41kg|j^rjKoU+_z#^%HD z+E#3awj=|Ijak&^^N8xa&Myywc5d6Ce_<^{nhu7AHlafR21}mqu}^66CVha@fYsi9 zYUG^p`?NEV^XFwxw^B!U?ck<1z5LplGt}vSaq}8jo4(Op1Xl1*K^lJv82bhy**C`N zyVDk^8jxq=))A2!H3MLEjkThhf&0s#w9N42Q-!F#e-*d3 zv@oB%YBnL0U^Q7x#D?`vYI^A#ToKGRsU!BN9Y?YKAsoY3jB@+N;Kf)tGSIYdpjkNl z<)`1dWcClZ3tvp-fBoec{?wOY#?uZ%v;!SS9I9qsMK7sE3aMR;)}!0dKE&^ZHhXz? zn&o_JE9Ly7M+JId-c8J-NgqF^f6{gMI6JZeZ6607`2pQKLuXijE_Oy}@PLpa7Xfy& zJz%HisFLP$mxh(FN)*5P|M9$#!R5Z_m1XkH&U(v)EB@_?p>wB`>>QNgtIt0*w4a?C zl9{CX>fs^kvlx1MDB^mYk6n0_OJ4XrcLzN|RQKF~`aGSR+aao^zIePIdFNjS zMZkqT#J*ri3t~3>@aDl&HP|?7! z8l$J9M(b&DoTaI_%LD8wB5EsTqSW0@Bt&Vyt zXzr`OKo3&%&8*xu*6qE*;V-7@c)J7SQ-Ys}qTG6>v)_*j@>DNv$X?V%*q#R$=FM?1 z4-VwP{ydnrH8g%A%TFWbBf6DtsdT8xuhq>A}0^_T# z1<5x<16?1~c+57x^vy1dvmoKL*aO(1x~M6yZ+7WB8DA%{9HFHYP4O%ANQT*!;YJ-; zYnEhA1Py;w-r0;K-Bivyp8+BaA{WT8DqXW@5C8z}c&y?_tG7HDy7iSupY4e*nz-S6 zz0J!n+d7_4e|&%D;-$@p_Z{djA^)*<@%ZmQ+5aHvzW(~z4}Yis4>`K#-UqsNK>8 zbrdrzbh*vcR%WhxbEX(NTthd;GWyS zMz>)Tx*3l?-)pz$MC2eV_I!;M^Twt(J?8}wVR*;qI5JqbUp@Xa(*uGu&(PET$>(aB z8)}FJf2ez@m}ODRj`iRiy17NWte6x@;Y2NA7p(zoQye+8D+Ro3r^hJ*DOpwAfLxs5 zU??T%D3ym!%s?E1OFJIF_N}(ZW@}1s>6%M6J;f&;+}E&SM#U}to5=QS*45wtYX1xD zT;8SG5BMP9%P>^U6*G((A**t!PxY4$S4&Gle-n092ga99FKty@OINF_O4~+ts@sP@ z?EZoO8Pzq6x(?~Ql~7LQqtK6h&kj4_J2LE;@5Hd*x!xLPn&QSqbkXf}J{@dn1!f(L zp}v4w6bgAl-sFhVsv5p##B~0W5lyC+a*G>8@hty8aWjZ~x5Q_6;2vJZjj}lo(CxQ!3q5uIZ~Gduwow zhx%w~=N^+`g?QrL;&Owe$_+{?&-rleP35tp;t7$2#5$3P&K$*w&fE=RuAh-jf1;I6 zzsPnpMYi88GEOftOHO1AU1aWSarC%6%_g@8cMc-Mq1$@q+z=v5zV{yWV4Y6Zoq;U% z;Fjmz+^+ky441Bc~a1%o-W*W(E~nY%T3(cM}{ z6<+FcbqI5<#cY2(aX&}VaqX0agUu!YSjOW4LV5}U6)>3_@bJq}tDP1pfQwt#^iTM*mm#?7W+ z%`j(^ZJ)xW)Rc|b!ox;Ye`z$5EV9F`dL1R^5=)6X)-qNdW8G~x4|5DFxWwJ!XenrM zt#Yg?SmnAw+@juKztMT4Yn$3>zuR$l!JW>Bl&8%vXh-aaoqtpQ>innLuYK;!28$d8 zUaNKRIJ~>S91QTbDYiRooXt1*68bSs$KZMQYMafX*&PlAaXx23e?i=#I3Z)R*zA_L zSpjNM3MdOSi?jn2)Pkfucr-|Y8B(|31~Za!X2|@Mxz3Stkj0Lp4&un*Ne67W7&QbG zTE*rp6}F7B%(8H^Em;eJ1(?)RZi5*jb-jV`%~yGoFopf?=UUtSUS{ZfwR5L^+G!vS zzgIiMAVBXk`bj@(f9;#{kN6>Y6M9m;)^w~fZ3W}rd(pT*qI=`BA7FaSJgJ}aJA|Cs zx52Jgiov!AIk4YVV=s0wyS{~rK``s-(Yv8K6G{fUd>mMoDP^tCW>XY4n_hMjogEq~ z(P^ie9Y%NShtWlelHYC42_tGR@z@iBd0^d(ZzYRE$-ndtf2^&Kjk>w1YT)W;v|+Kp z8e1Vhtbg~lTW{V%)_nQPeUn<|>2^<3_I=(h^nrvuPw6CwnP#7t9rpGH5%XjxEs(*( zqlyYkSEMMzT}45@Xn0T4h9Mb#+v`1kQBk zW$k50jdmm)o}lxVi4N+G^)=_qFN`&h2Wa^UlBzRmE&k zt-OTcc{oF!>`B4kk62ndb@rt*d)sN7)wf4p5~-V7es?RyO$#^dOh2`MwQ z3!@Y$7rRDe@cmtPF<(mZ%(*kb{R_C0<}Q#3;dn14Q$@Q2KfsnDbF`{VmJBea9W){lB=nd->u=Mi%|_-oAlr~8WGa!>BBxNqe+)p{ps0w}76q+PQ^fR_q6|5bvJl1N z35PU0A>k06#@CP2_&6$O`=V^q^B6_C9HP?)S{x2`4DDP>wt-%pd(Nqp*-=0i6gg=b z?YkSg*3~<*z(ds(E2WTcdKz^n)92Br9n;SyO%NuCM}(u|5$PAEUj?Pl({) zf9s8o8w>7qyx@4x|6bs%-*VJ^uz(aPnn@I23Hm|5@|%Kw4il3<$f-pdMf_P{BWJL8 zKOHBc1M9)Wq6|S=B@bzpL8Miilue%3VDc&A;v-}$Xzm&wm$KOR*OA3!J-LnWb$ z5WX*mqzpyr*JBJfse9}U!%B~imOHE?e;JFU%zh9>Q*uBHYK2;nCjMvkED+5pWP((N zFb;m0MlFE4ts7e?@@kqIkR+89G4~p=I8}zPPQh@m*(+g6sjA_MB&w;NF%&`R#t*PT ziI*-^6Hok!hd+6G_f6k^1RpB+?6b>#4)=wDvwKpFtg;U5I|S zN6Cg86LE$3X9iY%TR&f913U8{pl@g-sh^EgFUoy-F7ZEyZs+NzZ}XJ_mkpamp2(m? zs$e?jlz{Ri`-aTUr2D%(MY)J6PNqR2@mS;nF$3p~e}e{D7mNCVq! zs%FMWCaRgUXo?8>iK4xXUY3a#N3s(knIr1UDpunb&S|l5iY#*+5j7Q*D5T7CV8?Xz zR!gyBTO!K0rj!g0988I`#SW1ZGh}kg8s=^##j{}Qr`vBnmcv%RufMe)q`dYX;OzUY zL%vgEUq0si_^mm)USqTEe=xCc&h!`(iHZ8!+?oAetGBSmOy}ENSYs*n)Nl}JzB^K* zQOT&dYH)F+MotB53{l>~%+#bI;{z!Rn?6`ny12$+`Wkka9^*<673S6SL_Jr6ZTOCX z-S0jzGB_gM^Irqs!FRp&=J= z3P}OO+?y4`t8ukTouUe3oMVEQlljVA=e*$6WVx_HUgm5I_Jv*-eqZpG@4bTeoS%69 z?t8EBR45yAheAnzt-IFW=-&|96_Q4hm^#uuo{Ui&NrO7oIX!r}(xhIkz9;_G{RKW} z)vycjSF@o&&@9=Jf8qkO&s(qL`A58l$=BQDtprJZ5%E#nZX4oCv3=tq%2<;vu4yOj zShJ_>ZT1d3A7U<*5K~O-4(26fwkPuxip)#M4&d17ZX9!|*xAu!yRmr!gc=cN@|$PQgPo3CR-OrMLOt-oEclK zNHGWWFUuqwb8aW=fMGJ7F)~I!dY3yxNk81k`?ic5x8m4szrS|%>$kT(P~OuYe(u^W zKYaS8>mS?xf9Ty`KCuULopb7m^^2**@#-r-d-=^*kLmj210c6c0p|qtWR6!7o+}cN ziET-fr}j&PGxl)?KQQ11_i?!Y>wTQ_hRgpmWBW$T|JEY+sfEUf9OM#X&YZDDL)b** z-24&O122-_35UP(5%l{mT+6VV$?#=lA{oV}wzW5@{|C>D< zy;B2_=q`@Y={M}+uud<+{J+`V(K|H&iSGAY9O>8gdvYT+V1CdMQ{5!9ji6cbE_tt< zmiy#)DbA@ArcA|2P=b(Vp&_X0GVX*iMYkKux)W;`U1VX`TMzEN^^ok@FzyUgFBZkA`wz z2BmyWT%3?TjCbL^IE~L@K7{M=EX-lL(77*4F6etAn0d-DGb^!!A_rz{73&xz>P^{q zq}a<2!#mkwcwf=9p&x7HwnKoc>boDOe;J1z;#{Mw7XB_WTDSu^Z7)_dtBYAxRx>Z^ zd{&f*&Sz_kLoZQ48sM-+#HE3iRKhtu7r87hd#ZP1*V29Msew;_`obDgwctBjp8Mgo zTb>gR_y6<0S@*rNY2cHAH~s@ZaCE_4$A5kD<>SB|*Jb}I91>nbar_j+Hh;hwe{hku z5`3kp06Vx?3`HCs5(nFf8Rstc@>ui~S-D7&C}W%`iN}U~OBc&C2x9EGgl-VT!W;*d zZ%G?4ZR%;I2tw$QAv*N{yvcBcP()ydS;)qY5?oSfF!(})!58KjywX&d2rC!}HMhm4 zFo&k%ODr?C-t{wNGc^4RxmJB$f09(CEH^$Op!>Lkr%;WZs409j5cCIqK~A(Jw74q~ zN|@q&A{zIqg%RYo6-1!1vmh)%u2_giaM0|DV5c3TA~_O4F%BYj`UU6CqZ+?bwxJa` z$faVjh?SmduiU>DW2+d+a1{sFin61i!0G|Gd##llVnx$IvojEQOx!N=f6?L?0bv`f ztl-@q(4pwwl_a{H4xYMh?A&E!-F*Wm_x|_5p57ij`;U7tzCW=qvh=|EZ7*II8MgzI z@7#KJBB^^0_n+Fh=@7p1zu&-{daurWZ`6j48FTKKwR6w0fzLXYRAW2f$Wf4CTiICx z{X7*J6uJgLjI(Im|9TdUe;8-cxc}uW+JPqeohD%?1IB$zKOsT2)xsCF~Ob_kjQ2hxVd0;>+0=H}9acNN|Lqa2MiObG8|Pyg7y8 zBST^M*iabGr}SM@b`T3a&cD%;rzC&|-`#;QXyQ~z41S}RJ0*}Oe-3&Kr6H#?9DR`; z4bb-w>3J3>{+0f3u(;t>T%IcGg-J1=eViY|HE@Sjo)x(~zABH&Zm~N#0j$EHAUVy7 zWeCr<;;4Y%fSgq`*?PNL+Oy!l? zj*d*#CdRsDwu?yXe-E(JXfxe(QayC%(0$fTHn{h?)9$RBcN3>+&_kZXAg4jz&VT>K z|G(KnG<{_Y(Ve%2Nc7MBU0)UBxeY_Q$&tsqlZJ~7F=ZH7^x$rxRkTWRt7r*e)nqd^ zr>W_MlYs+fu(vqDmf=SAt`#I~uxw+2b>CM07IW{deOrFgf7pBNn%Vb&a@har{jE}hbPquRcODA3^LCHjaj%EsfS;|qhpoHELFd&oxH0BoGwd1MH}fLNe|%>>xX*(V@f3H97&-!`);K#ayp8@AS@$I1)Ik@bg z_sL=TBxr%WZ0K(6Abm7jaG5Q*%obdp=^L`(xmEr8=CJ;cJ}`+~tN&vU zY_a{kW>sw}{kL;OlVIXRjkg4lYO?E};Fgwd1+krEe_iE7;< zDoL;}Z#~TO$-ctn>Tdr1l~2sl%)Ms&HFM_NJE8ZH-b>ca8ncPq-`{i3=xKB2-M5p} zfHtUGK^!FlST&x^gtQ1WLk?NdZ77T9;U)Nbd@H`6yiEQSPJ~B=$A_Pb6lb&a-|s?u z@m$;nfAzQI>I|1dn`PxxW{2!0f{ta*qi+jFnJsI8r-!F)~p!SgJ52d?!lL3uSJW{JN)ga8eN92K^t&KwmExm_WtaX zf9Qwk5cf+kQ_X-4%iubm{aE<#?4M8>-0^+18@+??m-mB+zZ`Wy%l|+d(ZgITkF!^2 zzkm@$&~-2d9?d|$>u@~RWO@>~c$fmQ$pj8mHqLt`jbQq7p(?~>El%0`1 z4wzSlu7_TCqi%Ent_=DqdJ|iOv)L!Je`f*fN1*BOKE3ESxQ`p?-#So7CmPX>qZ+7L zkNy+=0-eNB{4=s%um}}GO1LrmI^gYSv;ao?6x{hf{uj9wuG_em`Kj4SKnL5oIdpYoI7n#XVAZx^-;cZnYiG!Gmb`0c>I zvK86wXb#}RRv7*F(WCHYhtLW1e+RhUL4U>qHe)MXVI08=@J(>titoXXu#9tC%9z-Mo5+TKKMaf2T9r+%4gq(ouB>9MZ&Uv_EF3FAIYPl9}J&bAx zw+pWQ+`GJ=Kfz~Vo-2e0ggwI3!jFX)g|nhX`nCy~UcK-{e`){Q18899f4~C+-2=VZ zcY%NS0H=b$Uut3WOW;}!>-_*=+&=Ugw!qx^aVegNFN2v`j924!;IH4tcL2BiAshQo z@Cz_Y|Ajw+F{>oV#ypaYA(O}~xUM8CNITg@?kBzE4e|viac0iOxwukp8rRCL;5KtN za1U^4?p5wB?$6wL?gCs{e_r83d@-Nkll(M(F@G)pDF0XfufihX*TQ=saMp?2#f1JdiJHo(r8(0+6%ECifBsoWYWbJY8U6)$ zx8Fd|*NYZ>EBQpUpl*yv4LtMb+$cWD{TjW=y@MtGG4w}X!5(~uJjKlhEchuuQD{aH z?h*78t{vZk_LByLlrK$p10K)B&jMeVk1OzJTo!R4|9Vk1_ZM_KT0{ODodG)Di5|qu z`K!^rs1o0d{)&DCe^fDCxJE1$UHDgI72in;a4#bKGw^mbIEFdFiSEFy+{5B0ET1M6=T8B5yP2!tBaq$( zTxAjPv;#ohhk*~&b2FgC3z%~m;Kc&q5D&xk5by~eFlZIffB5CV#eRc&#rY(It`@8q zxDJT7Uk}Vh3$s5$yR%oLYqIyFGT;Y0vNuDIPoww1G zh9_LY^`Xjvf0?8!JC)l2@B0p#lYJ^1!U|fMU5jR+7tjwS0WFb|u*PZpJ9yul&|&A z-P$#)SFODIsufFHn=fx#Fn`v}`c&P-Z`Dp1Uo)ftcxcNMw7lvoEmL~S)L=`jg=#w#zGq6b zC7eFPf8ZGm-o;=Q;79~+2se0FP6?-RTeu-Tb<4`mhPEltU6)yz9G$#EDI0;h6f=Nk zfYP4mhA!-xh#5dU4dc7OELLGqX@7J|L)sUeLPwD1;tfldr)SS;ZkQ5?L|V#5r19is z(WPk=os_mESraswJti$qPD|`D;Z^i)&|TrKe-VA1cV{%Tv@K~_9$mgNNf7>7ESje}s) zn6eRDG9((^poJlU=|i(&ZkM!-FNf)mMCbzFl}VwckV$vUY1Z>$v^3C-Qsv2(G-;zX zeMXII0j=pUY6fp_ivlM1GULRRHYEoCY?`~EVdeNVcK;u$SLpS*f8ZnB(Ak!of7{0S zLvnikxWT#{lrEUu%mqjeA_0!o0#Ys-Y)muFmNXxSKanBz@{D8xtYjrPJTJuZ{B;c6KU5>HyXB2Tso=fbnR4 zb0j=DjTQi9#^Dca<#9B$1kx#(f3nH60pOorl*Wbo>bGlM^=e&i@e}}-_3-6rY z+)Xf<+%~DDD+YDVhr%E#SSg{Uw2)@PG=my3Oied2vG##ODTF#$Ezb&Aepv=1R%SBF zFj|%&dYPs_D8U{?4@oV{@On+kXw5^JNiXZrTMx^%HbIR>YYwx23Y%5xzb?d1Gbq)m z@u>-^iKLFejL@QPC^-yme!VrVgm{wSw~LFCgAV@wp!FHbgGNN3|bz(885j0-4v z)nR&L8b{NMqt{31+ohYLH$5uQeYPUCUuW#9NT7=0RFL1XsEhTk<7MfK-{ zl-3{Gxu|m?;A13RNFSUV2V||m7S;odQ1UTEn5P&(OJ$tDSb_HNSDA9Ft8}-e~7+Lx?^^@ttH$BJOs~y z$qt0m0;J)qKz)iXp?qVu{ywvT`9rd#a~|A_=&}XU67aLDmaK?U=9;GXuFpOlBM+lP z^P1Br(AgOU9D*Unr$S@sK9Lp^(`f>K8$mJT=UgdPx9sFbUIX zt_3>M8_IFo5bkGxiS)W;SF04iSi=6+C-ufA)+Galsv0(abe^An52mrwMt~lN~JD(FSN;?|o zUJ-zaEn|{fLg?K_@9M?2+JBk?x?}F~zm$~H^o=`CfAqz^{;M@)ngdxG+GE`Wf!ihy z%tVtl^u@j}Zq!h&{NgVrLJ|KL^fcIqhp3Gx-GhAmCNzaSi?;Cy?G&2Oqxcuu$Dynd z^0T2$e+<$(C|?BkjS`s$UlyMfo_NV4roimrO++{X%mE6epB{c$lCy(3gH20 zyA#swVhvgc_aDvOb9-)FYhkD>A^Zt=@*;$U3@i^_&-n;h9zn8itVj zG(v&zAryjq_-S}8V9T*x2*sa6sN@oalF+_ve>Os+y$Dr7-B{?aW(tIzz{oFvdA0#w zsS2U`do8;dXZvOh(cVFD}}}(uC!Y$3}v`sJqd5<`Dua7e2!;e2qf4_?5=dC(^ivJf~Jrw5+uL9-w%hHxK*JrG3Jj+U&4a2tf9 z5YDoi6zA!_zY@mo>As64J*(GNuJ^eDpCAVck&nq4y@s6WvDz#4)L%;ejP^k|3V|bkhU;DOF1n4J zqJMJ^aUFy`5RO7P0pSw}A~^-uJ8->C-bOa^7Al8O2VpUUJrIsU_ymGP-hx;of1;?w zVhYzmAmmRFYvhmcT7QJtM&1PIP4XrT?X~Xenuzzb$>n_ zFe(8n4H$KVD@GGhC0E=X9}Vc|?XF!F%72i*^n{b4z4fEW>nII@z(`()C%=xu5N1PY zgRlXD2+$h8FHdKF)38< zCch!SKpvR!6o9ATEbc2VoY3#Srd;Ad;h`xO;iX0i7H{uK<$_k#6)MOMiqOH=)$(P%1GQ z5HL)m#Q1Lk1ks-Go&-rH9@q_88YS+%A0Qef?zkHu8YOPr3J{GFYqtPIqr~#n0MRJ1 za4|qMO3a!M5JVaB=)qV?sCw2K9DlC2k?UZVu7g>+4rb{(#FOjjg+Ax$*nZGmS_(7v za4I>xG}HmQ=L@)FF79|7cdWo2x8jbixT6+#T!}l9xFd)=if~5?cO1dvU@AIrs&`1X zCgsH)ui%d7amOayk-!~s+!4baVO*WckVyCRN|rRRq^F(|9i-oy2;9d;B7ZQW5y1Hf z@PwlfpMa2MxfC=C7we6EMKmq$DXr7)2l9CdZhQ%r;U)AA1RfUXB|xK>pp%!N z0~^G35Eet|gYXH2ECdl+7sJ5sW3dh5atL)07DKoV!Y2?!Hk?l&5VSrw#C>dFbkOCw zfzN`#lb7J4-suR5qzbj5mVeYP;qD7!TM?dBlr19F$n6Gh?y#He8LS@om-^YiR3z8S z~F1@e&b70;0q3*Cc?JY0hkI1cGJw29@%prDDSRVYY)3~5Do zunBInbtguI4r435>p8GMPjZZz3jSa?%qJNvd2pMW$njJdJqjUvIVRd` zrcU{Ws4W-g?Lm8oz=f024>Zne?jG~(vxSpd(iIHOW&v(Yf0w$-4&hJn*@h{H@IPqM z(tL=Uh(B$ZOUt>5Q(9UYGq{PhLt*?6Xa}hC57y2EQku3yVN;Rb?qR)M9PWp9F`7U- zSw?ZzE-uTg9eKhACaK7;EDRqfM;MCQmrO%`0(e6OXet?hf<{Yx9b`gSJUe zWKDuWXi^kpO|TyYS(704vnEX!o0R98+&S3fPWB`YUu+Z9+o-3EHtH#8^KTDge)YFv zQZk8qCbTSDMBR*S(S{We+R}GzS?Q$~Q@CqcOV0n8Xn$L}Y$Z*>W@w47n37%=of7Vv zu;?4A7t!ho(J5VMQN#S^u0^R8Q@SUlCNxBsOlj$vHoK~N$g}Pod{))$Z|H0`?W~GE zYg+X;R9DmLY4lmu^jX#PS<_O}*s~Br_1Vo`CN!yK@*+L$A!Y^8whip8Np5Y!M25o? zBHmjAhkrqJc^a9MEon=1Qd)&TtIF!j>S+~_7Ok>UUvjR>d+UTq;4pqVSEWI*Jvs>` zH($HyTI6k5HAVm11V1R+d@Y@DJx*@=cR#3WNT-%e*|Zrn;B@J{#&q4Bh0R@(1f^~C zmD1ylGPAiMlkL+BM?&FvTF7yO4QW{|EtBP3!+)=@|FyZ4eMi|rKW<7D;mv4M3zsfx zoKJuw%+ERP4ufJvWyPizc)?9Li8mR2K;-`NP8ugyWZx!9ab^*iB~O~#ZA z{^(>S2WMy}Mta#3@=l^e^Iqk7PtM?qQ!X&IyykXCTzDMup2k?N3ast%czDIrOm z5(_eVZAqg42Nv{*E|Z%{AOklyHos4H^ckL|>&2tlmMHcUIaz|QZKLj7?JYAwA+0khTqS{D5 zxaIbh|J~TmqDaZd>v^HE3H>CjmBmLoJTLJoS5JQG=s`#+i?`@04&fwMUxy>8<9}tI ze`utz$WrY0(o>)8UfTJ!9Z42BdENMQJ}lRDO8ZlMUT2b<{9U0XH+eeGt)tk66A4?E zdujWAFDUqbXSGI3*SqgF3ad<#mSqaU)@{Zq2)pSsPC;0`%{T>N4S2)+c9U@miSNL7 ztS_N2nTMxgPose~;~KbT9|a%97=Qehc@3;HhDNhSdGzeLPePx>Jp5Jmckp+Np*O5I z&>Pm93b^9BJJj9rJ)myQb!*I6^Nbp^>pc4-^pEU=-c0TdbycnlPs5%DK8Af1?o;u7 zDri*Jz|*kj7PF+lk9d16eoo%I`<}QlRi$13NkV>E-^MYIW{?y%1$PeicSlYuuTM$_D;Hg zU5nc=5Pa9K*oT%T6l_Vh6Zr@Sm!urWwZ-S8^r0LZO{~6%daw z55wYOOjY0cev6(puP(W$J*CgfW#_Dx+{v})M#5r$M=^~ErkK!ZP1$E0e8PA+r|C8Y zKK8B-7LVM%$t>qv_199w_M>561eC1CJt~cK8?YMdAGK<#cOJIr#KNQIWnHEm`{WGZXbXd!Ee#yh9mS=%Sm?vdN(b~We1c6@f+@IsyYk?l*F zOgy)3;_N@44B|bLicuc|I53l|Q7i#DlQ07vll4(VRXYlRKoA4a%&Z>}K|!#x6fE=v zc9wn+_LLsN!>tK6kAy$~q~xdpQHUVSd<6^*@lk8VbPcKx2{XB0rH$;JSjdsc+5dl; gaFL7BV#_s7zz0CC2=H`VE7B9Ey&VV&g6rG}1WESj#3qtdP3BSf-VNAQfHf`C3Z$ zmQG>WPQo~}@D)`^0yC1zUU&Q*rJ8@ETc;~dp-YK=JqeHh9G&&5JfEio)f@-p%2uNVkqOzU1b=ISN#NFCYb zTp2EJfJW2Li%A?J&rm-fD=LSgXro4b2^Rigm}VZ!=PTW0zqe{v%|WNc?l?0=Y?#ro z+Y6N%S>c8cGJ5S-w22+iO_B6-dvv;t{;yv9cCTShtor5$>skdHJ?H~i`&v@^@l3i= zZE**DF6>ScgZ_55MN89wOH>92x!>(>%q_oh06qLk{1K;O!xU7x-_BYnEZQ1>))Ho5 zua@rrp5D$Skvy4#HB_gSITZPne`5*rGH!PiAZPT?Qt=1g-~SCHLjj!e(ou z=C!!;Rqg~0B!bY0v9Oc>B$^2q*)o9R>f zB-VbR;ctH{-irOfZQ%7DV9o4JU0j{bjO_jgIT%~R@(?o<|BojoCg$Mc{{Jl3|FZo2 z{}W)6@N|_@Yuo~32L;%eSy{PZ1qEUM_ZrXagDx*aw2>}uK{g*5x@vcd^Hf`zR0_Na zLleB{zM%;tXp(>Vs}N9V#JjS+@$q~t3IT&{mg|Y}r6Krsv78cuAmCO`Xqlx})Sa9P z8|+Y4V{`26o&2&{5V}1xlh$?#rQ6S6-!i!wGt-mP)4*-U3`brHiX`+{Ik*#b`^T9X z-j=K1bsjXsiC8%OukP3N6BntiHll(iJd)c?Ixao8$G_J;YS0XAXe7Evm2O!#! z+%0#d9OL|!#?9!yINAK*3w}1obGc)f{wVcDb^dS*4*fs*j&i1e*{9>pqXk>rDjL+p0zF{-sVK_Q>(L^Mea+P1d*%vxIwVAJukzsr<@=WtIuMh3euyjyW zcLN|&M26r7lPXwazRfGrI|{3O&1>4n53+gAEb=w1ZZfWIkWq=dsk$HSW!!edZQ%Un zqj&ak{g*F9YzBez%Tn13Q5l>d7-oH#YK?c&ybIT3pHaVz;C$!=J5yynBw!ce^&+mSLz2bba z`dStXDk(xo{SI1z|a>k8r1ok3)(}G2p^nZ0FSlpDr2;4^HwDRfqsatT7@!_A-rozJ<8i|9|wRf z)M!%2L+ty}hL;OKXa0+g70Gh59rT|MFie)4^LFK1k9rYMwm_PZ^sZ^fSQkPVIPc?a z5RMYzZNkM~E-R^|$bZ^F5mQ2LVD@FA>N6ET%?k7R^EwoC+jE=?eNZ%cry%Ot?A z?9*2s2(@j)wLtjGH5JA4Z~p*aSRSxFxa9dbkO#@N$U`6F@W7;z9^-gcA@p@GCwscE zxxpqgU^eQa6ab^hA=8rq1aQy)c*H!;2ruNY=`DOtov2zgo~!me)g2n8aDV!LA4uRv zb%?W?88!YY+BGCTtiZ6oR12wi%E%4r7kxL&#ps89*O_VVZ+^-WsNAV{fd)G0M+;Hm zE`)n2UbywU-!wv%NxH)KAp^q`he$^`J2or1)t9aq9ozVSO}D~g6J!DR7!G`=`Lh5R&DM*LszObl7Z=? za`%*0YE%u0<}3N9O`M9S<^wZWi-@x*suZ2LR7C2sbS@tQSD+6vJ3LmVzp1^k*b~z4&Njl>%mor2#IyhSS4&XvO zf9-E_<}nNk?QdLrj`h9zej!I-o=x*Wy7+q6XHHLqhC-DhE$FztGmEe@r06=Es>Yhr|Jnd;JrdxkzJu?u+Z|>x5?wZEt_iw%j=But4&C2u5(C zf2&#{3{`ri0V4`8o=z|o3(5){&dZ6Wo!AT`9=r8D{R{r9e1E@3Z~MfQdZOWgZz}xu z+uH4y$DQjjx)_b7sNj0OGK#3ccoFHQg6^K6-sR(lZa} zY0JE)Zbnwssd7ttu!q12jXdt5vcW`2lU^REaKDq&%iamtM&ixVZp<`Y^<4~?o7EO_)+|IACGeng^C6vB2x zL83?uKn)c9^|SJ<4qZRMPQq(d!_;`A+f`-$wtN)|S~3J?4xJK&y8`N@S0X_%VHKBQ zO?h6WKL!0=A^0u}`j9A5`Qy7PxNsvq+?ZI);3==v_l`+TFha@mt?D2Ne;88n6~T96 zj)$_WSd}=HV^LGp`1oPT!6RB0Ml74>I>^!oP)lV$Z;;SD|7q8`z(LrcB2Mgi<`UBs++GbzMBHqziv>;m2TZMR2!70E9{C32M6HVi z>8DQ@VJo$l-!B7^Y&;3sq}#t}4I{AxYFW`Egk(8V23@Bq+takVt};&-a8WgFuBNs} zK*vjcHJ^ph!=Pb`qviAjm*AVXQK9LRThOKFL(X$-qYU_p6Nej@qCs=a7#JVu_OY6F z682(cI9*LutJX-`xXEDso$ITrJ>IjA;yV3z!h6wVUwiJ-rz^{Nu+OXFuJ#w1p(j7# zK+iN9oxW=ooyLTO6~w$sT-TO_i_gwFkSOPsiP_N9Gjdq+>Ts?Gb~7oyXM<@&e8bV5 z-C%)Y%DZNr02zB+^!ox6;%|dE#T@I*DCNgi)QC%P%-8Q-Al~N^ z?GT)rU68XWE1Qr1<$wYNzh4JfCbh$9b+A<^aHnk$O)4C9sY71{tLkOzHyV|AOyQ{U zwm=Zu#ifchdP&OWGav?f=X)9N9_ewpJtVo=nSX!y?~EK1QC61Zdl<gHx&;rJfAFR-6)eBf_64z1QAdvIcJJWDvECeICAZxWBD9BU{ol$ zD6Y3lMM;(v%%WxoF$EoB|$~IzTLA;x)NDzS2O%qnkpn8?t96o~7 zt=_*-t{nm`2nO1s4Jk|sI9N)iLL^M;YLyd=OW5cgV>-twBaXhzk?KE`4HrtfNtO_V zA|ZrfLG-vHBLmpu;f8LL>e9xP+Tq&hvY1b0MzM~l-1j3FjA=4RddZjN(H%_1rew_C zZ3TF()4Y(nknDf}<#{$+Np_<;n_OQW=WHggL{Xz_X~3cK8ZP)MYddUn3z7p*HqiH? zbOM67n?Q0c9cVRAX17IJD&xbWmJ~XrDKk{uPO55B7cp-tW5vo->VC0`Ye*$X15=oI z;`H9x8RvwBa!`Jd2tGca=Ai$5@w-iq622y@^{sM4@Do@@%dexH+XCyW%YDi(O>v98`Lyz{gLdUrM9MkPV*FU8i~szu=dgi?gTrQm@?yhx z^HyQyYiX9NO88pI==4nH;wupAfvK@8{$`UC<5ylhnY((i209~|!z1eyY{#8a< z{oN?@Ig=$0#7B&Ww^*+AL{)B!5Jd#F@qO_Rf?>{f8 zAI9;Rn3Qh@p~GX|4|L#1Q8rZPi=DL&woZ@m~fP=1l)Eppnnnu z$Yb=R$*lB6p7=KhZ842_QyWt(GAyCx*Rkbow&n}6RlWE~D~A+BG5s6;vOdkyW#8f7 z;ZyMXsFGo&*gSB0wA=dX_3Kx|4J$Ninf+hM=>?d9~9cyp)5+_2Zmbh1~eK`emG&VNrh(6Uso_q&(nMu(T@A|)trTxbr2zRn4?>f~!KcpQWiuJRl~g_3Ne zeUNxgu>_{f*1xY*y)iu?(S8I87w7x%m)nSDX0L^DiJzKjVx=MS-5L$GmvKvcw8oG5 z7F{hpHCrnBBfWlPBp#-U>Q-y3TLA1GjJ;jKovgHGc`!9My*r#ry%9wIwxn3+@FX;{ z%Ww{NY!1>ss;_nm7xNFMq5j>zhpj&I-C3+W|NX+Y?cM31-0v!;;Tx)+aMsM!>Fyby z5dY-< zCDT(R_T3&iEyG>?J~_@sK3Vgp-Fy#z5-n>OP)tUigjZxrPbagl1FLb8Ah4 zVWUaZ!WyRaTlUqiox<{#gR;uKRl+2=1t8$ZA`wk_|_5YZanrhsT zO;sW`MKgJzN}fRP(|v5hmmq%)-;J&>bX-v?(dLiGLTM;%Qz;1||GINR^KJPYK_A=` z21m(ZH3XHcF%s~y@&hkiY&ytvbk_E9;WG18aAJcKs}>8J{^vksNjr&hvMhq& z#3E<7N+);5RgACC<)sf%PxBFK>qJY1!$#)PbGwfT(dSF3=JKz$y>q@FLcX6C+P-1H z%G2bEgV*Gzfb#%QJ<;QToHOUw^S9DxXkJPR!f{=O zJ?rYp7iO17R-^*|s?p^@$R}-87GKMX)1am;ERisRN=9Ehoy2-f7--KK6*OQkUlUt%fnyMsZ9nH0L6j()W zaN=o0^p3O#UB%aWohgEPY`gvRkFg3@HLoofxX4%6l4*wbz@R5C00!SHDTx ziA$SaK{42ikP`IrUYRlg(23|@R)Ei^e-cVvH!q2W$GKUHb)DZWMc4XmPg!y9nE2oO zQZpPv?;lAX40sAwhEJP)OT>RZ5S%O_8VOdN$Vf#%Azx^c%87kteTaTe7lxtehvzoV z+6@4K*=W0YIC`ItwQRhVq=TPac@Rh0tkb0EE(qQWxYBzIiKbN{5 zMQVD_RDQ2x^KZ34ZaXxpw=*8<7Gvr*?vnr?bsu$?Ag7Hzwmw6*l}|sO`OX0vV16q} zzvdri(^|qr#T&+|<|5$_EyQ?Q(n4ZwO41~{@@yp4E+dZ3W{`4O#f67&LWKA% zYkmf?*mmgJ!4Jq$KYZa9s26Q|uWaA!w|$d@k2sjc#id8c?^kx;JiozO-bmLksN4E= zQFTl_dw!+WCCO8CQ86-9?_EVm*uVlbHMJC}(=B=Hz-v!Tmm*=NFkZ#m1!@m7*W9XX z=|d@J(+$yfyEv|NC`H3+l6(6Ly&(9`=sH9bebCVi1m!8zX6oG!<@@cdyzHg+X+*kE ztSQN~)xo{qa7<1kLt2@x&RR_bF?iJ_Lq&PjWnW%LP}x+ws#Actf@qGoOAG_}ch<|v zv{75k^femMk@b75uH#!x6N{|+JoVMwm$Iu)8V&5)S?k3Js$orHdkN?%PtrIQ2D~H@ zlfHS4`*~(yZQ{-7l}Ses2l(-g7r>U>m{9ZMd4MiR1dsNc*uXpx{zt^0zvX<~2r~4H z`O-qkstgal>a?N}A-Ne0v2dkLwPPovcRM-{EV=7Un_+Q7;jrL9h{NDg*`)Ap)i-E3`n94%V86vrWk3 zatdcu8Iw3 z@zxHH)buOI!BFMi{nTTN7ndiGgVtujP5$7^N5=!LdqJbJ@{+#CttCopv~Q{V4NOdf0MHz}6ymGzRt3IbZnd_fvKZ<;Cu6X()S@JM}G3zM$uKIS~Q>*KL5C-z>TJrXE>)dVahJj%v z&X?yGwl9C7>tpGd5u162+6diWXknc&lkx|O7SpV`jX1tF@0M67=h%r>BglDtt*?3> z^RdMJi-6-+U8(W}k?S%1GM$UAFmg23Naa|mtYykhppAaIhcFjP4Ik<z6uxpIYsyvyiSC^j6Q?}0u(EB8Wl;ektCLJ`T1gb zml*)sfVM29D*1U3sWWfC5fQ;h_}9ETI_w5HRiZ#|#7EKrfA&3iw#&uMN`N^xy=6hL zS{I1G{U)<|WA3j+4YW-6{s@k;D_a+L?pJ8B1!%S49L7il#mIQY@p{8AP^#<;=rNgU zA$WzHXjfhZpO}TF32vmUu8lnRUwo5%3X8x5%iO1xW`wEE_h|+_g%#SoRPp{ipQ^^5 zLZxQ1)LtZZgvl^*M1_cIJPI$dlgqs{z66Wp?2kL->gKM%HTUK~^#K~OSKItP?U@6w z%3m#o?mMySA&X|?ganAIpd^yrwy2|>#FNFiBElB7ES$rJQO%5zrh?w4dxRR)ZB77P z+}2me`EsYb)W-C9Zs18=&Bn)PnM3z(z1?=la}<@kNsY@E`QD2!u2a|B_{=Zw{iUK& z{+0a+&|`=PQ$IJUsVvL~5fw(8n!lTm{a{)oe`nQr6buS;l+>^kyoa%*W+ z`Em$>a2oLJ(;vf%(W-4Oh3OW@a0dWaf5FW6F;CFSHYB)J0E?qEDQlxY>gzd<}S?(7AaNoA7*4DJ|joW<#&zA!%2as-C@HJ*pyF+0MefV>S;otfUD8tYS zzh|+>#HGnq@oQj|5Y^6TVwv)bA5gC;`ZVOK=Kr*KGa=Q~|54MZSn;fdd6N3F1O}cZ zcV-}o-USgqLgu!G)yviCHh+p1Rl=o}yM)k%aKV1}0X1s?M_dpV%&fLbzpy!huz54w z=mqoT1Jc~|UQ^FOFoF%|=Cb*D-R+O5rnOV^##fi87nf41F&y)y7My+|aK(l$i#ng- zt=b{Q!~xba5(Kc_KO&3^5@B42efXN3+zwOmY=miO*x*)-BGN*`d^d#IeHP3_eKDSh zqvEawE~wXlS66%?qc-%1aY6%3z^$37+C?n6hl;{-1Yc=!a)Ilra3*>B>Yj`(lJOZ$|57<@Bs zd6~`$jQG3lm6!+<;04xt1mbHAVX>SY;N4lW1cHDhovl`;9U2K+5oZ4!0Y%Y5;lGO&G)Mk)~7gHcc_n{!JXo+H)*3?#|CC_yxF-xiqA`QT1o8xy1a<}PgQ_5igPnt4L%c}u1cJbP zKsauI(+68wwr6RqoMc3XDuK-O;ZmxboICm0WE@H6P%#rW7dz^c(7^kU=eh?a@a)4! z&ow_kf<+GadL}cV4)!Gm{MxClE^XCZ_{6=zW7&iUW!i)fr0!xvF7Z$~h6o2Ta3$oZ zwATtDN6iLO?{b^eRS_>Q;a2jfM-Ct6nlhXhIwC>;bF%JMa))7464x?mP}&B@`AjW8 zpEZ+)&tk1r6_(~u2YEx%8*w9XCxkIs0-oZ*pe(71eypEuxi*O}oxJ?yMCOn^uS!Pw zo8cBiFk2ySt126uVrHup0 z-U?5zXuEagYlIqjGN(FZXW@r;HusA^f1FQ{aO%@faJ6Qv7TzB;roa_lW~B)ZNkGPE z+hsip4^wv1tJjqrCDGHcP8mWc5=E(ww+2}x>*xz#6*2I#o=9b&jsx&jwibD_Md(6Y zag6jViU@ zyWWpVjx?;OzYW9wwvBkIes~qolKJ+w9= zI01#;!>MZv4)jsQj6nMy$|9|dcX>Vx*>|t6v1aUho3#Zd4)09Q^6Z0ol|;%F2t=&4%Nux9!>ygou}g5Qzd!m6p=C$WX8DJK$T(QM<^XFU_M zXMQMotZN};7j_e_Y=uX_LTo+E~c%ZeqYz)>GIR<(b-AA3;bkN zP^pXU7=2CDjs8qEwecMhP^MkP$ZrQbQ3m~)V#b-}e>60u7btgHQ(3f~E#x7BP#T7N zySK542GHU%-ti>;w!1mQ+LFbPQUy*4^tdXD&r)44cYe-Tno$%qTay@Y)}6OAwAxbI z^muw*AEZKtUb(vcH>%CQ(M|4EVxeKhb`Ik&u0}Vor|D&^DTWx*6HFAAh>kiTq+B$d z(>&NQmMFy7H?=A}06Shw0VHIanh=s%tZR#<70Xr9Q1w8z4Dkb$ zLF4B18tRMC(=an5bqi=L&=Frvu_%jJQ!h)!iY8xT@ueBL3^rJN6U-0sjdc;c=p^DO zY1e3IOF9;}Y*aVivT@94iI75qc7@Z?E@c>YWh4_*A@ZWBK4gvHy_SAstGi=~Q~agH z1W;MZQ|dNgH7`fS_9xKw&a5cC0?1@3 z*~qXkMaxKt@jg}Vj-_5_ZsR+?GByJ1wOx5A!a6ex{dt+Z?Cri!6QotIDS+K3y3W+f zm;NkyE(sqMY)Y@gGq*evbNK@$i$UtKE&+ZOmzl$RoZ35EmniRV`)$Jnm0~XcuCoV9 zp6{Q}!ds;jMF-mr?i<{tYo;H53;?`~R_NJZW6mfHjUgRE<==;7$#-|&W`D{U*}Huu zy{hJQx+S&sw=|Y2Z1HZxpZWSM(3LWr%IQ^GN0A;uLi~|ETWob6kpfeuy$QRNtbqOy!0Rsb;pq_G4J1ZG|EA5w`0qEV|!?LHdRF}H0uq8rFxqRnwc zF(LC_?VL4Z0(ooaa93^ov44qtAGTx9B?Pg|$KW`vBL+s{#<5L3qN!9&cfbY#qMW5A zeR+j?4Wdg6%0!bHw6sFECNR@;cY$7d+M6m#iUx*Ok9szm?jrY@eij45@<3C79&W50 zLGs1w^r3Ku0fl_-7;y@&IWNVyKv2T_xEoGcmFSZsD&PnAd(XIm>Af8kpOYdq*VUPw zVFkn6QDxge>1lD_n<$0PYF{wwwCzCdC5mn;M%l_fcsyJ0OkOh;A3%wVA}8gH6nD*{ zByP1b8f#{wW#C;shn8o<$mmmQT1bfa4-s7CKuF>a&F$YI_BdNp3bb;CEG{pI-O+4N zRy=PNx!$3VmOFZl-{@kuw{7NUm8Op?@~Wo4$pvM4gE&MJVOQ8U-QHtDaK1UHuDZ|H+A^0kKYUj`hUOmSDr#GGaqYX4Sh_s`Ct}Y}%;j&wjLFYSZh z=WvLP3?z~OA+8HjEPP*P7o3KJ(S}o@%&E-bh3q-_sUs%#Ocn%cv(>3pI8{8g?&v8eoE?a_Dk;%%RZoE;#3G({*iA33YR292>O44nv!F0gIgkv6L+JY zS~7Y=nHxAtkhnnYX}L*`#tXInAjq-5cN6F@Cb#YJjq3K{ORMFgQ3-r5DJVy+q;#vS z4E@zL_+o?0(B*F#sI_)%=q&I3!hFMg#JyB~SS?$rLA?;Pr>aqE8Xc5*lZjTJwVx;6 zFWhVY8^tjNyPz}uT&ZdeQVgnirO+PI$VUL$o552L$o~XmR8%4$JhQ;-=aB=4P6?SB za`^JdPUvCC_tFActsCEh>If;TswmM$Ds@-VI825oJg@2y}?^2C%@JDTOhREGT4zX2~ceC%mUjU3- zd3*<@*TP_Ybuwbtqgh7~_W^t!zf5sasQZp_+hK)XZ}Eb@|Glhq#Zp zO>;c&S9gPtIFY0R!DFdiaUsh!KDVtvZI9uL;bsW(Gt(O)_Q;g?Om$qK#JVE8G=>Gjqq9$oT! z#!UfTg6^dwKV>&!H zoen+BeluI_G1_pIWdjByHO&s>+kER(sA)G+Rr}AKjCgI^0?l0N0s1M=9QUx_DZ3ui z^2JR!Np8e;a`^=-2NBw`&T6NCbP~icpFB8T9kL(032Ua&`h*DwqvVdB7b?(O(}|ab z$O~9M&H5x<=D)B!aQsrW5|Y9Y>s=;UsU80D#z;>6<=ef-WR?0u4t!)Udr2(AY6#^# z2fzLe!-7FTe&#jcw4u4MZp)g6-ZnqiV>4tC^t$ z7&!w4f9vRC_v+9!vG<9uqvMlnw=Heu+7x93L_Ec4bykXW67sZ0Slsro3zqP7&@2Dx;=lorv`8jrhAln)@x+Cd&GJ~uQ06) zdSirnZ;f%dwfc?}D{_rWiH3c$|AGaF?`wG2ja|w0Z{pV?akG#d8anhHHG~| z{2_De@h0V2`*-8=8OtPx4dB(9IPjD08$8qe$vABXep zkNu3UmFgTH10cxJa%TZbH_zAAkjBgQeG2ZX$8D!B5Y8C&AdtH?_Z3?(9QH0%wWGJh zAKU$?FT|_CjvEQ_u&<9leVGf#>VGl!_OZ%X5P?@+Ce*@LR$VGo$DN@Cp$yztmrH92sSOQ!W3UAxTu@V==)-CWX-|2h9P7>kTpPZbiHi*Bq0tK#8H<)<1>;vGJQLn1o@ ztS!T>owA9Q`V;(?x|AxWv==0|xBu%IOY(Q&7D6zP8KX}cLZzjbrA7J0!8XvUdo*jq zz^jFXYr`^hZ0MQ(QOyyVUE!gnQBgi{S!c)v})pShqfMr=u zw=Z4cz!jr(`{gvUI}M==UM6AScg;FHAS0EDpImV|b`+@4P83W^M}^5ERZW7YURi$& z#+SS@^6%gMNAn%$jmeUbR^w~Is9mk^^;+&rVgz3I(njZABE$acL8}E*SK;gI)+cz$ zLC1M&?Dta=I8wqDo_+fJDA$iKX|ocrVCk?M-GhNNyz7aMYApoyAC+Lz>`#p z1-hIvjT&p<7YI>)GBaxQBBl=dbWNz)1qqD@=uCw4*5&Y(ZD4&b)I21wkgM+n8`ege zuC4BR+75~o;b15&FK=07X@7!FJPa5wpZ6k0`<=a{$wc~_+N5IvX&I|0HE1ZD(hK;^z8G~VFl~ebN_wy+RSviZxnq(CXWuxsr+B-v*Jx9t7?18?+^i|dxs#4NgEYcQvf)--Tz1S+)`Ve<6d#zao5xW&|L`tCA)m= z9PcCsun(FdpxGsK&D#T8YP8Ioc|Y5qH5=}=GeN7+Dm)a4+Dr)L9C%BN1JF_RZf3ij; zozsl({hbF8>j$~XN>`hJ*ITU52>}|zB_j;WbsVzE(Ll^%!PXHv{{l=fXj`5Q z&wvKga}p!`$qE5Q#5%2^X(FWrg(5ENpbEwjLB5K-QE3Zz00CtSLe46W^VwW+QxU`( z0eX@id{}x-M1OQHvm1>RC-$27uTXwo{>*u@-|~+z8JDWEgAddIJFhfSIF1<6R}4a^ z%4LNHvc$c=C)xM2QMoQb%F`dXV8~^Njf z&yRb&Lw1)A`n>)DQURJ0<=NN{T}^AYzdQO<9Sw|aoTHZeg^fZOPHVzfHip}oS`=K$ zO3XKCH;(Uw_+wRWBj+P-BTCYeugX`|NMd4Q2@Wy0 z9FqO9-+exkRLf@Qyx*iX9kl-n8?U!wO8k_6zA}uRM?E70TF)|(5v!cloK_iq1UMpa zU%{f2?$hsXbQLJ9cy^!jZj7eN-q(Ez1iQgbz_r!;>SjkiIQ_)@vjmS?PwyL8BeUcK zikro~?OyEOqMw66L8|>O;-->u}oIHa=JSz6{$% zNo}sIU+%HpH;$2AH4+P<|7ua27fgWQE__i)qd+g*zUYmp3~-Ri_7fUv6H86QHw3j- zGUeB_Ut6%)Cq+;nlZ3jk)Y9-uO55qUWllSJafzD1Rr61!wx{Ke55!KM`!cqbj}^a} z?T4TgVEuj}&i!*|SvS}JsuVBR9&uVuy;e&vtqqE+^O1S@S@55e|5Q)x_KjH0N6%Ya z=i8nf6D~Wmbk~UpQ9^=ff9TI~`x-e19TX<@m3ws0Dwt6*+O9Ukz1eHn%m7=kL>gRe zd0|!nz#BKlsZ7#!h=PGmB{}y)tji3@zL%_$>&U#Ux`AS>4aL2JuZOthHP?mJ_J?XdF+?2mKQjo z&YehxQYBBEN@G3{{IAwd{Dohe!fR|&Oh5~;L`Prgh_j=b9XC@=nXIe5p9+}f6(Ma; zY=L~F&vVFbVQ+C*UfWFmhKs(}3-W4c*;KCn`I94V6hqlj|02bFQ$uYABks?!r*dva zAsi`ciLZT!eO0T+WOeKLn75A;_WZxB83qFiK@w&Ai_V`1=>5~G7?7obWwp?p^Da?9 zW~Q}!gD~I^vQqc##7#xX2X#fh{dpwE^oSVSC)YD`DFoa;LlKejzdrTqm};f)RIY-O z-kNe2OGpRdL$wo_-GX((ZwELGASI@aX3d#4(eetu6=^wf$^n{amwoq6c*)zDbW8zv zZv}VXAAL8`T(@K|DjxzbS7Uw#zpsIbm&5PloI1#Shle6z0L|<5K!_h^Zd*z`1etym zK^%RqRb_{agzkd;4W-*P4qO!4s~`??G$K+3CVCOv3kCfL$#}@#9}VPJ!`$e&$d7Ni z+Hc?$R0ksf89i4NR8Z#lzx|zHBrD#(ymEGQpqYtr`OXH6#1HJ=h_#Y41!TYpr0~VODenybnlb81u@yvJ{@c|d>L&Lg(D}W!doApCg6fK}9>CWywf5eKWS%F!Ed|w< z)(9TJB+`W6J<w_>KJYj8$a; zI~I^!hI22_nGMNms0BTWlZ?u5RqD&R-Ukvlc6|7rQH2=zaBlqQ-hSlRJ-9qDBJRoZ zLzRs|H{|-pZ9sRFf?W~BXyh+3ZzGAFI|SYIT?LU-sl7^&Uwi3ey*XiZvk#vG*>gO7G=JX}<#|MOB^7^`NlF?pfUTR;| zK9D{jLH9(&QAt@;;kUWhq-&_QN#hdtZv;dHDf65JYtrSMO#c3;3DHIBTA#iQxE8$9 z7aS!zZe*TW>Q^*sy=l4;+lAbXwoL1`7fIEe5n@pmym=zV?X+<`Hhea8c+$@&2kot3 zR!;hH^2z#A69_zR!C<#yePV7HUH$%xuQZs}J4rueM`|)^$_mw;mXuPQb3u%h`0I}MH9LtLugsaSCOd1o*_p1*rVXzxM=#VT z#V6{W%_Ei%X`BAP_Mkgm>5j&qww%`y? z{J)p)OA4&3a7h*u=DxbrL@GJ;h&ni48%6-|pAl*GNO_b>PA;Hu{{2emnJUpf=%48} zBdvvg#V{nVa1&htBaOF>!dRGl)*noaaI~+sy@kA2OecswW7~O zxV~_2AfF)aL(sdp^?DCG28m0)ROMJ*;WsnAC%~B#%n<}vJ6fxATzFo*P~rKk(=SN} z7op!BXubvne0lIUXi@BS>?a?z|w|AvLJc9~`h zk^|&$qtkFJSmu0zpC@E5U)YS4uwg1x-#$$s9OlC4t z9XTckz?tEACzsuXfvcm9SH72-*{-@{53sH^@b@F_RUX%Cvd@O<75nwoZlg~Q&05_K z^T*1n8a*!woBNVe3Ap3Q++r@p51oPF+sFO0;l*Y3xSC3Qjt0{I%8x(n8PpM2BS2w7 zVZS3a_RV`Ip-13EMFrxJeNy$sNGbPk6$v$89bNV$+lia87YVGG;+0#o_SxpxqAEofMfo zQ#;!5TYZL*J6iDe;he9U3Nhx6x#W zODN+-RydBZufl!@bOZH&qf2JNW*W3`r4oTr$B0rhI#!os4lV_RA!7zII#$o|yB7=` z^t@~pwLh?#{e(#S`BU{)w~5wtHx)r_y1A6(kRaz;zyf0+j4U| zbKwP7M)|m*vK*8tn9|IJNDd-@A&!*-QZ5;)OfQ=489o7jB17sGeUb&RlI7s&w2anv zkrB7ZvDp9droQYMdKXKEZ_9NvGd^|U^@IzqFX*1VlYgY>q{zWY8kmnF;s<4S5_5EuoAKQ#OTG0Q@tua+eoW4CUY!_)zSB99c092wi9A zw0Lw{XItm8zHG-8@u(K>JV;(3FLZ8bYBLe1FMH^oP-fb_EihNB@c5Axaaz*ZxuOek z33!Yi>cR}Dn{rP}W=^Ulp1C3wkHwo;!dSY-BYSLN+Z2EZn%ot~cg^e4@m&iRHy;EA zEqd3&=5B(?l(xw&T_sR|)_gDutb*kdnoBe3MU-BknHZ*~n^;)=&_Nxc4pz#u40gS| z4i2aKSR%m>> z5IdZg>-6#Z1brfDBrqd1s~d6-LEQ-$^-RQ#IMfAg&S%+uxT9--f*v}^TAH7$*#R|a zUdK=#^qf}9YY3ia41Ce>2o^1F?wN?7eHKHF$@D`hEp#G(4>7_-@%++Mvz>I#TmTqI z3*~VkIj=ZMZ_MC$W@-F}7#&?E9ltRKnej{%s5MmTLes-7ot;tm#$i^Lr<;wK7U7C8 zwA7O6xWcR(3Ik4m3}4#eR)$wSVM;@Wo_4eOw2kmI3Ur!}%PjxOr$O&C_%a%^Ki2)O zu_$glAGoyf(9R{Divb^FnL_&DTtDE_5pH2EKu;cKJ;97QEeDz4O1hV#l*j>@j9=VE zW~W$+S=xDVylDm0paGcf7+9=WbVUoT6{nkqBL07@g!3wYQAWZV@6;xkS2%ZNY~Rkz zRTo~a8oHcD1IQ?eQ3jcSv9K*0%d81y*0rRDsw|^p?u5NPo^J5*?B?k-v;o_hp6OV= z47v#XX2$Y3WLyjx(dH|R8KjK5lS)p@m%(jxmUBNuUWBNE9?ghm+};8*OWe zwgC;n^I)=nL(z-?Y4l1EpW@3X-I!~PXD$$bNS1XjfO`>Lwopa_dUoZqm2pa3GZf#A z*{6Nvp?7FOa|VSvJL7;u(8a_ws0_^~Gh%WEP2g`sD!yzbmF%vhg563(><@tUREGG* zK_MMHp1+v!1z0FLc|u|aOs@`D6{2^;E?Ssl8^--J=&d1h!HnA=r^RFdfbU%ieAnE3 zO1LC{f_J%4qT-n%RIQW zLVawgAaL8n!P#hvhCbi>`Ar(i5;2dRz-;gED63W)V+x$q107?kaV zu!R2$suG_?5A&N)8bSlVDf=#ukP7un;Cd#1gzXTfLD-3Zf$oBI8l0^wBB}TcRS=206Z1KWC+1r|JFg5>F*(&ho0R6;Z@Le%V1O=f@b;$ zgp?HsIU5ji-GGo6hUbU6Avc6(gbJZ<1g?wi2$evcWCo$qYY`gpBtjKXr|Kv|H6J5? zG#2iwTL=U_3<`7~sA`n$y@}A&5`?BzA#^cJ_Dr~UHl%ZV>Hl3~vzR3NPy>1e)`cLA z>0LVGI z2?!!W5Yy5qg!K@1LpVuGxI!-69gS#{O1S{s8-M|*oDY2hAq#Bgis5ZLR$R0J>NJ}e>)Rn02psB1>_fPV2UKpeoI=%s7OpYQIW6<~aa2}L_KsYg% zqjRpFl4SMnBOH$~M>vdDph&i#!`+IrdXh}Cche-*kUA0x&8GD-9TRm@7sTQ4Lqzofr-1=kIP<9qA)~>4~O)B6}uPk=IZL z0)d{q22XwsMIp?E&<0@x1QDRu0eT&EK-d9c4}=T^z%qz62vPD1gjXTFj;bK&5avR# zkQ3eTm_Bm6J2^Qr$xD7set~>26hOczjgsTP1`tHMqq~ztPww0Wmo!S={~$m#O5S-dKr~9;v;`m< zCD&~Rh(^g3YXG8Aa`94tXq23@5Fm*9$oCGElt$|2ti{nuD!CqiX6bsErR!mqu17q% zo_^71Jnh?ey35O9#vajABg!KkAd5baJLcn#$8pC>+;JQ3*n&G6aL47iBZWJ{xT6Sn z=(yuB9tTs=f%V=CF6(ta?sx@vJcm0r;f^HkNZ^hV+!4ifdLM~(&!}NZ6H9s~(M<>G z*Cqn>QArGDGzK_-9|M|j1mfcmvg}HSO3`AYa-fK SX#`UQ2)$3vVya+eG2+Qyy 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 delta 20592 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 PGBG$aG72RnMNdWw)P*L9 diff --git a/Doc/latex/trackers_8h_source.tex b/Doc/latex/trackers_8h_source.tex index a32d9f2..10669d6 100644 --- a/Doc/latex/trackers_8h_source.tex +++ b/Doc/latex/trackers_8h_source.tex @@ -1,5 +1,5 @@ \doxysection{trackers.\+h} -\hypertarget{trackers_8h_source}{}\label{trackers_8h_source}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trackers.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trackers.h}} +\hypertarget{trackers_8h_source}{}\label{trackers_8h_source}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trackers.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trackers.h}} \mbox{\hyperlink{trackers_8h}{Go to the documentation of this file.}} \begin{DoxyCode}{0} \DoxyCodeLine{\Hypertarget{trackers_8h_source_l00001}00001\ \textcolor{comment}{/**\ }} diff --git a/Doc/latex/unionuint16___bit_type_def.tex b/Doc/latex/unionuint16___bit_type_def.tex index c196c4b..c4d32f3 100644 --- a/Doc/latex/unionuint16___bit_type_def.tex +++ b/Doc/latex/unionuint16___bit_type_def.tex @@ -5,7 +5,7 @@ \item uint16\+\_\+t \mbox{\hyperlink{unionuint16___bit_type_def_ab821c8d3f0ad9b2aa405b29c1a15e955}{all}} \item -\Hypertarget{unionuint16___bit_type_def_abe6bb6d170ddf8f4320c50c377e88fbb}\label{unionuint16___bit_type_def_abe6bb6d170ddf8f4320c50c377e88fbb} +\Hypertarget{unionuint16___bit_type_def_a74615b0facc151c62611408fa64fa3a7}\label{unionuint16___bit_type_def_a74615b0facc151c62611408fa64fa3a7} \begin{tabbing} xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=\kill struct \{\\ @@ -37,172 +37,174 @@ Definition at line \mbox{\hyperlink{bit__access_8h_source_l00055}{55}} of file \ +\label{doc-variable-members} +\Hypertarget{unionuint16___bit_type_def_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{unionuint16___bit_type_def_ab821c8d3f0ad9b2aa405b29c1a15e955}\label{unionuint16___bit_type_def_ab821c8d3f0ad9b2aa405b29c1a15e955} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!all@{all}} +\Hypertarget{unionuint16___bit_type_def_ab821c8d3f0ad9b2aa405b29c1a15e955}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!all@{all}} \index{all@{all}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{all}{all}} -{\footnotesize\ttfamily uint16\+\_\+t uint16\+\_\+\+Bit\+Type\+Def\+::all} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_ab821c8d3f0ad9b2aa405b29c1a15e955} +uint16\+\_\+t uint16\+\_\+\+Bit\+Type\+Def\+::all} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00057}{57}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_acf97910d744de20e4f66231ac04916f4}\label{unionuint16___bit_type_def_acf97910d744de20e4f66231ac04916f4} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit0@{bit0}} +\Hypertarget{unionuint16___bit_type_def_acf97910d744de20e4f66231ac04916f4}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit0@{bit0}} \index{bit0@{bit0}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit0}{bit0}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit0} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_acf97910d744de20e4f66231ac04916f4} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit0} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00060}{60}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_ad24e7739b7345e2e8c7b904390f38245}\label{unionuint16___bit_type_def_ad24e7739b7345e2e8c7b904390f38245} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit1@{bit1}} +\Hypertarget{unionuint16___bit_type_def_ad24e7739b7345e2e8c7b904390f38245}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit1@{bit1}} \index{bit1@{bit1}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit1}{bit1}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit1} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_ad24e7739b7345e2e8c7b904390f38245} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit1} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00061}{61}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_aeeaefb47272ce9dd0093189434e3cc16}\label{unionuint16___bit_type_def_aeeaefb47272ce9dd0093189434e3cc16} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit2@{bit2}} +\Hypertarget{unionuint16___bit_type_def_aeeaefb47272ce9dd0093189434e3cc16}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit2@{bit2}} \index{bit2@{bit2}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit2}{bit2}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit2} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_aeeaefb47272ce9dd0093189434e3cc16} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit2} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00062}{62}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_a0fd35ec303d0432e0ed09498b4339825}\label{unionuint16___bit_type_def_a0fd35ec303d0432e0ed09498b4339825} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit3@{bit3}} +\Hypertarget{unionuint16___bit_type_def_a0fd35ec303d0432e0ed09498b4339825}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit3@{bit3}} \index{bit3@{bit3}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit3}{bit3}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit3} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_a0fd35ec303d0432e0ed09498b4339825} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit3} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00063}{63}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_abf9ffa5ca2bf68f60e663c6a34283024}\label{unionuint16___bit_type_def_abf9ffa5ca2bf68f60e663c6a34283024} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit4@{bit4}} +\Hypertarget{unionuint16___bit_type_def_abf9ffa5ca2bf68f60e663c6a34283024}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit4@{bit4}} \index{bit4@{bit4}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit4}{bit4}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit4} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_abf9ffa5ca2bf68f60e663c6a34283024} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit4} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00064}{64}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_abdd8245ddc6468c4edc6eb7b523f2b68}\label{unionuint16___bit_type_def_abdd8245ddc6468c4edc6eb7b523f2b68} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit5@{bit5}} +\Hypertarget{unionuint16___bit_type_def_abdd8245ddc6468c4edc6eb7b523f2b68}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit5@{bit5}} \index{bit5@{bit5}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit5}{bit5}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit5} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_abdd8245ddc6468c4edc6eb7b523f2b68} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit5} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00065}{65}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_a67094d80de21352fd3fdfd34ca862f08}\label{unionuint16___bit_type_def_a67094d80de21352fd3fdfd34ca862f08} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit6@{bit6}} +\Hypertarget{unionuint16___bit_type_def_a67094d80de21352fd3fdfd34ca862f08}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit6@{bit6}} \index{bit6@{bit6}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit6}{bit6}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit6} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_a67094d80de21352fd3fdfd34ca862f08} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit6} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00066}{66}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_a6f693fc837a1ea0f3a6fcbc64963d4e5}\label{unionuint16___bit_type_def_a6f693fc837a1ea0f3a6fcbc64963d4e5} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit7@{bit7}} +\Hypertarget{unionuint16___bit_type_def_a6f693fc837a1ea0f3a6fcbc64963d4e5}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit7@{bit7}} \index{bit7@{bit7}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit7}{bit7}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit7} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_a6f693fc837a1ea0f3a6fcbc64963d4e5} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit7} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00067}{67}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_a87b063401e95d432f4797abf1ef38037}\label{unionuint16___bit_type_def_a87b063401e95d432f4797abf1ef38037} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit8@{bit8}} +\Hypertarget{unionuint16___bit_type_def_a87b063401e95d432f4797abf1ef38037}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit8@{bit8}} \index{bit8@{bit8}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit8}{bit8}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit8} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_a87b063401e95d432f4797abf1ef38037} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit8} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00068}{68}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_a790a2de77be9b2672fec0ed8725aa3ce}\label{unionuint16___bit_type_def_a790a2de77be9b2672fec0ed8725aa3ce} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit9@{bit9}} +\Hypertarget{unionuint16___bit_type_def_a790a2de77be9b2672fec0ed8725aa3ce}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit9@{bit9}} \index{bit9@{bit9}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit9}{bit9}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit9} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_a790a2de77be9b2672fec0ed8725aa3ce} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit9} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00069}{69}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_a2068066f12e596957429373a9e7b370b}\label{unionuint16___bit_type_def_a2068066f12e596957429373a9e7b370b} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit10@{bit10}} +\Hypertarget{unionuint16___bit_type_def_a2068066f12e596957429373a9e7b370b}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit10@{bit10}} \index{bit10@{bit10}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit10}{bit10}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit10} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_a2068066f12e596957429373a9e7b370b} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit10} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00070}{70}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_a5aea5de8000bab137f45154ac4845a7a}\label{unionuint16___bit_type_def_a5aea5de8000bab137f45154ac4845a7a} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit11@{bit11}} +\Hypertarget{unionuint16___bit_type_def_a5aea5de8000bab137f45154ac4845a7a}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit11@{bit11}} \index{bit11@{bit11}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit11}{bit11}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit11} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_a5aea5de8000bab137f45154ac4845a7a} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit11} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00071}{71}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_af42575933decdc768b2d47d74150b447}\label{unionuint16___bit_type_def_af42575933decdc768b2d47d74150b447} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit12@{bit12}} +\Hypertarget{unionuint16___bit_type_def_af42575933decdc768b2d47d74150b447}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit12@{bit12}} \index{bit12@{bit12}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit12}{bit12}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit12} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_af42575933decdc768b2d47d74150b447} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit12} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00072}{72}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_a4cb4776e5e848a3cce73e9eca21a2977}\label{unionuint16___bit_type_def_a4cb4776e5e848a3cce73e9eca21a2977} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit13@{bit13}} +\Hypertarget{unionuint16___bit_type_def_a4cb4776e5e848a3cce73e9eca21a2977}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit13@{bit13}} \index{bit13@{bit13}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit13}{bit13}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit13} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_a4cb4776e5e848a3cce73e9eca21a2977} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit13} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00073}{73}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_a0c88ae0be399d9620d288f548ab4037d}\label{unionuint16___bit_type_def_a0c88ae0be399d9620d288f548ab4037d} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit14@{bit14}} +\Hypertarget{unionuint16___bit_type_def_a0c88ae0be399d9620d288f548ab4037d}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit14@{bit14}} \index{bit14@{bit14}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit14}{bit14}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit14} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_a0c88ae0be399d9620d288f548ab4037d} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit14} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00074}{74}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint16___bit_type_def_a246b7b099a4fab9338abb9549339db7c}\label{unionuint16___bit_type_def_a246b7b099a4fab9338abb9549339db7c} -\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit15@{bit15}} +\Hypertarget{unionuint16___bit_type_def_a246b7b099a4fab9338abb9549339db7c}\index{uint16\_BitTypeDef@{uint16\_BitTypeDef}!bit15@{bit15}} \index{bit15@{bit15}!uint16\_BitTypeDef@{uint16\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit15}{bit15}} -{\footnotesize\ttfamily unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit15} +{\footnotesize\ttfamily \label{unionuint16___bit_type_def_a246b7b099a4fab9338abb9549339db7c} +unsigned uint16\+\_\+\+Bit\+Type\+Def\+::bit15} @@ -212,4 +214,4 @@ Definition at line \mbox{\hyperlink{bit__access_8h_source_l00075}{75}} of file \ The documentation for this union was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{bit__access_8h}{bit\+\_\+access.\+h}}\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{bit__access_8h}{bit\+\_\+access.\+h}}\end{DoxyCompactItemize} diff --git a/Doc/latex/unionuint32___bit_type_def.tex b/Doc/latex/unionuint32___bit_type_def.tex index 1567bb7..3014264 100644 --- a/Doc/latex/unionuint32___bit_type_def.tex +++ b/Doc/latex/unionuint32___bit_type_def.tex @@ -5,7 +5,7 @@ \item uint32\+\_\+t \mbox{\hyperlink{unionuint32___bit_type_def_aabd9acf3b55b909219a41737a105f31b}{all}} \item -\Hypertarget{unionuint32___bit_type_def_a76de1c3d849f17f4ee2f9d17b44ee853}\label{unionuint32___bit_type_def_a76de1c3d849f17f4ee2f9d17b44ee853} +\Hypertarget{unionuint32___bit_type_def_a49ec6ac6dfc5a5da865150c5213e3822}\label{unionuint32___bit_type_def_a49ec6ac6dfc5a5da865150c5213e3822} \begin{tabbing} xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=\kill struct \{\\ @@ -53,332 +53,334 @@ Definition at line \mbox{\hyperlink{bit__access_8h_source_l00080}{80}} of file \ +\label{doc-variable-members} +\Hypertarget{unionuint32___bit_type_def_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{unionuint32___bit_type_def_aabd9acf3b55b909219a41737a105f31b}\label{unionuint32___bit_type_def_aabd9acf3b55b909219a41737a105f31b} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!all@{all}} +\Hypertarget{unionuint32___bit_type_def_aabd9acf3b55b909219a41737a105f31b}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!all@{all}} \index{all@{all}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{all}{all}} -{\footnotesize\ttfamily uint32\+\_\+t uint32\+\_\+\+Bit\+Type\+Def\+::all} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_aabd9acf3b55b909219a41737a105f31b} +uint32\+\_\+t uint32\+\_\+\+Bit\+Type\+Def\+::all} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00082}{82}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_abff6cfc25cc49ec273ed50773492e7f5}\label{unionuint32___bit_type_def_abff6cfc25cc49ec273ed50773492e7f5} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit0@{bit0}} +\Hypertarget{unionuint32___bit_type_def_abff6cfc25cc49ec273ed50773492e7f5}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit0@{bit0}} \index{bit0@{bit0}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit0}{bit0}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit0} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_abff6cfc25cc49ec273ed50773492e7f5} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit0} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00085}{85}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_abf8bdbe7ff864eed8de9099c0b587e28}\label{unionuint32___bit_type_def_abf8bdbe7ff864eed8de9099c0b587e28} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit1@{bit1}} +\Hypertarget{unionuint32___bit_type_def_abf8bdbe7ff864eed8de9099c0b587e28}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit1@{bit1}} \index{bit1@{bit1}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit1}{bit1}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit1} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_abf8bdbe7ff864eed8de9099c0b587e28} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit1} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00085}{85}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a666403b3523509859533e4d9f8b92f54}\label{unionuint32___bit_type_def_a666403b3523509859533e4d9f8b92f54} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit2@{bit2}} +\Hypertarget{unionuint32___bit_type_def_a666403b3523509859533e4d9f8b92f54}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit2@{bit2}} \index{bit2@{bit2}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit2}{bit2}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit2} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a666403b3523509859533e4d9f8b92f54} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit2} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00085}{85}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a5a2e789bb9bd79a65b1018bf45f18e20}\label{unionuint32___bit_type_def_a5a2e789bb9bd79a65b1018bf45f18e20} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit3@{bit3}} +\Hypertarget{unionuint32___bit_type_def_a5a2e789bb9bd79a65b1018bf45f18e20}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit3@{bit3}} \index{bit3@{bit3}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit3}{bit3}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit3} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a5a2e789bb9bd79a65b1018bf45f18e20} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit3} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00085}{85}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_abf47a02fa44022e310d8f5ff1a016a0b}\label{unionuint32___bit_type_def_abf47a02fa44022e310d8f5ff1a016a0b} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit4@{bit4}} +\Hypertarget{unionuint32___bit_type_def_abf47a02fa44022e310d8f5ff1a016a0b}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit4@{bit4}} \index{bit4@{bit4}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit4}{bit4}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit4} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_abf47a02fa44022e310d8f5ff1a016a0b} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit4} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00086}{86}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_ad1123a45e39fae16a0bc6ef1f9d8a029}\label{unionuint32___bit_type_def_ad1123a45e39fae16a0bc6ef1f9d8a029} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit5@{bit5}} +\Hypertarget{unionuint32___bit_type_def_ad1123a45e39fae16a0bc6ef1f9d8a029}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit5@{bit5}} \index{bit5@{bit5}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit5}{bit5}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit5} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_ad1123a45e39fae16a0bc6ef1f9d8a029} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit5} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00086}{86}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a09e0e3f37bb503bfc35c74988f7d1c38}\label{unionuint32___bit_type_def_a09e0e3f37bb503bfc35c74988f7d1c38} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit6@{bit6}} +\Hypertarget{unionuint32___bit_type_def_a09e0e3f37bb503bfc35c74988f7d1c38}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit6@{bit6}} \index{bit6@{bit6}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit6}{bit6}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit6} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a09e0e3f37bb503bfc35c74988f7d1c38} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit6} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00086}{86}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_ae0c9ae90820561cd7a65bed3ed545908}\label{unionuint32___bit_type_def_ae0c9ae90820561cd7a65bed3ed545908} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit7@{bit7}} +\Hypertarget{unionuint32___bit_type_def_ae0c9ae90820561cd7a65bed3ed545908}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit7@{bit7}} \index{bit7@{bit7}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit7}{bit7}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit7} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_ae0c9ae90820561cd7a65bed3ed545908} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit7} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00086}{86}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_aa5d94c8ca24d3987d889abf68a727469}\label{unionuint32___bit_type_def_aa5d94c8ca24d3987d889abf68a727469} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit8@{bit8}} +\Hypertarget{unionuint32___bit_type_def_aa5d94c8ca24d3987d889abf68a727469}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit8@{bit8}} \index{bit8@{bit8}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit8}{bit8}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit8} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_aa5d94c8ca24d3987d889abf68a727469} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit8} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00087}{87}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_aa7a37c3527f8cccab46b7df2fd8209f5}\label{unionuint32___bit_type_def_aa7a37c3527f8cccab46b7df2fd8209f5} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit9@{bit9}} +\Hypertarget{unionuint32___bit_type_def_aa7a37c3527f8cccab46b7df2fd8209f5}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit9@{bit9}} \index{bit9@{bit9}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit9}{bit9}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit9} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_aa7a37c3527f8cccab46b7df2fd8209f5} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit9} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00087}{87}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_ac12eaa502b6d609141ccb335f33af5e7}\label{unionuint32___bit_type_def_ac12eaa502b6d609141ccb335f33af5e7} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit10@{bit10}} +\Hypertarget{unionuint32___bit_type_def_ac12eaa502b6d609141ccb335f33af5e7}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit10@{bit10}} \index{bit10@{bit10}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit10}{bit10}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit10} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_ac12eaa502b6d609141ccb335f33af5e7} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit10} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00087}{87}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a683cce990ca4831b03265bfbe482cbb4}\label{unionuint32___bit_type_def_a683cce990ca4831b03265bfbe482cbb4} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit11@{bit11}} +\Hypertarget{unionuint32___bit_type_def_a683cce990ca4831b03265bfbe482cbb4}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit11@{bit11}} \index{bit11@{bit11}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit11}{bit11}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit11} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a683cce990ca4831b03265bfbe482cbb4} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit11} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00087}{87}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a77e18067ae4ac536b344117243c6d506}\label{unionuint32___bit_type_def_a77e18067ae4ac536b344117243c6d506} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit12@{bit12}} +\Hypertarget{unionuint32___bit_type_def_a77e18067ae4ac536b344117243c6d506}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit12@{bit12}} \index{bit12@{bit12}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit12}{bit12}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit12} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a77e18067ae4ac536b344117243c6d506} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit12} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00088}{88}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a3cd10a17f06d0074bac403ed78afd891}\label{unionuint32___bit_type_def_a3cd10a17f06d0074bac403ed78afd891} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit13@{bit13}} +\Hypertarget{unionuint32___bit_type_def_a3cd10a17f06d0074bac403ed78afd891}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit13@{bit13}} \index{bit13@{bit13}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit13}{bit13}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit13} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a3cd10a17f06d0074bac403ed78afd891} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit13} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00088}{88}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a3c1e306cf28b30566ba1336fffce194b}\label{unionuint32___bit_type_def_a3c1e306cf28b30566ba1336fffce194b} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit14@{bit14}} +\Hypertarget{unionuint32___bit_type_def_a3c1e306cf28b30566ba1336fffce194b}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit14@{bit14}} \index{bit14@{bit14}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit14}{bit14}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit14} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a3c1e306cf28b30566ba1336fffce194b} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit14} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00088}{88}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a5270b3410fb334ca5639a7ff8168e79b}\label{unionuint32___bit_type_def_a5270b3410fb334ca5639a7ff8168e79b} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit15@{bit15}} +\Hypertarget{unionuint32___bit_type_def_a5270b3410fb334ca5639a7ff8168e79b}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit15@{bit15}} \index{bit15@{bit15}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit15}{bit15}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit15} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a5270b3410fb334ca5639a7ff8168e79b} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit15} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00088}{88}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_aaafd5bb13d528e1677d257c454877608}\label{unionuint32___bit_type_def_aaafd5bb13d528e1677d257c454877608} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit16@{bit16}} +\Hypertarget{unionuint32___bit_type_def_aaafd5bb13d528e1677d257c454877608}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit16@{bit16}} \index{bit16@{bit16}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit16}{bit16}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit16} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_aaafd5bb13d528e1677d257c454877608} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit16} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00089}{89}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a1433177abbca3502a8b349c84ea00a18}\label{unionuint32___bit_type_def_a1433177abbca3502a8b349c84ea00a18} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit17@{bit17}} +\Hypertarget{unionuint32___bit_type_def_a1433177abbca3502a8b349c84ea00a18}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit17@{bit17}} \index{bit17@{bit17}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit17}{bit17}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit17} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a1433177abbca3502a8b349c84ea00a18} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit17} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00089}{89}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a4a71070cee54394b6538702985bb9bed}\label{unionuint32___bit_type_def_a4a71070cee54394b6538702985bb9bed} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit18@{bit18}} +\Hypertarget{unionuint32___bit_type_def_a4a71070cee54394b6538702985bb9bed}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit18@{bit18}} \index{bit18@{bit18}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit18}{bit18}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit18} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a4a71070cee54394b6538702985bb9bed} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit18} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00089}{89}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_aa986b0413af6a14e8bc889e40a547dec}\label{unionuint32___bit_type_def_aa986b0413af6a14e8bc889e40a547dec} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit19@{bit19}} +\Hypertarget{unionuint32___bit_type_def_aa986b0413af6a14e8bc889e40a547dec}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit19@{bit19}} \index{bit19@{bit19}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit19}{bit19}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit19} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_aa986b0413af6a14e8bc889e40a547dec} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit19} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00089}{89}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a4aa0febc01b82124e82fd183e5938a92}\label{unionuint32___bit_type_def_a4aa0febc01b82124e82fd183e5938a92} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit20@{bit20}} +\Hypertarget{unionuint32___bit_type_def_a4aa0febc01b82124e82fd183e5938a92}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit20@{bit20}} \index{bit20@{bit20}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit20}{bit20}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit20} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a4aa0febc01b82124e82fd183e5938a92} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit20} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00090}{90}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a7b0e092cf7411e9b265546cb685088d2}\label{unionuint32___bit_type_def_a7b0e092cf7411e9b265546cb685088d2} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit21@{bit21}} +\Hypertarget{unionuint32___bit_type_def_a7b0e092cf7411e9b265546cb685088d2}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit21@{bit21}} \index{bit21@{bit21}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit21}{bit21}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit21} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a7b0e092cf7411e9b265546cb685088d2} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit21} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00090}{90}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a659e845e7eb657ea25a2f99d989849f6}\label{unionuint32___bit_type_def_a659e845e7eb657ea25a2f99d989849f6} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit22@{bit22}} +\Hypertarget{unionuint32___bit_type_def_a659e845e7eb657ea25a2f99d989849f6}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit22@{bit22}} \index{bit22@{bit22}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit22}{bit22}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit22} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a659e845e7eb657ea25a2f99d989849f6} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit22} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00090}{90}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_aee65f736e7d7b6af66addf365ae47ca9}\label{unionuint32___bit_type_def_aee65f736e7d7b6af66addf365ae47ca9} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit23@{bit23}} +\Hypertarget{unionuint32___bit_type_def_aee65f736e7d7b6af66addf365ae47ca9}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit23@{bit23}} \index{bit23@{bit23}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit23}{bit23}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit23} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_aee65f736e7d7b6af66addf365ae47ca9} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit23} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00090}{90}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a760d75577810f01480ff019023d7c10e}\label{unionuint32___bit_type_def_a760d75577810f01480ff019023d7c10e} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit24@{bit24}} +\Hypertarget{unionuint32___bit_type_def_a760d75577810f01480ff019023d7c10e}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit24@{bit24}} \index{bit24@{bit24}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit24}{bit24}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit24} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a760d75577810f01480ff019023d7c10e} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit24} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00091}{91}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a5cd1e149fa9d1b0c23a6977989ee30ca}\label{unionuint32___bit_type_def_a5cd1e149fa9d1b0c23a6977989ee30ca} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit25@{bit25}} +\Hypertarget{unionuint32___bit_type_def_a5cd1e149fa9d1b0c23a6977989ee30ca}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit25@{bit25}} \index{bit25@{bit25}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit25}{bit25}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit25} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a5cd1e149fa9d1b0c23a6977989ee30ca} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit25} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00091}{91}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a3ac1b793de197ed00907d420cbaf67de}\label{unionuint32___bit_type_def_a3ac1b793de197ed00907d420cbaf67de} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit26@{bit26}} +\Hypertarget{unionuint32___bit_type_def_a3ac1b793de197ed00907d420cbaf67de}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit26@{bit26}} \index{bit26@{bit26}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit26}{bit26}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit26} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a3ac1b793de197ed00907d420cbaf67de} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit26} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00091}{91}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_aef4211a2fbabc4020b376fcda333743e}\label{unionuint32___bit_type_def_aef4211a2fbabc4020b376fcda333743e} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit27@{bit27}} +\Hypertarget{unionuint32___bit_type_def_aef4211a2fbabc4020b376fcda333743e}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit27@{bit27}} \index{bit27@{bit27}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit27}{bit27}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit27} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_aef4211a2fbabc4020b376fcda333743e} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit27} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00091}{91}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a6849e6bd6f3e263f512d24bfe9b3b5be}\label{unionuint32___bit_type_def_a6849e6bd6f3e263f512d24bfe9b3b5be} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit28@{bit28}} +\Hypertarget{unionuint32___bit_type_def_a6849e6bd6f3e263f512d24bfe9b3b5be}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit28@{bit28}} \index{bit28@{bit28}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit28}{bit28}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit28} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a6849e6bd6f3e263f512d24bfe9b3b5be} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit28} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00092}{92}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a1a12a3a22dd803e4381a6f9c7be8b043}\label{unionuint32___bit_type_def_a1a12a3a22dd803e4381a6f9c7be8b043} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit29@{bit29}} +\Hypertarget{unionuint32___bit_type_def_a1a12a3a22dd803e4381a6f9c7be8b043}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit29@{bit29}} \index{bit29@{bit29}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit29}{bit29}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit29} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a1a12a3a22dd803e4381a6f9c7be8b043} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit29} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00092}{92}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_a743186db785e1a412209b75152ade3ff}\label{unionuint32___bit_type_def_a743186db785e1a412209b75152ade3ff} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit30@{bit30}} +\Hypertarget{unionuint32___bit_type_def_a743186db785e1a412209b75152ade3ff}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit30@{bit30}} \index{bit30@{bit30}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit30}{bit30}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit30} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_a743186db785e1a412209b75152ade3ff} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit30} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00092}{92}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint32___bit_type_def_acff898f6a1d8583148b8c20537266253}\label{unionuint32___bit_type_def_acff898f6a1d8583148b8c20537266253} -\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit31@{bit31}} +\Hypertarget{unionuint32___bit_type_def_acff898f6a1d8583148b8c20537266253}\index{uint32\_BitTypeDef@{uint32\_BitTypeDef}!bit31@{bit31}} \index{bit31@{bit31}!uint32\_BitTypeDef@{uint32\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit31}{bit31}} -{\footnotesize\ttfamily unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit31} +{\footnotesize\ttfamily \label{unionuint32___bit_type_def_acff898f6a1d8583148b8c20537266253} +unsigned uint32\+\_\+\+Bit\+Type\+Def\+::bit31} @@ -388,4 +390,4 @@ Definition at line \mbox{\hyperlink{bit__access_8h_source_l00092}{92}} of file \ The documentation for this union was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{bit__access_8h}{bit\+\_\+access.\+h}}\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{bit__access_8h}{bit\+\_\+access.\+h}}\end{DoxyCompactItemize} diff --git a/Doc/latex/unionuint64___bit_type_def.tex b/Doc/latex/unionuint64___bit_type_def.tex index 9b49ea9..23030ba 100644 --- a/Doc/latex/unionuint64___bit_type_def.tex +++ b/Doc/latex/unionuint64___bit_type_def.tex @@ -5,7 +5,7 @@ \item uint64\+\_\+t \mbox{\hyperlink{unionuint64___bit_type_def_a1dd79aa84a1d13d156f1b684aaf01edd}{all}} \item -\Hypertarget{unionuint64___bit_type_def_a1cec80592b666bd54a987bfd849604ae}\label{unionuint64___bit_type_def_a1cec80592b666bd54a987bfd849604ae} +\Hypertarget{unionuint64___bit_type_def_a90521812d54cf423f4cacf6cce0022cd}\label{unionuint64___bit_type_def_a90521812d54cf423f4cacf6cce0022cd} \begin{tabbing} xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=\kill struct \{\\ @@ -85,652 +85,654 @@ Definition at line \mbox{\hyperlink{bit__access_8h_source_l00097}{97}} of file \ +\label{doc-variable-members} +\Hypertarget{unionuint64___bit_type_def_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{unionuint64___bit_type_def_a1dd79aa84a1d13d156f1b684aaf01edd}\label{unionuint64___bit_type_def_a1dd79aa84a1d13d156f1b684aaf01edd} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!all@{all}} +\Hypertarget{unionuint64___bit_type_def_a1dd79aa84a1d13d156f1b684aaf01edd}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!all@{all}} \index{all@{all}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{all}{all}} -{\footnotesize\ttfamily uint64\+\_\+t uint64\+\_\+\+Bit\+Type\+Def\+::all} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a1dd79aa84a1d13d156f1b684aaf01edd} +uint64\+\_\+t uint64\+\_\+\+Bit\+Type\+Def\+::all} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00099}{99}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_aff17255dbf3ae6a53a2cb3b9ec3d4298}\label{unionuint64___bit_type_def_aff17255dbf3ae6a53a2cb3b9ec3d4298} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit0@{bit0}} +\Hypertarget{unionuint64___bit_type_def_aff17255dbf3ae6a53a2cb3b9ec3d4298}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit0@{bit0}} \index{bit0@{bit0}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit0}{bit0}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit0} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_aff17255dbf3ae6a53a2cb3b9ec3d4298} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit0} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00102}{102}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a3261a8e364bbfc3bea2099962fd391e5}\label{unionuint64___bit_type_def_a3261a8e364bbfc3bea2099962fd391e5} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit1@{bit1}} +\Hypertarget{unionuint64___bit_type_def_a3261a8e364bbfc3bea2099962fd391e5}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit1@{bit1}} \index{bit1@{bit1}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit1}{bit1}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit1} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a3261a8e364bbfc3bea2099962fd391e5} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit1} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00102}{102}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a20ae7d30b5f560cb06ec7ddf8c901b8c}\label{unionuint64___bit_type_def_a20ae7d30b5f560cb06ec7ddf8c901b8c} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit2@{bit2}} +\Hypertarget{unionuint64___bit_type_def_a20ae7d30b5f560cb06ec7ddf8c901b8c}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit2@{bit2}} \index{bit2@{bit2}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit2}{bit2}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit2} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a20ae7d30b5f560cb06ec7ddf8c901b8c} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit2} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00102}{102}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a0c4125f907098ffe900e193357e5d3ad}\label{unionuint64___bit_type_def_a0c4125f907098ffe900e193357e5d3ad} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit3@{bit3}} +\Hypertarget{unionuint64___bit_type_def_a0c4125f907098ffe900e193357e5d3ad}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit3@{bit3}} \index{bit3@{bit3}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit3}{bit3}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit3} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a0c4125f907098ffe900e193357e5d3ad} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit3} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00102}{102}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a548c073727ccb13e6e7f56472412034f}\label{unionuint64___bit_type_def_a548c073727ccb13e6e7f56472412034f} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit4@{bit4}} +\Hypertarget{unionuint64___bit_type_def_a548c073727ccb13e6e7f56472412034f}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit4@{bit4}} \index{bit4@{bit4}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit4}{bit4}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit4} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a548c073727ccb13e6e7f56472412034f} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit4} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00103}{103}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a5386a391a6ba21bdeb0296ed9043d03a}\label{unionuint64___bit_type_def_a5386a391a6ba21bdeb0296ed9043d03a} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit5@{bit5}} +\Hypertarget{unionuint64___bit_type_def_a5386a391a6ba21bdeb0296ed9043d03a}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit5@{bit5}} \index{bit5@{bit5}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit5}{bit5}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit5} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a5386a391a6ba21bdeb0296ed9043d03a} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit5} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00103}{103}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a9181ed01944b9da888afafead31931d2}\label{unionuint64___bit_type_def_a9181ed01944b9da888afafead31931d2} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit6@{bit6}} +\Hypertarget{unionuint64___bit_type_def_a9181ed01944b9da888afafead31931d2}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit6@{bit6}} \index{bit6@{bit6}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit6}{bit6}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit6} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a9181ed01944b9da888afafead31931d2} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit6} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00103}{103}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a19df4425e8bfa0de2d6920696cf7614c}\label{unionuint64___bit_type_def_a19df4425e8bfa0de2d6920696cf7614c} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit7@{bit7}} +\Hypertarget{unionuint64___bit_type_def_a19df4425e8bfa0de2d6920696cf7614c}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit7@{bit7}} \index{bit7@{bit7}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit7}{bit7}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit7} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a19df4425e8bfa0de2d6920696cf7614c} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit7} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00103}{103}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a4e721ef35fc0b10ffde85d3face0810b}\label{unionuint64___bit_type_def_a4e721ef35fc0b10ffde85d3face0810b} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit8@{bit8}} +\Hypertarget{unionuint64___bit_type_def_a4e721ef35fc0b10ffde85d3face0810b}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit8@{bit8}} \index{bit8@{bit8}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit8}{bit8}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit8} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a4e721ef35fc0b10ffde85d3face0810b} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit8} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00104}{104}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a1269f7d45f62bf763c6dbcce5d286459}\label{unionuint64___bit_type_def_a1269f7d45f62bf763c6dbcce5d286459} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit9@{bit9}} +\Hypertarget{unionuint64___bit_type_def_a1269f7d45f62bf763c6dbcce5d286459}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit9@{bit9}} \index{bit9@{bit9}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit9}{bit9}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit9} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a1269f7d45f62bf763c6dbcce5d286459} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit9} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00104}{104}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a6d2d38d7385f47a21797ff1251150b26}\label{unionuint64___bit_type_def_a6d2d38d7385f47a21797ff1251150b26} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit10@{bit10}} +\Hypertarget{unionuint64___bit_type_def_a6d2d38d7385f47a21797ff1251150b26}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit10@{bit10}} \index{bit10@{bit10}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit10}{bit10}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit10} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a6d2d38d7385f47a21797ff1251150b26} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit10} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00104}{104}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_af2680443011d9537ad667321115bd9d9}\label{unionuint64___bit_type_def_af2680443011d9537ad667321115bd9d9} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit11@{bit11}} +\Hypertarget{unionuint64___bit_type_def_af2680443011d9537ad667321115bd9d9}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit11@{bit11}} \index{bit11@{bit11}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit11}{bit11}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit11} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_af2680443011d9537ad667321115bd9d9} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit11} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00104}{104}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a1e806ef90a4a49e9acc816fbfd559b7a}\label{unionuint64___bit_type_def_a1e806ef90a4a49e9acc816fbfd559b7a} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit12@{bit12}} +\Hypertarget{unionuint64___bit_type_def_a1e806ef90a4a49e9acc816fbfd559b7a}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit12@{bit12}} \index{bit12@{bit12}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit12}{bit12}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit12} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a1e806ef90a4a49e9acc816fbfd559b7a} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit12} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00105}{105}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_ad4b8ef500154da1a0dc19ef9535fd18b}\label{unionuint64___bit_type_def_ad4b8ef500154da1a0dc19ef9535fd18b} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit13@{bit13}} +\Hypertarget{unionuint64___bit_type_def_ad4b8ef500154da1a0dc19ef9535fd18b}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit13@{bit13}} \index{bit13@{bit13}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit13}{bit13}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit13} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_ad4b8ef500154da1a0dc19ef9535fd18b} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit13} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00105}{105}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a1ace2a9de437ba03fffcf0003e8a9922}\label{unionuint64___bit_type_def_a1ace2a9de437ba03fffcf0003e8a9922} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit14@{bit14}} +\Hypertarget{unionuint64___bit_type_def_a1ace2a9de437ba03fffcf0003e8a9922}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit14@{bit14}} \index{bit14@{bit14}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit14}{bit14}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit14} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a1ace2a9de437ba03fffcf0003e8a9922} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit14} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00105}{105}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a6a2318362ad7fe9eb0d8115f78a2b954}\label{unionuint64___bit_type_def_a6a2318362ad7fe9eb0d8115f78a2b954} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit15@{bit15}} +\Hypertarget{unionuint64___bit_type_def_a6a2318362ad7fe9eb0d8115f78a2b954}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit15@{bit15}} \index{bit15@{bit15}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit15}{bit15}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit15} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a6a2318362ad7fe9eb0d8115f78a2b954} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit15} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00105}{105}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a843c0a233cbb56277603b2af8c49799a}\label{unionuint64___bit_type_def_a843c0a233cbb56277603b2af8c49799a} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit16@{bit16}} +\Hypertarget{unionuint64___bit_type_def_a843c0a233cbb56277603b2af8c49799a}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit16@{bit16}} \index{bit16@{bit16}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit16}{bit16}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit16} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a843c0a233cbb56277603b2af8c49799a} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit16} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00106}{106}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_ac5f4985df61854a2e4a459bee5049901}\label{unionuint64___bit_type_def_ac5f4985df61854a2e4a459bee5049901} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit17@{bit17}} +\Hypertarget{unionuint64___bit_type_def_ac5f4985df61854a2e4a459bee5049901}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit17@{bit17}} \index{bit17@{bit17}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit17}{bit17}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit17} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_ac5f4985df61854a2e4a459bee5049901} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit17} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00106}{106}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_aedcddf700cf22c6ffa88a3cc35d3ca45}\label{unionuint64___bit_type_def_aedcddf700cf22c6ffa88a3cc35d3ca45} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit18@{bit18}} +\Hypertarget{unionuint64___bit_type_def_aedcddf700cf22c6ffa88a3cc35d3ca45}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit18@{bit18}} \index{bit18@{bit18}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit18}{bit18}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit18} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_aedcddf700cf22c6ffa88a3cc35d3ca45} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit18} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00106}{106}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_aa54f6e0b37d9a7ee270d60ab5fa99d96}\label{unionuint64___bit_type_def_aa54f6e0b37d9a7ee270d60ab5fa99d96} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit19@{bit19}} +\Hypertarget{unionuint64___bit_type_def_aa54f6e0b37d9a7ee270d60ab5fa99d96}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit19@{bit19}} \index{bit19@{bit19}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit19}{bit19}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit19} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_aa54f6e0b37d9a7ee270d60ab5fa99d96} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit19} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00106}{106}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_aa494c40e09d657938459fe033f9b4768}\label{unionuint64___bit_type_def_aa494c40e09d657938459fe033f9b4768} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit20@{bit20}} +\Hypertarget{unionuint64___bit_type_def_aa494c40e09d657938459fe033f9b4768}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit20@{bit20}} \index{bit20@{bit20}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit20}{bit20}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit20} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_aa494c40e09d657938459fe033f9b4768} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit20} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00107}{107}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a2bb5652539ba1be890e7a8e9106b1b13}\label{unionuint64___bit_type_def_a2bb5652539ba1be890e7a8e9106b1b13} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit21@{bit21}} +\Hypertarget{unionuint64___bit_type_def_a2bb5652539ba1be890e7a8e9106b1b13}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit21@{bit21}} \index{bit21@{bit21}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit21}{bit21}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit21} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a2bb5652539ba1be890e7a8e9106b1b13} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit21} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00107}{107}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_acdfa6e465a2ab178030d6e6602aace99}\label{unionuint64___bit_type_def_acdfa6e465a2ab178030d6e6602aace99} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit22@{bit22}} +\Hypertarget{unionuint64___bit_type_def_acdfa6e465a2ab178030d6e6602aace99}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit22@{bit22}} \index{bit22@{bit22}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit22}{bit22}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit22} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_acdfa6e465a2ab178030d6e6602aace99} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit22} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00107}{107}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_afe3bd10a6deca0fe61ab0ef5e8e4a20f}\label{unionuint64___bit_type_def_afe3bd10a6deca0fe61ab0ef5e8e4a20f} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit23@{bit23}} +\Hypertarget{unionuint64___bit_type_def_afe3bd10a6deca0fe61ab0ef5e8e4a20f}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit23@{bit23}} \index{bit23@{bit23}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit23}{bit23}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit23} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_afe3bd10a6deca0fe61ab0ef5e8e4a20f} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit23} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00107}{107}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_aae3e9b8317400c2d0b727dfa173d5ad2}\label{unionuint64___bit_type_def_aae3e9b8317400c2d0b727dfa173d5ad2} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit24@{bit24}} +\Hypertarget{unionuint64___bit_type_def_aae3e9b8317400c2d0b727dfa173d5ad2}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit24@{bit24}} \index{bit24@{bit24}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit24}{bit24}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit24} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_aae3e9b8317400c2d0b727dfa173d5ad2} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit24} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00108}{108}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a81b8ac661abfed6e2b58fdb615eb252a}\label{unionuint64___bit_type_def_a81b8ac661abfed6e2b58fdb615eb252a} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit25@{bit25}} +\Hypertarget{unionuint64___bit_type_def_a81b8ac661abfed6e2b58fdb615eb252a}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit25@{bit25}} \index{bit25@{bit25}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit25}{bit25}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit25} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a81b8ac661abfed6e2b58fdb615eb252a} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit25} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00108}{108}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_af3f19ae67c1f900e23daf8deda4324ef}\label{unionuint64___bit_type_def_af3f19ae67c1f900e23daf8deda4324ef} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit26@{bit26}} +\Hypertarget{unionuint64___bit_type_def_af3f19ae67c1f900e23daf8deda4324ef}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit26@{bit26}} \index{bit26@{bit26}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit26}{bit26}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit26} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_af3f19ae67c1f900e23daf8deda4324ef} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit26} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00108}{108}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_ace71c1313eb20f6157e354125e85b644}\label{unionuint64___bit_type_def_ace71c1313eb20f6157e354125e85b644} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit27@{bit27}} +\Hypertarget{unionuint64___bit_type_def_ace71c1313eb20f6157e354125e85b644}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit27@{bit27}} \index{bit27@{bit27}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit27}{bit27}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit27} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_ace71c1313eb20f6157e354125e85b644} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit27} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00108}{108}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a6691a7d235dedb6f8f2a3a285a987c0b}\label{unionuint64___bit_type_def_a6691a7d235dedb6f8f2a3a285a987c0b} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit28@{bit28}} +\Hypertarget{unionuint64___bit_type_def_a6691a7d235dedb6f8f2a3a285a987c0b}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit28@{bit28}} \index{bit28@{bit28}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit28}{bit28}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit28} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a6691a7d235dedb6f8f2a3a285a987c0b} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit28} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00109}{109}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a28b75958e1c0d1132e45c08a911b1c4b}\label{unionuint64___bit_type_def_a28b75958e1c0d1132e45c08a911b1c4b} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit29@{bit29}} +\Hypertarget{unionuint64___bit_type_def_a28b75958e1c0d1132e45c08a911b1c4b}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit29@{bit29}} \index{bit29@{bit29}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit29}{bit29}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit29} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a28b75958e1c0d1132e45c08a911b1c4b} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit29} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00109}{109}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a120ee09962960ef1c39d1710070a927a}\label{unionuint64___bit_type_def_a120ee09962960ef1c39d1710070a927a} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit30@{bit30}} +\Hypertarget{unionuint64___bit_type_def_a120ee09962960ef1c39d1710070a927a}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit30@{bit30}} \index{bit30@{bit30}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit30}{bit30}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit30} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a120ee09962960ef1c39d1710070a927a} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit30} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00109}{109}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a7daaf6b99ddcead17e00cad39d58c0ba}\label{unionuint64___bit_type_def_a7daaf6b99ddcead17e00cad39d58c0ba} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit31@{bit31}} +\Hypertarget{unionuint64___bit_type_def_a7daaf6b99ddcead17e00cad39d58c0ba}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit31@{bit31}} \index{bit31@{bit31}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit31}{bit31}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit31} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a7daaf6b99ddcead17e00cad39d58c0ba} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit31} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00109}{109}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a8c273132d8a04ec96ef2b81c4acdab40}\label{unionuint64___bit_type_def_a8c273132d8a04ec96ef2b81c4acdab40} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit32@{bit32}} +\Hypertarget{unionuint64___bit_type_def_a8c273132d8a04ec96ef2b81c4acdab40}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit32@{bit32}} \index{bit32@{bit32}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit32}{bit32}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit32} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a8c273132d8a04ec96ef2b81c4acdab40} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit32} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00110}{110}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a37884146acb266d93a1046cbb32e0754}\label{unionuint64___bit_type_def_a37884146acb266d93a1046cbb32e0754} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit33@{bit33}} +\Hypertarget{unionuint64___bit_type_def_a37884146acb266d93a1046cbb32e0754}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit33@{bit33}} \index{bit33@{bit33}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit33}{bit33}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit33} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a37884146acb266d93a1046cbb32e0754} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit33} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00110}{110}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a317a774edf3fc9f8c5f0bab49ac7e3ea}\label{unionuint64___bit_type_def_a317a774edf3fc9f8c5f0bab49ac7e3ea} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit34@{bit34}} +\Hypertarget{unionuint64___bit_type_def_a317a774edf3fc9f8c5f0bab49ac7e3ea}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit34@{bit34}} \index{bit34@{bit34}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit34}{bit34}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit34} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a317a774edf3fc9f8c5f0bab49ac7e3ea} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit34} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00110}{110}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_ad07bade9d4ce904b8822dbf507c7c695}\label{unionuint64___bit_type_def_ad07bade9d4ce904b8822dbf507c7c695} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit35@{bit35}} +\Hypertarget{unionuint64___bit_type_def_ad07bade9d4ce904b8822dbf507c7c695}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit35@{bit35}} \index{bit35@{bit35}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit35}{bit35}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit35} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_ad07bade9d4ce904b8822dbf507c7c695} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit35} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00110}{110}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a14afca8c10e4abcbaf4740e308b8791a}\label{unionuint64___bit_type_def_a14afca8c10e4abcbaf4740e308b8791a} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit36@{bit36}} +\Hypertarget{unionuint64___bit_type_def_a14afca8c10e4abcbaf4740e308b8791a}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit36@{bit36}} \index{bit36@{bit36}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit36}{bit36}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit36} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a14afca8c10e4abcbaf4740e308b8791a} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit36} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00111}{111}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a8796b96d250307eaefb78eeea59e30ed}\label{unionuint64___bit_type_def_a8796b96d250307eaefb78eeea59e30ed} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit37@{bit37}} +\Hypertarget{unionuint64___bit_type_def_a8796b96d250307eaefb78eeea59e30ed}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit37@{bit37}} \index{bit37@{bit37}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit37}{bit37}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit37} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a8796b96d250307eaefb78eeea59e30ed} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit37} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00111}{111}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a297a35fbb4c94c193f578ac20522b589}\label{unionuint64___bit_type_def_a297a35fbb4c94c193f578ac20522b589} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit38@{bit38}} +\Hypertarget{unionuint64___bit_type_def_a297a35fbb4c94c193f578ac20522b589}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit38@{bit38}} \index{bit38@{bit38}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit38}{bit38}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit38} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a297a35fbb4c94c193f578ac20522b589} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit38} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00111}{111}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a2d85e07f1127e67e02a3fb9b17cec87f}\label{unionuint64___bit_type_def_a2d85e07f1127e67e02a3fb9b17cec87f} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit39@{bit39}} +\Hypertarget{unionuint64___bit_type_def_a2d85e07f1127e67e02a3fb9b17cec87f}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit39@{bit39}} \index{bit39@{bit39}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit39}{bit39}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit39} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a2d85e07f1127e67e02a3fb9b17cec87f} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit39} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00111}{111}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a094fd073860f380f8d1881ae313864a2}\label{unionuint64___bit_type_def_a094fd073860f380f8d1881ae313864a2} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit40@{bit40}} +\Hypertarget{unionuint64___bit_type_def_a094fd073860f380f8d1881ae313864a2}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit40@{bit40}} \index{bit40@{bit40}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit40}{bit40}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit40} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a094fd073860f380f8d1881ae313864a2} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit40} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00112}{112}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a72f0b4f624bef10dc2deb8661fb7da4b}\label{unionuint64___bit_type_def_a72f0b4f624bef10dc2deb8661fb7da4b} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit41@{bit41}} +\Hypertarget{unionuint64___bit_type_def_a72f0b4f624bef10dc2deb8661fb7da4b}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit41@{bit41}} \index{bit41@{bit41}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit41}{bit41}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit41} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a72f0b4f624bef10dc2deb8661fb7da4b} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit41} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00112}{112}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_ab70b7c38e6cc4d117e5b21e63718eed9}\label{unionuint64___bit_type_def_ab70b7c38e6cc4d117e5b21e63718eed9} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit42@{bit42}} +\Hypertarget{unionuint64___bit_type_def_ab70b7c38e6cc4d117e5b21e63718eed9}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit42@{bit42}} \index{bit42@{bit42}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit42}{bit42}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit42} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_ab70b7c38e6cc4d117e5b21e63718eed9} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit42} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00112}{112}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_ac33764c0c04dd15ec3643343ebbf2437}\label{unionuint64___bit_type_def_ac33764c0c04dd15ec3643343ebbf2437} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit43@{bit43}} +\Hypertarget{unionuint64___bit_type_def_ac33764c0c04dd15ec3643343ebbf2437}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit43@{bit43}} \index{bit43@{bit43}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit43}{bit43}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit43} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_ac33764c0c04dd15ec3643343ebbf2437} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit43} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00112}{112}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a1d3c44deb4caaf002d77c50dbc0a03e2}\label{unionuint64___bit_type_def_a1d3c44deb4caaf002d77c50dbc0a03e2} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit44@{bit44}} +\Hypertarget{unionuint64___bit_type_def_a1d3c44deb4caaf002d77c50dbc0a03e2}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit44@{bit44}} \index{bit44@{bit44}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit44}{bit44}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit44} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a1d3c44deb4caaf002d77c50dbc0a03e2} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit44} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00113}{113}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_ad00ed97ae560ea4db6b8ee15b1c8ab7d}\label{unionuint64___bit_type_def_ad00ed97ae560ea4db6b8ee15b1c8ab7d} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit45@{bit45}} +\Hypertarget{unionuint64___bit_type_def_ad00ed97ae560ea4db6b8ee15b1c8ab7d}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit45@{bit45}} \index{bit45@{bit45}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit45}{bit45}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit45} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_ad00ed97ae560ea4db6b8ee15b1c8ab7d} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit45} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00113}{113}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_adcfbd33fd8d3e555093f10d12e4e30bd}\label{unionuint64___bit_type_def_adcfbd33fd8d3e555093f10d12e4e30bd} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit46@{bit46}} +\Hypertarget{unionuint64___bit_type_def_adcfbd33fd8d3e555093f10d12e4e30bd}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit46@{bit46}} \index{bit46@{bit46}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit46}{bit46}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit46} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_adcfbd33fd8d3e555093f10d12e4e30bd} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit46} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00113}{113}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a31c74e216efa115cf210a28543250092}\label{unionuint64___bit_type_def_a31c74e216efa115cf210a28543250092} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit47@{bit47}} +\Hypertarget{unionuint64___bit_type_def_a31c74e216efa115cf210a28543250092}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit47@{bit47}} \index{bit47@{bit47}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit47}{bit47}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit47} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a31c74e216efa115cf210a28543250092} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit47} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00113}{113}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a5785ec5ef50cea4f9893e3b36687d8c3}\label{unionuint64___bit_type_def_a5785ec5ef50cea4f9893e3b36687d8c3} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit48@{bit48}} +\Hypertarget{unionuint64___bit_type_def_a5785ec5ef50cea4f9893e3b36687d8c3}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit48@{bit48}} \index{bit48@{bit48}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit48}{bit48}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit48} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a5785ec5ef50cea4f9893e3b36687d8c3} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit48} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00114}{114}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a7a73d551df00a67ffa9d9ce9ae5a66b2}\label{unionuint64___bit_type_def_a7a73d551df00a67ffa9d9ce9ae5a66b2} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit49@{bit49}} +\Hypertarget{unionuint64___bit_type_def_a7a73d551df00a67ffa9d9ce9ae5a66b2}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit49@{bit49}} \index{bit49@{bit49}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit49}{bit49}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit49} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a7a73d551df00a67ffa9d9ce9ae5a66b2} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit49} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00114}{114}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a38c4154dde7a42789a799283565ea259}\label{unionuint64___bit_type_def_a38c4154dde7a42789a799283565ea259} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit50@{bit50}} +\Hypertarget{unionuint64___bit_type_def_a38c4154dde7a42789a799283565ea259}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit50@{bit50}} \index{bit50@{bit50}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit50}{bit50}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit50} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a38c4154dde7a42789a799283565ea259} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit50} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00114}{114}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_aea9978fdeedb0b8653633e5c5ceda200}\label{unionuint64___bit_type_def_aea9978fdeedb0b8653633e5c5ceda200} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit51@{bit51}} +\Hypertarget{unionuint64___bit_type_def_aea9978fdeedb0b8653633e5c5ceda200}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit51@{bit51}} \index{bit51@{bit51}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit51}{bit51}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit51} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_aea9978fdeedb0b8653633e5c5ceda200} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit51} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00114}{114}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a4cef515450f79794b217673872204e74}\label{unionuint64___bit_type_def_a4cef515450f79794b217673872204e74} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit52@{bit52}} +\Hypertarget{unionuint64___bit_type_def_a4cef515450f79794b217673872204e74}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit52@{bit52}} \index{bit52@{bit52}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit52}{bit52}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit52} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a4cef515450f79794b217673872204e74} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit52} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00115}{115}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_af6b445f558b5c1e6ea2f47b7fb8d82ba}\label{unionuint64___bit_type_def_af6b445f558b5c1e6ea2f47b7fb8d82ba} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit53@{bit53}} +\Hypertarget{unionuint64___bit_type_def_af6b445f558b5c1e6ea2f47b7fb8d82ba}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit53@{bit53}} \index{bit53@{bit53}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit53}{bit53}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit53} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_af6b445f558b5c1e6ea2f47b7fb8d82ba} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit53} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00115}{115}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_ae133f0a428da163fe266a4ef11f7b772}\label{unionuint64___bit_type_def_ae133f0a428da163fe266a4ef11f7b772} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit54@{bit54}} +\Hypertarget{unionuint64___bit_type_def_ae133f0a428da163fe266a4ef11f7b772}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit54@{bit54}} \index{bit54@{bit54}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit54}{bit54}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit54} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_ae133f0a428da163fe266a4ef11f7b772} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit54} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00115}{115}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a7cac784c45e82916a2dc3d98728e6d51}\label{unionuint64___bit_type_def_a7cac784c45e82916a2dc3d98728e6d51} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit55@{bit55}} +\Hypertarget{unionuint64___bit_type_def_a7cac784c45e82916a2dc3d98728e6d51}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit55@{bit55}} \index{bit55@{bit55}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit55}{bit55}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit55} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a7cac784c45e82916a2dc3d98728e6d51} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit55} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00115}{115}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a0b592c9e73b61ee134b894e4c57baaa1}\label{unionuint64___bit_type_def_a0b592c9e73b61ee134b894e4c57baaa1} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit56@{bit56}} +\Hypertarget{unionuint64___bit_type_def_a0b592c9e73b61ee134b894e4c57baaa1}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit56@{bit56}} \index{bit56@{bit56}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit56}{bit56}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit56} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a0b592c9e73b61ee134b894e4c57baaa1} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit56} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00116}{116}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a7fad0ef8a3759fb94623f797dc0a28cd}\label{unionuint64___bit_type_def_a7fad0ef8a3759fb94623f797dc0a28cd} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit57@{bit57}} +\Hypertarget{unionuint64___bit_type_def_a7fad0ef8a3759fb94623f797dc0a28cd}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit57@{bit57}} \index{bit57@{bit57}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit57}{bit57}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit57} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a7fad0ef8a3759fb94623f797dc0a28cd} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit57} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00116}{116}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_adf6d53faede2611a9cfd87c96887f785}\label{unionuint64___bit_type_def_adf6d53faede2611a9cfd87c96887f785} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit58@{bit58}} +\Hypertarget{unionuint64___bit_type_def_adf6d53faede2611a9cfd87c96887f785}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit58@{bit58}} \index{bit58@{bit58}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit58}{bit58}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit58} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_adf6d53faede2611a9cfd87c96887f785} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit58} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00116}{116}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_aed5c6e4bf5e5d5062d4619165f53e21e}\label{unionuint64___bit_type_def_aed5c6e4bf5e5d5062d4619165f53e21e} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit59@{bit59}} +\Hypertarget{unionuint64___bit_type_def_aed5c6e4bf5e5d5062d4619165f53e21e}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit59@{bit59}} \index{bit59@{bit59}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit59}{bit59}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit59} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_aed5c6e4bf5e5d5062d4619165f53e21e} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit59} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00116}{116}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_ac32cd60facac9c1ab19d47c29324525e}\label{unionuint64___bit_type_def_ac32cd60facac9c1ab19d47c29324525e} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit60@{bit60}} +\Hypertarget{unionuint64___bit_type_def_ac32cd60facac9c1ab19d47c29324525e}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit60@{bit60}} \index{bit60@{bit60}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit60}{bit60}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit60} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_ac32cd60facac9c1ab19d47c29324525e} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit60} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00117}{117}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_ace649ce26ab7885f2d988d9842c72466}\label{unionuint64___bit_type_def_ace649ce26ab7885f2d988d9842c72466} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit61@{bit61}} +\Hypertarget{unionuint64___bit_type_def_ace649ce26ab7885f2d988d9842c72466}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit61@{bit61}} \index{bit61@{bit61}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit61}{bit61}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit61} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_ace649ce26ab7885f2d988d9842c72466} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit61} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00117}{117}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_a95f5a66dae374905c9e4c6779451c96e}\label{unionuint64___bit_type_def_a95f5a66dae374905c9e4c6779451c96e} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit62@{bit62}} +\Hypertarget{unionuint64___bit_type_def_a95f5a66dae374905c9e4c6779451c96e}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit62@{bit62}} \index{bit62@{bit62}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit62}{bit62}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit62} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_a95f5a66dae374905c9e4c6779451c96e} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit62} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00117}{117}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint64___bit_type_def_ad61034647ebdb14089dbcb9cc9cd0f51}\label{unionuint64___bit_type_def_ad61034647ebdb14089dbcb9cc9cd0f51} -\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit63@{bit63}} +\Hypertarget{unionuint64___bit_type_def_ad61034647ebdb14089dbcb9cc9cd0f51}\index{uint64\_BitTypeDef@{uint64\_BitTypeDef}!bit63@{bit63}} \index{bit63@{bit63}!uint64\_BitTypeDef@{uint64\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit63}{bit63}} -{\footnotesize\ttfamily unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit63} +{\footnotesize\ttfamily \label{unionuint64___bit_type_def_ad61034647ebdb14089dbcb9cc9cd0f51} +unsigned uint64\+\_\+\+Bit\+Type\+Def\+::bit63} @@ -740,4 +742,4 @@ Definition at line \mbox{\hyperlink{bit__access_8h_source_l00117}{117}} of file The documentation for this union was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{bit__access_8h}{bit\+\_\+access.\+h}}\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{bit__access_8h}{bit\+\_\+access.\+h}}\end{DoxyCompactItemize} diff --git a/Doc/latex/unionuint8___bit_type_def.tex b/Doc/latex/unionuint8___bit_type_def.tex index 34f9424..d369e58 100644 --- a/Doc/latex/unionuint8___bit_type_def.tex +++ b/Doc/latex/unionuint8___bit_type_def.tex @@ -5,7 +5,7 @@ \item uint8\+\_\+t \mbox{\hyperlink{unionuint8___bit_type_def_aacf75bef7d0b9ed458e03a4278f5fe88}{all}} \item -\Hypertarget{unionuint8___bit_type_def_a06339e6cbac8350c26b153d573e9c1df}\label{unionuint8___bit_type_def_a06339e6cbac8350c26b153d573e9c1df} +\Hypertarget{unionuint8___bit_type_def_aebe07b71261a8c24d23c63637d506f91}\label{unionuint8___bit_type_def_aebe07b71261a8c24d23c63637d506f91} \begin{tabbing} xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=xx\=\kill struct \{\\ @@ -29,92 +29,94 @@ Definition at line \mbox{\hyperlink{bit__access_8h_source_l00039}{39}} of file \ +\label{doc-variable-members} +\Hypertarget{unionuint8___bit_type_def_doc-variable-members} \doxysubsection{Member Data Documentation} -\Hypertarget{unionuint8___bit_type_def_aacf75bef7d0b9ed458e03a4278f5fe88}\label{unionuint8___bit_type_def_aacf75bef7d0b9ed458e03a4278f5fe88} -\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!all@{all}} +\Hypertarget{unionuint8___bit_type_def_aacf75bef7d0b9ed458e03a4278f5fe88}\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!all@{all}} \index{all@{all}!uint8\_BitTypeDef@{uint8\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{all}{all}} -{\footnotesize\ttfamily uint8\+\_\+t uint8\+\_\+\+Bit\+Type\+Def\+::all} +{\footnotesize\ttfamily \label{unionuint8___bit_type_def_aacf75bef7d0b9ed458e03a4278f5fe88} +uint8\+\_\+t uint8\+\_\+\+Bit\+Type\+Def\+::all} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00041}{41}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint8___bit_type_def_a3748bf8d6ebfdce0895b1f4e704746d9}\label{unionuint8___bit_type_def_a3748bf8d6ebfdce0895b1f4e704746d9} -\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit0@{bit0}} +\Hypertarget{unionuint8___bit_type_def_a3748bf8d6ebfdce0895b1f4e704746d9}\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit0@{bit0}} \index{bit0@{bit0}!uint8\_BitTypeDef@{uint8\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit0}{bit0}} -{\footnotesize\ttfamily unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit0} +{\footnotesize\ttfamily \label{unionuint8___bit_type_def_a3748bf8d6ebfdce0895b1f4e704746d9} +unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit0} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00044}{44}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint8___bit_type_def_a8794ff2357a3b7d52e7afa3b5a7de99a}\label{unionuint8___bit_type_def_a8794ff2357a3b7d52e7afa3b5a7de99a} -\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit1@{bit1}} +\Hypertarget{unionuint8___bit_type_def_a8794ff2357a3b7d52e7afa3b5a7de99a}\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit1@{bit1}} \index{bit1@{bit1}!uint8\_BitTypeDef@{uint8\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit1}{bit1}} -{\footnotesize\ttfamily unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit1} +{\footnotesize\ttfamily \label{unionuint8___bit_type_def_a8794ff2357a3b7d52e7afa3b5a7de99a} +unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit1} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00045}{45}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint8___bit_type_def_a892712177c44aabdc16d3241dfc99db9}\label{unionuint8___bit_type_def_a892712177c44aabdc16d3241dfc99db9} -\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit2@{bit2}} +\Hypertarget{unionuint8___bit_type_def_a892712177c44aabdc16d3241dfc99db9}\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit2@{bit2}} \index{bit2@{bit2}!uint8\_BitTypeDef@{uint8\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit2}{bit2}} -{\footnotesize\ttfamily unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit2} +{\footnotesize\ttfamily \label{unionuint8___bit_type_def_a892712177c44aabdc16d3241dfc99db9} +unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit2} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00046}{46}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint8___bit_type_def_a3c83a9aa064121feff3b6cb97c1dc543}\label{unionuint8___bit_type_def_a3c83a9aa064121feff3b6cb97c1dc543} -\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit3@{bit3}} +\Hypertarget{unionuint8___bit_type_def_a3c83a9aa064121feff3b6cb97c1dc543}\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit3@{bit3}} \index{bit3@{bit3}!uint8\_BitTypeDef@{uint8\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit3}{bit3}} -{\footnotesize\ttfamily unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit3} +{\footnotesize\ttfamily \label{unionuint8___bit_type_def_a3c83a9aa064121feff3b6cb97c1dc543} +unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit3} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00047}{47}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint8___bit_type_def_af5a2b4b6c4e408d985671b2543eee037}\label{unionuint8___bit_type_def_af5a2b4b6c4e408d985671b2543eee037} -\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit4@{bit4}} +\Hypertarget{unionuint8___bit_type_def_af5a2b4b6c4e408d985671b2543eee037}\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit4@{bit4}} \index{bit4@{bit4}!uint8\_BitTypeDef@{uint8\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit4}{bit4}} -{\footnotesize\ttfamily unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit4} +{\footnotesize\ttfamily \label{unionuint8___bit_type_def_af5a2b4b6c4e408d985671b2543eee037} +unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit4} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00048}{48}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint8___bit_type_def_abbbf81339876997dded91b86237eba01}\label{unionuint8___bit_type_def_abbbf81339876997dded91b86237eba01} -\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit5@{bit5}} +\Hypertarget{unionuint8___bit_type_def_abbbf81339876997dded91b86237eba01}\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit5@{bit5}} \index{bit5@{bit5}!uint8\_BitTypeDef@{uint8\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit5}{bit5}} -{\footnotesize\ttfamily unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit5} +{\footnotesize\ttfamily \label{unionuint8___bit_type_def_abbbf81339876997dded91b86237eba01} +unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit5} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00049}{49}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint8___bit_type_def_afba4a1642a44bd86c9535a32ccf54004}\label{unionuint8___bit_type_def_afba4a1642a44bd86c9535a32ccf54004} -\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit6@{bit6}} +\Hypertarget{unionuint8___bit_type_def_afba4a1642a44bd86c9535a32ccf54004}\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit6@{bit6}} \index{bit6@{bit6}!uint8\_BitTypeDef@{uint8\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit6}{bit6}} -{\footnotesize\ttfamily unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit6} +{\footnotesize\ttfamily \label{unionuint8___bit_type_def_afba4a1642a44bd86c9535a32ccf54004} +unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit6} Definition at line \mbox{\hyperlink{bit__access_8h_source_l00050}{50}} of file \mbox{\hyperlink{bit__access_8h_source}{bit\+\_\+access.\+h}}. -\Hypertarget{unionuint8___bit_type_def_ad1ca71ae4b18042a6c305cd84b749810}\label{unionuint8___bit_type_def_ad1ca71ae4b18042a6c305cd84b749810} -\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit7@{bit7}} +\Hypertarget{unionuint8___bit_type_def_ad1ca71ae4b18042a6c305cd84b749810}\index{uint8\_BitTypeDef@{uint8\_BitTypeDef}!bit7@{bit7}} \index{bit7@{bit7}!uint8\_BitTypeDef@{uint8\_BitTypeDef}} \doxysubsubsection{\texorpdfstring{bit7}{bit7}} -{\footnotesize\ttfamily unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit7} +{\footnotesize\ttfamily \label{unionuint8___bit_type_def_ad1ca71ae4b18042a6c305cd84b749810} +unsigned uint8\+\_\+\+Bit\+Type\+Def\+::bit7} @@ -124,4 +126,4 @@ Definition at line \mbox{\hyperlink{bit__access_8h_source_l00051}{51}} of file \ The documentation for this union was generated from the following file\+:\begin{DoxyCompactItemize} \item -F\+:/\+Work/\+Projects/\+STM/.\+Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{bit__access_8h}{bit\+\_\+access.\+h}}\end{DoxyCompactItemize} +E\+:/.\+WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/\mbox{\hyperlink{bit__access_8h}{bit\+\_\+access.\+h}}\end{DoxyCompactItemize} diff --git a/MyLibsGeneral/Inc/__general_flash.h b/MyLibsGeneral/Inc/__general_flash.h new file mode 100644 index 0000000..9a532e5 --- /dev/null +++ b/MyLibsGeneral/Inc/__general_flash.h @@ -0,0 +1,44 @@ +/************************************************************************** +* @file general_flash.h +* @brief Заголовочны файл модуля работы с FLASH. +*************************************************************************/ +#ifndef __FLASH_GENERAL_H_ +#define __FLASH_GENERAL_H_ + +////////////////////////////////////////////////////////////////////// +/////////////////////////---USER SETTINGS---///////////////////////// + + +/////////////////////////---USER SETTINGS---///////////////////////// +#include "mylibs_defs.h" + + + +///////////////////////////////////////////////////////////////////// +////////////////////////////---DEFINES---//////////////////////////// + +////////////////////////////---DEFINES---//////////////////////////// + + +///////////////////////////////////////////////////////////////////// +///////////////////////---STRUCTURES & ENUMS---////////////////////// + +///////////////////////---STRUCTURES & ENUMS---////////////////////// + + +///////////////////////////////////////////////////////////////////// +///////////////////////////---FUNCTIONS---/////////////////////////// + +HAL_StatusTypeDef FLASH_Enable_DualBankMode(void); +HAL_StatusTypeDef FLASH_WriteProtection(uint32_t BankN, uint32_t WriteProtection); +/* functions for reading bytes/halswords/words */ +uint8_t FLASH_Read_Byte(uint32_t add); +uint16_t FLASH_Read_HalfWord(uint32_t add); +uint32_t FLASH_Read_Word(uint32_t add); +/* functions for writing bytes/halswords/words */ +HAL_StatusTypeDef FLASH_Write_Byte(uint32_t Address, uint8_t Data); +HAL_StatusTypeDef FLASH_Write_HalfWord(uint32_t Address, uint16_t Data); +HAL_StatusTypeDef FLASH_Write_Word(uint32_t Address, uint32_t Data); +///////////////////////////---FUNCTIONS---/////////////////////////// + +#endif // __FLASH_GENERAL_H_ \ No newline at end of file diff --git a/MyLibsGeneral/Inc/bit_access.h b/MyLibsGeneral/Inc/bit_access.h new file mode 100644 index 0000000..fe824cd --- /dev/null +++ b/MyLibsGeneral/Inc/bit_access.h @@ -0,0 +1,159 @@ +/** +************************************************************************** +* @file bit_access.h +* @brief Заголочный файл для дефайнов битового доступа. +************************************************************************** +* @defgroup BIT_ACCESS_DEFINES Bit access defines +* @ingroup MYLIBS_DEFINES +* @brief Макросы и typedef'ы для работы с битами в unsigned типах. +* @details +В этом файле определены макросы для получения значения конкретного бита^ +- @ref uint8_bit +- @ref uint16_bit +- @ref uint32_bit +- @ref uint64_bit + +Особенности использования: +- Индекс бита должен быть **константой на этапе компиляции**. + Пример верного использования: + @code + uint8_t val = 0x05; + uint8_t b2 = uint8_bit(val, 2); // Получить бит 2 + uint8_bit(val, 6) = 1; // Записать бит 6 + @endcode +- Нельзя использовать переменные в качестве индекса: + @code + uint8_t i = 2; + uint8_bit(val, i); // Не сработает! + @endcode +- Макросы возвращают 0 или 1. +- Доступ реализован через приведение к `union` с битовыми полями, поэтому это + безопасный способ работы с отдельными битами без ручного сдвига и маскирования. +* @{ +*************************************************************************/ +#ifndef __BIT_ACCESS_H_ +#define __BIT_ACCESS_H_ +#include "mylibs_defs.h" + + +typedef union +{ + uint8_t all; + struct + { + unsigned bit0:1; + unsigned bit1:1; + unsigned bit2:1; + unsigned bit3:1; + unsigned bit4:1; + unsigned bit5:1; + unsigned bit6:1; + unsigned bit7:1; + }bit; +}uint8_BitTypeDef; + +typedef union +{ + uint16_t all; + struct + { + unsigned bit0:1; + unsigned bit1:1; + unsigned bit2:1; + unsigned bit3:1; + unsigned bit4:1; + unsigned bit5:1; + unsigned bit6:1; + unsigned bit7:1; + unsigned bit8:1; + unsigned bit9:1; + unsigned bit10:1; + unsigned bit11:1; + unsigned bit12:1; + unsigned bit13:1; + unsigned bit14:1; + unsigned bit15:1; + }bit; +}uint16_BitTypeDef; + + +typedef union +{ + uint32_t all; + struct + { + unsigned bit0:1; unsigned bit1:1; unsigned bit2:1; unsigned bit3:1; + unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1; + unsigned bit8:1; unsigned bit9:1; unsigned bit10:1; unsigned bit11:1; + unsigned bit12:1; unsigned bit13:1; unsigned bit14:1; unsigned bit15:1; + unsigned bit16:1; unsigned bit17:1; unsigned bit18:1; unsigned bit19:1; + unsigned bit20:1; unsigned bit21:1; unsigned bit22:1; unsigned bit23:1; + unsigned bit24:1; unsigned bit25:1; unsigned bit26:1; unsigned bit27:1; + unsigned bit28:1; unsigned bit29:1; unsigned bit30:1; unsigned bit31:1; + }bit; +}uint32_BitTypeDef; + + +typedef union +{ + uint64_t all; + struct + { + unsigned bit0:1; unsigned bit1:1; unsigned bit2:1; unsigned bit3:1; + unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1; + unsigned bit8:1; unsigned bit9:1; unsigned bit10:1; unsigned bit11:1; + unsigned bit12:1; unsigned bit13:1; unsigned bit14:1; unsigned bit15:1; + unsigned bit16:1; unsigned bit17:1; unsigned bit18:1; unsigned bit19:1; + unsigned bit20:1; unsigned bit21:1; unsigned bit22:1; unsigned bit23:1; + unsigned bit24:1; unsigned bit25:1; unsigned bit26:1; unsigned bit27:1; + unsigned bit28:1; unsigned bit29:1; unsigned bit30:1; unsigned bit31:1; + unsigned bit32:1; unsigned bit33:1; unsigned bit34:1; unsigned bit35:1; + unsigned bit36:1; unsigned bit37:1; unsigned bit38:1; unsigned bit39:1; + unsigned bit40:1; unsigned bit41:1; unsigned bit42:1; unsigned bit43:1; + unsigned bit44:1; unsigned bit45:1; unsigned bit46:1; unsigned bit47:1; + unsigned bit48:1; unsigned bit49:1; unsigned bit50:1; unsigned bit51:1; + unsigned bit52:1; unsigned bit53:1; unsigned bit54:1; unsigned bit55:1; + unsigned bit56:1; unsigned bit57:1; unsigned bit58:1; unsigned bit59:1; + unsigned bit60:1; unsigned bit61:1; unsigned bit62:1; unsigned bit63:1; + }bit; +}uint64_BitTypeDef; + + +/** + * @brief Получить n-й бит из uint8_t + * @param _uint8_ Переменная типа uint8_t + * @param _bit_ Константный номер бита (0..7) + * @return Значение выбранного бита (0 или 1) + * @note Индекс бита должен быть известен на этапе компиляции! + */ +#define uint8_bit(_uint8_, _bit_) (*(uint8_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_ +/** + * @brief Получить n-й бит из uint16_t + * @param _uint16_ Переменная типа uint16_t + * @param _bit_ Константный номер бита (0..15) + * @return Значение выбранного бита (0 или 1) + * @note Индекс бита должен быть известен на этапе компиляции! + */ +#define uint16_bit(_uint8_, _bit_) (*(uint16_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_ +/** + * @brief Получить n-й бит из uint32_t + * @param _uint32_ Переменная типа uint32_t + * @param _bit_ Константный номер бита (0..31) + * @return Значение выбранного бита (0 или 1) + * @note Индекс бита должен быть известен на этапе компиляции! + */ +#define uint32_bit(_uint8_, _bit_) (*(uint32_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_ +/** + * @brief Получить n-й бит из uint64_t + * @param _uint64_ Переменная типа uint64_t + * @param _bit_ Константный номер бита (0..63) + * @return Значение выбранного бита (0 или 1) + * @note Индекс бита должен быть известен на этапе компиляции! + */ +#define uint64_bit(_uint8_, _bit_) (*(uint64_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_ + +#endif //__BIT_ACCESS_H_ + +/** BIT_ACCESS_DEFINES + * @} + */ \ No newline at end of file diff --git a/MyLibsGeneral/Inc/evolve_optimizer.h b/MyLibsGeneral/Inc/evolve_optimizer.h new file mode 100644 index 0000000..7d4de0f --- /dev/null +++ b/MyLibsGeneral/Inc/evolve_optimizer.h @@ -0,0 +1,338 @@ +/** +****************************************************************************** +* @file evolve_optimizer.h +* @brief Заголовочный файл для адаптивного подбора параметров +****************************************************************************** +* @addtogroup EVOLVE_OPTIMIZER Evolve optimizer +* @ingroup MYLIBS_DEFINES +* @brief Библиотека для эволюционного подбора параметров +* @details +Поддерживает: +- Любое количество параметров +- Генерацию новых параметров на основе лучших кандидатов +- Мутацию для поиска оптимальных параметров +- Несколько независимых оптимизаторов в одной программе + + +Параметры для конфигурации: +- @ref ENABLE_EVOLVE_OPTIMIZATION - Включить оптимизацию параметров + Если библиотека отключена @ref ENABLE_EVOLVE_OPTIMIZATION, то вставляются + заглушки, никак не влияющие на параметры и остальную программу +- @ref EVOLVE_MAX_PARAMS - Максимальное количество параметров +- @ref EVOLVE_MAX_CANDIDATES - Максимальное количество кандидатов для обучения +- (опционально) @ref EVOLVE_MUTATION_MIN_PCT - Минимальная мутация в процентах от Loss (по умолчанию 10%) +- (опционально) @ref EVOLVE_MUTATION_MAX_PCT - Максимальная мутация в процентах от Loss (по умолчанию 100%) +- (опционально) @ref ELOVLE_N_ELITE_CANDIDATE - Количество кандидатов, которые проходят в поколение без изменений + +@par Пример использования: +@code +#include "evolve_optimizer.h" +#define N_PARAMS 4 +#define N_CANDIDATES 100 +#define N_BEST 10 +#define MUTATION 0.1f +float params[N_PARAMS]; +EvolveOptimizer_t optimizer; + +// Формирование параметров +uint16_t param_u16 = 800; +float param_f = 0.01f; +uint8_t param_u8 = 40; +int16_t param_i16 = 1600; +params[0] = PARAM_SCALE(param_u16, 0.0f, 1000.0f); +params[1] = PARAM_SCALE(param_f, 0.001f, 0.1f); +params[2] = PARAM_SCALE(param_u8, 10.0f, 100.0f); +params[3] = PARAM_SCALE(param_i16, 500.0f, 5000.0f); + +// Инициалиазция +EvolveOptimizer_Init(&optimizer, N_PARAMS, N_CANDIDATES, N_BEST, MUTATION, params); + +// Шаг эволюции +float loss = calc_loss(); // расчет эффективности параметров (от 0 до 1) +EvolveOptimizer_Step(&optimizer, params, loss); + +// Взятие следующих для эволюции параметров +param_u16 = PARAM_UNSCALE(params[0], 0.0f, 1000.0f); +param_f = PARAM_UNSCALE(params[1], 0.001f, 0.1f); +param_u8 = PARAM_UNSCALE(params[2], 10.0f, 100.0f); +param_i16 = PARAM_UNSCALE(params[3], 500.0f, 5000.0f); +@endcode +* @{ +*****************************************************************************/ +#ifndef __EVOLVE_OPTIMIZER_H_ +#define __EVOLVE_OPTIMIZER_H_ + +#include "mylibs_defs.h" +#include +#include + +#ifdef ENABLE_EVOLVE_OPTIMIZATION +/** + * @brief Линейное масштабирование x из диапазона [min_val, max_val] в диапазон [0, 1) + */ +#define PARAM_SCALE(x, min_val, max_val) \ +(((float)(x) - (float)(min_val)) / ((float)(max_val) - (float)(min_val))) + +/** + * @brief Обратное линейное масштабирование значения из [0, 1) в диапазон [min_val, max_val] + */ +#define PARAM_UNSCALE(val, min_val, max_val) \ +(((float)(val)) * ((float)(max_val) - (float)(min_val)) + (float)(min_val)) + +#ifndef local_time +#define local_time() HAL_GetTick() ///< Локальное время +#endif + + + +#ifndef EVOLVE_MUTATION_MIN_PCT +#define EVOLVE_MUTATION_MIN_PCT 10 ///< Минимальная мутация (в процентах от Loss) +#endif +#ifndef EVOLVE_MUTATION_MAX_PCT +#define EVOLVE_MUTATION_MAX_PCT 100 ///< Максимальная мутация (в процентах от Loss) +#endif +#ifndef ELOVLE_N_ELITE_CANDIDATE +#define ELOVLE_N_ELITE_CANDIDATE 2 ///< Количество кандидатов, которые проходят в поколение без изменений (по умолчанию 2) +#endif + + +/** + * @brief Структура эволюционного оптимизатора + */ +typedef struct { + float stability; ///< Коэффициент насколько стабильная популяция (0..1)(@ref n_cand) + + uint16_t n_params; ///< Количество параметров + uint16_t n_cand; ///< Количество кандидатов в популяции + uint16_t n_best; ///< Количество лучших, усредняемых + float mutation_amp; ///< Амплитуда мутации (0..1) + + uint16_t cand_index; ///< Индекс кандидата для обработки + uint16_t gen_index; ///< Индекс популяции + + //INTERNAL + float gen_mut; ///< Амплитуда мутации у текущей популяции + + float loss[EVOLVE_MAX_CANDIDATES]; ///< Loss для каждого кандидата + float candidates[EVOLVE_MAX_CANDIDATES][EVOLVE_MAX_PARAMS]; ///< Параметры кандидатов + uint16_t sorted_idx[EVOLVE_MAX_CANDIDATES]; ///< Индексы отсортированных кандидатов +} EvolveOptimizer_t; + + + +/** + * @cond EVOLVE_INTERNAL + */ + +// Вспомогательный указатель для сортировки +static EvolveOptimizer_t *g_sort_opt; // глобальный указатель на текущий оптимизатор + +// функция условия сортировки +static int cmp_idx(const void *a, const void *b) { + if (g_sort_opt->loss[*(const uint16_t*)a] < g_sort_opt->loss[*(const uint16_t*)b]) + return -1; + if (g_sort_opt->loss[*(const uint16_t*)a] > g_sort_opt->loss[*(const uint16_t*)b]) + return 1; + return 0; +} +/** @endcond */ + + + + + +/** + * @brief Инициализация эволюционного оптимизатора. + * @param opt Указатель на структуру оптимизатора + * @param n_params Количество параметров в одном кандидате + * @param n_cand Количество кандидатов + * @param n_best Количество лучших, усредняемых + * @param mutation_amp Амплитуда мутации (в диапазоне 0.0–1.0) + * @param start_params Начальные параметры (в диапазоне 0.0–1.0) + * @return 0 — если окей, + * -1 — если ошибка + */ +__STATIC_INLINE int EvolveOptimizer_Init(EvolveOptimizer_t* opt, + uint16_t n_params, + uint16_t n_cand, + uint16_t n_best, + float mutation_amp, + float* start_params) +{ + if((opt == NULL) || (start_params == NULL)) + return -1; + + if(n_params > EVOLVE_MAX_PARAMS) + return -1; + opt->n_params = n_params; + + if(n_cand > EVOLVE_MAX_CANDIDATES) + return -1; + opt->n_cand = n_cand; + + if(n_best > EVOLVE_MAX_CANDIDATES/2) + return -1; + opt->n_best = n_best; + + + if((mutation_amp > 1) || (mutation_amp < 0)) + return -1; + if(mutation_amp <= 0.001f) + mutation_amp = 0.001f; + opt->mutation_amp = mutation_amp; + + uint32_t seed = local_time(); +#ifdef ADC1 + seed += (ADC1->DR & 0xFF); +#endif + srand(seed); + + for (uint16_t i = 0; i < n_cand; i++) { + for (uint16_t j = 0; j < n_params; j++) { + // Добавляем случайную мутацию вокруг стартового параметра + float base = start_params[j]; + float inv_randmax = 1.0f / (float)RAND_MAX; + float noise = ((float)rand() * inv_randmax * 2.0f - 1.0f) * mutation_amp; + opt->candidates[i][j] = base + noise; + if (opt->candidates[i][j] < 0.0f) opt->candidates[i][j] = 0.0f; + if (opt->candidates[i][j] > 1.0f) opt->candidates[i][j] = 1.0f; + } + opt->loss[i] = 0.0f; + } + + opt->cand_index = 0; + opt->gen_index = 0; + return 0; +} + + +/** + * @brief Один шаг эволюционного оптимизатора. + * @param opt Указатель на структуру оптимизатора + * @param params Массив параметров, которые будут обновлены (на выходе — новые параметры) + * @param loss Loss текущего кандидата + * @return 0 — если окей, + * -1 — если ошибка + * @details + * Сохраняет loss текущего кандидата и формирует параметры следующего кандидата. + * Если накоплено n_cand кандидатов, генерируется новое поколение. + * Новое поколение формируется случайным выбором из n_best лучших с добавлением мутации. + * + * На выходе params содержит параметры следующего кандидата для измерений. + * @note Функция использует глобальную внутреннюю переменную для сортировки. + * Надо убедится что только один экземпляр функции запущен в момент времени + */ +__STATIC_INLINE int EvolveOptimizer_Step(EvolveOptimizer_t* opt, + float* params, + float loss) +{ + if((opt == NULL) || (params == NULL)) + return -1; + + uint16_t n_params = opt->n_params; + if(n_params > EVOLVE_MAX_PARAMS) + return -1; + + uint16_t n_cand = opt->n_cand; + if(n_cand > EVOLVE_MAX_CANDIDATES) + return -1; + + uint16_t n_best = opt->n_best; + if(n_best > EVOLVE_MAX_CANDIDATES/2) + return -1; + + float mut = opt->mutation_amp; + if((mut > 1) ||(mut < 0)) + return -1; + + // 1. Сохраняем loss текущего кандидата + opt->loss[opt->cand_index] = loss; + opt->cand_index++; + + if (opt->cand_index >= n_cand) { + // 2. Сортируем текущее поколение по loss + for(uint16_t i = 0; i < opt->n_cand; i++) + opt->sorted_idx[i] = i; + + g_sort_opt = opt; + qsort(opt->sorted_idx, opt->n_cand, sizeof(uint16_t), cmp_idx); + g_sort_opt = NULL; + + // --- Адаптивная мутация в зависимости от Loss --- + float best_loss = opt->loss[opt->sorted_idx[0]]; + float worst_loss = opt->loss[opt->sorted_idx[opt->n_cand - 1]]; + float diff = worst_loss - best_loss; + + float sum_loss = 0.0f; + for (uint16_t i = 0; i < n_cand; i++) + sum_loss += opt->loss[i]; + float avg_loss = sum_loss / (float)n_cand; + + + float loss_ratio = (diff > 0.0f) ? ((avg_loss - best_loss) / diff) : 0.5f; + if (loss_ratio < 0.0f) loss_ratio = 0.0f; + if (loss_ratio > 1.0f) loss_ratio = 1.0f; + + // Записываем стабильность популяции в структуру + if(diff < 0.0f) diff = 0.0f; + if(diff > 1.0f) diff = 1.0f; + opt->stability = (1.0f - worst_loss) * (1.0f - (worst_loss - best_loss)); + if(opt->stability < 0.0f) opt->stability = 0.0f; + if(opt->stability > 1.0f) opt->stability = 1.0f; + + float mut_pct = EVOLVE_MUTATION_MIN_PCT + + (EVOLVE_MUTATION_MAX_PCT - EVOLVE_MUTATION_MIN_PCT) * loss_ratio; + float adaptive_mut = mut * (mut_pct / 100.0f); + if (adaptive_mut < 0.0001f) adaptive_mut = 0.0001f; + opt->gen_mut = adaptive_mut; + + // 3. Генерируем новое поколение + uint16_t n_elite = ELOVLE_N_ELITE_CANDIDATE; + for (uint16_t c = 0; c < n_cand; c++) { + if (c < n_elite) { + for (uint16_t i = 0; i < n_params; i++) + opt->candidates[c][i] = opt->candidates[opt->sorted_idx[c]][i]; + opt->loss[c] = 0.0f; + } else { + for (uint16_t i = 0; i < n_params; i++) { + float inv_randmax = 1.0f / (float)RAND_MAX; + float noise = ((float)rand() * inv_randmax * 2.0f - 1.0f) * adaptive_mut; + uint16_t parent = opt->sorted_idx[rand() % opt->n_best]; + opt->candidates[c][i] = opt->candidates[parent][i] + noise; + if (opt->candidates[c][i] < 0.0f) opt->candidates[c][i] = 0.0f; + if (opt->candidates[c][i] > 1.0f) opt->candidates[c][i] = 1.0f; + } + opt->loss[c] = 0.0f; + } + } + opt->cand_index = 0; + opt->gen_index++; + } + + // 4. Возвращаем параметры следующего кандидата + for (uint16_t i = 0; i < opt->n_params; i++) + params[i] = opt->candidates[opt->cand_index][i]; + + return 0; +} +#else // ENABLE_EVOLVE_OPTIMIZATION +//заглушки +typedef struct { + uint16_t n_params; + uint16_t n_cand; + uint16_t n_best; + float mutation_amp; + float loss[0]; + float candidates[0][0]; +} EvolveOptimizer_t; +#define EvolveOptimizer_Init(opt, n_params, n_cand, n_best, mutation_amp, start_params) +#define EvolveOptimizer_Step(opt, params, LossFunc) +#define PARAM_SCALE(x, min_val, max_val) (x) +#define PARAM_UNSCALE(val, min_val, max_val) (val) +#endif // ENABLE_EVOLVE_OPTIMIZATION + +#endif // __EVOLVE_OPTIMIZER_H_ + +/** EVOLVE_OPTIMIZER + * @} + */ diff --git a/MyLibsGeneral/Inc/general_gpio.h b/MyLibsGeneral/Inc/general_gpio.h new file mode 100644 index 0000000..218a6bf --- /dev/null +++ b/MyLibsGeneral/Inc/general_gpio.h @@ -0,0 +1,237 @@ +/** +************************************************************************** +* @file general_gpio.h +* @brief Заголовочный файл для модуля инициализации портов и работы с ними. +************************************************************************** +* @defgroup MY_LIBS_GPIO GPIO Tools +* @ingroup MYLIBS_PERIPHERAL +* @brief Функции и макросы для удобной работы с GPIO. +* @details +Модуль предоставляет универсальные инструменты для работы с GPIO): + - @ref MYLIBS_GPIO_GENERAL — инициализация и общие функции работы с портами. + - @ref MYLIBS_GPIO_SWITCH — работа с GPIO как с кнопкой: чтение состояния, + фильтрация дребезга, настройка активного уровня. + - @ref MYLIBS_GPIO_LEDS — работа с GPIO как со светодиодом: включение, + выключение, моргание и плавное затухание. + +*************************************************************************/ +#ifndef __GPIO_GENERAL_H_ +#define __GPIO_GENERAL_H_ + +#include "mylibs_defs.h" + +/** + * @addtogroup GPIO_INIT Init defines + * @ingroup MYLIBS_GPIO_GENERAL + * @brief Настройка состояний кнопок и количества тиков в периоде ШИМ + * @{ + */ + +#ifndef local_time +#define local_time() HAL_GetTick() ///< Локальное время +#endif + +#ifndef LED_PWM_TICKS +#define LED_PWM_TICKS 15 ///< Количество тиков в периоде ШИМ +#endif + +#ifndef LED_ON +#define LED_ON 1 ///< Состояние пина для включения светодиода +#endif +#ifndef LED_OFF +#define LED_OFF 0 ///< Состояние пина для выключения светодиода +#endif + +#ifndef SW_ON +#define SW_ON 1 ///< Состояние пина при нажатой кнопке +#endif +#ifndef SW_OFF +#define SW_OFF 0 ///< Состояние пина при отжатой кнопке +#endif + +/** GPIO_INIT + * @} + */ + + +/** + * @brief Режимы работы светодиода + * @ingroup MYLIBS_GPIO_LEDS + */ +typedef enum +{ + LED_IS_OFF = 0, ///< Светодиод выключен + LED_IS_ON = 1, ///< Светодиод включен + LED_IS_BLINKING = 2, ///< Моргание светодиодом + LED_IS_FADING = 3, ///< Плавное моргание светодиодом +}GPIO_LEDStateTypeDef; + +/** + * @brief Структура светодиода + * @ingroup MYLIBS_GPIO_LEDS + */ +typedef struct +{ + GPIO_LEDStateTypeDef state; ///< Текущий режим работы светодиода + + GPIO_TypeDef *LED_Port; ///< GPIO порт ножки светодиода + uint32_t LED_Pin; ///< GPIO пин ножки светодиода + + uint8_t LED_ActiveLvl; ///< Активный уровень ножки (при котором светодиод горит) + uint32_t LED_Period; ///< Период моргания светодиода + + uint32_t tickprev; +}GPIO_LEDTypeDef; + +/** + * @brief Структура кнопки + * @ingroup MYLIBS_GPIO_SWITCH + */ +typedef struct +{ + GPIO_TypeDef *Sw_Port; ///< GPIO порт ножки кнопки + uint32_t Sw_Pin; ///< GPIO пин ножки кнопки + + uint8_t Sw_ActiveLvl; ///< Активный уровень ножки (при котором кнопка нажата) + uint32_t Sw_PrevState; ///< Предыдущее состояние кнопки + uint32_t Sw_FilterDelay; ///< Фильтр от дребезга (в мс) + + uint32_t tickprev; +}GPIO_SwitchTypeDef; + + +///////////////////////////////////////////////////////////////////// +///////////////////////////---FUNCTIONS---/////////////////////////// +/** + * @addtogroup MYLIBS_GPIO_GENERAL General tools + * @ingroup MY_LIBS_GPIO + * @brief Общие функции/макросы для работы с GPIO + * @par Пример использования: + @code + // Включаем тактирование порта GPIOA + GPIO_Clock_Enable(GPIOA); + @endcode + * @{ + */ + +HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx); + +/** MYLIBS_GPIO_GENERAL + * @} + */ + +/** + * @addtogroup MYLIBS_GPIO_SWITCH Switch tools + * @ingroup MY_LIBS_GPIO + * @brief Функции для работы с GPIO, как с кнопкой + * @par Пример использования: + @code + MX_GPIO_Init(); // инициализация пина аппаратная + + // Инициализация кнопки на порте GPIOB, пин 0, активный уровень 1 + GPIO_SwitchTypeDef sw1; + GPIO_Switch_Init(&sw1, GPIOB, GPIO_PIN_0, 1); // или дефайн SW_ON/SW_OFF + + // Считываем состояние кнопки + if(GPIO_Read_Switch(&sw1)) + { + // Кнопка нажата + LED_ON(); + } + else + { + // Кнопка отжата + LED_OFF(); + } + @endcode + * @{ + */ + +/* Инициализировать кнопку (структуру кнопки) */ +HAL_StatusTypeDef GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_On_State); +/* Считать состоянии кнопки запуска */ +int GPIO_Read_Switch(GPIO_SwitchTypeDef *swstart); + +/** MYLIBS_GPIO_SWITCH + * @} + */ + + +/** + * @addtogroup MYLIBS_GPIO_LEDS LED tools + * @ingroup MY_LIBS_GPIO + * @brief Функции для работы с GPIO, для управления светодиодом + * @par Пример использования: + @code + MX_GPIO_Init(); // инициализация пина аппаратная + + // Инициализация светодиода на порте GPIOA, пин 5, активный уровень 0 + GPIO_LEDTypeDef led; + GPIO_LED_Init(&led, GPIOA, GPIO_PIN_5, 0); // или дефайн LED_ON/LED_OFF + + // Включение светодиода + GPIO_LED_On(&led); + + // Запуск моргания + GPIO_LED_Blink_Start(&led, 500); // Период 500 мс + + // В основном цикле + while (1) { + GPIO_LED_Dynamic_Handle(&led); + } + @endcode + * @{ + */ + +/* Инициализировать светодиод (структуру светодиода) */ +HAL_StatusTypeDef GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_On_State); +/* Включить светодиод */ +HAL_StatusTypeDef GPIO_LED_On (GPIO_LEDTypeDef *led); +/* Выключить светодиод */ +HAL_StatusTypeDef GPIO_LED_Off (GPIO_LEDTypeDef *led); +/* Выставить светодиод по переменной */ +HAL_StatusTypeDef GPIO_LED_Set (GPIO_LEDTypeDef *led, uint8_t led_state); +/* Активировать моргание светодиодом */ +HAL_StatusTypeDef GPIO_LED_Blink_Start (GPIO_LEDTypeDef *led, uint32_t period); +/* Активировать моргание светодиодом */ +HAL_StatusTypeDef GPIO_LED_Fading_Start(GPIO_LEDTypeDef *led, uint32_t period); +/* Управление динамическими режимами свечения светодиода */ +void GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led); + +/** MYLIBS_GPIO_LEDS + * @} + */ +///////////////////////////---FUNCTIONS---/////////////////////////// + + +/** + * @cond GPIO_INTERNAL + */ + +// /** +// * @brief Маппинг альтернативной функции SPI между GPIO +// * @ingroup MYLIBS_GPIO_GENERAL +// */ +// #define SPI_Alternate_Mapping(INSTANCE) \ +// ((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \ +// (((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \ +// (((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \ +// (((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \ +// (0)) + + +/** + * @brief Маппинг альтернативной функции TIM между GPIO + * @ingroup MYLIBS_GPIO_GENERAL + */ +#define GPIO_TIM_Alternate_Mapping(INSTANCE) \ +((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \ +(((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \ +(((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \ +(((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \ +(0)) + + +/** @endcond */ + +#endif // __GPIO_GENERAL_H_ \ No newline at end of file diff --git a/MyLibsGeneral/Inc/general_spi.h b/MyLibsGeneral/Inc/general_spi.h new file mode 100644 index 0000000..239db9d --- /dev/null +++ b/MyLibsGeneral/Inc/general_spi.h @@ -0,0 +1,170 @@ +/** +************************************************************************** +* @file general_spi.h +* @brief Заголовочный файл для модуля инициализации SPI. +************************************************************************** +* @defgroup MY_LIBS_SPI SPI Tools +* @ingroup MYLIBS_PERIPHERAL +* @brief Функции и макросы для удобной работы с SPI. +* @details +Модуль предоставляет функции для базовой инициализации SPI + + +@par Пример использования: +@code +// Структура настроек SPI +SPI_SettingsTypeDef spi1Settings; + +void SPI1_Init(void) +{ + // Настройка SPI1 как Master, 8 бит, полный дуплекс + spi1Settings.hspi.Instance = SPI1; + spi1Settings.hspi.Init.Mode = SPI_MODE_MASTER; + spi1Settings.hspi.Init.Direction = SPI_DIRECTION_2LINES; + spi1Settings.hspi.Init.DataSize = SPI_DATASIZE_8BIT; + spi1Settings.hspi.Init.CLKPolarity = SPI_POLARITY_LOW; + spi1Settings.hspi.Init.CLKPhase = SPI_PHASE_1EDGE; + spi1Settings.hspi.Init.NSS = SPI_NSS_SOFT; + spi1Settings.hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; + spi1Settings.hspi.Init.FirstBit = SPI_FIRSTBIT_MSB; + spi1Settings.hspi.Init.TIMode = SPI_TIMODE_DISABLE; + spi1Settings.hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + + // Настройка GPIO + spi1Settings.CLK_GPIOx = GPIOA; + spi1Settings.CLK_PIN = GPIO_PIN_5; + spi1Settings.CLK_GPIO_AlternageFunc = GPIO_AF5_SPI1; + + spi1Settings.MISO_GPIOx = GPIOA; + spi1Settings.MISO_PIN = GPIO_PIN_6; + spi1Settings.MISO_GPIO_AlternageFunc = GPIO_AF5_SPI1; + + spi1Settings.MOSI_GPIOx = GPIOA; + spi1Settings.MOSI_PIN = GPIO_PIN_7; + spi1Settings.MOSI_GPIO_AlternageFunc = GPIO_AF5_SPI1; + + // Инициализация SPI + if(SPI_Base_Init(&spi1Settings) != HAL_OK) + { + // Обработка ошибки + Error_Handler(); + } +} +@endcode + + + +* @note Требуется подключение модуля SPI в библиотеке HAL +@code +#define HAL_SPI_MODULE_ENABLED +@endcode +* @{ +*************************************************************************/ +#ifndef __SPI_GENERAL_H_ +#define __SPI_GENERAL_H_ + + +///////////////////////////////////////////////////////////////////// +/////////////////////////---USER SETTINGS---///////////////////////// +/** + * @addtogroup SPI_INIT Init defines + * @ingroup MY_LIBS_SPI + * @brief Настройка SPI + * @{ + */ +#define HAL_SPI_MODULE_ENABLED ///< Включение HAL SPI + +#define USE_SPI1 ///< Включить SPI1 в @ref SPI_MspInit +#define USE_SPI2 ///< Включить SPI2 в @ref SPI_MspInit +#define USE_SPI3 ///< Включить SPI3 в @ref SPI_MspInit +/** SPI_INIT + * @} + */ +/////////////////////////---USER SETTINGS---///////////////////////// +#include "mylibs_defs.h" + + + +///////////////////////////////////////////////////////////////////// +////////////////////////////---DEFINES---//////////////////////////// + + + +////////////////////////////---DEFINES---//////////////////////////// + + +///////////////////////////////////////////////////////////////////// +///////////////////////---STRUCTURES & ENUMS---////////////////////// +/** + * @brief Структура настроек SPI + * @details Содержит все необходимые параметры для инициализации SPI, + * включая GPIO и DMA. + */ +typedef struct +{ + SPI_HandleTypeDef hspi; ///< HAL handle SPI + + GPIO_TypeDef *CLK_GPIOx; ///< Порт CLK + uint32_t CLK_PIN; ///< Пин CLK + uint32_t CLK_GPIO_AlternageFunc; ///< Альтернативная функция для CLK + + GPIO_TypeDef *MISO_GPIOx; ///< Порт MISO + uint32_t MISO_PIN; ///< Пин MISO + uint32_t MISO_GPIO_AlternageFunc; ///< Альтернативная функция для MISO + + GPIO_TypeDef *MOSI_GPIOx; ///< Порт MOSI + uint32_t MOSI_PIN; ///< Пин MOSI + uint32_t MOSI_GPIO_AlternageFunc; ///< Альтернативная функция для MOSI + + DMA_Stream_TypeDef *DMAChannel; ///< Канал DMA (NULL если не нужен) + uint32_t DMA_CHANNEL_X; ///< Номер канала DMA (0 если не нужен) + +} SPI_SettingsTypeDef; +///////////////////////---STRUCTURES & ENUMS---////////////////////// + + +///////////////////////////////////////////////////////////////////// +///////////////////////////---FUNCTIONS---/////////////////////////// + +/* Инициализация SPI с использованием структуры настроек */ +HAL_StatusTypeDef SPI_Base_Init(SPI_SettingsTypeDef *sspi); + +/* Проверка корректности структуры настроек SPI */ +HAL_StatusTypeDef SPI_Check_Init_Struct(SPI_SettingsTypeDef *sspi); + +/* Инициализация тактирования и прерываний для выбранного SPI */ +void SPI_MspInit(SPI_HandleTypeDef *hspi); + +/* Деинициализация тактирования и прерываний для выбранного SPI */ +void SPI_MspDeInit(SPI_HandleTypeDef *hspi); + + +/** + * @cond SPI_INTERNAL + */ + +/* Настройка GPIO для SPI */ +void SPI_GPIO_Init(SPI_SettingsTypeDef *sspi); + +/* Настройка DMA для SPI */ +void SPI_DMA_Init(SPI_HandleTypeDef *hspi, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X); + +#ifndef __USER_LINKDMA +/** + * @brief Аналог HAL макроса для привязки DMA к UART. + * @note @ref __HAL_LINKDMA. + */ +#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ +do{ \ +(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__); \ +(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U) +#endif + +/** @endcond */ +///////////////////////////---FUNCTIONS---/////////////////////////// + +#endif // __SPI_GENERAL_H_ + +/** MY_LIBS_SPI + * @} + */ \ No newline at end of file diff --git a/MyLibsGeneral/Inc/general_tim.h b/MyLibsGeneral/Inc/general_tim.h new file mode 100644 index 0000000..a45493c --- /dev/null +++ b/MyLibsGeneral/Inc/general_tim.h @@ -0,0 +1,301 @@ +/** +************************************************************************** +* @file general_tim.h +* @brief Заголовочный файл для модуля инициализации таймеров и работы с ними. +************************************************************************** +* @defgroup MY_LIBS_TIM TIM Tools +* @ingroup MYLIBS_PERIPHERAL +* @brief Функции и макросы для удобной работы с TIM. +* @details +Модуль предоставляет универсальные инструменты для работы с TIM: + - @ref MYLIBS_TIM_GENERAL — базовая инициализация таймеров и прерываний. + - @ref MYLIBS_TIM_DELAY — функции задержки через таймеры (blocking и non-blocking). + - @ref MYLIBS_TIM_OC — настройка каналов Output Compare и PWM. + - @ref MYLIBS_TIM_ENCODER — работа с энкодерами, чтение положения и кнопки. + +* @note Требуется подключение модуля TIM в библиотеке HAL и GPIO (@ref MY_LIBS_GPIO) из MyLibs +@code +#define HAL_TIM_MODULE_ENABLED +@endcode +*************************************************************************/ +#ifndef __TIM_GENERAL_H_ +#define __TIM_GENERAL_H_ + +///////////////////////////////////////////////////////////////////// +/////////////////////////---USER SETTINGS---///////////////////////// +/** + * @addtogroup TIM_INIT Init defines + * @ingroup MYLIBS_TIM_GENERAL + * @brief Настройка таймеров + * @{ + */ +#define HAL_TIM_MODULE_ENABLED + +#define USE_TIM1 ///< Включить TIM1 в @ref TIM_Base_MspInit +#define USE_TIM2 ///< Включить TIM2 в @ref TIM_Base_MspInit +#define USE_TIM3 ///< Включить TIM3 в @ref TIM_Base_MspInit +#define USE_TIM4 ///< Включить TIM4 в @ref TIM_Base_MspInit +#define USE_TIM5 ///< Включить TIM5 в @ref TIM_Base_MspInit +#define USE_TIM6 ///< Включить TIM6 в @ref TIM_Base_MspInit +#define USE_TIM7 ///< Включить TIM7 в @ref TIM_Base_MspInit +#define USE_TIM8 ///< Включить TIM8 в @ref TIM_Base_MspInit +#define USE_TIM9 ///< Включить TIM9 в @ref TIM_Base_MspInit +#define USE_TIM10 ///< Включить TIM10 в @ref TIM_Base_MspInit +#define USE_TIM11 ///< Включить TIM11 в @ref TIM_Base_MspInit +#define USE_TIM12 ///< Включить TIM12 в @ref TIM_Base_MspInit +#define USE_TIM13 ///< Включить TIM13 в @ref TIM_Base_MspInit +#define USE_TIM14 ///< Включить TIM14 в @ref TIM_Base_MspInit +/** TIM_INIT + * @} + */ +/////////////////////////---USER SETTINGS---///////////////////////// +#include "mylibs_defs.h" +#include "general_gpio.h" + +///////////////////////////////////////////////////////////////////// +////////////////////////////---DEFINES---//////////////////////////// +#define TIM_IT_CONF_Pos 0 +//#define TIM_PWM_CONF_Pos 1 +//#define TIM_CLCK_SRC_CONF_Pos 2 +//#define TIM_SLAVE_CONF_Pos 3 +//#define TIM_MASTER_CONF_Pos 4 +//#define TIM_BDTR_CONF_Pos 5 + +#define TIM_IT_CONF (1<<(TIM_IT_CONF_Pos)) +//#define TIM_PWM_CONF (1<<(TIM_PWM_Pos)) + +////////////////////////////---DEFINES---////////////////////////////] + + + +///////////////////////////////////////////////////////////////////// +///////////////////////---STRUCTURES & ENUMS---////////////////////// +/** + * @brief Режим прерываний таймера + * @ingroup MYLIBS_TIM_GENERAL + */ +typedef enum +{ + TIM_DEFAULT = 0, ///< Прерываний отключены + TIM_IT_MODE = TIM_IT_CONF, ///< Прерываний включены +// TIM_PWM_MODE = TIM_PWM_ENABLE, +// TIM_PWM_IT_MODE = TIM_PWM_ENABLE | TIM_IT_CONF, +}TIM_ITModeTypeDef; + +/** + * @brief Длительность тика таймера (частота тактирования таймера) + * @ingroup MYLIBS_TIM_GENERAL + * @details enum дает базовые длительности, но можно выставить другие + * (напр 500 - 0.5 мс) + */ +typedef enum +{ + TIM_Base_Disable = 0, ///< Таймер отключен + TIM_TickBase_1US = 1, ///< Таймер тактируется с частотой 1 МГц + TIM_TickBase_10US = 10, ///< Таймер тактируется с частотой 100 кГц + TIM_TickBase_100US = 100, ///< Таймер тактируется с частотой 10 кГц + TIM_TickBase_1MS = 1000, ///< Таймер тактируется с частотой 1 кГц + TIM_TickBase_10MS = 10000, ///< Таймер тактируется с частотой 100 Гц + TIM_TickBase_100MS = 100000, ///< Таймер тактируется с частотой 10 Гц +}TIM_MHzTickBaseTypeDef; + +/** + * @brief Структура инициализации таймера + * @ingroup MYLIBS_TIM_GENERAL + * @details + * Содержит все базовые структуры, которые нужны для инициализации таймера. + * Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами + * + * Также высокоуровневые настройки частоты работы таймера. + * Если какая-либо высокоуровневая настройка не задана, то + * по возможности берется низкоуровневая настройка из структур + */ +typedef struct // struct with settings for custom function +{ + TIM_HandleTypeDef htim; ///< HAL handle таймера + TIM_ClockConfigTypeDef sClockSourceConfig; ///< Настройки тактирования таймера + TIM_SlaveConfigTypeDef sSlaveConfig; ///< Настройки слейв режима таймера + TIM_MasterConfigTypeDef sMasterConfig; ///< Настройки мастер режима таймера + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; ///< Настройки дедтаймов таймера + + TIM_ITModeTypeDef sTimMode; ///< Настройки прерывания таймера + TIM_MHzTickBaseTypeDef sTickBaseUS; ///< Длительность одного тика + uint8_t sTickBasePrescaler; ///< Дополнительный делитель, для удобного деления @ref sTickBaseUS + float sTimAHBFreqMHz; ///< Частота шины тактирования таймера + float sTimFreqHz; ///< Желаемая частота таймера + +}TIM_SettingsTypeDef; + + +/** + * @brief Структура инициализации енкодера + * @ingroup MYLIBS_TIM_ENCODER + * @details + * Содержит все базовые структуры, которые нужны для инициализации таймера. + * Если структуры настроек не заданы, то они заполнятся сами дефолтными параметрами + * + * Также высокоуровневые настройки частоты работы таймера. + * Если какая-либо высокоуровневая настройка не задана, то + * по возможности берется низкоуровневая настройка из структур + */ +typedef struct // struct with variables for encoder +{ + int16_t Encoder_Diff; ///< Считанная разница + uint16_t Encoder_Shdw; ///< Последние считанные тики + + TIM_HandleTypeDef *htim; ///< Указатель на HAL handle таймера + TIM_Encoder_InitTypeDef sConfig; ///< Указатель на структуру настройки энкодера + + GPIO_TypeDef *GPIOx; ///< Порт, куда подключается энкодер + uint32_t GPIO_PIN_TI1; ///< Пин, куда подключается канал TI1 + uint32_t GPIO_PIN_TI2; ///< Пин, куда подключается канал TI2 + uint32_t GPIO_PIN_SW; ///< Пин, куда кнопка энкодера (если есть) + + GPIO_SwitchTypeDef Sw; ///< Структура кнопки + +}TIM_EncoderTypeDef; +///////////////////////---STRUCTURES & ENUMS---////////////////////// + +///////////////////////////////////////////////////////////////////// +///////////////////////////---FUNCTIONS---/////////////////////////// +/** + * @addtogroup MYLIBS_TIM_GENERAL General tools + * @ingroup MY_LIBS_TIM + * @brief Функции для базовой инициализации таймеров + * @par Пример использования: + @code + TIM_SettingsTypeDef tim2Settings; + + void TIM2_Init(void) + { + // Настройка таймера TIM2 на 1 кГц с прерываниями с шагом таймера 10 мкс + tim2Settings.htim.Instance = TIM2; + tim2Settings.sTimMode = TIM_IT_MODE; + tim2Settings.sTickBaseUS = TIM_TickBase_10US; + tim2Settings.sTickBasePrescaler = 1; + tim2Settings.sTimFreqHz = 1000; // 1 кГц + tim2Settings.sTimAHBFreqMHz = 72000000; // Hz + + if(TIM_Base_Init(&tim2Settings) != HAL_OK) + { + Error_Handler(); + } + } + @endcode + * @{ + */ +/* Initialize TIM with TIM_SettingsTypeDef structure */ +HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef* stim); +/* Initialize TIMs clock and interrupt */ +void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode); +/* DeInitialize TIMs clock and interrupt */ +void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim); +/** MYLIBS_TIM_GENERAL + * @} + */ + +/** + * @addtogroup MYLIBS_TIM_DELAY Delay tools + * @ingroup MY_LIBS_TIM + * @brief Функции для формирования задержек с помощью таймеров + * @par Пример использования: + @code + TIM_HandleTypeDef htim2; + + // блокирующая задержка 500 тиков таймера + LED_ON(); + TIM_Delay(&htim2, 500); + LED_OFF(); + + + while(1) + { + // не блокирующая задержка 200 тиков таймера + if(TIM_Delay_NonBlocking(&htim2, 200) == HAL_OK) + { + TIM_Delay_Start(&htim2); + LED_TOOGLE(); + } + } + @endcode + * @{ + */ +/* Start delay via TIM */ +HAL_StatusTypeDef TIM_Delay_Start(TIM_HandleTypeDef *htim); +/* Delay via TIM */ +HAL_StatusTypeDef TIM_Delay(TIM_HandleTypeDef *htim, uint16_t delay); +/* Wait Delay via TIM without blocking app */ +HAL_StatusTypeDef TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay); +/** MYLIBS_TIM_DELAY + * @} + */ + +/** + * @addtogroup MYLIBS_TIM_OC PWM/OC Channels tools + * @ingroup MY_LIBS_TIM + * @brief Функции для инициализации базовых функций каналов таймера + * @par Пример использования: + @code + void PWM_Channel_Init_Example(void) + { + TIM_HandleTypeDef htim3; + TIM_OC_InitTypeDef sConfigOC; + GPIO_TypeDef *GPIOx = GPIOB; + uint32_t PWM_PIN = GPIO_PIN_0; + + // Настройка таймера и канала PWM + TIM_Output_PWM_Init(&htim3, &sConfigOC, TIM_CHANNEL_1, GPIOx, PWM_PIN); + + // Настройка компаратора OC + TIM_OC_Comparator_Init(&htim3, TIM_CHANNEL_1); + } + @endcode + * @{ + */ +/* Initialize PWM Channel and GPIO for output */ +HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN); +/* Initialize OC Comparator */ +HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL); +/** MYLIBS_TIM_ENCODER + * @} + */ + +/** + * @addtogroup MYLIBS_TIM_ENCODER Encoder tools + * @ingroup MY_LIBS_TIM + * @brief Функции для считывания энкодера + * @par Пример использования: + @code + TIM_EncoderTypeDef henc1; + TIM_HandleTypeDef htim4; + + // инициализация + henc1.htim = &htim4; + henc1.GPIOx = GPIOA; + henc1.GPIO_PIN_TI1 = GPIO_PIN_0; + henc1.GPIO_PIN_TI2 = GPIO_PIN_1; + TIM_Encoder_Init(&henc1, &htim4); + + // считывание энкодера и кнопки + int16_t delta = TIM_Encoder_Read(&henc1); + setpoint_tmp += delta; + if(TIM_Encoder_ReadSwitch(&henc1)) + { + setpoint = setpoint_tmp; // подтвердить новое значение + } + @endcode + * @{ + */ +/* Initialize TIM Encoder functional */ +HAL_StatusTypeDef TIM_Encoder_Init(TIM_EncoderTypeDef *henc1, TIM_HandleTypeDef *htim); +/* Считать энкодер */ +HAL_StatusTypeDef TIM_Encoder_Read(TIM_EncoderTypeDef *henc); +/* Считать кнопку энкодера */ +int TIM_Encoder_ReadSwitch(TIM_EncoderTypeDef *henc); +/** MYLIBS_TIM_ENCODER + * @} + */ +///////////////////////////---FUNCTIONS---/////////////////////////// + + +#endif // __TIM_GENERAL_H_ diff --git a/MyLibsGeneral/Inc/general_uart.h b/MyLibsGeneral/Inc/general_uart.h new file mode 100644 index 0000000..cf0660a --- /dev/null +++ b/MyLibsGeneral/Inc/general_uart.h @@ -0,0 +1,156 @@ +/** +************************************************************************** +* @file general_uart.h +* @brief Заголовочный файл для модуля инициализации UART. +************************************************************************** +* @defgroup MY_LIBS_UART UART Tools +* @ingroup MYLIBS_PERIPHERAL +* @brief Функции и макросы для удобной работы с UART. +* @details +Модуль предоставляет функции для базовой инициализации UART + + +@par Пример использования: +@code +// Структура настроек UART +UART_SettingsTypeDef uart2Settings; + +void UART2_Init(void) +{ + // Настройка UART2 с 115200 бод, 8 бит, 1 стоп-бит, без паритета + uart2Settings.huart.Instance = USART2; + uart2Settings.huart.Init.BaudRate = 115200; + uart2Settings.huart.Init.WordLength = UART_WORDLENGTH_8B; + uart2Settings.huart.Init.StopBits = UART_STOPBITS_1; + uart2Settings.huart.Init.Parity = UART_PARITY_NONE; + uart2Settings.huart.Init.Mode = UART_MODE_TX_RX; + uart2Settings.huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; + uart2Settings.huart.Init.OverSampling = UART_OVERSAMPLING_16; + + // Настройка GPIO + uart2Settings.GPIOx = GPIOA; + uart2Settings.GPIO_PIN_TX = GPIO_PIN_2; + uart2Settings.GPIO_PIN_RX = GPIO_PIN_3; + + // DMA не используется в этом примере + uart2Settings.DMAChannel = NULL; + uart2Settings.DMA_CHANNEL_X = 0; + + // Инициализация UART + if(UART_Base_Init(&uart2Settings) != HAL_OK) + { + // Обработка ошибки + Error_Handler(); + } +} +@endcode + +* @note Требуется подключение модуля UART в библиотеке HAL +@code +#define HAL_UART_MODULE_ENABLED +@endcode +* @{ +*************************************************************************/ +#ifndef __UART_GENERAL_H_ +#define __UART_GENERAL_H_ + +///////////////////////////////////////////////////////////////////// +/////////////////////////---USER SETTINGS---///////////////////////// +/** + * @addtogroup UART_INIT Init defines + * @ingroup MY_LIBS_UART + * @brief Настройка UART + * @{ + */ +#define HAL_UART_MODULE_ENABLED ///< Включение HAL UART + +#define USE_USART1 ///< Включить USART1 в @ref UART_MspInit +#define USE_USART2 ///< Включить USART2 в @ref UART_MspInit +#define USE_USART3 ///< Включить USART3 в @ref UART_MspInit +#define USE_UART4 ///< Включить UART4 в @ref UART_MspInit +#define USE_UART5 ///< Включить UART5 в @ref UART_MspInit +#define USE_USART6 ///< Включить USART6 в @ref UART_MspInit +/** UART_INIT + * @} + */ +/////////////////////////---USER SETTINGS---///////////////////////// +#include "mylibs_defs.h" + + + +///////////////////////////////////////////////////////////////////// +////////////////////////////---DEFINES---//////////////////////////// + + + +////////////////////////////---DEFINES---//////////////////////////// + + +///////////////////////////////////////////////////////////////////// +///////////////////////---STRUCTURES & ENUMS---////////////////////// +/** + * @brief Структура настроек UART + * @details Содержит все необходимые параметры для инициализации UART, + * включая GPIO и DMA. + */ +typedef struct +{ + UART_HandleTypeDef huart; ///< HAL handle UART + + GPIO_TypeDef *GPIOx; ///< Порт для UART + uint16_t GPIO_PIN_RX; ///< Пин приема + uint16_t GPIO_PIN_TX; ///< Пин передачи + + DMA_Stream_TypeDef *DMAChannel; ///< Канал DMA (NULL если не нужен) + uint32_t DMA_CHANNEL_X; ///< Номер канала DMA (0 если не нужен) + +} UART_SettingsTypeDef; + +///////////////////////---STRUCTURES & ENUMS---////////////////////// + + +///////////////////////////////////////////////////////////////////// +///////////////////////////---FUNCTIONS---/////////////////////////// + +/* Инициализация UART с использованием структуры настроек */ +HAL_StatusTypeDef UART_Base_Init(UART_SettingsTypeDef *suart); + +/* Проверка корректности структуры настроек UART */ +HAL_StatusTypeDef UART_Check_Init_Struct(UART_SettingsTypeDef *suart); + +/* Инициализация тактирования и прерываний для выбранного UART */ +void UART_MspInit(UART_HandleTypeDef *huart); + +/* Деинициализация тактирования и прерываний для выбранного UART */ +void UART_MspDeInit(UART_HandleTypeDef *huart); + + +/** + * @cond UART_INTERNAL + */ + +/* Настройка GPIO для UART */ +void UART_GPIO_Init(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN_RX, uint16_t GPIO_PIN_TX); + +/* Настройка DMA для UART */ +void UART_DMA_Init(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X); + +#ifndef __USER_LINKDMA +/** + * @brief Аналог HAL макроса для привязки DMA к UART. + * @note @ref __HAL_LINKDMA. + */ +#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ +do{ \ +(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__); \ +(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U) +#endif + +/** @endcond */ +///////////////////////////---FUNCTIONS---/////////////////////////// + +#endif // __UART_GENERAL_H_ + +/** MY_LIBS_UART + * @} + */ \ No newline at end of file diff --git a/MyLibsGeneral/Inc/mylibs_config.h b/MyLibsGeneral/Inc/mylibs_config.h new file mode 100644 index 0000000..68208d2 --- /dev/null +++ b/MyLibsGeneral/Inc/mylibs_config.h @@ -0,0 +1,96 @@ +/** +************************************************************************** +* @file mylibs_config.h +* @brief Конфигурации для библиотек MyLibs +************************************************************************** +* @defgroup MYLIBS_CONFIG Configs +* @ingroup MYLIBS_ALL +* @brief Конфигурации для библиотек MyLibs +* @{ +*************************************************************************/ +#ifndef __MYLIBS_CONFIG_H_ +#define __MYLIBS_CONFIG_H_ + +#include "stm32f4xx_hal.h" + +// user includes + +/** + * @addtogroup TRACE_CONFIG Trace configs + * @ingroup MYLIBS_CONFIG + * @brief Конфигурация трекеров и трассировки + * @{ + */ + +#define TRACKERS_ENABLE ///< Включить трекеры +#define SERIAL_TRACE_ENABLE ///< Включить serial трассировку +#define RTT_TRACE_ENABLE ///< Включить serial трассировку через RTT +#define SWO_TRACE_ENABLE ///< Включить serial трассировку через SWO +/** + * @brief Уровень log serial трассировки @ref log_printf + * - LOG_LEVEL == 0 - логирование отключено (макрос пустой) + * - LOG_LEVEL == 1 - выводится время и TAG + * - LOG_LEVEL >= 2 - выводится время, TAG, имя файла и номер строки + */ +#define LOG_LEVEL 1 + +#define RTT_FLASH_BUFFER_SIZE 1024 ///< Размер буфера RTT в Flash +#define RTT_FLASH_SECTOR FLASH_SECTOR_11 ///< Сектор FLASH куда положится RTT буфер +#define RTT_FLASH_SECTOR_START 0x080E0000 ///< Начало сектора RTT_FLASH_SECTOR +#define RTT_FLASH_SECTOR_END 0x080FFFFF ///< Конец сектора RTT_FLASH_SECTOR + + +#define HARDFAULT_SERIAL_TRACE ///< Включить обработку и serial трассировку Hardfault +#define HF_RTT_TAG_BASE 0xDEAD0000 ///< базовый тег для HardFault +#define HF_RTT_TAIL_SIZE RTT_FLASH_BUFFER_SIZE ///< Размер буфера RTT, который сохранится при Hardfault +#define HF_STACK_DUMP_WORDS 32 ///< Сколько слов стека будет проанализировано во время Hardfault +#define HF_FLASH_ADDR ((uint32_t)0x080FF000) ///< Адрес FLASH куда положится RTT буфер +#define HF_RAM_END 0x20030000 ///< Конец RAM памяти (чтобы во время анализа стека не выйти за пределы) + +#define GPIO_TRACE_ENABLE ///< Включить GPIO трассировку + +/** TRACE_CONFIG + * @} + */ + + +/** + * @addtogroup EVOLVE_CONFIG Evolve configs + * @ingroup MYLIBS_CONFIG + * @brief Конфигурация однослойного персептрона и алгоритма обучения + * @{ + */ + +#define ENABLE_EVOLVE_OPTIMIZATION ///< Включить оптимизацию параметров +#define EVOLVE_MAX_PARAMS 20 ///< Максимальное количество параметров +#define EVOLVE_MAX_CANDIDATES 100 ///< Максимальное количество кандидатов для обучения + +/** EVOLVE_CONFIG + * @} + */ + + +/** + * @addtogroup LIBS_CONFIG Libraries configs + * @ingroup MYLIBS_CONFIG + * @brief Подключение различных модулей библиотеки + * @{ + */ + +#define local_time() uwTick ///< Локальное время + +#define INCLUDE_EVOLVE_OPTIMIZER ///< Подключить библиотеку для оптимизации параметров +#define INCLUDE_BIT_ACCESS_LIB ///< Подключить библиотеку с typedef с битовыми полями +#define INCLUDE_TRACKERS_LIB ///< Подключить библиотеку с трекерами +#define INCLUDE_TRACE_LIB ///< Подключить библиотеку с трейсами +#define INCLUDE_GENERAL_PERIPH_LIBS ///< Подключить библиотеку с периферией +#define FREERTOS_DELAY ///< Использовать FreeRTOS задержку, вместо HAL + +/** LIBS_CONFIG + * @} + */ + +/** MYLIBS_CONFIG + * @} + */ +#endif //__MYLIBS_CONFIG_H_ \ No newline at end of file diff --git a/MyLibsGeneral/Inc/mylibs_defs.h b/MyLibsGeneral/Inc/mylibs_defs.h new file mode 100644 index 0000000..e7e835f --- /dev/null +++ b/MyLibsGeneral/Inc/mylibs_defs.h @@ -0,0 +1,206 @@ +/** +************************************************************************** +* @file mylibs_defs.h +* @brief Заголочный файл для дефайнов библиотеки MyLibsGeneral. +************************************************************************** +* @defgroup MYLIBS_DEFINES General Tools +* @ingroup MYLIBS_ALL +* @brief Общие макросы и typedef'ы, используемые по всему проекту +* +*************************************************************************/ +#ifndef __MYLIBS_DEFINES_H_ +#define __MYLIBS_DEFINES_H_ + +#include "mylibs_config.h" + +/*************************************************************************** +******************************ERROR_HANDLER********************************/ +/** + * @addtogroup ERROR_HANDLER_DEFINES Error Handler defines + * @ingroup MYLIBS_DEFINES + * @brief Дефайны для обработки ошибок + * @{ + */ + +/* extern Error_Handler from main.h */ +extern void Error_Handler(void); + +/** + * @brief Error_Handler который будет вызыватся в библиотеке + */ +#define MyLibs_Error_Handler(params) Error_Handler(params) +/* If error handler not defined - set void */ +#ifndef MyLibs_Error_Handler +#define MyLibs_Error_Handler(...) +#endif // MyLibs_Error_Handler + +/** @brief Проверить один указатель на NULL */ +#define check_null_ptr_1(p1) (p1 == NULL) + +/** @brief Проверить два указателя на NULL */ +#define check_null_ptr_2(p1, p2) ((p1 == NULL) || (p1 != NULL && p2 == NULL)) + +/** @brief Проверить три указателя на NULL */ +#define check_null_ptr_3(p1, p2, p3) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && p3 == NULL)))) + +/** @brief Проверить четыре указателя на NULL */ +#define check_null_ptr_4(p1, p2, p3, p4) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && p4 == NULL)))))) + +/** @brief Проверить пять указателей на NULL */ +#define check_null_ptr_5(p1, p2, p3, p4, p5) ((p1 == NULL) || (p1 != NULL && ((p2 == NULL) || (p2 != NULL && ((p3 == NULL) || (p3 != NULL && ((p4 == NULL) || (p4 != NULL && p5 == NULL)))))))) + +/** ERROR_HANDLER_DEFINES + * @} + */ + + +/*************************************************************************** +******************************DELAYS_DEFINES*******************************/ +/** + * @addtogroup DELAYS_DEFINES Delays defines + * @ingroup MYLIBS_DEFINES + * @brief Макросы и определения для работы с задержками в миллисекундах. + * @details + * Этот блок содержит макросы для реализации задержек с использованием HAL или FreeRTOS: + * - @ref msDelay — простая задержка заданной длительности; + * - @ref msDelayStart — сохранение текущего времени начала задержки; + * - @ref msDelayWhileActive — проверка, активна ли задержка; + * - @ref msDelayWaitDone — проверка, завершена ли задержка. + * Эти макросы удобны для реализации неблокирующих задержек. + * @{ + */ + +/** + * @def msDelay(_ms_) + * @brief Блокирующая задержка на указанное количество миллисекунд. + * @param _ms_ Время задержки в миллисекундах. + * @note Использует задержку через @ref local_time или osDelay в зависимости от @ref FREERTOS_DELAY. + */ +#ifdef FREERTOS_DELAY + #define msDelay(_ms_) osDelay(_ms_) +#else + #define msDelay(_ms_) \ + do { \ + uint32_t _start_ = local_time(); \ + while (local_time() - _start_ < (_ms_)) {} \ + } while(0) +#endif + + +/** + * @brief Начать отсчет задержки. + * @param _pvar_ Указатель на переменную типа uint32_t для хранения времени старта. + * @details После вызова этого макроса переменная _pvar_ содержит текущее количество миллисекунд + * с момента запуска системы (@ref local_time). + * + * Используется для реализации неблокирующих задержек. + */ +#define msDelayStart(_pvar_) *(_pvar_) = local_time() + +/** + * @brief Проверяет, активна ли задержка. + * @param _ms_ Длительность задержки в миллисекундах. + * @param _pvar_ Указатель на переменную, в которой сохранено время начала (@ref msDelayStart). + * @retval 1 Задержка еще активна. + * @retval 0 Задержка завершена. + * @details + * Возвращает true, пока время задержки не истекло. Используется в проверках, + * когда нужно **действовать, пока задержка выполняется**. Пример: + * @code + * while(msDelayWhileActive(1000, &tick)) { + * // выполняем другие задачи, задержка не блокирует поток + * } + * @endcode + */ +#define msDelayWhileActive(_ms_, _pvar_) (local_time() - *(_pvar_) < _ms_) + +/** + * @brief Проверяет, завершилась ли задержка. + * @param _ms_ Длительность задержки в миллисекундах. + * @param _pvar_ Указатель на переменную, в которой сохранено время начала (msDelayStart). + * @retval 1 Задержка завершена. + * @retval 0 Задержка еще активна. + * @details + * Возвращает true, когда задержка уже завершена. Используется в проверках, + * когда нужно **выполнить действие только после окончания задержки**. Пример: + * @code + * if(msDelayWaitDone(1000, &tick)) { + * // выполняем действие после завершения задержки + * } + * @endcode + */ +#define msDelayWaitDone(_ms_, _pvar_) (local_time() - *(_pvar_) >= _ms_) + +/** DELAYS_DEFINES + * @} + */ + + +/*************************************************************************** +*******************************UTIL_DEFINES********************************/ +static int dummy; +/** + * @addtogroup UTILS_DEFINES Utils defines + * @ingroup MYLIBS_DEFINES + * @brief Общие вспомогательные макросы + * @{ + */ + +/** + * @brief Обнуление структуры. + * @param _struct_ Структура, которую нужно обнулить. + * @details Макрос использует memset для обнуления всей памяти структуры. + * Используется для быстрой и безопасной инициализации переменных структур до нуля. + */ +#define ClearStruct(_struct_) memset(&(_struct_), 0, sizeof(_struct_)) + +/** + * @brief Деление с округлением вверх + * @param _val_ Делимое. + * @param _div_ Делитель. + * @return Результат деления, округленный вверх. + * @details Если результат деления без остатка: он возвращается как есть + Если с остатком - округляется вверх + */ +//#define Divide_Up(_val_, _div_) (((_val_)%(_div_))? (_val_)/(_div_)+1 : (_val_)/_div_) /* через тернарный оператор */ +#define Divide_Up(_val_, _div_) ((_val_ - 1) / _div_) + 1 /* через мат выражение */ + +/** + * @brief Swap between Little Endian and Big Endian + * @param v Исходное 16-битное значение. + * @return Результат с поменяными местами старшим и младшим байтом. + * @details Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты. + */ +#define ByteSwap16(v) (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8))) + +/** + * @brief Абсолютное значение числа + * @param x Число. + * @return Абсолютное значение числа x. + * @details Берет число по модулю. Хз как работает библиотечный abs в stdlib.h, мб это быстрее, но вряд ли конечно. + */ +#define ABS(x) ( ((x) > 0)? (x) : -(x)) + +/** UTILS_DEFINES + * @} + */ + + + +/** + * @cond LIBS_INTERNAL + */ + + +/** + * @brief Аналог HAL макроса для привязки DMA к UART. + * @note @ref __HAL_LINKDMA. + */ +#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ +do{ \ +(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__); \ +(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U) + + +/** @endcond */ +#endif //__MYLIBS_DEFINES_H_ \ No newline at end of file diff --git a/MyLibsGeneral/Inc/mylibs_include.h b/MyLibsGeneral/Inc/mylibs_include.h new file mode 100644 index 0000000..e9acba2 --- /dev/null +++ b/MyLibsGeneral/Inc/mylibs_include.h @@ -0,0 +1,125 @@ +/** +************************************************************************** +* @file mylibs_include.h +* @brief Заголочный файл для всех библиотек +************************************************************************** +* @details +Здесь нужно собрать библиотеки и дефайны, которые должны быть видны во всем проекте, +чтобы не подключать 100 инклюдов в каждом ".c" файле +************************************************************************** +* @defgroup MYLIBS_ALL My Libs +* @brief Все используемые MyLibs библиотеки +* @details +Для подключения библиотеки необходимо: +- Сконфигурировать mylibs_config.h: + - Подключить заголовочный файл HAL библиотеки конкретного МК (напр. stm32f4xx_hal.h) + - Подключить другие заголовочные файлы которые общие для всего проекта и должны быть видны + - +- Подключить mylibs_include.h туда, где необходим доступ к библиотекам. + +* @defgroup MYLIBS_PERIPHERAL Peripheral +* @ingroup MYLIBS_ALL +* @brief Модули для управления периферией +* +*************************************************************************/ +#ifndef __MYLIBS_INCLUDE_H_ +#define __MYLIBS_INCLUDE_H_ + +#include "mylibs_defs.h" + + +#ifdef ARM_MATH_CM4 + #include "arm_math.h" +#else + #include "math.h" +#endif + + +#ifdef INCLUDE_BIT_ACCESS_LIB +#include "bit_access.h" +#endif + +#ifdef INCLUDE_TRACKERS_LIB +#include "trackers.h" +#else + #define TrackerTypeDef(num_user_vars) void * + #define num_of_usercnts(_user_) 0 + #define assert_tracecnt(_cntstruct_, _uservarnumb_) 0 + #define if_assert_usertracker(_cntstruct_, _uservarnumb_) if(0) + #define tern_assert_usertracker(_cntstruct_, _uservarnumb_) 0 + #define TrackerGet_Ok(_cntstruct_) dummy + #define TrackerGet_Err(_cntstruct_) dummy + #define TrackerGet_Warn(_cntstruct_) dummy + #define TrackerGet_User(_cntstruct_, _uservarnumb_) dummy + #define TrackerCnt_Ok(_cntstruct_) + #define TrackerCnt_Err(_cntstruct_) + #define TrackerCnt_Warn(_cntstruct_) + #define TrackerCnt_User(_cntstruct_, _uservarnumb_) + #define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_) + #define TrackerClear_All(_cntstruct_) + #define TrackerClear_Ok(_cntstruct_) + #define TrackerClear_Err(_cntstruct_) + #define TrackerClear_Warn(_cntstruct_) + #define TrackerClear_User(_cntstruct_) + #define TrackerClear_UserAll(_cntstruct_) +#endif + +#ifdef INCLUDE_TRACE_LIB +#include "trace.h" +#else +#define my_printf(...) +#define log_printf(TAG, fmt, ...) +#define TRACE_GPIO_SET(_gpio_,_pin_) +#define TRACE_GPIO_RESET(_gpio_,_pin_) +#define RTT_FlashPrepare(...) +#define RTT_EraseFlash(...) 0 +#define RTT_SaveToFlash(...) 0 +#define RTT_ReadFromFlash(...) 0 +#define HF_CheckRecovered(...) 0 +#define HF_HandleFault(...) +#endif + +#ifdef INCLUDE_EVOLVE_OPTIMIZER +#include "evolve_optimizer.h" +#else +typedef struct { + uint16_t n_params; + uint16_t n_cand; + uint16_t n_best; + uint16_t iq_mutation; + int32_t loss[0]; + int32_t candidates[0][0]; +} EvolveOptimizer_t; +#define EvolveOptimizer_Init(opt, n_params, n_cand, n_best, iq_mutation, start_params) +#define EvolveOptimizer_Step(opt, params, LossFunc) +#define PARAM_SCALE_Q16(x, min_val, max_val) (x) +#define PARAM_UNSCALE_Q16(q16_val, min_val, max_val) (q16_val) +#endif + +#ifdef INCLUDE_GENERAL_PERIPH_LIBS + +#include "__general_flash.h" +#include "general_gpio.h" +#ifdef HAL_SPI_MODULE_ENABLED +#include "general_spi.h" +#endif +#ifdef HAL_UART_MODULE_ENABLED +#include "general_uart.h" +#endif +#ifdef HAL_TIM_MODULE_ENABLED +#include "general_tim.h" +#endif + +#endif //INCLUDE_GENERAL_PERIPH_LIBS + + + + +/////////////////////////---USER SETTINGS---///////////////////////// +// user includes + +// user settings +/////////////////////////---USER SETTINGS---///////////////////////// + + +#endif // __MYLIBS_INCLUDE_H_ \ No newline at end of file diff --git a/MyLibsGeneral/Inc/trace.h b/MyLibsGeneral/Inc/trace.h new file mode 100644 index 0000000..d0f5c7f --- /dev/null +++ b/MyLibsGeneral/Inc/trace.h @@ -0,0 +1,591 @@ +/** +************************************************************************** +* @file trace.h +* @brief Заголочный файл для работы с трассировкой. +************************************************************************** +* @addtogroup TRACE Trace defines +* @ingroup MYLIBS_DEFINES +* @brief Дефайны для работы с трассировкой +*************************************************************************/ +#ifndef __TRACE_H_ +#define __TRACE_H_ +#include "mylibs_defs.h" + +#include +/** + * @addtogroup TRACE_SERIAL Serial trace defines + * @ingroup TRACE + * @brief Дефайны для работы с serial трассировкой (SWO, RTT) + * @details В зависимости от настроек определяется дефайн @ref my_printf() и @ref log_printf() для работы с трассировкой: + - @ref SERIAL_TRACE_ENABLE - Если трассировка отключена, то все дефайны определяются как 'ничего' + и на производительность кода не влияют + + - @ref RTT_TRACE_ENABLE - для RTT это будет вызов функции SEGGER_RTT_printf() + + Предварительно надо подключить библиотеку SEGGER RTT (SEGGER_RTT.h) и вызвать функцию SEGGER_RTT_Init() + + - @ref SWO_TRACE_ENABLE для SWO это будет просто printf() + + Предварительно надо подключить библиотеку STDOUT и retarget под ITM: + + @verbatim + Manage Run-Time Environment -> Compiler -> I/O -> STDOUT -> ITM + @endverbatim + + Для SWO также надо включить трассировку: + + @verbatim + Options For Target -> Debug -> Debugger Settings + @endverbatim + + В вкладке Debug: + - Port = SW + В вкладке Trace: + - Указать Core Clock + - Выставить Trace Port = SWO + - ITM - выбрать нужный порт (для Keil нулевой порт) + + + * @{ + * + * @def my_printf(...) + * @brief Универсальный макрос для вывода трассировки + * @details Варианты реализации: + * - RTT_TRACE_ENABLE `SEGGER_RTT_printf(0, ...)` + * - SWO_TRACE_ENABLE - `printf(...)` + * - NO_TRACE - пустой макрос + * + * @def log_printf(TAG, fmt, ...) + * @brief Макрос логирования с поддержкой уровней @ref LOG_LEVEL + * @param TAG Тэг лога + * @param fmt, ... Форматируемая строка + * @details Варианты реализации: + * - @ref LOG_LEVEL == 0 - логирование отключено (макрос пустой) + * - @ref LOG_LEVEL == 1 - выводится время @ref local_time и TAG + * @code + [123] [ADC] Measure Done + [456] [ADC] Measure Err + * @endcode + * - @ref LOG_LEVEL >= 2 - выводится время, TAG, имя файла и номер строки + * @code + [123] [ADC] (../Core/Src/adc.c:75) Measure Done + [456] [ADC] (../Core/Src/adc.c:80) Measure Err + * @endcode + */ +#ifdef SERIAL_TRACE_ENABLE + + #if defined(RTT_TRACE_ENABLE) + #undef SWO_TRACE_ENABLE + #include "SEGGER_RTT.h" + #define my_printf(...) SEGGER_RTT_printf(0, __VA_ARGS__) + #elif defined(SWO_TRACE_ENABLE) + #undef RTT_TRACE_ENABLE + #define my_printf(...) printf(__VA_ARGS__) + #else // NO_TRACE + #define my_printf(...) + #warning No trace is selected. Serial debug wont work. + #endif // RTT_TRACE_ENABLE/SWO_TRACE_ENABLE/NO_TRACE +#else //SERIAL_TRACE_ENABLE + + #define my_printf(...) + #undef RTT_TRACE_ENABLE + #undef SWO_TRACE_ENABLE + +#endif //SERIAL_TRACE_ENABLE + + +#ifndef local_time +#define local_time() HAL_GetTick() ///< Локальное время +#endif +#ifndef LOG_LEVEL +#define LOG_LEVEL 1 ///< @brief Уровень логирования (по умолчанию == 1) +#endif + + +#if LOG_LEVEL == 0 // лог отключен + #define \ +log_printf(TAG, fmt, ...) +#elif LOG_LEVEL == 1 // только тэг + #define log_printf(TAG, fmt, ...) \ +my_printf("\n[%lu] [%s] " fmt, \ +(unsigned long)local_time(), TAG, ##__VA_ARGS__) +#elif LOG_LEVEL >= 2 // всё + #define log_printf(TAG, fmt, ...) \ +my_printf("\n[%lu] [%s] (%s:%d) " fmt, \ +(unsigned long)local_time(), TAG, __FILE__, __LINE__, ##__VA_ARGS__) +#endif + +/** TRACE_SERIAL + * @} + */ + +/** + * @addtogroup TRACE_GPIO GPIO trace defines + * @ingroup TRACE + * @brief Дефайны для работы с GPIO трассировкой + * @details Определяется дефайны для работы с GPIO трассировкой: + - TRACE_GPIO_RESET() - для сброса ножки GPIO (через BSRR) + - TRACE_GPIO_SET() - для выставления ножки GPIO (через BSRR) + + - Если трассировка @ref GPIO_TRACE_ENABLE отключена, то все дефайны определяются как 'ничего' + и на производительность кода не влияют + * @{ + * + * @def TRACE_GPIO_RESET(_gpio_, _pin_) + * @brief Сбросить указанную ножку GPIO + * @param _gpio_ Указатель на структуру GPIO (напр. GPIOA) + * @param _pin_ Номер ножки (напр. GPIO_PIN_0) + * @details Варианты реализации: + * - GPIO_TRACE_ENABLE не определён - макрос пустой + * - GPIO_TRACE_ENABLE определён - устанавливает бит сброса через BSRR ((_pin_)<<16) + * + * @def TRACE_GPIO_SET(_gpio_, _pin_) + * @brief Установить указанную ножку GPIO + * @param _gpio_ Указатель на структуру GPIO (например GPIOA) + * @param _pin_ Номер ножки (напр. GPIO_PIN_0) + * @details Варианты реализации: + * - GPIO_TRACE_ENABLE не определён - макрос пустой + * - GPIO_TRACE_ENABLE определён - устанавливает бит установки через BSRR (_pin_) + */ +#ifndef GPIO_TRACE_ENABLE + #define TRACE_GPIO_SET(_gpio_,_pin_) + #define TRACE_GPIO_RESET(_gpio_,_pin_) +#else + #define TRACE_GPIO_SET(_gpio_,_pin_) (_gpio_)->BSRR = (((_pin_))) + #define TRACE_GPIO_RESET(_gpio_,_pin_) (_gpio_)->BSRR = ((_pin_)<<16) +#endif //GPIO_TRACE_ENABLE + + +/** TRACE_GPIO + * @} + */ + + + +#if defined(HAL_MODULE_ENABLED) && defined(RTT_TRACE_ENABLE) + +/** + * @addtogroup TRACE_RTT_FLASH Flash RTT Buffer + * @ingroup TRACE + * @brief Макросы и функции для сохранения/чтения RTT буфера в Flash + * @details Модуль позволяет сохранять данные RTT буфера во Flash и читать их обратно по тегам. + * Теги работают следующим образом: + * - Базовый тег (младший байт = 0): модуль сам выбирает первый свободный слот во Flash; + * новые записи получают автоинкрементированный младший байт тега (от 0x00 до 0xFF). + * - Конкретный тег (младший байт != 0): запись или чтение происходит строго с указанным тегом; + * если слот с таким тегом уже занят, запись не выполняется. + * - Автоинкремент позволяет хранить несколько последовательных записей в пределах одного базового тега, + * без необходимости вручную отслеживать адреса Flash или позиции буферов. + * + * Параметры: + * - @ref RTT_FLASH_BUFFER_SIZE - Размер буфера RTT в Flash + * - @ref RTT_FLASH_SECTOR - Сектор FLASH куда положится RTT буфер + * - @ref RTT_FLASH_SECTOR_START - Начало сектора RTT_FLASH_SECTOR + * - @ref RTT_FLASH_SECTOR_END - Конец сектора RTT_FLASH_SECTOR + * + * @{ + */ + + +/** + * @brief Структура RTT, которая будет положена в Flash + */ +typedef struct { + uint32_t tag; ///< Уникальный идентификатор буфера + uint32_t size; ///< Размер данных + char data[RTT_FLASH_BUFFER_SIZE]; ///< Буфер RTT +} RTT_FlashHeader_t; + +/** + * @brief Подготовка Flash к записи + * @details Сбрасывает ошибки Flash и ожидает готовности перед записью + */ +__STATIC_FORCEINLINE void RTT_FlashPrepare(void) +{ + HAL_FLASH_Unlock(); + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR | FLASH_FLAG_OPERR); + while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) { + __NOP(); + } +} + +/** + * @brief Сохраняет последние символы RTT-буфера в Flash по тегу + * @param tag Базовый или конкретный идентификатор буфера. + * @param tail_size Количество последних символов RTT для копирования + * @param buf_num Указатель на переменную в которую запишется номер буфера для конкретного тега + * @return >=0 — номер буфера (тег) для записи, <0 — ошибка (нет места, тег уже занят, ошибка записи в флеш) + * + * @details Автоматически копирует последние tail_size символов из RTT-буфера + * и записывает их во Flash. + * Тег может быть базовым или конкретным: + * - Если базовый (младший байт == 0) — будет выбран первый свободный слот с автоинкрементом. + * Автоинкремент формируется в пределах от 0x1 до 0xFF + * - Если конкретный (младший байт != 0) — запись выполняется только с этим тегом, иначе ошибка. + * + */ +__STATIC_FORCEINLINE int RTT_SaveToFlash(uint32_t tag, uint32_t tail_size) +{ + if (tag == 0xFFFFFFFF) + return -1; // Неверный тег + + SEGGER_RTT_BUFFER_UP *up = &_SEGGER_RTT.aUp[0]; + unsigned buf_size = up->SizeOfBuffer; + unsigned wr = up->WrOff; + + // Ограничиваем по размеру буфера RTT и RTT_FLASH_BUFFER_SIZE + unsigned n = (tail_size > buf_size) ? buf_size : tail_size; + if (n > RTT_FLASH_BUFFER_SIZE) + n = RTT_FLASH_BUFFER_SIZE; + + uint32_t addr = RTT_FLASH_SECTOR_START; + RTT_FlashHeader_t *flash_hdr = NULL; + uint32_t base_tag = tag & 0xFFFFFF00; + uint32_t next_tag = (tag & 0xFF) == 0 ? tag + 1 : tag; + + // Ищем первый свободный слот, параллельно автоинкрементируем тег + while ((addr + sizeof(RTT_FlashHeader_t)) <= RTT_FLASH_SECTOR_END) + { + flash_hdr = (RTT_FlashHeader_t *)addr; + + if (flash_hdr->tag == 0xFFFFFFFF) + break; // Нашли свободное место + + + if((flash_hdr->tag & 0xFFFFFF00) == base_tag) // выбраный тег + { + if ((tag & 0xFF) == 0) // если он базовый - ищем последний + next_tag = flash_hdr->tag + 1; // автоинкремент + else + if(flash_hdr->tag == tag) // если он конкретный и уже существует - то ошибка + return -1; // конкретный тег уже занят + } + + + if(next_tag - tag > 0xFF) + return -1; // автоинкремент слишком большой + + addr += sizeof(RTT_FlashHeader_t); + } + + if ((addr + sizeof(RTT_FlashHeader_t)) > RTT_FLASH_SECTOR_END) + return -1; // Нет свободного места + + // Копируем последние n символов из RTT + char temp[RTT_FLASH_BUFFER_SIZE]; + unsigned valid_count = 0; + + for (unsigned i = 0; i < n; i++) + { + unsigned idx = (wr + buf_size - n + i) % buf_size; + char c = up->pBuffer[idx]; + if (c != 0) + temp[valid_count++] = c; + } + + RTT_FlashPrepare(); + + // Формируем структуру в RAM + RTT_FlashHeader_t flash_data; + flash_data.tag = next_tag; + flash_data.size = valid_count; + memcpy(flash_data.data, temp, valid_count); + + // Записываем структуру во Flash (по 4 байта) + const uint32_t *p = (const uint32_t *)&flash_data; + for (unsigned i = 0; i < sizeof(RTT_FlashHeader_t) / 4; i++) + { + if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + i * 4, p[i]) != HAL_OK) + return -1; + } + + HAL_FLASH_Lock(); + __DSB(); + __ISB(); + + + return (int)(next_tag&0xFF); +} + + +/** + * @brief Читает последние символы RTT-буфера из Flash по тегу + * @param tag Базовый или конкретный идентификатор буфера. + * @param Buffer Буфер назначения для копирования данных + * @param tail_size Количество последних символов, которые нужно прочитать + * @param read_size Количество считанных символов + * @return >=0 — номер буфера (тег) для записи, <0 — ошибка (тег не найден или структура повреждена) + * + * @details Копирует последние tail_size символов из найденной записи Flash в Buffer. + * Тег может быть базовым или конкретным: + * - Если базовый (младший байт == 0) — будет прочитана последняя запись из группы. + * - Если конкретный (младший байт != 0) — прочитывается именно эта запись. + */ +__STATIC_FORCEINLINE int RTT_ReadFromFlash(uint32_t tag, char *Buffer, uint32_t tail_size, uint32_t *read_size) +{ + if (!Buffer || tail_size == 0) + return -1; // Неверные параметры + + if (tag == 0xFFFFFFFF) + return -1; // Недопустимый тег + + uint32_t addr = RTT_FLASH_SECTOR_START; + RTT_FlashHeader_t *flash_hdr = NULL; + RTT_FlashHeader_t *target_hdr = NULL; + uint32_t base_tag = tag & 0xFFFFFF00; + + // Поиск записи по тегу + while ((addr + sizeof(RTT_FlashHeader_t)) <= RTT_FLASH_SECTOR_END) + { + flash_hdr = (RTT_FlashHeader_t *)addr; + + if (flash_hdr->tag == 0xFFFFFFFF) + break; // Достигнут конец записанных структур + + // выбраный тег + if((flash_hdr->tag & 0xFFFFFF00) == base_tag) + { + if ((tag & 0xFF) == 0) // если он базовый - ищем последний + target_hdr = flash_hdr; // сохраняем последний в группе + else + if(flash_hdr->tag == tag) // если он конкретный и найден - берем его + { + target_hdr = flash_hdr; + break; // конкретный тег найден + } + } + + addr += sizeof(RTT_FlashHeader_t); + } + + if (!target_hdr) return -1; // Тег не найден + + // Проверка корректности размера + if (target_hdr->size > RTT_FLASH_BUFFER_SIZE) + return -1; // Повреждённая запись + + // Определяем количество читаемых символов + uint32_t n = (tail_size > target_hdr->size) ? target_hdr->size : tail_size; + // Начальная позиция для чтения последних tail_size символов + uint32_t start = target_hdr->size - n; + // Копируем данные из Flash в RAM + memcpy(Buffer, &target_hdr->data[start], n); + + if(read_size != NULL) + { + *read_size = n; + } + + __DSB(); + __ISB(); + + return (int)(target_hdr->tag & 0xFF); +} + +/** + * @brief Стирание сектора Flash с RTT-буфером + */ +__STATIC_FORCEINLINE int RTT_EraseFlash(void) +{ + FLASH_EraseInitTypeDef eraseInit; + uint32_t pageError = 0; + + RTT_FlashPrepare(); + + eraseInit.TypeErase = FLASH_TYPEERASE_SECTORS; + eraseInit.Sector = RTT_FLASH_SECTOR; + eraseInit.NbSectors = 1; + + if (HAL_FLASHEx_Erase(&eraseInit, &pageError) != HAL_OK) + { + return -1; + } + return 0; + HAL_FLASH_Lock(); +} + +/** TRACE_RTT_FLASH + * @} + */ + +#else // HAL_MODULE_ENABLED && RTT_TRACE_ENABLE +#define RTT_FlashPrepare(...) +#define RTT_EraseFlash(...) 0 +#define RTT_SaveToFlash(...) 0 +#define RTT_ReadFromFlash(...) 0 +#endif // HAL_MODULE_ENABLED && RTT_TRACE_ENABLE + + + + +/** + * @addtogroup TRACE_HARDFAULT Hardfault trace defines + * @ingroup TRACE + * @brief Модуль трассировки HardFault с возможностью сохранения RTT буфера во Flash + * @details + * Этот модуль позволяет сохранять контекст процессора и последние символы RTT буфера при возникновении HardFault. + * + * Механизм работы: + * - При срабатывании HardFault вызывается HF_HandleFault(), который: + * 1. Получает указатель на стек, где произошёл HardFault (MSP или PSP). + * 2. Выводит значения регистров R0-R3, R12, LR, PC, PSR и системных регистров SCB. + * 3. Формирует строку с регистрами и копирует последние символы RTT буфера. + * 4. Сохраняет данные во Flash с базовым тегом HF_RTT_TAG_BASE. + * - Для восстановления последнего HardFault используется HF_CheckRecovered(), который: + * 1. Читает запись во Flash по базовому тегу. + * 2. Выводит сохранённый RTT буфер и контекст регистров. + * 3. Опционально стирает Flash после восстановления. + * + * Параметры: + * - @ref HARDFAULT_SERIAL_TRACE - Включить обработку и serial трассировку Hardfault + * Если отключена то вставляются заглушки, никак не влияющие на параметры и остальную программу + * - @ref HF_RTT_TAG_BASE - Базовый тег RTT Flash для HardFault + * - @ref HF_RTT_TAIL_SIZE - Размер буфера RTT, который сохранится при Hardfault + * - @ref HF_STACK_DUMP_WORDS - Сколько слов стека будет проанализировано во время Hardfault + * - @ref HF_FLASH_ADDR - Адрес FLASH куда положится RTT буфер + * - @ref HF_RAM_END - Конец RAM памяти (чтобы во время анализа стека не выйти за пределы) + * + @code + void Hardfault() + { + HF_HandleFault(); + NVIC_SystemReset(); + } + + int main() + { + if(HF_CheckRecovered(0)) + { + //set hardfault error + RTT_EraseFlash(); // erase rtt flash after message readed + } + } + @endcode + * @{ + */ +#if defined(HAL_MODULE_ENABLED) && defined(HARDFAULT_SERIAL_TRACE) + +#ifndef HF_RTT_TAIL_SIZE +#define HF_RTT_TAIL_SIZE RTT_FLASH_BUFFER_SIZE ///< Размер буфера RTT, который сохранится при Hardfault +#endif + +/** + * @brief Контекст стек-фрейма процессора при HardFault + * @details Сохраняет регистры R0-R3, R12, LR, PC, PSR для последующего анализа. + */ +typedef struct { + uint32_t r0; ///< Регистр R0 + uint32_t r1; ///< Регистр R1 + uint32_t r2; ///< Регистр R2 + uint32_t r3; ///< Регистр R3 + uint32_t r12; ///< Регистр R12 + uint32_t lr; ///< Link Register + uint32_t pc; ///< Program Counter + uint32_t psr; ///< Program Status Register +} HF_StackFrame_t; + +/** + * @brief Проверка и вывод последнего HardFault-трейса из Flash + * @details + * Функция ищет последнюю запись HardFault по базовому тегу HF_RTT_TAG_BASE + * и выводит её содержимое в консоль. После успешного вывода Flash можно опционально очистить. + * + * @return int + * - 1 — данные HardFault найдены и выведены + * - 0 — данные отсутствуют или тег не найден + * + * @note Вызов рекомендуется при инициализации приложения для анализа предыдущего сбоя. + */ +__STATIC_FORCEINLINE int HF_CheckRecovered(int erase) +{ + char buffer[RTT_FLASH_BUFFER_SIZE]; + uint32_t read_size = 0; + int n_hardfault = RTT_ReadFromFlash(HF_RTT_TAG_BASE, buffer, HF_RTT_TAIL_SIZE, &read_size); + if (n_hardfault > 0) + { + my_printf("\n--- Recovered HardFault RTT buffer #%u ---\n", n_hardfault); + for (int i = 0; i < read_size; i++) + { + char c = buffer[i]; + if (c == 0 || c == (char)0xFF) break; + my_printf("%c", c); + } + + if(erase) + RTT_EraseFlash(); + my_printf("\n--------- HardFault Dump End ---------\n"); + return 1; + } + return 0; +} + + +static HF_StackFrame_t *stack_frame; +static uint32_t stack_dump[HF_STACK_DUMP_WORDS]; +static void *ret_adr[10] = {0}; +/** + * @brief Обработчик HardFault + * @details + * Вызывается из прерывания HardFault или в любом месте где понятно что ошибка критическая. + * Последовательно выполняет: + * 1. Определяет активный стек (MSP или PSP) на момент сбоя. + * 2. Сохраняет значения регистров R0-R3, R12, LR, PC, PSR. + * 3. Выводит системные регистры CFSR, HFSR, DFSR, AFSR, MMFAR, BFAR. + * 4. Формирует stack trace с 3 уровнями возврата. + * 5. Копирует последние символы RTT буфера. + * 6. Сохраняет все данные во Flash через RTT_SaveToFlash с базовым тегом HF_RTT_TAG_BASE. + * + * @note Функция защищена, так как вызывается в контексте сбоя — минимизирует использование вызовов HAL. + */ +__STATIC_FORCEINLINE void HF_HandleFault(void) +{ + // Получаем указатель на стек, где произошёл HardFault + __ASM volatile( + "TST lr, #4 \n" + "ITE EQ \n" + "MRSEQ %[ptr], MSP\n" + "MRSNE %[ptr], PSP\n" + : [ptr] "=r"(stack_frame) + ); + + my_printf("\n===== HardFault occurred! =====\n"); + my_printf("R0 = 0x%08X\n", stack_frame->r0); + my_printf("R1 = 0x%08X\n", stack_frame->r1); + my_printf("R2 = 0x%08X\n", stack_frame->r2); + my_printf("R3 = 0x%08X\n", stack_frame->r3); + my_printf("R12 = 0x%08X\n", stack_frame->r12); + my_printf("LR = 0x%08X\n", stack_frame->lr); + my_printf("PC = 0x%08X\n", stack_frame->pc); + my_printf("PSR = 0x%08X\n", stack_frame->psr); + + my_printf("CFSR = 0x%08X\n", SCB->CFSR); + my_printf("HFSR = 0x%08X\n", SCB->HFSR); + my_printf("DFSR = 0x%08X\n", SCB->DFSR); + my_printf("AFSR = 0x%08X\n", SCB->AFSR); + my_printf("MMFAR = 0x%08X\n", SCB->MMFAR); + my_printf("BFAR = 0x%08X\n", SCB->BFAR); + + // --- Stack trace --- + my_printf("--- Stack trace ---\n"); + ret_adr[0] = __builtin_return_address(0); + ret_adr[1] = __builtin_return_address(1); + ret_adr[2] = __builtin_return_address(2); + + for (int i = 0; i < 3; i++) // развернуть n уровней + { + if(ret_adr[i]) + my_printf(" #%d: 0x%08lX\r\n", i, ret_adr[i]); // -1 для Thumb + } + RTT_SaveToFlash(HF_RTT_TAG_BASE, HF_RTT_TAIL_SIZE); +} +#else // HAL_MODULE_ENABLED && HARDFAULT_SERIAL_TRACE +#define HF_CheckRecovered(...) 0 +#define HF_HandleFault(...) +#endif // HAL_MODULE_ENABLED && HARDFAULT_SERIAL_TRACE +/** TRACE_HARDFAULT + * @} + */ + + + +#endif //__TRACE_H_ \ No newline at end of file diff --git a/MyLibsGeneral/Inc/trackers.h b/MyLibsGeneral/Inc/trackers.h new file mode 100644 index 0000000..9313f39 --- /dev/null +++ b/MyLibsGeneral/Inc/trackers.h @@ -0,0 +1,163 @@ +/** +************************************************************************** +* @file trackers.h +* @brief Заголочный файл для работы с трекерами @ref TRACKERS. +************************************************************************** +* @addtogroup TRACKERS Trackers defines +* @ingroup MYLIBS_DEFINES +* @brief Дефайны для работы с трекерами +* @details +Есть дефайн для объявления структуры трекера: TrackerTypeDef(num_user_vars). +Структура состоит из следующих элементов: +- cnt_ok +- cnt_err +- cnt_warn +- user[num_user_vars] +Также есть ряд функций (дефайнов) для обращения к элементам этой структуры. + +Параметры для конфигурации: +- @ref TRACKERS_ENABLE - Включить трекеры + Если трекеры @ref TRACKERS_ENABLE отключены, то все дефайны определяются как ничего + и на производительность кода не влияют + +@par Пример: + +Определяем typedef трекера измерений Measure_TrackerTypeDef + +@verbatim + typedef TrackerTypeDef(MEASURE_USER_VARS_NUMB) Measure_TrackerTypeDef; +@endverbatim + +И через @ref Measure_TrackerTypeDef структура подключается в другие структуры + +Для работы с структурой можно использовать функции: +- Для получения значения: + - TrackerGet_Ok() + - TrackerGet_Err() + - TrackerGet_Warn() + - TrackerGet_User(n) + +- Для записи значения: + - TrackerCnt_Ok() + - TrackerCnt_Err() + - TrackerCnt_Warn() + - TrackerCnt_User() + - TrackerWrite_User(n) + +- Для очищения значения: + - TrackerClear_All() + - TrackerClear_Ok() + - TrackerClear_Err() + - TrackerClear_Warn() + - TrackerClear_User(n) + - TrackerClear_UserAll() +* @{ +*************************************************************************/ +#ifndef __TRACKERS_H_ +#define __TRACKERS_H_ +#include "mylibs_defs.h" + +#ifdef TRACKERS_ENABLE + /** + * @brief Структура для счетчиков отладки + * @param num_user_vars - количество пользовательских переменных + * @details Содержит счетчик для успешных событый (cnt_ok), + * счетчик для ошибок (cnt_err), счетчик для предупреждений (cnt_warn). + * + * Также есть возможность объявить пользовательские переменные в + * количестве штук. + */ + #define TrackerTypeDef(num_user_vars) \ + struct \ + { \ + uint32_t cnt_ok; \ + uint32_t cnt_err; \ + uint32_t cnt_warn; \ + uint32_t user[num_user_vars]; \ + } + + /** @brief Получить количетство пользовательских переменных */ + #define num_of_usercnts(_user_) (sizeof(_user_) / sizeof(uint32_t)) + /** @brief Проверка существует ли указанная пользовательская переменная */ + #define assert_usertracker(_cntstruct_, _uservarnumb_) ((_uservarnumb_) < num_of_usercnts((_cntstruct_).user)) + /** @brief Условие для проверки существует ли указанная пользовательская переменная */ + #define if_assert_usertracker(_cntstruct_, _uservarnumb_) if(assert_usertracker(_cntstruct_, _uservarnumb_)) + /** @brief Тернарный оператор для проверки существует ли указанная пользовательская переменная */ + #define tern_assert_usertracker(_cntstruct_, _uservarnumb_) (assert_usertracker(_cntstruct_, _uservarnumb_)) ? _uservarnumb_ : 0 + + + /** @brief Считать счетчик успешных событий */ + #define TrackerGet_Ok(_cntstruct_) (_cntstruct_).cnt_ok + /** @brief Считать счетчик ошибок */ + #define TrackerGet_Err(_cntstruct_) (_cntstruct_).cnt_err + /** @brief Считать счетчик предупреждений */ + #define TrackerGet_Warn(_cntstruct_) (_cntstruct_).cnt_warn + /** + * @brief Считать пользовательскую переменную + * @note Здесь нет проверки - существует ли пользовательская переменная! + * Есть возможность выйти за границы структуры!!! + * Чтобы этого избежать можно использовать дефайн #ref assert_usertracker() + @verbatim + if(assert_usertracker(struct, 0)) { + TrackerGet_User(struct, 0) + } + @endverbatim + */ + #define TrackerGet_User(_cntstruct_, _uservarnumb_) (_cntstruct_).user[tern_assert_usertracker(_cntstruct_, _uservarnumb_)] + + + + /** @brief Инкрементирование счетчика успешных событий */ + #define TrackerCnt_Ok(_cntstruct_) (_cntstruct_).cnt_ok++ + /** @brief Инкрементирование счетчика ошибок */ + #define TrackerCnt_Err(_cntstruct_) (_cntstruct_).cnt_err++ + /** @brief Инкрементирование счетчика предупреждений */ + #define TrackerCnt_Warn(_cntstruct_) (_cntstruct_).cnt_warn++ + /** @brief Инкрементирование пользовательской переменной */ + #define TrackerCnt_User(_cntstruct_, _uservarnumb_) if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_]++; + /** @brief Запись числа в пользовательскую переменную */ + #define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_) if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = (_val_) + + /** @brief Очистка всей структуры */ + #define TrackerClear_All(_cntstruct_) memset(&(_cntstruct_), 0, sizeof(_cntstruct_)) + /** @brief Очистка счетчика успешных событий */ + #define TrackerClear_Ok(_cntstruct_) (_cntstruct_).cnt_ok = 0 + /** @brief Очистка счетчика ошибок */ + #define TrackerClear_Err(_cntstruct_) (_cntstruct_).cnt_err = 0 + /** @brief Очистка счетчика предупреждений */ + #define TrackerClear_Warn(_cntstruct_) (_cntstruct_).cnt_warn = 0 + /** @brief Очистка пользовательской переменной */ + #define TrackerClear_User(_cntstruct_, _uservarnumb_) if_assert_usertracker(_cntstruct_, _uservarnumb_) (_cntstruct_).user[_uservarnumb_] = 0; + /** @brief Очистка всех пользовательских переменных */ + #define TrackerClear_UserAll(_cntstruct_) memset(&(_cntstruct_).user, 0, sizeof((_cntstruct_).user)) + +#else //TRACKERS_ENABLE + + #define TrackerTypeDef(num_user_vars) void * + + #define num_of_usercnts(_user_) 0 + #define assert_tracecnt(_cntstruct_, _uservarnumb_) 0 + #define if_assert_usertracker(_cntstruct_, _uservarnumb_) if(0) + #define tern_assert_usertracker(_cntstruct_, _uservarnumb_) 0 + + #define TrackerGet_Ok(_cntstruct_) dummy + #define TrackerGet_Err(_cntstruct_) dummy + #define TrackerGet_Warn(_cntstruct_) dummy + #define TrackerGet_User(_cntstruct_, _uservarnumb_) dummy + + #define TrackerCnt_Ok(_cntstruct_) + #define TrackerCnt_Err(_cntstruct_) + #define TrackerCnt_Warn(_cntstruct_) + #define TrackerCnt_User(_cntstruct_, _uservarnumb_) + #define TrackerWrite_User(_cntstruct_, _uservarnumb_, _val_) + + #define TrackerClear_All(_cntstruct_) + #define TrackerClear_Ok(_cntstruct_) + #define TrackerClear_Err(_cntstruct_) + #define TrackerClear_Warn(_cntstruct_) + #define TrackerClear_User(_cntstruct_) + #define TrackerClear_UserAll(_cntstruct_) + +#endif //TRACKERS_ENABLE + +#endif //__TRACKERS_H_ \ No newline at end of file diff --git a/MyLibsGeneral/Src/__general_flash.c b/MyLibsGeneral/Src/__general_flash.c new file mode 100644 index 0000000..f7c5e7c --- /dev/null +++ b/MyLibsGeneral/Src/__general_flash.c @@ -0,0 +1,192 @@ +#include "__general_flash.h" +FLASH_EraseInitTypeDef EraseInitStruct; +extern HAL_StatusTypeDef res_hal; +unsigned CRC_Update; +//uint32_t PAGE_OFFSET = ((uint32_t)((4-1) * 0x0400)); +uint32_t PAGE_NUMB = 127; + + +/* Записать в память данные, произвольного размера */ +HAL_StatusTypeDef FLASH_Write_Data(uint32_t* Address, uint8_t* Data, int Data_size) +{ + HAL_StatusTypeDef res_hal; + + int data_cnt = 0; + uint32_t adr; + uint32_t word_data; + + + res_hal = HAL_FLASH_Unlock(); + if (res_hal != HAL_OK) return res_hal; + + for (adr = *Address; adr < *Address + Data_size; adr = adr + 4) + { + + + word_data = ( + Data[data_cnt] | + Data[data_cnt + 1] << 8 | + Data[data_cnt + 2] << 16 | + Data[data_cnt + 3] << 24); + + res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, adr, word_data); + + if (res_hal != HAL_OK) return res_hal; + + data_cnt += 4; + } + + *Address += Data_size; + res_hal = HAL_FLASH_Lock(); + + return res_hal; +} + + + +HAL_StatusTypeDef FLASH_Enable_DualBankMode(void) +{ + HAL_StatusTypeDef res_hal; + FLASH_AdvOBProgramInitTypeDef OB_DualBank; + + + res_hal = HAL_FLASH_Unlock(); + if (res_hal != HAL_OK) + return res_hal; + + res_hal = HAL_FLASH_OB_Unlock(); + if (res_hal != HAL_OK) + return res_hal; + + + FLASH->OPTCR |= FLASH_OPTCR_DB1M; + + res_hal = HAL_FLASH_OB_Launch(); + if (res_hal != HAL_OK) + return res_hal; + + res_hal = HAL_FLASH_OB_Lock(); + if (res_hal != HAL_OK) + return res_hal; + + res_hal = HAL_FLASH_Lock(); + if (res_hal != HAL_OK) + return res_hal; + + + return res_hal; +} + + + +/* Убрать защиту */ +HAL_StatusTypeDef FLASH_WriteProtection(uint32_t BankN, uint32_t WriteProtection) +{ + HAL_StatusTypeDef res_hal; + FLASH_OBProgramInitTypeDef OBInit; + + // Очистка всех возможных ошибок + FLASH->SR |= FLASH_FLAG_WRPERR // Write Protection Error + | FLASH_FLAG_PGSERR // Programming Sequence Error + | FLASH_FLAG_PGAERR // Programming Alignment Error + | FLASH_FLAG_OPERR; // Operation Error + + res_hal = HAL_FLASH_Unlock(); + if (res_hal != HAL_OK) + return res_hal; + + res_hal = HAL_FLASH_OB_Unlock(); // Разблокировка Option Bytes + if (res_hal != HAL_OK) + return res_hal; + + // Считываем текущую конфигурацию Option Bytes + HAL_FLASHEx_OBGetConfig(&OBInit); + + // Отключаем защиту на всех секторах второго банка + OBInit.OptionType = OPTIONBYTE_WRP; + OBInit.WRPState = WriteProtection; // Снять защиту + OBInit.WRPSector = OB_WRP_SECTOR_12; // Снять защиту + OBInit.Banks = BankN; // Указываем второй банк + res_hal = HAL_FLASHEx_OBProgram(&OBInit); + if (res_hal != HAL_OK) + return res_hal; + + // Записываем изменения и перезагружаем чип + res_hal = HAL_FLASH_OB_Launch(); + if (res_hal != HAL_OK) + return res_hal; + + // Считываем текущую конфигурацию Option Bytes + HAL_FLASHEx_OBGetConfig(&OBInit); + +// Блокировка Option Bytes + res_hal = HAL_FLASH_OB_Lock(); + if (res_hal != HAL_OK) + return res_hal; + + res_hal = HAL_FLASH_Lock(); + if (res_hal != HAL_OK) + return res_hal; + + return res_hal; +} +//-----------------ELEMENTARY FUNCTIONS--------------------- +/* functions for reading bytes/halswords/words */ +uint8_t FLASH_Read_Byte(uint32_t add) +{ + return (*(__IO uint8_t*)(add)); +} +uint16_t FLASH_Read_HalfWord(uint32_t add) +{ + return (*(__IO uint16_t*)(add)); +} +uint32_t FLASH_Read_Word(uint32_t add) +{ + return (*(__IO uint32_t*)(add)); +} +/* functions for writing bytes/halswords/words */ +HAL_StatusTypeDef FLASH_Write_Byte(uint32_t Address, uint8_t Data) +{ + HAL_StatusTypeDef res_hal; + + res_hal = HAL_FLASH_Unlock(); + + if (res_hal != HAL_OK) return res_hal; + + res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, (uint8_t)(Data)); + + if (res_hal != HAL_OK) return res_hal; + + res_hal = HAL_FLASH_Lock(); + return res_hal; +} +HAL_StatusTypeDef FLASH_Write_HalfWord(uint32_t Address, uint16_t Data) +{ + HAL_StatusTypeDef res_hal; + + res_hal = HAL_FLASH_Unlock(); + + if (res_hal != HAL_OK) return res_hal; + + res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, (uint16_t)(Data)); + + if (res_hal != HAL_OK) return res_hal; + + res_hal = HAL_FLASH_Lock(); + return res_hal; +} +HAL_StatusTypeDef FLASH_Write_Word(uint32_t Address, uint32_t Data) +{ + HAL_StatusTypeDef res_hal; + + res_hal = HAL_FLASH_Unlock(); + if (res_hal != HAL_OK) return res_hal; + + res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, (uint32_t)(Data)); + if (res_hal != HAL_OK) return res_hal; + + res_hal = HAL_FLASH_Lock(); + return res_hal; +} +//---------------------------------------------------------- + diff --git a/MyLibsGeneral/Src/general_gpio.c b/MyLibsGeneral/Src/general_gpio.c new file mode 100644 index 0000000..6839d51 --- /dev/null +++ b/MyLibsGeneral/Src/general_gpio.c @@ -0,0 +1,326 @@ +/** +************************************************************************** +* @file general_gpio.c +* @brief Модуль для инициализации портов и работы с ними. +************************************************************************** +* @details +Реализация функций для работы с GPIO: + - Включение тактирования портов + - Инициализация светодиодов и кнопок + - Управление светодиодами: включение, выключение, моргание, плавное затухание + - Чтение состояния кнопок с фильтром от дребезга +***************************************************************************/ +#include "general_gpio.h" + +//------------------------------------------------------------------- +//------------------------GPIO INIT FUNCTIONS------------------------ + + +/** + * @brief Включить тактирование порта GPIO + */ +HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx) +{ + if(check_null_ptr_1(GPIOx)) + return HAL_ERROR; + + HAL_StatusTypeDef status = HAL_OK; + // choose port for enable clock + if (GPIOx==GPIOA) + __HAL_RCC_GPIOA_CLK_ENABLE(); + else if (GPIOx==GPIOB) + __HAL_RCC_GPIOB_CLK_ENABLE(); +#ifdef GPIOC + else if (GPIOx==GPIOC) + __HAL_RCC_GPIOC_CLK_ENABLE(); +#endif +#ifdef GPIOD + else if (GPIOx==GPIOD) + __HAL_RCC_GPIOD_CLK_ENABLE(); +#endif +#ifdef GPIOE + else if (GPIOx==GPIOE) + __HAL_RCC_GPIOE_CLK_ENABLE(); +#endif +#ifdef GPIOF + else if (GPIOx==GPIOF) + __HAL_RCC_GPIOF_CLK_ENABLE(); +#endif +#ifdef GPIOH + else if (GPIOx==GPIOF) + __HAL_RCC_GPIOH_CLK_ENABLE(); +#endif + else + status = HAL_ERROR; + + return status; +} + +//------------------------GPIO INIT FUNCTIONS------------------------ +//------------------------------------------------------------------- + + +//------------------------------------------------------------------- +//------------------------GPIO LED FUNCTIONS------------------------- + +/** + * @brief Инициализировать светодиод (структуру светодиода) + * @param led Указатель на структуру светодиода + * @param GPIOx Указатель на структуру порта для светодиода + * @param GPIO_PIN_X Пин для светодиода + * @param LED_ActiveLevel Состояния пина, при котором светодиод будет включен + */ +HAL_StatusTypeDef GPIO_LED_Init(GPIO_LEDTypeDef *led, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t LED_ActiveLevel) +{ + if(check_null_ptr_3(led, GPIOx, GPIO_PIN_X)) + return HAL_ERROR; + + led->LED_Port = GPIOx; + led->LED_Pin = GPIO_PIN_X; + led->LED_ActiveLvl = LED_ActiveLevel; + + GPIO_LED_Off(led); + return HAL_OK; +} + +/** + * @brief Включить светодиод + * @param led Указатель на структуру светодиода + * @return HAL Status + */ +HAL_StatusTypeDef GPIO_LED_On(GPIO_LEDTypeDef *led) +{ + if(check_null_ptr_3(led, led->LED_Port, led->LED_Pin)) + return HAL_ERROR; + + led->state = LED_IS_ON; + HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, led->LED_ActiveLvl); + + + return HAL_OK; +} +/** + * @brief Выключить светодиод + * @param led Указатель на структуру светодиода + * @return HAL Status + */ +HAL_StatusTypeDef GPIO_LED_Off(GPIO_LEDTypeDef *led) +{ + if(check_null_ptr_3(led, led->LED_Port, led->LED_Pin)) + return HAL_ERROR; + + led->state = LED_IS_OFF; + HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, !led->LED_ActiveLvl); + + + + return HAL_OK; +} +/** + * @brief Выставить светодиод по переменной + * @param led Указатель на структуру светодиода + * @param led_state Состояние светодиода + * @return HAL Status + */ +HAL_StatusTypeDef GPIO_LED_Set(GPIO_LEDTypeDef *led, uint8_t led_state) +{ + if(check_null_ptr_3(led, led->LED_Port, led->LED_Pin)) + return HAL_ERROR; + + if(led_state) + { + return GPIO_LED_On(led); + } + else + { + return GPIO_LED_Off(led); + } +} +/** + * @brief Активировать моргание светодиодом + * @param led Указатель на структуру светодиода + * @param period Период плавного моргания светодиода + * @return HAL Status + * @details Функция ставит режим моргания, который после управляется в @ref GPIO_LED_Dynamic_Handle + */ +HAL_StatusTypeDef GPIO_LED_Blink_Start(GPIO_LEDTypeDef *led, uint32_t period) +{ + if(check_null_ptr_3(led, led->LED_Port, led->LED_Pin)) + return HAL_ERROR; + + led->state = LED_IS_BLINKING; + led->LED_Period = period; + + return HAL_OK; +} + +/** + * @brief Активировать моргание светодиодом + * @param led Указатель на структуру светодиода + * @param period Период плавного моргания светодиода + * @return HAL Status + * @details Функция ставит режим моргания, который после управляется в @ref GPIO_LED_Dynamic_Handle + */ +HAL_StatusTypeDef GPIO_LED_Fading_Start(GPIO_LEDTypeDef *led, uint32_t period) +{ + if(check_null_ptr_3(led, led->LED_Port, led->LED_Pin)) + return HAL_ERROR; + + led->state = LED_IS_FADING; + led->LED_Period = period; + + + return HAL_OK; +} + +//uint8_t LED_PWM_FADING_DUTYS[LED_PWM_TICKS] = {0 1 2 3 4 5 6 7 8 9 10 11 12 } +/** + * @brief Управление динамическими режимами свечения светодиода + * @param Указатель на структуру светодиода + * @details Функция моргает/плавно моргает светодиодом в неблокирующем режиме + * Т.е. функцию надо вызывать постоянно, чтобы она мониторила тики + * и в нужный момент переключала светодиод + */ +void GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led) +{ + if(check_null_ptr_3(led, led->LED_Port, led->LED_Pin)) + return; + + /* Режим моргания светодиода */ + if(led->state == LED_IS_BLINKING) + { + uint32_t tickcurrent = local_time(); + /* Ожидание истечения периода моргания */ + if((tickcurrent - led->tickprev) > led->LED_Period) + { + /* Моргание */ + HAL_GPIO_TogglePin(led->LED_Port, led->LED_Pin); + + led->tickprev = tickcurrent; + } + } + /* Режим плавного моргания светодиода */ + else if(led->state == LED_IS_FADING) + { + static unsigned direction = 0; + static int duty = 0; + uint32_t tickcurrent = local_time(); + /* Ожидание момента изменения яркости */ + /* Период ШИМ 20 мс, поэтому менять яроксть надо 40 раз за период (туда обратно) */ + if((tickcurrent - led->tickprev) > led->LED_Period/(LED_PWM_TICKS*2)) + { + /* Формирование разтухания */ + if(direction == 0) + { + if(++duty >= LED_PWM_TICKS) + { + direction = 1; + duty = LED_PWM_TICKS; + } + } + /* Формирование затухания */ + else + { + if(--duty <= 0) + { + direction = 0; + duty = 0; + } + } + led->tickprev = tickcurrent; + } + /* Формирование ШИМ для изменения яркости */ + int duty_crt = (duty*duty/LED_PWM_TICKS); + if(tickcurrent%LED_PWM_TICKS < duty_crt) + { + HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, led->LED_ActiveLvl); + } + else + { + HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, !led->LED_ActiveLvl); + } + } +} +//------------------------GPIO LED FUNCTIONS------------------------- +//------------------------------------------------------------------- + +//------------------------------------------------------------------- +//------------------------GPIO SW FUNCTIONS------------------------- + +/** +* @brief Инициализировать кнопку (структуру кнопки) + * @param sw Указатель на структуру кнопки + * @param GPIOx Указатель на структуру порта для кнопки + * @param GPIO_PIN_X Пин для кнопки + * @param SW_ActiveLevel Состояния пина, когда кнопка нажата + * @return HAL Status + */ +HAL_StatusTypeDef GPIO_Switch_Init(GPIO_SwitchTypeDef *sw, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN_X, uint8_t SW_ActiveLevel) +{ + if(check_null_ptr_3(sw, GPIOx, GPIO_PIN_X)) + return HAL_ERROR; + + sw->Sw_Port = GPIOx; + sw->Sw_Pin = GPIO_PIN_X; + sw->Sw_ActiveLvl = SW_ActiveLevel; + return HAL_OK; +} + +/** + * @brief Считать состоянии кнопки + * @param sw Указатель на структуру кнопки + * @return 1 - если кнопка нажата, + * 0 - если отжата, + * -1 - если ошибка + * @details Функция включает в себя неблокирующую проверку на дребезг + * Т.е. функцию надо вызывать постоянно, чтобы она мониторила состояние кнопки + */ +int GPIO_Read_Switch(GPIO_SwitchTypeDef *sw) +{ + if(check_null_ptr_3(sw, sw->Sw_Port, sw->Sw_Pin)) + return -1; + + if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl) + { + sw->Sw_PrevState = 1; + + + if(sw->Sw_FilterDelay) // если включена защита от дребезга + { + if(sw->tickprev == 0) + sw->tickprev = local_time(); + + if((local_time() - sw->tickprev) >= sw->Sw_FilterDelay) + { + if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl) + { + return 1; + } + else + { + sw->tickprev = 0; + return 0; + } + } + } + else // если нет защиты от дребезга + { + if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl) + { + return 1; + } + else + { + sw->tickprev = 0; + return 0; + } + } + } + else + { + sw->Sw_PrevState = 0; + } + return 0; +} +//------------------------GPIO SW FUNCTIONS------------------------- +//------------------------------------------------------------------- \ No newline at end of file diff --git a/MyLibsGeneral/Src/general_spi.c b/MyLibsGeneral/Src/general_spi.c new file mode 100644 index 0000000..d81ba7d --- /dev/null +++ b/MyLibsGeneral/Src/general_spi.c @@ -0,0 +1,284 @@ +/** +************************************************************************** +* @file general_spi.c +* @brief Модуль для инициализации SPI. +************************************************************************** +Реализация функций для работы с SPI: + - Инициализация SPI и его линий CLK/MISO/MOSI + - Настройка GPIO для SPI + - Настройка NVIC и тактирования SPI +**************************************************************************/ +#include "general_spi.h" +#include "general_gpio.h" + +//------------------------------------------------------------------- +//------------------------SPI INIT FUNCTIONS------------------------ +/** + * @brief Инициализация SPI с помощью структуры SPI_SettingsTypeDef. + * @param sspi Указатель на структуру с настройками SPI. + * @return HAL status. + * @details + * Инициализирует SPI и его GPIO. + * Настройка аналогична HAL_SPI_Init + * @code + * suart.hspi.Init... + * @endcode + * но дополнительно надо прописать пины CLK/MISO/MOSI @ref SPI_SettingsTypeDef + */ +HAL_StatusTypeDef SPI_Base_Init(SPI_SettingsTypeDef *sspi) +{ // function takes setting structure for init + + // check is settings are valid + if(SPI_Check_Init_Struct(sspi) != HAL_OK) + return HAL_ERROR; + + SPI_MspInit(&sspi->hspi); + + if (HAL_SPI_Init(&sspi->hspi) != HAL_OK) + { + MyLibs_Error_Handler(); + return HAL_ERROR; + } + + // init gpio from SPISettings structure + SPI_GPIO_Init(sspi); + +// // init dma from SPISettings structure if need +// if (sspi->DMAChannel != 0) +// SPI_DMA_Init(&sspi->hspi, sspi->hspi.hdmarx, sspi->DMAChannel, sspi->DMA_CHANNEL_X); + + return HAL_OK; +} + + +/** + * @brief Инициализация GPIO для SPI. + * @param sspi Указатель на структуру с настройками SPI. + */ +void SPI_GPIO_Init(SPI_SettingsTypeDef *sspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + // GPIO INIT + GPIO_Clock_Enable(sspi->CLK_GPIOx); + GPIO_Clock_Enable(sspi->MISO_GPIOx); + GPIO_Clock_Enable(sspi->MOSI_GPIOx); + // CLK PIN INIT + GPIO_InitStruct.Pin = sspi->CLK_PIN; + GPIO_InitStruct.Alternate = sspi->CLK_GPIO_AlternageFunc; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + HAL_GPIO_Init(sspi->CLK_GPIOx, &GPIO_InitStruct); + // MISO PIN INIT + GPIO_InitStruct.Pin = sspi->MISO_PIN; + GPIO_InitStruct.Alternate = sspi->MISO_GPIO_AlternageFunc; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + HAL_GPIO_Init(sspi->MISO_GPIOx, &GPIO_InitStruct); + // MOSI PIN INIT + GPIO_InitStruct.Pin = sspi->MOSI_PIN; + GPIO_InitStruct.Alternate = sspi->MOSI_GPIO_AlternageFunc; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + HAL_GPIO_Init(sspi->MOSI_GPIOx, &GPIO_InitStruct); +} + + +void SPI_DMA_Init(SPI_HandleTypeDef *hspi, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X) +{ // function takes spi and dma handlers and dmachannel for spi +// // for now only dma rx is supported, tx maybe later if needed +// // calc defines on boot_project_setup.h + +// /* SPI3 DMA Init */ +// /* SPI3_RX Init */ +// +// hdma_rx->Instance = DMAChannel; +//#if defined(STM32F4xx) // dma channel choose for 407 +// hdma_rx->Init.Channel = DMA_CHANNEL_X; +//#endif +// hdma_rx->Init.Direction = DMA_PERIPH_TO_MEMORY; +// hdma_rx->Init.PeriphInc = DMA_PINC_DISABLE; +// hdma_rx->Init.MemInc = DMA_MINC_ENABLE; +// hdma_rx->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; +// hdma_rx->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; +// hdma_rx->Init.Mode = DMA_CIRCULAR; +// hdma_rx->Init.Priority = DMA_PRIORITY_LOW; +// if (HAL_DMA_Init(hdma_rx) != HAL_OK) +// { +// MyLibs_Error_Handler(); +// } + +// __USER_LINKDMA(hspi,hdmarx,hdma_rx); +// + +// // __USER_LINKDMA is need because __HAL_LINKDMA is written for global defined hdma_rx +// // so you get error because hal uses . insted of -> +} + + +/** + * @brief Настройка тактирования и прерываний SPI. + * @param hspi Указатель на хендл SPI. + * @note Чтобы не генерировать функцию с иницилизацией неиспользуемых SPI, + дефайнами @ref SPI_INIT в @ref general_spi.h определяются используемые SPI. + */ +void SPI_MspInit(SPI_HandleTypeDef *hspi) // analog for hal function +{ + // rcc, dma and interrupt init for SPIs + // GPIO init was moved to own functions SPI_GPIO_Init + if(0); +#ifdef USE_SPI1 + else if(hspi->Instance==SPI1) + { + +// /* DMA2 clock enable */ +// __HAL_RCC_DMA2_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); + + /* SPI1 clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + /* SPI1 interrupt Init */ + HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(SPI1_IRQn); + } +#endif // USE_SPI1 +#ifdef USE_SPI2 + else if(hspi->Instance==SPI2) + { +// /* DMA1 clock enable */ +// __HAL_RCC_DMA1_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); + + /* SPI2 clock enable */ + __HAL_RCC_SPI2_CLK_ENABLE(); + + /* SPI2 interrupt Init */ + HAL_NVIC_SetPriority(SPI2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(SPI2_IRQn); + } +#endif // USE_SPI2 +#ifdef USE_SPI3 + else if(hspi->Instance==SPI3) + { +// /* DMA1 clock enable */ +// __HAL_RCC_DMA1_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); + + /* SPI3 clock enable */ + __HAL_RCC_SPI3_CLK_ENABLE(); + /* SPI3 interrupt Init */ + HAL_NVIC_SetPriority(SPI3_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(SPI3_IRQn); + } +#endif // USE_SPI3 +} + +/** + * @brief Деинициализация тактирования и прерываний SPI. + * @param hspi Указатель на хендл SPI. + * @note Чтобы не генерировать функцию с иницилизацией неиспользуемых SPI, + дефайнами @ref SPI_INIT в @ref general_spi.h определяются используемые SPI. + */ +void SPI_MspDeInit(SPI_HandleTypeDef *hspi) // analog for hal function +{ + // rcc, dma and interrupt init for SPIs + // GPIO init was moved to own functions SPI_GPIO_Init + if(0); +#ifdef USE_SPI1 + else if(hspi->Instance==SPI1) + { + +// /* DMA2 clock enable */ +// __HAL_RCC_DMA2_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); + + /* SPI1 clock reset */ + __HAL_RCC_SPI1_FORCE_RESET(); + __HAL_RCC_SPI1_RELEASE_RESET(); + } +#endif // USE_SPI1 +#ifdef USE_SPI2 + else if(hspi->Instance==SPI2) + { +// /* DMA1 clock enable */ +// __HAL_RCC_DMA1_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); + + /* SPI2 clock reset */ + __HAL_RCC_SPI2_FORCE_RESET(); + __HAL_RCC_SPI2_RELEASE_RESET(); + } +#endif // USE_SPI2 +#ifdef USE_SPI3 + else if(hspi->Instance==SPI3) + { +// /* DMA1 clock enable */ +// __HAL_RCC_DMA1_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); + + /* SPI3 clock reset */ + __HAL_RCC_SPI3_FORCE_RESET(); + __HAL_RCC_SPI3_RELEASE_RESET(); + } +#endif // USE_SPI3 +} + +/** + * @brief Проверка корректности структуры инициализации SPI. + * @param sspi Указатель на структуру с настройками SPI. + * @return HAL status. + */ +HAL_StatusTypeDef SPI_Check_Init_Struct(SPI_SettingsTypeDef *sspi) +{ + // check is settings are valid + if (!IS_SPI_ALL_INSTANCE(sspi->hspi.Instance)) + return HAL_ERROR; + + // check init settings + if (!IS_SPI_MODE(sspi->hspi.Init.Mode)) + return HAL_ERROR; + if (!IS_SPI_DIRECTION(sspi->hspi.Init.Direction)) + return HAL_ERROR; + if (!IS_SPI_DATASIZE(sspi->hspi.Init.DataSize)) + return HAL_ERROR; + if (!IS_SPI_BAUDRATE_PRESCALER(sspi->hspi.Init.BaudRatePrescaler)) + return HAL_ERROR; + if (!IS_SPI_CPOL(sspi->hspi.Init.CLKPolarity)) + return HAL_ERROR; + if (!IS_SPI_CPHA(sspi->hspi.Init.CLKPhase)) + return HAL_ERROR; + if (!IS_SPI_NSS(sspi->hspi.Init.NSS)) + return HAL_ERROR; + if (!IS_SPI_FIRST_BIT(sspi->hspi.Init.FirstBit)) + return HAL_ERROR; + if (!IS_SPI_CRC_CALCULATION(sspi->hspi.Init.CRCCalculation)) + return HAL_ERROR; + if (!IS_SPI_CRC_POLYNOMIAL(sspi->hspi.Init.NSS) && + (sspi->hspi.Init.CRCCalculation != SPI_CRCCALCULATION_DISABLE)) + return HAL_ERROR; + if (!IS_SPI_TIMODE(sspi->hspi.Init.TIMode)) + return HAL_ERROR; + + // check gpio + if (!IS_GPIO_ALL_INSTANCE(sspi->CLK_GPIOx) || !IS_GPIO_ALL_INSTANCE(sspi->MISO_GPIOx) || !IS_GPIO_ALL_INSTANCE(sspi->MOSI_GPIOx)) + return HAL_ERROR; + if (!IS_GPIO_PIN(sspi->CLK_PIN) && !IS_GPIO_PIN(sspi->MISO_PIN) && !IS_GPIO_PIN(sspi->MOSI_PIN)) // if both pins arent set up + return HAL_ERROR; + + return HAL_OK; +} \ No newline at end of file diff --git a/MyLibsGeneral/Src/general_tim.c b/MyLibsGeneral/Src/general_tim.c new file mode 100644 index 0000000..ca3367a --- /dev/null +++ b/MyLibsGeneral/Src/general_tim.c @@ -0,0 +1,722 @@ +/** +************************************************************************** +* @file general_tim.c +* @brief Модуль для инициализации таймеров и работы с ними. +************************************************************************** +Реализация функций для работы с TIM: + - Инициализация таймера и его каналов + - Формирование задержек через таймеры + - Считывание энкодера +*************************************************************************/ +#include "general_tim.h" + +//------------------------------------------------------------------- +//-------------------------TIM INIT FUNCTIONS------------------------ +/** + * @brief Инициализация таймера. + * @param stim Указатель на структуру с настройками таймера. + * @return HAL status. + * @details + * Инициализирует таймер исходя из настроек верхнего уровня: + * - Длительность одного тика @ref TIM_MHzTickBaseTypeDef + * - Частота таймера (в Гц, float) + * - Частота тактирования таймера от шины (в Гц, float) + * + * При невозможности выставления частоты при заданой длительности тика + * длительность тика увеличивается до тех пор, пока частота не будет достигнута. + * + * При выставлении дефайна @ref UPDATE_TIM_PARAMS_AFTER_INITIALIZATION + * новая длительность тика записывается в структуру. + * + * Также остается возможность низкоуровневой настройки по структурам @ref TIM_SettingsTypeDef. + * Для этого надо высокоуровневые настройки приравнять к нулю + */ +HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef *stim) +{ // function takes structure for init + // check that htim is defined + if(check_null_ptr_2(stim, stim->htim.Instance)) + return HAL_ERROR; + + + + if(stim->sTickBaseUS) // if tickbase isnt disable + { + if(stim->sTimAHBFreqMHz == NULL) + return HAL_ERROR; + stim->htim.Init.Prescaler = (stim->sTimAHBFreqMHz*stim->sTickBaseUS) - 1; + + if ((stim->sTimFreqHz != NULL)) + stim->htim.Init.Period = ((1000000/stim->sTickBaseUS) / stim->sTimFreqHz) - 1; + else if (stim->htim.Init.Period == NULL) + stim->htim.Init.Period = 0xFFFF; + + if(stim->sTickBasePrescaler) + { + stim->htim.Init.Prescaler = (stim->htim.Init.Prescaler + 1)/stim->sTickBasePrescaler - 1; + stim->htim.Init.Period = (stim->htim.Init.Period + 1)*stim->sTickBasePrescaler - 1; + } + else + stim->sTickBasePrescaler = 1; + } + + // fix overflow of presc and period if need + for(int i = 0; (stim->htim.Init.Prescaler > 0xFFFF) || (stim->htim.Init.Period > 0xFFFF); i++) + { + if (i>10) // if it isnt fixed after 10 itteration - return HAL_ERRPOR + { + return HAL_ERROR; + } + + // if timbase is too big (prescaller too big for choosen base from MHZ) + if(stim->htim.Init.Prescaler > 0xFFFF) + { + // переносим часть пресскалера в период + stim->htim.Init.Prescaler = ((stim->htim.Init.Prescaler + 1)/2) - 1; + stim->htim.Init.Period = ((stim->htim.Init.Period + 1)*2) - 1; + // обновляем TickBase, если есть куда обновлять + if(stim->sTickBaseUS > 1) + stim->sTickBaseUS /= 2; + // обновляем sTickBasePrescaler, если sTickBaseUS - уже в минимуме + else if (stim->sTickBaseUS == 1) + stim->sTickBasePrescaler *= 2; + else // if TickBase = 0 - return error + return HAL_ERROR; + } + // if freq is too low (period too big for choosen base) + if(stim->htim.Init.Period > 0xFFFF) + { + // переносим часть периода в прескалер + stim->htim.Init.Period = ((stim->htim.Init.Period + 1)/2) - 1; + stim->htim.Init.Prescaler = ((stim->htim.Init.Prescaler + 1)*2) - 1; + // обновляем TickBase + stim->sTickBaseUS *= 2; + } + } + + //-------------TIM BASE INIT---------------- + // tim base init + TIM_Base_MspInit(&stim->htim, stim->sTimMode); + if (HAL_TIM_Base_Init(&stim->htim) != HAL_OK) + { + MyLibs_Error_Handler(); + return HAL_ERROR; + } + + //-------------CLOCK SRC INIT--------------- + // fill sClockSourceConfig if its NULL + if (stim->sClockSourceConfig.ClockSource == NULL) + stim->sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + // clock source init + if (HAL_TIM_ConfigClockSource(&stim->htim, &stim->sClockSourceConfig) != HAL_OK) + { + MyLibs_Error_Handler(); + return HAL_ERROR; + } + + //--------------SLAVE INIT------------------ + // if slave mode enables - config it + if (stim->sSlaveConfig.SlaveMode) + { + // slave mode init + if (HAL_TIM_SlaveConfigSynchro(&stim->htim, &stim->sSlaveConfig) != HAL_OK) + { + MyLibs_Error_Handler(); + return HAL_ERROR; + } + } + //--------------MASTER INIT----------------- + // master mode init + if (HAL_TIMEx_MasterConfigSynchronization(&stim->htim, &stim->sMasterConfig) != HAL_OK) + { + MyLibs_Error_Handler(); + return HAL_ERROR; + } + + //--------------BDTR INIT----------------- + if (HAL_TIMEx_ConfigBreakDeadTime(&stim->htim, &stim->sBreakDeadTimeConfig) != HAL_OK) + { + MyLibs_Error_Handler(); + return HAL_ERROR; + } + + //----------------IT CLEAR------------------- + __HAL_TIM_CLEAR_IT(&stim->htim, TIM_IT_UPDATE); + + + // обновляем TickBase + #ifdef UPDATE_TIM_PARAMS_AFTER_INITIALIZATION + stim->sTickBaseUS = (stim->htim.Instance->PSC+1)*stim->sTickBasePrescaler/(stim->sTimAHBFreqMHz); + if(stim->sTickBaseUS == 0) // if prescaler is too high + { // recalc what is prescaler irl + stim->sTickBaseUS = 1; + stim->sTickBasePrescaler = stim->sTimAHBFreqMHz/(stim->htim.Instance->PSC+1); + } + #endif + stim->htim.Instance->CNT = 0; + return HAL_OK; +} + + + +/** + * @brief Инициализация режима энкодер у таймера. + * @param henc Указатель на хендл энкодера. + * @param htim Указатель на хендл таймера. + * @return HAL status. + * @note Предварительно надо инициализировать таймер @ref TIM_Base_Init. + */ +HAL_StatusTypeDef TIM_Encoder_Init(TIM_EncoderTypeDef *henc, TIM_HandleTypeDef *htim) +{ + if(check_null_ptr_3(henc, htim, htim->Instance)) + return HAL_ERROR; + if(check_null_ptr_3(henc->GPIOx, henc->GPIO_PIN_TI1, henc->GPIO_PIN_TI2)) + return HAL_ERROR; + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + HAL_StatusTypeDef RES = HAL_ERROR; + henc->htim = htim; + + // setup channel for pwm + RES = HAL_TIM_Encoder_Init(henc->htim, &henc->sConfig); + if (RES != HAL_OK) + { + MyLibs_Error_Handler(); + return RES; + } + // choose port for enable clock + RES = GPIO_Clock_Enable(henc->GPIOx); + if(RES != HAL_OK) + { + MyLibs_Error_Handler(); + return RES; + } + + GPIO_InitStruct.Pin = henc->GPIO_PIN_TI1|henc->GPIO_PIN_TI2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_TIM_Alternate_Mapping(henc->htim->Instance); + if(GPIO_InitStruct.Alternate) + HAL_GPIO_Init(henc->GPIOx, &GPIO_InitStruct); + + if(henc->GPIO_PIN_SW) + { + /*Configure switch pin */ + GPIO_InitStruct.Pin = henc->GPIO_PIN_SW; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(henc->GPIOx, &GPIO_InitStruct); + + GPIO_Switch_Init(&henc->Sw, henc->GPIOx, henc->GPIO_PIN_SW, 0); + } + + return HAL_OK; +} + +/** + * @brief Инициализация выхода ШИМ таймера. + * @param htim Указатель на хендл таймера. + * @param sConfigOC Указатель на настрйоки канала таймера. + * @param TIM_CHANNEL Канал таймера для настройки. + * @param GPIOx Порт для вывода ШИМ. + * @param GPIO_PIN Пин для вывода ШИМ. + * @return HAL status. + * @note Предварительно надо инициализировать таймер @ref TIM_Base_Init. + */ +HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN) +{ + if(check_null_ptr_3(htim, htim->Instance, sConfigOC)) + return HAL_ERROR; + if(check_null_ptr_2(GPIOx, GPIO_PIN)) + return HAL_ERROR; + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + HAL_StatusTypeDef RES = HAL_ERROR; + + // setup channel for pwm + RES = HAL_TIM_PWM_ConfigChannel(htim, sConfigOC, TIM_CHANNEL); + if (RES != HAL_OK) + { + MyLibs_Error_Handler(); + return RES; + } + // choose port for enable clock + RES = GPIO_Clock_Enable(GPIOx); + if(RES != HAL_OK) + { + MyLibs_Error_Handler(); + return RES; + } + + GPIO_InitStruct.Pin = GPIO_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + if(sConfigOC->OCPolarity == TIM_OCNPOLARITY_HIGH) + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + else + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_TIM_Alternate_Mapping(htim->Instance); + if(GPIO_InitStruct.Alternate) + HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); + + return HAL_OK; +} + +/** + * @brief Инициализация OC компаратора таймера. + * @param htim Указатель на хендл таймера. + * @param TIM_CHANNEL Канал таймера для настройки. + * @return HAL status. + * @note Предварительно надо инициализировать таймер @ref TIM_Base_Init. + */ +HAL_StatusTypeDef TIM_OC_Comparator_Init(TIM_HandleTypeDef *htim, uint32_t TIM_CHANNEL) +{ + if(check_null_ptr_2(htim, htim->Instance)) + return HAL_ERROR; + + TIM_OC_InitTypeDef sConfigOC = {0}; + HAL_StatusTypeDef RES = HAL_ERROR; + + sConfigOC.OCMode = TIM_OCMODE_ACTIVE; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + + RES = HAL_TIM_OC_ConfigChannel(htim, &sConfigOC, TIM_CHANNEL); + if (RES != HAL_OK) + { + MyLibs_Error_Handler(); + return RES; + } + return RES; +} + + +//------------------------------------------------------------------- +//-------------------------TIM USER FUNCTIONS------------------------ +/** + * @brief Считать энкодер. + * @param henc Указатель на хендл энкодера. + * @return HAL status. + * @details Читает разницу энкодера, которую он накопил после + * предыдущего вызова этой функции. + */ +HAL_StatusTypeDef TIM_Encoder_Read(TIM_EncoderTypeDef *henc) +{ + if(check_null_ptr_3(henc, henc->htim, henc->htim->Instance)) + return HAL_ERROR; + + uint16_t cnt_now = (uint16_t)henc->htim->Instance->CNT; + int16_t diff = (int16_t)(cnt_now - henc->Encoder_Shdw); // переполнение корректно обрабатывается + henc->Encoder_Diff = diff; + henc->Encoder_Shdw = cnt_now; + + return HAL_OK; +} +/** + * @brief Считать кнопку энкодера. + * @param henc Указатель на хендл энкодера. + * @return 1 - если кнопка нажата, + * 0 - если отжата, + * -1 - если ошибка + */ +int TIM_Encoder_ReadSwitch(TIM_EncoderTypeDef *henc) +{ + if(check_null_ptr_1(henc)) + return -1; + + return GPIO_Read_Switch(&henc->Sw); +} + +/** + * @brief Задержка в тиках таймера (блокирующая). + * @param htim Указатель на хендл таймера. + * @param delay Задержка в тиках таймера. + * @return HAL status. + * @details Формирует задержку с блокировкой программы. + */ +HAL_StatusTypeDef TIM_Delay(TIM_HandleTypeDef *htim, uint16_t delay) +{ + if(check_null_ptr_2(htim, htim->Instance)) + return HAL_ERROR; + + if(delay >= htim->Instance->ARR) + { + return HAL_ERROR; + } + htim->Instance->CNT = 0; + while(1) + { + if(htim->Instance->CNT > delay) + { + return HAL_OK; + } + } +} + +/** + * @brief Начать отсчет неблокирующей задержки. + * @param htim Указатель на хендл таймера. + * @return HAL status. + * @details Сбрасывает счетчик для начала отсчета неблокирующей задержки. + * @ref TIM_Delay_NonBlocking для проверки статуса задержки + */ +HAL_StatusTypeDef TIM_Delay_Start(TIM_HandleTypeDef *htim) +{ + if(check_null_ptr_2(htim, htim->Instance)) + return HAL_ERROR; + + htim->Instance->CNT = 0; + + return HAL_OK; +} + +/** + * @brief Задержка в тиках таймера (неблокирующая). + * @param htim Указатель на хендл таймера. + * @param delay Задержка в тиках таймера. + * @return HAL status. + * @details Формирует задержку с блокировкой программы. + * Перед ожиданием задержки надо запутстить таймер @ref TIM_Delay_Start + * @note Таймер не должен использоваться на время этой задержки + */ +HAL_StatusTypeDef TIM_Delay_NonBlocking(TIM_HandleTypeDef *htim, uint16_t delay) +{ + if(check_null_ptr_2(htim, htim->Instance)) + return HAL_ERROR; + + if(delay >= htim->Instance->ARR) + { + return HAL_ERROR; + } + + if(htim->Instance->CNT <= delay) + { + return HAL_BUSY; + } + else + { + return HAL_OK; + } +} + +/** + * @brief Инициализация CLK и NVIC таймеров. + * @param htim Указатель на хендл таймера. + * @note Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров, + дефайнами @ref TIM_INIT в @ref general_tim.h определяются используемые таймеры. + */ +void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode) +{ + if(check_null_ptr_2(htim, htim->Instance)) + return; + + it_mode = it_mode&TIM_IT_CONF; +#ifdef USE_TIM1 + if(htim->Instance==TIM1) + { + /* TIM2 clock enable */ + __HAL_RCC_TIM1_CLK_ENABLE(); + + /* TIM2 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn); + } + } +#endif +#ifdef USE_TIM2 + if(htim->Instance==TIM2) + { + /* TIM2 clock enable */ + __HAL_RCC_TIM2_CLK_ENABLE(); + + /* TIM2 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM2_IRQn); + } + } +#endif +#ifdef USE_TIM3 + if(htim->Instance==TIM3) + { + /* TIM3 clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + + /* TIM3 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM3_IRQn); + } + } +#endif +#ifdef USE_TIM4 + if(htim->Instance==TIM4) + { + /* TIM4 clock enable */ + __HAL_RCC_TIM4_CLK_ENABLE(); + + /* TIM4 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM4_IRQn); + } + } +#endif +#ifdef USE_TIM5 + if(htim->Instance==TIM5) + { + /* TIM5 clock enable */ + __HAL_RCC_TIM5_CLK_ENABLE(); + + /* TIM5 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM5_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM5_IRQn); + } + } +#endif +#ifdef USE_TIM6 + if(htim->Instance==TIM6) + { + /* TIM6 clock enable */ + __HAL_RCC_TIM6_CLK_ENABLE(); + + /* TIM6 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); + } + } +#endif +#ifdef USE_TIM7 + if(htim->Instance==TIM7) + { + /* TIM7 clock enable */ + __HAL_RCC_TIM7_CLK_ENABLE(); + + /* TIM7 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM7_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM7_IRQn); + } + } +#endif +#ifdef USE_TIM8 + if(htim->Instance==TIM8) + { + /* TIM8 clock enable */ + __HAL_RCC_TIM8_CLK_ENABLE(); + + /* TIM8 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn); + } + } +#endif +#ifdef USE_TIM9 + if(htim->Instance==TIM9) + { + /* TIM9 clock enable */ + __HAL_RCC_TIM9_CLK_ENABLE(); + + /* TIM9 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn); + } + } +#endif +#ifdef USE_TIM10 + if(htim->Instance==TIM10) + { + /* TIM10 clock enable */ + __HAL_RCC_TIM10_CLK_ENABLE(); + + /* TIM10 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn); + } + } +#endif +#ifdef USE_TIM11 + if(htim->Instance==TIM11) + { + /* TIM11 clock enable */ + __HAL_RCC_TIM11_CLK_ENABLE(); + + /* TIM11 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn); + } + } +#endif +#ifdef USE_TIM12 + if(htim->Instance==TIM12) + { + /* TIM12 clock enable */ + __HAL_RCC_TIM12_CLK_ENABLE(); + + /* TIM12 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn); + } + } +#endif +#ifdef USE_TIM13 + if(htim->Instance==TIM13) + { + /* TIM13 clock enable */ + __HAL_RCC_TIM13_CLK_ENABLE(); + + /* TIM13 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn); + } + } +#endif +#ifdef USE_TIM14 + if(htim->Instance==TIM14) + { + /* TIM14 clock enable */ + __HAL_RCC_TIM14_CLK_ENABLE(); + + /* TIM14 interrupt Init */ + if(it_mode) + { + HAL_NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn); + } + } +#endif +} +/** + * @brief Деинициализация CLK и NVIC таймеров. + * @param htim Указатель на хендл таймера. + * @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров, + дефайнами @ref TIM_INIT в @ref general_tim.h определяются используемые таймеры. + */ +void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim) +{ + if(check_null_ptr_2(htim, htim->Instance)) + return; + +#ifdef USE_TIM1 + if(htim->Instance==TIM1) + { + __HAL_RCC_TIM1_FORCE_RESET(); + __HAL_RCC_TIM1_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM2 + if(htim->Instance==TIM2) + { + __HAL_RCC_TIM2_FORCE_RESET(); + __HAL_RCC_TIM2_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM3 + if(htim->Instance==TIM3) + { + __HAL_RCC_TIM3_FORCE_RESET(); + __HAL_RCC_TIM3_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM4 + if(htim->Instance==TIM4) + { + __HAL_RCC_TIM4_FORCE_RESET(); + __HAL_RCC_TIM4_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM5 + if(htim->Instance==TIM5) + { + __HAL_RCC_TIM5_FORCE_RESET(); + __HAL_RCC_TIM5_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM6 + if(htim->Instance==TIM6) + { + __HAL_RCC_TIM6_FORCE_RESET(); + __HAL_RCC_TIM6_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM7 + if(htim->Instance==TIM7) + { + __HAL_RCC_TIM7_FORCE_RESET(); + __HAL_RCC_TIM7_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM8 + if(htim->Instance==TIM8) + { + __HAL_RCC_TIM8_FORCE_RESET(); + __HAL_RCC_TIM8_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM9 + if(htim->Instance==TIM9) + { + __HAL_RCC_TIM9_FORCE_RESET(); + __HAL_RCC_TIM9_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM10 + if(htim->Instance==TIM10) + { + __HAL_RCC_TIM10_FORCE_RESET(); + __HAL_RCC_TIM10_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM11 + if(htim->Instance==TIM11) + { + __HAL_RCC_TIM11_FORCE_RESET(); + __HAL_RCC_TIM11_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM12 + if(htim->Instance==TIM12) + { + __HAL_RCC_TIM12_FORCE_RESET(); + __HAL_RCC_TIM12_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM13 + if(htim->Instance==TIM13) + { + __HAL_RCC_TIM13_FORCE_RESET(); + __HAL_RCC_TIM13_RELEASE_RESET(); + } +#endif +#ifdef USE_TIM14 + if(htim->Instance==TIM14) + { + __HAL_RCC_TIM14_FORCE_RESET(); + __HAL_RCC_TIM14_RELEASE_RESET(); + } +#endif +} +//-------------------------TIM INIT FUNCTIONS------------------------ +//------------------------------------------------------------------- diff --git a/MyLibsGeneral/Src/general_uart.c b/MyLibsGeneral/Src/general_uart.c new file mode 100644 index 0000000..a5fcc1b --- /dev/null +++ b/MyLibsGeneral/Src/general_uart.c @@ -0,0 +1,383 @@ +/** +************************************************************************** +* @file general_uart.c +* @brief Модуль для инициализации UART. +************************************************************************** +Реализация функций для работы с UART: + - Инициализация UART и его линий RX/TX + - Настройка DMA для UART + - Настройка GPIO для UART + - Настройка NVIC и тактирования UART +**************************************************************************/ +#include "general_uart.h" +#include "general_gpio.h" + +//------------------------------------------------------------------- +//------------------------UART INIT FUNCTIONS------------------------ +/** + * @brief Инициализация UART с помощью структуры UART_SettingsTypeDef. + * @param suart Указатель на структуру с настройками UART. + * @return HAL status. + * @details + * Инициализирует UART и его GPIO и при необходимости DMA. + * Настройка аналогична HAL_UART_Init + * @code + * suart.huart.Init... + * @endcode + * но дополнительно надо прописать пины RX/TX @ref UART_SettingsTypeDef + * @code + * suart->GPIOx, suart->GPIO_PIN_RX, suart->GPIO_PIN_TX + * @endcode + */ +HAL_StatusTypeDef UART_Base_Init(UART_SettingsTypeDef *suart) +{ // function takes setting structure for init + + // check is settings are valid + if(UART_Check_Init_Struct(suart) != HAL_OK) + return HAL_ERROR; + + suart->huart.Init.Mode = UART_MODE_TX_RX; + + UART_MspInit(&suart->huart); + + + if (HAL_UART_Init(&suart->huart) != HAL_OK) + { + MyLibs_Error_Handler(); + return HAL_ERROR; + } + + // init gpio from UARTSettings structure + UART_GPIO_Init(suart->GPIOx, suart->GPIO_PIN_RX, suart->GPIO_PIN_TX); + + __HAL_UART_ENABLE_IT(&suart->huart, UART_IT_IDLE); + // init dma from UARTSettings structure if need + if (suart->DMAChannel != 0) + UART_DMA_Init(&suart->huart, suart->huart.hdmarx, suart->DMAChannel, suart->DMA_CHANNEL_X); + + + return HAL_OK; +} + + +/** + * @brief Инициализация GPIO для UART. + * @param GPIOx Порт для настройки. + * @param GPIO_PIN_RX Пин для приема. + * @param GPIO_PIN_TX Пин для передачи. + */ +void UART_GPIO_Init(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN_RX, uint16_t GPIO_PIN_TX) +{ // function takes port and pins (for rx and tx) + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + // choose port for enable clock + GPIO_Clock_Enable(GPIOx); + + //USART3 GPIO Configuration + //GPIO_PIN_TX ------> USART_TX + //GPIO_PIN_RX ------> USART_RX + +#if defined(STM32F4xx) // gpio init for 407 + GPIO_InitStruct.Pin = GPIO_PIN_TX|GPIO_PIN_RX; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART3; + HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); +#elif defined(STM32F1xx) // gpio init for atm403/stm103 + //GPIO_PIN_TX ------> USART_TX + GPIO_InitStruct.Pin = GPIO_PIN_TX; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); + +// GPIO_PIN_RX ------> USART_RX + GPIO_InitStruct.Pin = GPIO_PIN_RX; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); +#endif +} + +/** + * @brief Инициализация DMA для UART. + * @param huart Указатель на хендл UART. + * @param hdma_rx Указатель на хендл DMA для линии приема UART. + * @param DMAChannel Указатель на канал DMA/поток DMA в STM32F407. + * @param DMA_CHANNEL_X Канал DMA. + */ +void UART_DMA_Init(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X) +{ // function takes uart and dma handlers and dmachannel for uart + // for now only dma rx is supported, tx maybe later if needed + // calc defines on boot_project_setup.h + + /* USART3 DMA Init */ + /* USART3_RX Init */ + + hdma_rx->Instance = DMAChannel; +#if defined(STM32F4xx) // dma channel choose for 407 + hdma_rx->Init.Channel = DMA_CHANNEL_X; +#endif + hdma_rx->Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_rx->Init.PeriphInc = DMA_PINC_DISABLE; + hdma_rx->Init.MemInc = DMA_MINC_ENABLE; + hdma_rx->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_rx->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_rx->Init.Mode = DMA_CIRCULAR; + hdma_rx->Init.Priority = DMA_PRIORITY_LOW; + if (HAL_DMA_Init(hdma_rx) != HAL_OK) + { + MyLibs_Error_Handler(); + } + + __USER_LINKDMA(huart,hdmarx,hdma_rx); + + + // __USER_LINKDMA is need because __HAL_LINKDMA is written for global defined hdma_rx + // so you get error because hal uses . insted of -> +} + +/** + * @brief Настройка тактирования и прерываний UART. + * @param huart Указатель на хендл UART. + * @note Чтобы не генерировать функцию с иницилизацией неиспользуемых UART, + дефайнами @ref UART_INIT в @ref general_uart.h определяются используемые UART. + */ +void UART_MspInit(UART_HandleTypeDef *huart) // analog for hal function +{ +// __RCC_DMA_UART_CLK_ENABLE(); +// /* DMA interrupt init */ +// /* DMA1_Stream1_IRQn interrupt configuration */ +// HAL_NVIC_SetPriority(DMA_UART_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA_UART_IRQn); + + // rcc, dma and interrupt init for USARTs + // GPIO init was moved to own functions UART_GPIO_Init + if(0); +#ifdef USE_USART1 + else if(huart->Instance==USART1) + { + + /* DMA2 clock enable */ + __HAL_RCC_DMA2_CLK_ENABLE(); + /* DMA interrupt init */ + HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); + + /* USART1 clock enable */ + __HAL_RCC_USART1_CLK_ENABLE(); + + /* USART1 interrupt Init */ + HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART1_IRQn); + } +#endif // USE_USART1 +#ifdef USE_USART2 + else if(huart->Instance==USART2) + { + /* DMA1 clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + /* DMA interrupt init */ + HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); + + /* USART2 clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + /* USART2 interrupt Init */ + HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART2_IRQn); + } +#endif // USE_USART2 +#ifdef USE_USART3 + else if(huart->Instance==USART3) + { + /* DMA1 clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + /* DMA interrupt init */ + HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); + + /* USART3 clock enable */ + __HAL_RCC_USART3_CLK_ENABLE(); + /* USART3 interrupt Init */ + HAL_NVIC_SetPriority(USART3_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART3_IRQn); + } +#endif // USE_USART3 +#ifdef USE_UART4 + else if(huart->Instance==UART4) + { + /* DMA1 clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + /* DMA interrupt init */ + HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn); + + /* UART4 clock enable */ + __HAL_RCC_UART4_CLK_ENABLE(); + + /* UART4 interrupt Init */ + HAL_NVIC_SetPriority(UART4_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(UART4_IRQn); + } +#endif // USE_UART4 +#ifdef USE_UART5 + else if(huart->Instance==UART5) + { + /* DMA1 clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + /* DMA interrupt init */ + HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn); + + /* UART5 clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* UART5 interrupt Init */ + HAL_NVIC_SetPriority(UART5_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(UART5_IRQn); + } +#endif // USE_UART5 +#ifdef USE_USART6 + else if(huart->Instance==USART6) + { + /* DMA2 clock enable */ + __HAL_RCC_DMA2_CLK_ENABLE(); + /* DMA interrupt init */ + HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn); + + /* USART6 clock enable */ + __HAL_RCC_USART6_CLK_ENABLE(); + + /* USART6 interrupt Init */ + HAL_NVIC_SetPriority(USART6_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART6_IRQn); + } +#endif // USE_USART6 +} + +/** + * @brief Деинициализация тактирования и прерываний UART. + * @param huart Указатель на хендл UART. + * @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых UART, + дефайнами @ref UART_INIT в @ref general_uart.h определяются используемые UART. + */ +void UART_MspDeInit(UART_HandleTypeDef *huart) // analog for hal function +{ + // rcc, dma and interrupt init for USARTs + // GPIO init was moved to own functions UART_GPIO_Init + if(0); +#ifdef USE_USART1 + else if(huart->Instance==USART1) + { + +// /* DMA2 clock enable */ +// __HAL_RCC_DMA2_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); + + /* USART1 clock reset */ + __HAL_RCC_USART1_FORCE_RESET(); + __HAL_RCC_USART1_RELEASE_RESET(); + } +#endif // USE_USART1 +#ifdef USE_USART2 + else if(huart->Instance==USART2) + { +// /* DMA1 clock enable */ +// __HAL_RCC_DMA1_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); + + /* USART2 clock reset */ + __HAL_RCC_USART2_FORCE_RESET(); + __HAL_RCC_USART2_RELEASE_RESET(); + } +#endif // USE_USART2 +#ifdef USE_USART3 + else if(huart->Instance==USART3) + { +// /* DMA1 clock enable */ +// __HAL_RCC_DMA1_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); + + /* USART3 clock reset */ + __HAL_RCC_USART3_FORCE_RESET(); + __HAL_RCC_USART3_RELEASE_RESET(); + } +#endif // USE_USART3 +#ifdef USE_UART4 + else if(huart->Instance==UART4) + { +// /* DMA1 clock enable */ +// __HAL_RCC_DMA1_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn); + + /* UART4 clock reset */ + __HAL_RCC_UART4_FORCE_RESET(); + __HAL_RCC_UART4_RELEASE_RESET(); + } +#endif // USE_UART4 +#ifdef USE_UART5 + else if(huart->Instance==UART5) + { +// /* DMA1 clock enable */ +// __HAL_RCC_DMA1_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn); + + /* UART5 clock reset */ + __HAL_RCC_UART5_FORCE_RESET(); + __HAL_RCC_UART5_RELEASE_RESET(); + } +#endif // USE_UART5 +#ifdef USE_USART6 + else if(huart->Instance==USART6) + { +// /* DMA2 clock enable */ +// __HAL_RCC_DMA2_CLK_ENABLE(); +// /* DMA interrupt init */ +// HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn); + + /* USART6 clock reset */ + __HAL_RCC_USART6_FORCE_RESET(); + __HAL_RCC_USART6_RELEASE_RESET(); + } +#endif // USE_USART6 +} + +/** + * @brief Проверка корректности структуры инициализации UART. + * @param suart Указатель на структуру с настройками UART. + * @return HAL status. + */ +HAL_StatusTypeDef UART_Check_Init_Struct(UART_SettingsTypeDef *suart) +{ + // check is settings are valid + if (!IS_UART_INSTANCE(suart->huart.Instance)) + return HAL_ERROR; + + if (!IS_UART_BAUDRATE(suart->huart.Init.BaudRate) || (suart->huart.Init.BaudRate == NULL)) + return HAL_ERROR; + + if (!IS_GPIO_ALL_INSTANCE(suart->GPIOx)) + return HAL_ERROR; + + if (!IS_GPIO_PIN(suart->GPIO_PIN_RX) && !IS_GPIO_PIN(suart->GPIO_PIN_TX)) // if both pins arent set up + return HAL_ERROR; + + return HAL_OK; +} + +//------------------------UART INIT FUNCTIONS------------------------ +//------------------------------------------------------------------- diff --git a/MyLibsGeneral/mainpage.h b/MyLibsGeneral/mainpage.h new file mode 100644 index 0000000..d774781 --- /dev/null +++ b/MyLibsGeneral/mainpage.h @@ -0,0 +1,74 @@ + +/** +@mainpage + +@section overview Обзор +MyLibs - это набор библиотек для удобной работы с STM32. + +@subsection features Основные возможности + +@subsubsection utils_module Общие утилиты (@ref MYLIBS_DEFINES) +- Макросы для задержек и утилит (@ref DELAYS_DEFINES и @ref UTILS_DEFINES) +- Трекеры для статистики и отладки (@ref TRACKERS и @ref TRACE) +- Эволюционный алгоритм для оптимизации параметров (@ref EVOLVE_OPTIMIZER) +- Битовый доступ к регистрам через union (@ref BIT_ACCESS_DEFINES) + +@subsubsection trace_module Трассировка @ref TRACE +- Serial трассировка через SWO и RTT (@ref TRACE_SERIAL) +- GPIO трассировка для отладки (@ref TRACE_GPIO) +- Сохранение логов в Flash память (@ref TRACE_RTT_FLASH) +- Обработка HardFault с сохранением контекста (@ref TRACE_HARDFAULT) + +@subsubsection gpio_module Модуль GPIO @ref MY_LIBS_GPIO +- Инициализация портов и тактирования (@ref MYLIBS_GPIO_GENERAL) +- Управление светодиодами (включение/выключение, моргание, плавное затухание) (@ref MYLIBS_GPIO_LEDS) +- Работа с кнопками (чтение состояния, фильтрация дребезга) (@ref MYLIBS_GPIO_SWITCH) + +@subsubsection tim_module Модуль таймеров @ref MY_LIBS_TIM +- Базовая инициализация таймеров (@ref MYLIBS_TIM_GENERAL) +- Формирование задержек (блокирующие и неблокирующие) (@ref MYLIBS_TIM_DELAY) +- Работа с энкодерами (чтение положения, обработка кнопок) (@ref MYLIBS_TIM_ENCODER) +- Настройка ШИМ и Output Compare (@ref MYLIBS_TIM_OC) + +@subsubsection uart_module Модуль UART @ref MY_LIBS_UART +- Базовая инициализация UART и его пинов одной функцией (@ref UART_Base_Init) + +@subsubsection spi_module Модуль SPI @ref MY_LIBS_SPI +- Базовая инициализация SPI и пинов одной функцией (@ref SPI_Base_Init) + +@subsection structure Структура проекта + +@code +├── inc/ # Заголовочные файлы +│ ├── mylibs_include.h # Главный include файл +│ ├── mylibs_config.h # Конфигурация библиотек +│ ├── mylibs_defs.h # Общие определения и макросы +│ ├── bit_access.h # Битовый доступ к регистрам +│ ├── evolve_optimizer.h # Оптимизатор (генетический алгоритм) +│ ├── trackers.h # Трекеры для отладки +│ ├── trace.h # Трассировка и логирование +│ ├── general_gpio.h # Работа с GPIO + ├── general_spi.h # Работа с SPI +│ └── general_tim.h # Работа с таймерами + ├── general_uart.h # Работа с UART +└── src/ # Исходные файлы + ├── general_gpio.c # Реализация GPIO + ├── general_spi.c # Реализация SPI + └── general_tim.c # Реализация TIM + ├── general_uart.c # Реализация UART +@endcode + +@subsection usage_basic Использование + +Инструкция по подключению: + +1. Настройте конфигурацию @ref MYLIBS_CONFIG в @ref mylibs_config.h + +2. Подключите главный заголовочный файл: +@code +#include "mylibs_include.h" +@endcode + +3. Используйте нужные модули в своем коде. Примеры использования приведены в соответствующей теме + + */ \ No newline at end of file diff --git a/RTT/SEGGER_RTT.c b/RTT/SEGGER_RTT.c new file mode 100644 index 0000000..6a8bde4 --- /dev/null +++ b/RTT/SEGGER_RTT.c @@ -0,0 +1,2099 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* 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 SEGGER Microcontroller 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. * +* * +********************************************************************** +* * +* RTT version: 8.10g * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT.c +Purpose : Implementation of SEGGER real-time transfer (RTT) which + allows real-time communication on targets which support + debugger memory accesses while the CPU is running. +Revision: $Rev: 29668 $ + +Additional information: + Type "int" is assumed to be 32-bits in size + H->T Host to target communication + T->H Target to host communication + + RTT channel 0 is always present and reserved for Terminal usage. + Name is fixed to "Terminal" + + Effective buffer size: SizeOfBuffer - 1 + + WrOff == RdOff: Buffer is empty + WrOff == (RdOff - 1): Buffer is full + WrOff > RdOff: Free space includes wrap-around + WrOff < RdOff: Used space includes wrap-around + (WrOff == (SizeOfBuffer - 1)) && (RdOff == 0): + Buffer full and wrap-around after next byte + + +---------------------------------------------------------------------- +*/ + +#include "SEGGER_RTT.h" + +#include // for memcpy + +/********************************************************************* +* +* Configuration, default values +* +********************************************************************** +*/ + +#if SEGGER_RTT_CPU_CACHE_LINE_SIZE + #ifdef SEGGER_RTT_CB_ALIGN + #error "Custom SEGGER_RTT_CB_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif + #ifdef SEGGER_RTT_BUFFER_ALIGN + #error "Custom SEGGER_RTT_BUFFER_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif + #ifdef SEGGER_RTT_PUT_CB_SECTION + #error "Custom SEGGER_RTT_PUT_CB_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif + #ifdef SEGGER_RTT_PUT_BUFFER_SECTION + #error "Custom SEGGER_RTT_PUT_BUFFER_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif + #ifdef SEGGER_RTT_BUFFER_ALIGNMENT + #error "Custom SEGGER_RTT_BUFFER_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif + #ifdef SEGGER_RTT_ALIGNMENT + #error "Custom SEGGER_RTT_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif +#endif + +#ifndef BUFFER_SIZE_UP + #define BUFFER_SIZE_UP 1024 // Size of the buffer for terminal output of target, up to host +#endif + +#ifndef BUFFER_SIZE_DOWN + #define BUFFER_SIZE_DOWN 16 // Size of the buffer for terminal input to target from host (Usually keyboard input) +#endif + +#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS + #define SEGGER_RTT_MAX_NUM_UP_BUFFERS 2 // Number of up-buffers (T->H) available on this target +#endif + +#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS + #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS 2 // Number of down-buffers (H->T) available on this target +#endif + +#ifndef SEGGER_RTT_BUFFER_SECTION + #if defined(SEGGER_RTT_SECTION) + #define SEGGER_RTT_BUFFER_SECTION SEGGER_RTT_SECTION + #endif +#endif + +#ifndef SEGGER_RTT_ALIGNMENT + #define SEGGER_RTT_ALIGNMENT SEGGER_RTT_CPU_CACHE_LINE_SIZE +#endif + +#ifndef SEGGER_RTT_BUFFER_ALIGNMENT + #define SEGGER_RTT_BUFFER_ALIGNMENT SEGGER_RTT_CPU_CACHE_LINE_SIZE +#endif + +#ifndef SEGGER_RTT_MODE_DEFAULT + #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP +#endif + +#ifndef SEGGER_RTT_LOCK + #define SEGGER_RTT_LOCK() +#endif + +#ifndef SEGGER_RTT_UNLOCK + #define SEGGER_RTT_UNLOCK() +#endif + +#ifndef STRLEN + #define STRLEN(a) strlen((a)) +#endif + +#ifndef STRCPY + #define STRCPY(pDest, pSrc) strcpy((pDest), (pSrc)) +#endif + +#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP + #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 +#endif + +#ifndef SEGGER_RTT_MEMCPY + #ifdef MEMCPY + #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) MEMCPY((pDest), (pSrc), (NumBytes)) + #else + #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) memcpy((pDest), (pSrc), (NumBytes)) + #endif +#endif + +#ifndef MIN + #define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX + #define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ +#if (defined __ICCARM__) || (defined __ICCRX__) + #define RTT_PRAGMA(P) _Pragma(#P) +#endif + +#if SEGGER_RTT_ALIGNMENT || SEGGER_RTT_BUFFER_ALIGNMENT + #if ((defined __GNUC__) || (defined __clang__)) + #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) + #elif (defined __ICCARM__) || (defined __ICCRX__) + #define PRAGMA(A) _Pragma(#A) +#define SEGGER_RTT_ALIGN(Var, Alignment) RTT_PRAGMA(data_alignment=Alignment) \ + Var + #elif (defined __CC_ARM) + #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) + #else + #error "Alignment not supported for this compiler." + #endif +#else + #define SEGGER_RTT_ALIGN(Var, Alignment) Var +#endif + +#if defined(SEGGER_RTT_SECTION) || defined (SEGGER_RTT_BUFFER_SECTION) + #if ((defined __GNUC__) || (defined __clang__)) + #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section))) Var + #elif (defined __ICCARM__) || (defined __ICCRX__) +#define SEGGER_RTT_PUT_SECTION(Var, Section) RTT_PRAGMA(location=Section) \ + Var + #elif (defined __CC_ARM) + #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section), zero_init)) Var + #else + #error "Section placement not supported for this compiler." + #endif +#else + #define SEGGER_RTT_PUT_SECTION(Var, Section) Var +#endif + +#if SEGGER_RTT_ALIGNMENT + #define SEGGER_RTT_CB_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_ALIGNMENT) +#else + #define SEGGER_RTT_CB_ALIGN(Var) Var +#endif + +#if SEGGER_RTT_BUFFER_ALIGNMENT + #define SEGGER_RTT_BUFFER_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_BUFFER_ALIGNMENT) +#else + #define SEGGER_RTT_BUFFER_ALIGN(Var) Var +#endif + + +#if defined(SEGGER_RTT_SECTION) + #define SEGGER_RTT_PUT_CB_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_SECTION) +#else + #define SEGGER_RTT_PUT_CB_SECTION(Var) Var +#endif + +#if defined(SEGGER_RTT_BUFFER_SECTION) + #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_BUFFER_SECTION) +#else + #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) Var +#endif + +/********************************************************************* +* +* Static const data +* +********************************************************************** +*/ + +static const unsigned char _aTerminalId[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ + +// +// RTT Control Block and allocate buffers for channel 0 +// +#if SEGGER_RTT_CPU_CACHE_LINE_SIZE + #if ((defined __GNUC__) || (defined __clang__)) + SEGGER_RTT_CB _SEGGER_RTT __attribute__ ((aligned (SEGGER_RTT_CPU_CACHE_LINE_SIZE))); + static char _acUpBuffer [SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_UP)] __attribute__ ((aligned (SEGGER_RTT_CPU_CACHE_LINE_SIZE))); + static char _acDownBuffer[SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_DOWN)] __attribute__ ((aligned (SEGGER_RTT_CPU_CACHE_LINE_SIZE))); + #elif (defined __ICCARM__) + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + SEGGER_RTT_CB _SEGGER_RTT; + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _acUpBuffer [SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_UP)]; + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _acDownBuffer[SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_DOWN)]; + #else + #error "Don't know how to place _SEGGER_RTT, _acUpBuffer, _acDownBuffer cache-line aligned" + #endif +#else + SEGGER_RTT_PUT_CB_SECTION(SEGGER_RTT_CB_ALIGN(SEGGER_RTT_CB _SEGGER_RTT)); + SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acUpBuffer [BUFFER_SIZE_UP])); + SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acDownBuffer[BUFFER_SIZE_DOWN])); +#endif + +static unsigned char _ActiveTerminal; + +/********************************************************************* +* +* Static functions +* +********************************************************************** +*/ + +/********************************************************************* +* +* _DoInit() +* +* Function description +* Initializes the control block an buffers. +* +* Notes +* (1) May only be called via INIT() to avoid overriding settings. +* The only exception is SEGGER_RTT_Init(), to make an intentional override possible. +*/ + #define INIT() \ + do { \ + volatile SEGGER_RTT_CB* pRTTCBInit; \ + pRTTCBInit = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); \ + if (pRTTCBInit->acID[0] != 'S') { \ + _DoInit(); \ + } \ + } while (0) + +static void _DoInit(void) { + volatile SEGGER_RTT_CB* p; // Volatile to make sure that compiler cannot change the order of accesses to the control block + static const char _aInitStr[] = "\0\0\0\0\0\0TTR REGGES"; // Init complete ID string to make sure that things also work if RTT is linked to a no-init memory area + unsigned i; + // + // Initialize control block + // + p = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access control block uncached so that nothing in the cache ever becomes dirty and all changes are visible in HW directly + memset((SEGGER_RTT_CB*)p, 0, sizeof(_SEGGER_RTT)); // Make sure that the RTT CB is always zero initialized. + p->MaxNumUpBuffers = SEGGER_RTT_MAX_NUM_UP_BUFFERS; + p->MaxNumDownBuffers = SEGGER_RTT_MAX_NUM_DOWN_BUFFERS; + // + // Initialize up buffer 0 + // + p->aUp[0].sName = "Terminal"; + p->aUp[0].pBuffer = _acUpBuffer; + p->aUp[0].SizeOfBuffer = BUFFER_SIZE_UP; + p->aUp[0].RdOff = 0u; + p->aUp[0].WrOff = 0u; + p->aUp[0].Flags = SEGGER_RTT_MODE_DEFAULT; + // + // Initialize down buffer 0 + // + p->aDown[0].sName = "Terminal"; + p->aDown[0].pBuffer = _acDownBuffer; + p->aDown[0].SizeOfBuffer = BUFFER_SIZE_DOWN; + p->aDown[0].RdOff = 0u; + p->aDown[0].WrOff = 0u; + p->aDown[0].Flags = SEGGER_RTT_MODE_DEFAULT; + // + // Finish initialization of the control block. + // Copy Id string backwards to make sure that "SEGGER RTT" is not found in initializer memory (usually flash), + // as this would cause J-Link to "find" the control block at a wrong address. + // + RTT__DMB(); // Force order of memory accesses for cores that may perform out-of-order memory accesses + for (i = 0; i < sizeof(_aInitStr) - 1; ++i) { + p->acID[i] = _aInitStr[sizeof(_aInitStr) - 2 - i]; // Skip terminating \0 at the end of the array + } + RTT__DMB(); // Force order of memory accesses for cores that may perform out-of-order memory accesses +} + +/********************************************************************* +* +* _WriteBlocking() +* +* Function description +* Stores a specified number of characters in SEGGER RTT ring buffer +* and updates the associated write pointer which is periodically +* read by the host. +* The caller is responsible for managing the write chunk sizes as +* _WriteBlocking() will block until all data has been posted successfully. +* +* Parameters +* pRing Ring buffer to post to. +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* >= 0 - Number of bytes written into buffer. +*/ +static unsigned _WriteBlocking(SEGGER_RTT_BUFFER_UP* pRing, const char* pBuffer, unsigned NumBytes) { + unsigned NumBytesToWrite; + unsigned NumBytesWritten; + unsigned RdOff; + unsigned WrOff; + volatile char* pDst; + // + // Write data to buffer and handle wrap-around if necessary + // + NumBytesWritten = 0u; + WrOff = pRing->WrOff; + do { + RdOff = pRing->RdOff; // May be changed by host (debug probe) in the meantime + if (RdOff > WrOff) { + NumBytesToWrite = RdOff - WrOff - 1u; + } else { + NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u); + } + NumBytesToWrite = MIN(NumBytesToWrite, (pRing->SizeOfBuffer - WrOff)); // Number of bytes that can be written until buffer wrap-around + NumBytesToWrite = MIN(NumBytesToWrite, NumBytes); + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesWritten += NumBytesToWrite; + NumBytes -= NumBytesToWrite; + WrOff += NumBytesToWrite; + while (NumBytesToWrite--) { + *pDst++ = *pBuffer++; + }; +#else + SEGGER_RTT_MEMCPY((void*)pDst, pBuffer, NumBytesToWrite); + NumBytesWritten += NumBytesToWrite; + pBuffer += NumBytesToWrite; + NumBytes -= NumBytesToWrite; + WrOff += NumBytesToWrite; +#endif + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0u; + } + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff; + } while (NumBytes); + return NumBytesWritten; +} + +/********************************************************************* +* +* _WriteNoCheck() +* +* Function description +* Stores a specified number of characters in SEGGER RTT ring buffer +* and updates the associated write pointer which is periodically +* read by the host. +* It is callers responsibility to make sure data actually fits in buffer. +* +* Parameters +* pRing Ring buffer to post to. +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Notes +* (1) If there might not be enough space in the "Up"-buffer, call _WriteBlocking +*/ +static void _WriteNoCheck(SEGGER_RTT_BUFFER_UP* pRing, const char* pData, unsigned NumBytes) { + unsigned NumBytesAtOnce; + unsigned WrOff; + unsigned Rem; + volatile char* pDst; + + WrOff = pRing->WrOff; + Rem = pRing->SizeOfBuffer - WrOff; + if (Rem > NumBytes) { + // + // All data fits before wrap around + // + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + WrOff += NumBytes; + while (NumBytes--) { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff; +#else + SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytes); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff + NumBytes; +#endif + } else { + // + // We reach the end of the buffer, so need to wrap around + // +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; + NumBytesAtOnce = Rem; + while (NumBytesAtOnce--) { + *pDst++ = *pData++; + }; + pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; + NumBytesAtOnce = NumBytes - Rem; + while (NumBytesAtOnce--) { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = NumBytes - Rem; +#else + NumBytesAtOnce = Rem; + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; + SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytesAtOnce); + NumBytesAtOnce = NumBytes - Rem; + pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; + SEGGER_RTT_MEMCPY((void*)pDst, pData + Rem, NumBytesAtOnce); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = NumBytesAtOnce; +#endif + } +} + +/********************************************************************* +* +* _PostTerminalSwitch() +* +* Function description +* Switch terminal to the given terminal ID. It is the caller's +* responsibility to ensure the terminal ID is correct and there is +* enough space in the buffer for this to complete successfully. +* +* Parameters +* pRing Ring buffer to post to. +* TerminalId Terminal ID to switch to. +*/ +static void _PostTerminalSwitch(SEGGER_RTT_BUFFER_UP* pRing, unsigned char TerminalId) { + unsigned char ac[2]; + + ac[0] = 0xFFu; + ac[1] = _aTerminalId[TerminalId]; // Caller made already sure that TerminalId does not exceed our terminal limit + _WriteBlocking(pRing, (const char*)ac, 2u); +} + +/********************************************************************* +* +* _GetAvailWriteSpace() +* +* Function description +* Returns the number of bytes that can be written to the ring +* buffer without blocking. +* +* Parameters +* pRing Ring buffer to check. +* +* Return value +* Number of bytes that are free in the buffer. +*/ +static unsigned _GetAvailWriteSpace(SEGGER_RTT_BUFFER_UP* pRing) { + unsigned RdOff; + unsigned WrOff; + unsigned r; + // + // Avoid warnings regarding volatile access order. It's not a problem + // in this case, but dampen compiler enthusiasm. + // + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + if (RdOff <= WrOff) { + r = pRing->SizeOfBuffer - 1u - WrOff + RdOff; + } else { + r = RdOff - WrOff - 1u; + } + return r; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* SEGGER_RTT_ReadUpBufferNoLock() +* +* Function description +* Reads characters from SEGGER real-time-terminal control block +* which have been previously stored by the application. +* Do not lock against interrupts and multiple access. +* Used to do the same operation that J-Link does, to transfer +* RTT data via other channels, such as TCP/IP or UART. +* +* Parameters +* BufferIndex Index of Up-buffer to be used. +* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to. +* BufferSize Size of the target application buffer. +* +* Return value +* Number of bytes that have been read. +* +* Additional information +* This function must not be called when J-Link might also do RTT. +*/ +unsigned SEGGER_RTT_ReadUpBufferNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) { + unsigned NumBytesRem; + unsigned NumBytesRead; + unsigned RdOff; + unsigned WrOff; + unsigned char* pBuffer; + SEGGER_RTT_BUFFER_UP* pRing; + volatile char* pSrc; + + INIT(); + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + pBuffer = (unsigned char*)pData; + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + NumBytesRead = 0u; + // + // Read from current read position to wrap-around of buffer, first + // + if (RdOff > WrOff) { + NumBytesRem = pRing->SizeOfBuffer - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + // + // Handle wrap-around of buffer + // + if (RdOff == pRing->SizeOfBuffer) { + RdOff = 0u; + } + } + // + // Read remaining items of buffer + // + NumBytesRem = WrOff - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + if (NumBytesRem > 0u) { + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + } + // + // Update read offset of buffer + // + if (NumBytesRead) { + pRing->RdOff = RdOff; + } + // + return NumBytesRead; +} + +/********************************************************************* +* +* SEGGER_RTT_ReadNoLock() +* +* Function description +* Reads characters from SEGGER real-time-terminal control block +* which have been previously stored by the host. +* Do not lock against interrupts and multiple access. +* +* Parameters +* BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. +* BufferSize Size of the target application buffer. +* +* Return value +* Number of bytes that have been read. +*/ +unsigned SEGGER_RTT_ReadNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) { + unsigned NumBytesRem; + unsigned NumBytesRead; + unsigned RdOff; + unsigned WrOff; + unsigned char* pBuffer; + SEGGER_RTT_BUFFER_DOWN* pRing; + volatile char* pSrc; + // + INIT(); + pRing = (SEGGER_RTT_BUFFER_DOWN*)((uintptr_t)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + pBuffer = (unsigned char*)pData; + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + NumBytesRead = 0u; + // + // Read from current read position to wrap-around of buffer, first + // + if (RdOff > WrOff) { + NumBytesRem = pRing->SizeOfBuffer - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + // + // Handle wrap-around of buffer + // + if (RdOff == pRing->SizeOfBuffer) { + RdOff = 0u; + } + } + // + // Read remaining items of buffer + // + NumBytesRem = WrOff - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + if (NumBytesRem > 0u) { + pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + } + if (NumBytesRead) { + pRing->RdOff = RdOff; + } + // + return NumBytesRead; +} + +/********************************************************************* +* +* SEGGER_RTT_ReadUpBuffer +* +* Function description +* Reads characters from SEGGER real-time-terminal control block +* which have been previously stored by the application. +* Used to do the same operation that J-Link does, to transfer +* RTT data via other channels, such as TCP/IP or UART. +* +* Parameters +* BufferIndex Index of Up-buffer to be used. +* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to. +* BufferSize Size of the target application buffer. +* +* Return value +* Number of bytes that have been read. +* +* Additional information +* This function must not be called when J-Link might also do RTT. +* This function locks against all other RTT operations. I.e. during +* the read operation, writing is also locked. +* If only one consumer reads from the up buffer, +* call sEGGER_RTT_ReadUpBufferNoLock() instead. +*/ +unsigned SEGGER_RTT_ReadUpBuffer(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) { + unsigned NumBytesRead; + + SEGGER_RTT_LOCK(); + // + // Call the non-locking read function + // + NumBytesRead = SEGGER_RTT_ReadUpBufferNoLock(BufferIndex, pBuffer, BufferSize); + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return NumBytesRead; +} + +/********************************************************************* +* +* SEGGER_RTT_Read +* +* Function description +* Reads characters from SEGGER real-time-terminal control block +* which have been previously stored by the host. +* +* Parameters +* BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. +* BufferSize Size of the target application buffer. +* +* Return value +* Number of bytes that have been read. +*/ +unsigned SEGGER_RTT_Read(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) { + unsigned NumBytesRead; + + SEGGER_RTT_LOCK(); + // + // Call the non-locking read function + // + NumBytesRead = SEGGER_RTT_ReadNoLock(BufferIndex, pBuffer, BufferSize); + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return NumBytesRead; +} + +/********************************************************************* +* +* SEGGER_RTT_WriteWithOverwriteNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block. +* SEGGER_RTT_WriteWithOverwriteNoLock does not lock the application +* and overwrites data if the data does not fit into the buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, data is overwritten. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +* (3) Do not use SEGGER_RTT_WriteWithOverwriteNoLock if a J-Link +* connection reads RTT data. +*/ +void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + const char* pData; + SEGGER_RTT_BUFFER_UP* pRing; + unsigned Avail; + volatile char* pDst; + // + // Get "to-host" ring buffer and copy some elements into local variables. + // + pData = (const char *)pBuffer; + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // Check if we will overwrite data and need to adjust the RdOff. + // + if (pRing->WrOff == pRing->RdOff) { + Avail = pRing->SizeOfBuffer - 1u; + } else if ( pRing->WrOff < pRing->RdOff) { + Avail = pRing->RdOff - pRing->WrOff - 1u; + } else { + Avail = pRing->RdOff - pRing->WrOff - 1u + pRing->SizeOfBuffer; + } + if (NumBytes > Avail) { + pRing->RdOff += (NumBytes - Avail); + while (pRing->RdOff >= pRing->SizeOfBuffer) { + pRing->RdOff -= pRing->SizeOfBuffer; + } + } + // + // Write all data, no need to check the RdOff, but possibly handle multiple wrap-arounds + // + Avail = pRing->SizeOfBuffer - pRing->WrOff; + do { + if (Avail > NumBytes) { + // + // Last round + // + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + Avail = NumBytes; + while (NumBytes--) { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff += Avail; +#else + SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytes); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff += NumBytes; +#endif + break; + } else { + // + // Wrap-around necessary, write until wrap-around and reset WrOff + // + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + NumBytes -= Avail; + while (Avail--) { + *pDst++ = *pData++; + }; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = 0; +#else + SEGGER_RTT_MEMCPY((void*)pDst, pData, Avail); + pData += Avail; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = 0; + NumBytes -= Avail; +#endif + Avail = (pRing->SizeOfBuffer - 1); + } + } while (NumBytes); +} + +/********************************************************************* +* +* SEGGER_RTT_WriteSkipNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block which is then read by the host. +* SEGGER_RTT_WriteSkipNoLock does not lock the application and +* skips all data, if the data does not fit into the buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* MUST be > 0!!! +* This is done for performance reasons, so no initial check has do be done. +* +* Return value +* 1: Data has been copied +* 0: No space, data has not been copied +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, all data is dropped. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +*/ +#if (RTT_USE_ASM == 0) +unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + const char* pData; + SEGGER_RTT_BUFFER_UP* pRing; + unsigned Avail; + unsigned RdOff; + unsigned WrOff; + unsigned Rem; + volatile char* pDst; + // + // Cases: + // 1) RdOff <= WrOff => Space until wrap-around is sufficient + // 2) RdOff <= WrOff => Space after wrap-around needed (copy in 2 chunks) + // 3) RdOff < WrOff => No space in buf + // 4) RdOff > WrOff => Space is sufficient + // 5) RdOff > WrOff => No space in buf + // + // 1) is the most common case for large buffers and assuming that J-Link reads the data fast enough + // + pData = (const char *)pBuffer; + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF; + if (RdOff <= WrOff) { // Case 1), 2) or 3) + Avail = pRing->SizeOfBuffer - WrOff - 1u; // Space until wrap-around (assume 1 byte not usable for case that RdOff == 0) + if (Avail >= NumBytes) { // Case 1)? + memcpy((void*)pDst, pData, NumBytes); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff + NumBytes; + return 1; + } + Avail += RdOff; // Space incl. wrap-around + if (Avail >= NumBytes) { // Case 2? => If not, we have case 3) (does not fit) + Rem = pRing->SizeOfBuffer - WrOff; // Space until end of buffer + memcpy((void*)pDst, pData, Rem); // Copy 1st chunk + NumBytes -= Rem; + // + // Special case: First check that assumed RdOff == 0 calculated that last element before wrap-around could not be used + // But 2nd check (considering space until wrap-around and until RdOff) revealed that RdOff is not 0, so we can use the last element + // In this case, we may use a copy straight until buffer end anyway without needing to copy 2 chunks + // Therefore, check if 2nd memcpy is necessary at all + // + if (NumBytes) { + pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF; + memcpy((void*)pDst, pData + Rem, NumBytes); + } + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = NumBytes; + return 1; + } + } else { // Potential case 4) + Avail = RdOff - WrOff - 1u; + if (Avail >= NumBytes) { // Case 4)? => If not, we have case 5) (does not fit) + memcpy((void*)pDst, pData, NumBytes); + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff + NumBytes; + return 1; + } + } + return 0; // No space in buffer +} +#endif + +/********************************************************************* +* +* SEGGER_RTT_WriteDownBufferNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block inside a buffer. +* SEGGER_RTT_WriteDownBufferNoLock does not lock the application. +* Used to do the same operation that J-Link does, to transfer +* RTT data from other channels, such as TCP/IP or UART. +* +* Parameters +* BufferIndex Index of "Down"-buffer to be used. +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* Number of bytes which have been stored in the "Down"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +* +* Additional information +* This function must not be called when J-Link might also do RTT. +*/ +unsigned SEGGER_RTT_WriteDownBufferNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + unsigned Status; + unsigned Avail; + const char* pData; + SEGGER_RTT_BUFFER_UP* pRing; + // + // Get "to-target" ring buffer. + // It is save to cast that to a "to-host" buffer. Up and Down buffer differ in volatility of offsets that might be modified by J-Link. + // + pData = (const char *)pBuffer; + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // How we output depends upon the mode... + // + switch (pRing->Flags) { + case SEGGER_RTT_MODE_NO_BLOCK_SKIP: + // + // If we are in skip mode and there is no space for the whole + // of this output, don't bother. + // + Avail = _GetAvailWriteSpace(pRing); + if (Avail < NumBytes) { + Status = 0u; + } else { + Status = NumBytes; + _WriteNoCheck(pRing, pData, NumBytes); + } + break; + case SEGGER_RTT_MODE_NO_BLOCK_TRIM: + // + // If we are in trim mode, trim to what we can output without blocking. + // + Avail = _GetAvailWriteSpace(pRing); + Status = Avail < NumBytes ? Avail : NumBytes; + _WriteNoCheck(pRing, pData, Status); + break; + case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: + // + // If we are in blocking mode, output everything. + // + Status = _WriteBlocking(pRing, pData, NumBytes); + break; + default: + Status = 0u; + break; + } + // + // Finish up. + // + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_WriteNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block which is then read by the host. +* SEGGER_RTT_WriteNoLock does not lock the application. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +*/ +unsigned SEGGER_RTT_WriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + unsigned Status; + unsigned Avail; + const char* pData; + SEGGER_RTT_BUFFER_UP* pRing; + // + // Get "to-host" ring buffer. + // + pData = (const char *)pBuffer; + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // How we output depends upon the mode... + // + switch (pRing->Flags) { + case SEGGER_RTT_MODE_NO_BLOCK_SKIP: + // + // If we are in skip mode and there is no space for the whole + // of this output, don't bother. + // + Avail = _GetAvailWriteSpace(pRing); + if (Avail < NumBytes) { + Status = 0u; + } else { + Status = NumBytes; + _WriteNoCheck(pRing, pData, NumBytes); + } + break; + case SEGGER_RTT_MODE_NO_BLOCK_TRIM: + // + // If we are in trim mode, trim to what we can output without blocking. + // + Avail = _GetAvailWriteSpace(pRing); + Status = Avail < NumBytes ? Avail : NumBytes; + _WriteNoCheck(pRing, pData, Status); + break; + case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: + // + // If we are in blocking mode, output everything. + // + Status = _WriteBlocking(pRing, pData, NumBytes); + break; + default: + Status = 0u; + break; + } + // + // Finish up. + // + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_WriteDownBuffer +* +* Function description +* Stores a specified number of characters in SEGGER RTT control block in a buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* Number of bytes which have been stored in the "Down"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +* +* Additional information +* This function must not be called when J-Link might also do RTT. +* This function locks against all other RTT operations. I.e. during +* the write operation, writing from the application is also locked. +* If only one consumer writes to the down buffer, +* call SEGGER_RTT_WriteDownBufferNoLock() instead. +*/ +unsigned SEGGER_RTT_WriteDownBuffer(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + unsigned Status; + + INIT(); + SEGGER_RTT_LOCK(); + Status = SEGGER_RTT_WriteDownBufferNoLock(BufferIndex, pBuffer, NumBytes); // Call the non-locking write function + SEGGER_RTT_UNLOCK(); + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_Write +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block which is then read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +*/ +unsigned SEGGER_RTT_Write(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + unsigned Status; + + INIT(); + SEGGER_RTT_LOCK(); + Status = SEGGER_RTT_WriteNoLock(BufferIndex, pBuffer, NumBytes); // Call the non-locking write function + SEGGER_RTT_UNLOCK(); + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_WriteString +* +* Function description +* Stores string in SEGGER RTT control block. +* This data is read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* s Pointer to string. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +* (2) String passed to this function has to be \0 terminated +* (3) \0 termination character is *not* stored in RTT buffer +*/ +unsigned SEGGER_RTT_WriteString(unsigned BufferIndex, const char* s) { + unsigned Len; + + Len = STRLEN(s); + return SEGGER_RTT_Write(BufferIndex, s, Len); +} + +/********************************************************************* +* +* SEGGER_RTT_PutCharSkipNoLock +* +* Function description +* Stores a single character/byte in SEGGER RTT buffer. +* SEGGER_RTT_PutCharSkipNoLock does not lock the application and +* skips the byte, if it does not fit into the buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* c Byte to be stored. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, the character is dropped. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +*/ + +unsigned SEGGER_RTT_PutCharSkipNoLock(unsigned BufferIndex, char c) { + SEGGER_RTT_BUFFER_UP* pRing; + unsigned WrOff; + unsigned Status; + volatile char* pDst; + // + // Get "to-host" ring buffer. + // + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0; + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) { + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; + *pDst = c; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff; + Status = 1; + } else { + Status = 0; + } + // + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_PutCharSkip +* +* Function description +* Stores a single character/byte in SEGGER RTT buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* c Byte to be stored. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, the character is dropped. +*/ + +unsigned SEGGER_RTT_PutCharSkip(unsigned BufferIndex, char c) { + SEGGER_RTT_BUFFER_UP* pRing; + unsigned WrOff; + unsigned Status; + volatile char* pDst; + // + // Prepare + // + INIT(); + SEGGER_RTT_LOCK(); + // + // Get "to-host" ring buffer. + // + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0; + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) { + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; + *pDst = c; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff; + Status = 1; + } else { + Status = 0; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return Status; +} + + /********************************************************************* +* +* SEGGER_RTT_PutChar +* +* Function description +* Stores a single character/byte in SEGGER RTT buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* c Byte to be stored. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +*/ + +unsigned SEGGER_RTT_PutChar(unsigned BufferIndex, char c) { + SEGGER_RTT_BUFFER_UP* pRing; + unsigned WrOff; + unsigned Status; + volatile char* pDst; + // + // Prepare + // + INIT(); + SEGGER_RTT_LOCK(); + // + // Get "to-host" ring buffer. + // + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0; + } + // + // Wait for free space if mode is set to blocking + // + if (pRing->Flags == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) { + while (WrOff == pRing->RdOff) { + ; + } + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) { + pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF; + *pDst = c; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + pRing->WrOff = WrOff; + Status = 1; + } else { + Status = 0; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_GetKey +* +* Function description +* Reads one character from the SEGGER RTT buffer. +* Host has previously stored data there. +* +* Return value +* < 0 - No character available (buffer empty). +* >= 0 - Character which has been read. (Possible values: 0 - 255) +* +* Notes +* (1) This function is only specified for accesses to RTT buffer 0. +*/ +int SEGGER_RTT_GetKey(void) { + char c; + int r; + + r = (int)SEGGER_RTT_Read(0u, &c, 1u); + if (r == 1) { + r = (int)(unsigned char)c; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_WaitKey +* +* Function description +* Waits until at least one character is avaible in the SEGGER RTT buffer. +* Once a character is available, it is read and this function returns. +* +* Return value +* >=0 - Character which has been read. +* +* Notes +* (1) This function is only specified for accesses to RTT buffer 0 +* (2) This function is blocking if no character is present in RTT buffer +*/ +int SEGGER_RTT_WaitKey(void) { + int r; + + do { + r = SEGGER_RTT_GetKey(); + } while (r < 0); + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_HasKey +* +* Function description +* Checks if at least one character for reading is available in the SEGGER RTT buffer. +* +* Return value +* == 0 - No characters are available to read. +* == 1 - At least one character is available. +* +* Notes +* (1) This function is only specified for accesses to RTT buffer 0 +*/ +int SEGGER_RTT_HasKey(void) { + SEGGER_RTT_BUFFER_DOWN* pRing; + unsigned RdOff; + int r; + + INIT(); + pRing = (SEGGER_RTT_BUFFER_DOWN*)((uintptr_t)&_SEGGER_RTT.aDown[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + RdOff = pRing->RdOff; + if (RdOff != pRing->WrOff) { + r = 1; + } else { + r = 0; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_HasData +* +* Function description +* Check if there is data from the host in the given buffer. +* +* Return value: +* ==0: No data +* !=0: Data in buffer +* +*/ +unsigned SEGGER_RTT_HasData(unsigned BufferIndex) { + SEGGER_RTT_BUFFER_DOWN* pRing; + unsigned v; + + pRing = (SEGGER_RTT_BUFFER_DOWN*)((uintptr_t)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + v = pRing->WrOff; + return v - pRing->RdOff; +} + +/********************************************************************* +* +* SEGGER_RTT_HasDataUp +* +* Function description +* Check if there is data remaining to be sent in the given buffer. +* +* Return value: +* ==0: No data +* !=0: Data in buffer +* +*/ +unsigned SEGGER_RTT_HasDataUp(unsigned BufferIndex) { + SEGGER_RTT_BUFFER_UP* pRing; + unsigned v; + + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + v = pRing->RdOff; + return pRing->WrOff - v; +} + +/********************************************************************* +* +* SEGGER_RTT_AllocDownBuffer +* +* Function description +* Run-time configuration of the next down-buffer (H->T). +* The next buffer, which is not used yet is configured. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode. +* +* Return value +* >= 0 - O.K. Buffer Index +* < 0 - Error +*/ +int SEGGER_RTT_AllocDownBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int BufferIndex; + volatile SEGGER_RTT_CB* pRTTCB; + + INIT(); + SEGGER_RTT_LOCK(); + pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + BufferIndex = 0; + do { + if (pRTTCB->aDown[BufferIndex].pBuffer == NULL) { + break; + } + BufferIndex++; + } while (BufferIndex < pRTTCB->MaxNumDownBuffers); + if (BufferIndex < pRTTCB->MaxNumDownBuffers) { + pRTTCB->aDown[BufferIndex].sName = sName; + pRTTCB->aDown[BufferIndex].pBuffer = (char*)pBuffer; + pRTTCB->aDown[BufferIndex].SizeOfBuffer = BufferSize; + pRTTCB->aDown[BufferIndex].RdOff = 0u; + pRTTCB->aDown[BufferIndex].WrOff = 0u; + pRTTCB->aDown[BufferIndex].Flags = Flags; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + } else { + BufferIndex = -1; + } + SEGGER_RTT_UNLOCK(); + return BufferIndex; +} + +/********************************************************************* +* +* SEGGER_RTT_AllocUpBuffer +* +* Function description +* Run-time configuration of the next up-buffer (T->H). +* The next buffer, which is not used yet is configured. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode. +* +* Return value +* >= 0 - O.K. Buffer Index +* < 0 - Error +*/ +int SEGGER_RTT_AllocUpBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int BufferIndex; + volatile SEGGER_RTT_CB* pRTTCB; + + INIT(); + SEGGER_RTT_LOCK(); + pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + BufferIndex = 0; + do { + if (pRTTCB->aUp[BufferIndex].pBuffer == NULL) { + break; + } + BufferIndex++; + } while (BufferIndex < pRTTCB->MaxNumUpBuffers); + if (BufferIndex < pRTTCB->MaxNumUpBuffers) { + pRTTCB->aUp[BufferIndex].sName = sName; + pRTTCB->aUp[BufferIndex].pBuffer = (char*)pBuffer; + pRTTCB->aUp[BufferIndex].SizeOfBuffer = BufferSize; + pRTTCB->aUp[BufferIndex].RdOff = 0u; + pRTTCB->aUp[BufferIndex].WrOff = 0u; + pRTTCB->aUp[BufferIndex].Flags = Flags; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + } else { + BufferIndex = -1; + } + SEGGER_RTT_UNLOCK(); + return BufferIndex; +} + +/********************************************************************* +* +* SEGGER_RTT_ConfigUpBuffer +* +* Function description +* Run-time configuration of a specific up-buffer (T->H). +* Buffer to be configured is specified by index. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* BufferIndex Index of the buffer to configure. +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode. +* +* Return value +* >= 0 - O.K. +* < 0 - Error +* +* Additional information +* Buffer 0 is configured on compile-time. +* May only be called once per buffer. +* Buffer name and flags can be reconfigured using the appropriate functions. +*/ +int SEGGER_RTT_ConfigUpBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + volatile SEGGER_RTT_BUFFER_UP* pUp; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) { + SEGGER_RTT_LOCK(); + pUp = &pRTTCB->aUp[BufferIndex]; + if (BufferIndex) { + pUp->sName = sName; + pUp->pBuffer = (char*)pBuffer; + pUp->SizeOfBuffer = BufferSize; + pUp->RdOff = 0u; + pUp->WrOff = 0u; + } + pUp->Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_ConfigDownBuffer +* +* Function description +* Run-time configuration of a specific down-buffer (H->T). +* Buffer to be configured is specified by index. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* BufferIndex Index of the buffer to configure. +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode. +* +* Return value +* >= 0 O.K. +* < 0 Error +* +* Additional information +* Buffer 0 is configured on compile-time. +* May only be called once per buffer. +* Buffer name and flags can be reconfigured using the appropriate functions. +*/ +int SEGGER_RTT_ConfigDownBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + volatile SEGGER_RTT_BUFFER_DOWN* pDown; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) { + SEGGER_RTT_LOCK(); + pDown = &pRTTCB->aDown[BufferIndex]; + if (BufferIndex) { + pDown->sName = sName; + pDown->pBuffer = (char*)pBuffer; + pDown->SizeOfBuffer = BufferSize; + pDown->RdOff = 0u; + pDown->WrOff = 0u; + } + pDown->Flags = Flags; + RTT__DMB(); // Force data write to be complete before writing the , in case CPU is allowed to change the order of memory accesses + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetNameUpBuffer +* +* Function description +* Run-time configuration of a specific up-buffer name (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer to renamed. +* sName Pointer to a constant name string. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetNameUpBuffer(unsigned BufferIndex, const char* sName) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + volatile SEGGER_RTT_BUFFER_UP* pUp; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) { + SEGGER_RTT_LOCK(); + pUp = &pRTTCB->aUp[BufferIndex]; + pUp->sName = sName; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetNameDownBuffer +* +* Function description +* Run-time configuration of a specific Down-buffer name (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer to renamed. +* sName Pointer to a constant name string. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetNameDownBuffer(unsigned BufferIndex, const char* sName) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + volatile SEGGER_RTT_BUFFER_DOWN* pDown; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) { + SEGGER_RTT_LOCK(); + pDown = &pRTTCB->aDown[BufferIndex]; + pDown->sName = sName; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetFlagsUpBuffer +* +* Function description +* Run-time configuration of specific up-buffer flags (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer. +* Flags Flags to set for the buffer. +* Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetFlagsUpBuffer(unsigned BufferIndex, unsigned Flags) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + volatile SEGGER_RTT_BUFFER_UP* pUp; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) { + SEGGER_RTT_LOCK(); + pUp = &pRTTCB->aUp[BufferIndex]; + pUp->Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetFlagsDownBuffer +* +* Function description +* Run-time configuration of specific Down-buffer flags (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer to renamed. +* Flags Flags to set for the buffer. +* Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetFlagsDownBuffer(unsigned BufferIndex, unsigned Flags) { + int r; + volatile SEGGER_RTT_CB* pRTTCB; + volatile SEGGER_RTT_BUFFER_DOWN* pDown; + + INIT(); + pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) { + SEGGER_RTT_LOCK(); + pDown = &pRTTCB->aDown[BufferIndex]; + pDown->Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_Init +* +* Function description +* Initializes the RTT Control Block. +* Should be used in RAM targets, at start of the application. +* +*/ +void SEGGER_RTT_Init (void) { + _DoInit(); +} + +/********************************************************************* +* +* SEGGER_RTT_SetTerminal +* +* Function description +* Sets the terminal to be used for output on channel 0. +* +* Parameters +* TerminalId Index of the terminal. +* +* Return value +* >= 0 O.K. +* < 0 Error (e.g. if RTT is configured for non-blocking mode and there was no space in the buffer to set the new terminal Id) +* +* Notes +* (1) Buffer 0 is always reserved for terminal I/O, so we can use index 0 here, fixed +*/ +int SEGGER_RTT_SetTerminal (unsigned char TerminalId) { + unsigned char ac[2]; + SEGGER_RTT_BUFFER_UP* pRing; + unsigned Avail; + int r; + + INIT(); + r = 0; + ac[0] = 0xFFu; + if (TerminalId < sizeof(_aTerminalId)) { // We only support a certain number of channels + ac[1] = _aTerminalId[TerminalId]; + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + SEGGER_RTT_LOCK(); // Lock to make sure that no other task is writing into buffer, while we are and number of free bytes in buffer does not change downwards after checking and before writing + if ((pRing->Flags & SEGGER_RTT_MODE_MASK) == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) { + _ActiveTerminal = TerminalId; + _WriteBlocking(pRing, (const char*)ac, 2u); + } else { // Skipping mode or trim mode? => We cannot trim this command so handling is the same for both modes + Avail = _GetAvailWriteSpace(pRing); + if (Avail >= 2) { + _ActiveTerminal = TerminalId; // Only change active terminal in case of success + _WriteNoCheck(pRing, (const char*)ac, 2u); + } else { + r = -1; + } + } + SEGGER_RTT_UNLOCK(); + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_TerminalOut +* +* Function description +* Writes a string to the given terminal +* without changing the terminal for channel 0. +* +* Parameters +* TerminalId Index of the terminal. +* s String to be printed on the terminal. +* +* Return value +* >= 0 - Number of bytes written. +* < 0 - Error. +* +*/ +int SEGGER_RTT_TerminalOut (unsigned char TerminalId, const char* s) { + int Status; + unsigned FragLen; + unsigned Avail; + SEGGER_RTT_BUFFER_UP* pRing; + // + INIT(); + // + // Validate terminal ID. + // + if (TerminalId < (char)sizeof(_aTerminalId)) { // We only support a certain number of channels + // + // Get "to-host" ring buffer. + // + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[0] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + // + // Need to be able to change terminal, write data, change back. + // Compute the fixed and variable sizes. + // + FragLen = STRLEN(s); + // + // How we output depends upon the mode... + // + SEGGER_RTT_LOCK(); + Avail = _GetAvailWriteSpace(pRing); + switch (pRing->Flags & SEGGER_RTT_MODE_MASK) { + case SEGGER_RTT_MODE_NO_BLOCK_SKIP: + // + // If we are in skip mode and there is no space for the whole + // of this output, don't bother switching terminals at all. + // + if (Avail < (FragLen + 4u)) { + Status = 0; + } else { + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, FragLen); + _PostTerminalSwitch(pRing, _ActiveTerminal); + } + break; + case SEGGER_RTT_MODE_NO_BLOCK_TRIM: + // + // If we are in trim mode and there is not enough space for everything, + // trim the output but always include the terminal switch. If no room + // for terminal switch, skip that totally. + // + if (Avail < 4u) { + Status = -1; + } else { + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, (FragLen < (Avail - 4u)) ? FragLen : (Avail - 4u)); + _PostTerminalSwitch(pRing, _ActiveTerminal); + } + break; + case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: + // + // If we are in blocking mode, output everything. + // + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, FragLen); + _PostTerminalSwitch(pRing, _ActiveTerminal); + break; + default: + Status = -1; + break; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + } else { + Status = -1; + } + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_GetAvailWriteSpace +* +* Function description +* Returns the number of bytes available in the ring buffer. +* +* Parameters +* BufferIndex Index of the up buffer. +* +* Return value +* Number of bytes that are free in the selected up buffer. +*/ +unsigned SEGGER_RTT_GetAvailWriteSpace (unsigned BufferIndex) { + SEGGER_RTT_BUFFER_UP* pRing; + + pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF); // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + return _GetAvailWriteSpace(pRing); +} + + +/********************************************************************* +* +* SEGGER_RTT_GetBytesInBuffer() +* +* Function description +* Returns the number of bytes currently used in the up buffer. +* +* Parameters +* BufferIndex Index of the up buffer. +* +* Return value +* Number of bytes that are used in the buffer. +*/ +unsigned SEGGER_RTT_GetBytesInBuffer(unsigned BufferIndex) { + unsigned RdOff; + unsigned WrOff; + unsigned r; + volatile SEGGER_RTT_CB* pRTTCB; + // + // Avoid warnings regarding volatile access order. It's not a problem + // in this case, but dampen compiler enthusiasm. + // + pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + RdOff = pRTTCB->aUp[BufferIndex].RdOff; + WrOff = pRTTCB->aUp[BufferIndex].WrOff; + if (RdOff <= WrOff) { + r = WrOff - RdOff; + } else { + r = pRTTCB->aUp[BufferIndex].SizeOfBuffer - (WrOff - RdOff); + } + return r; +} + +/*************************** End of file ****************************/ diff --git a/RTT/SEGGER_RTT.h b/RTT/SEGGER_RTT.h new file mode 100644 index 0000000..33e3c6c --- /dev/null +++ b/RTT/SEGGER_RTT.h @@ -0,0 +1,513 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* 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 SEGGER Microcontroller 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. * +* * +********************************************************************** +* * +* RTT version: 8.10g * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT.h +Purpose : Implementation of SEGGER real-time transfer which allows + real-time communication on targets which support debugger + memory accesses while the CPU is running. +Revision: $Rev: 25842 $ +---------------------------------------------------------------------- +*/ + +#ifndef SEGGER_RTT_H +#define SEGGER_RTT_H + +#include "SEGGER_RTT_Conf.h" + +/********************************************************************* +* +* Defines, defaults +* +********************************************************************** +*/ + +#ifndef RTT_USE_ASM + // + // Some cores support out-of-order memory accesses (reordering of memory accesses in the core) + // For such cores, we need to define a memory barrier to guarantee the order of certain accesses to the RTT ring buffers. + // Needed for: + // Cortex-M7 (ARMv7-M) + // Cortex-M23 (ARM-v8M) + // Cortex-M33 (ARM-v8M) + // Cortex-A/R (ARM-v7A/R) + // + // We do not explicitly check for "Embedded Studio" as the compiler in use determines what we support. + // You can use an external toolchain like IAR inside ES. So there is no point in checking for "Embedded Studio" + // + #if (defined __CROSSWORKS_ARM) // Rowley Crossworks + #define _CC_HAS_RTT_ASM_SUPPORT 1 + #if (defined __ARM_ARCH_7M__) // Cortex-M3 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #elif (defined __ARM_ARCH_7EM__) // Cortex-M4/M7 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8M_BASE__) // Cortex-M23 + #define _CORE_HAS_RTT_ASM_SUPPORT 0 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8M_MAIN__) // Cortex-M33 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined(__ARM_ARCH_8_1M_MAIN__)) // Cortex-M85 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #else + #define _CORE_HAS_RTT_ASM_SUPPORT 0 + #endif + #elif (defined __ARMCC_VERSION) + // + // ARM compiler + // ARM compiler V6.0 and later is clang based. + // Our ASM part is compatible to clang. + // + #if (__ARMCC_VERSION >= 6000000) + #define _CC_HAS_RTT_ASM_SUPPORT 1 + #else + #define _CC_HAS_RTT_ASM_SUPPORT 0 + #endif + #if (defined __ARM_ARCH_6M__) // Cortex-M0 / M1 + #define _CORE_HAS_RTT_ASM_SUPPORT 0 // No ASM support for this architecture + #elif (defined __ARM_ARCH_7M__) // Cortex-M3 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #elif (defined __ARM_ARCH_7EM__) // Cortex-M4/M7 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8M_BASE__) // Cortex-M23 + #define _CORE_HAS_RTT_ASM_SUPPORT 0 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8M_MAIN__) // Cortex-M33 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8_1M_MAIN__) // Cortex-M85 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif ((defined __ARM_ARCH_7A__) || (defined __ARM_ARCH_7R__)) // Cortex-A/R 32-bit ARMv7-A/R + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #else + #define _CORE_HAS_RTT_ASM_SUPPORT 0 + #endif + #elif ((defined __GNUC__) || (defined __clang__)) + // + // GCC / Clang + // + #define _CC_HAS_RTT_ASM_SUPPORT 1 + // ARM 7/9: __ARM_ARCH_5__ / __ARM_ARCH_5E__ / __ARM_ARCH_5T__ / __ARM_ARCH_5T__ / __ARM_ARCH_5TE__ + #if (defined __ARM_ARCH_7M__) // Cortex-M3 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #elif (defined __ARM_ARCH_7EM__) // Cortex-M4/M7 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 // Only Cortex-M7 needs a DMB but we cannot distinguish M4 and M7 here... + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8M_BASE__) // Cortex-M23 + #define _CORE_HAS_RTT_ASM_SUPPORT 0 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8M_MAIN__) // Cortex-M33 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif (defined __ARM_ARCH_8_1M_MAIN__) // Cortex-M85 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #elif ((defined __ARM_ARCH_7A__) || (defined __ARM_ARCH_7R__)) // Cortex-A/R 32-bit ARMv7-A/R + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() __asm volatile ("dmb\n" : : :); + #else + #define _CORE_HAS_RTT_ASM_SUPPORT 0 + #endif + #elif ((defined __IASMARM__) || (defined __ICCARM__)) + // + // IAR assembler/compiler + // + #define _CC_HAS_RTT_ASM_SUPPORT 1 + #if (__VER__ < 6300000) + #define VOLATILE + #else + #define VOLATILE volatile + #endif + #if (defined __ARM7M__) // Needed for old versions that do not know the define yet + #if (__CORE__ == __ARM7M__) // Cortex-M3 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #endif + #endif + #if (defined __ARM7EM__) + #if (__CORE__ == __ARM7EM__) // Cortex-M4/M7 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() asm VOLATILE ("DMB"); + #endif + #endif + #if (defined __ARM8M_BASELINE__) + #if (__CORE__ == __ARM8M_BASELINE__) // Cortex-M23 + #define _CORE_HAS_RTT_ASM_SUPPORT 0 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() asm VOLATILE ("DMB"); + #endif + #endif + #if (defined __ARM8M_MAINLINE__) + #if (__CORE__ == __ARM8M_MAINLINE__) // Cortex-M33 + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() asm VOLATILE ("DMB"); + #endif + #endif + #if (defined __ARM8EM_MAINLINE__) + #if (__CORE__ == __ARM8EM_MAINLINE__) // Cortex-??? + #define _CORE_HAS_RTT_ASM_SUPPORT 1 + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() asm VOLATILE ("DMB"); + #endif + #endif + #if (defined __ARM7A__) + #if (__CORE__ == __ARM7A__) // Cortex-A 32-bit ARMv7-A + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() asm VOLATILE ("DMB"); + #endif + #endif + #if (defined __ARM7R__) + #if (__CORE__ == __ARM7R__) // Cortex-R 32-bit ARMv7-R + #define _CORE_NEEDS_DMB 1 + #define RTT__DMB() asm VOLATILE ("DMB"); + #endif + #endif +// TBD: __ARM8A__ => Cortex-A 64-bit ARMv8-A +// TBD: __ARM8R__ => Cortex-R 64-bit ARMv8-R + #else + // + // Other compilers + // + #define _CC_HAS_RTT_ASM_SUPPORT 0 + #define _CORE_HAS_RTT_ASM_SUPPORT 0 + #endif + // + // If IDE and core support the ASM version, enable ASM version by default + // + #ifndef _CORE_HAS_RTT_ASM_SUPPORT + #define _CORE_HAS_RTT_ASM_SUPPORT 0 // Default for unknown cores + #endif + #if (_CC_HAS_RTT_ASM_SUPPORT && _CORE_HAS_RTT_ASM_SUPPORT) + #define RTT_USE_ASM (1) + #else + #define RTT_USE_ASM (0) + #endif +#endif + +#ifndef _CORE_NEEDS_DMB + #define _CORE_NEEDS_DMB 0 +#endif + +#ifndef RTT__DMB + #if _CORE_NEEDS_DMB + #error "Don't know how to place inline assembly for DMB" + #else + #define RTT__DMB() + #endif +#endif + +#ifndef SEGGER_RTT_CPU_CACHE_LINE_SIZE + #define SEGGER_RTT_CPU_CACHE_LINE_SIZE (0) // On most target systems where RTT is used, we do not have a CPU cache, therefore 0 is a good default here +#endif + +#ifndef SEGGER_RTT_UNCACHED_OFF + #if SEGGER_RTT_CPU_CACHE_LINE_SIZE + #error "SEGGER_RTT_UNCACHED_OFF must be defined when setting SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #else + #define SEGGER_RTT_UNCACHED_OFF (0) + #endif +#endif +#if RTT_USE_ASM + #if SEGGER_RTT_CPU_CACHE_LINE_SIZE + #error "RTT_USE_ASM is not available if SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0" + #endif +#endif + +#ifndef SEGGER_RTT_ASM // defined when SEGGER_RTT.h is included from assembly file +#include +#include +#include + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ + +// +// Determine how much we must pad the control block to make it a multiple of a cache line in size +// Assuming: U8 = 1B +// U16 = 2B +// U32 = 4B +// U8/U16/U32* = 4B +// +#if SEGGER_RTT_CPU_CACHE_LINE_SIZE // Avoid division by zero in case we do not have any cache + #define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) (((NumBytes + SEGGER_RTT_CPU_CACHE_LINE_SIZE - 1) / SEGGER_RTT_CPU_CACHE_LINE_SIZE) * SEGGER_RTT_CPU_CACHE_LINE_SIZE) +#else + #define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) (NumBytes) +#endif +#define SEGGER_RTT__CB_SIZE (16 + 4 + 4 + (SEGGER_RTT_MAX_NUM_UP_BUFFERS * 24) + (SEGGER_RTT_MAX_NUM_DOWN_BUFFERS * 24)) +#define SEGGER_RTT__CB_PADDING (SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(SEGGER_RTT__CB_SIZE) - SEGGER_RTT__CB_SIZE) + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +// +// Description for a circular buffer (also called "ring buffer") +// which is used as up-buffer (T->H) +// +typedef struct { + const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" + char* pBuffer; // Pointer to start of buffer + unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. + unsigned WrOff; // Position of next item to be written by either target. + volatile unsigned RdOff; // Position of next item to be read by host. Must be volatile since it may be modified by host. + unsigned Flags; // Contains configuration flags. Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode. +} SEGGER_RTT_BUFFER_UP; + +// +// Description for a circular buffer (also called "ring buffer") +// which is used as down-buffer (H->T) +// +typedef struct { + const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" + char* pBuffer; // Pointer to start of buffer + unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. + volatile unsigned WrOff; // Position of next item to be written by host. Must be volatile since it may be modified by host. + unsigned RdOff; // Position of next item to be read by target (down-buffer). + unsigned Flags; // Contains configuration flags. Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode. +} SEGGER_RTT_BUFFER_DOWN; + +// +// RTT control block which describes the number of buffers available +// as well as the configuration for each buffer +// +// +typedef struct { + char acID[16]; // Initialized to "SEGGER RTT" + int MaxNumUpBuffers; // Initialized to SEGGER_RTT_MAX_NUM_UP_BUFFERS (type. 2) + int MaxNumDownBuffers; // Initialized to SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (type. 2) + SEGGER_RTT_BUFFER_UP aUp[SEGGER_RTT_MAX_NUM_UP_BUFFERS]; // Up buffers, transferring information up from target via debug probe to host + SEGGER_RTT_BUFFER_DOWN aDown[SEGGER_RTT_MAX_NUM_DOWN_BUFFERS]; // Down buffers, transferring information down from host via debug probe to target +#if SEGGER_RTT__CB_PADDING + unsigned char aDummy[SEGGER_RTT__CB_PADDING]; +#endif +} SEGGER_RTT_CB; + +/********************************************************************* +* +* Global data +* +********************************************************************** +*/ +extern SEGGER_RTT_CB _SEGGER_RTT; + +/********************************************************************* +* +* RTT API functions +* +********************************************************************** +*/ +#ifdef __cplusplus + extern "C" { +#endif +int SEGGER_RTT_AllocDownBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_AllocUpBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_ConfigUpBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_ConfigDownBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_GetKey (void); +unsigned SEGGER_RTT_HasData (unsigned BufferIndex); +int SEGGER_RTT_HasKey (void); +unsigned SEGGER_RTT_HasDataUp (unsigned BufferIndex); +void SEGGER_RTT_Init (void); +unsigned SEGGER_RTT_Read (unsigned BufferIndex, void* pBuffer, unsigned BufferSize); +unsigned SEGGER_RTT_ReadNoLock (unsigned BufferIndex, void* pData, unsigned BufferSize); +int SEGGER_RTT_SetNameDownBuffer (unsigned BufferIndex, const char* sName); +int SEGGER_RTT_SetNameUpBuffer (unsigned BufferIndex, const char* sName); +int SEGGER_RTT_SetFlagsDownBuffer (unsigned BufferIndex, unsigned Flags); +int SEGGER_RTT_SetFlagsUpBuffer (unsigned BufferIndex, unsigned Flags); +int SEGGER_RTT_WaitKey (void); +unsigned SEGGER_RTT_Write (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteSkipNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_ASM_WriteSkipNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteString (unsigned BufferIndex, const char* s); +void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_PutChar (unsigned BufferIndex, char c); +unsigned SEGGER_RTT_PutCharSkip (unsigned BufferIndex, char c); +unsigned SEGGER_RTT_PutCharSkipNoLock (unsigned BufferIndex, char c); +unsigned SEGGER_RTT_GetAvailWriteSpace (unsigned BufferIndex); +unsigned SEGGER_RTT_GetBytesInBuffer (unsigned BufferIndex); +// +// Function macro for performance optimization +// +#define SEGGER_RTT_HASDATA(n) (((SEGGER_RTT_BUFFER_DOWN*)((uintptr_t)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_DOWN*)((uintptr_t)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) + +#if RTT_USE_ASM + #define SEGGER_RTT_WriteSkipNoLock SEGGER_RTT_ASM_WriteSkipNoLock +#endif + +/********************************************************************* +* +* RTT transfer functions to send RTT data via other channels. +* +********************************************************************** +*/ +unsigned SEGGER_RTT_ReadUpBuffer (unsigned BufferIndex, void* pBuffer, unsigned BufferSize); +unsigned SEGGER_RTT_ReadUpBufferNoLock (unsigned BufferIndex, void* pData, unsigned BufferSize); +unsigned SEGGER_RTT_WriteDownBuffer (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteDownBufferNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); + +#define SEGGER_RTT_HASDATA_UP(n) (((SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff) // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly + +/********************************************************************* +* +* RTT "Terminal" API functions +* +********************************************************************** +*/ +int SEGGER_RTT_SetTerminal (unsigned char TerminalId); +int SEGGER_RTT_TerminalOut (unsigned char TerminalId, const char* s); + +/********************************************************************* +* +* RTT printf functions (require SEGGER_RTT_printf.c) +* +********************************************************************** +*/ +int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...); +int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList); + +#ifdef __cplusplus + } +#endif + +#endif // ifndef(SEGGER_RTT_ASM) + +// +// For some environments, NULL may not be defined until certain headers are included +// +#ifndef NULL + #define NULL ((void*)0) +#endif + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +// +// Operating modes. Define behavior if buffer is full (not enough space for entire message) +// +#define SEGGER_RTT_MODE_NO_BLOCK_SKIP (0) // Skip. Do not block, output nothing. (Default) +#define SEGGER_RTT_MODE_NO_BLOCK_TRIM (1) // Trim: Do not block, output as much as fits. +#define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL (2) // Block: Wait until there is space in the buffer. +#define SEGGER_RTT_MODE_MASK (3) + +// +// Control sequences, based on ANSI. +// Can be used to control color, and clear the screen +// +#define RTT_CTRL_RESET "\x1B[0m" // Reset to default colors +#define RTT_CTRL_CLEAR "\x1B[2J" // Clear screen, reposition cursor to top left + +#define RTT_CTRL_TEXT_BLACK "\x1B[2;30m" +#define RTT_CTRL_TEXT_RED "\x1B[2;31m" +#define RTT_CTRL_TEXT_GREEN "\x1B[2;32m" +#define RTT_CTRL_TEXT_YELLOW "\x1B[2;33m" +#define RTT_CTRL_TEXT_BLUE "\x1B[2;34m" +#define RTT_CTRL_TEXT_MAGENTA "\x1B[2;35m" +#define RTT_CTRL_TEXT_CYAN "\x1B[2;36m" +#define RTT_CTRL_TEXT_WHITE "\x1B[2;37m" + +#define RTT_CTRL_TEXT_BRIGHT_BLACK "\x1B[1;30m" +#define RTT_CTRL_TEXT_BRIGHT_RED "\x1B[1;31m" +#define RTT_CTRL_TEXT_BRIGHT_GREEN "\x1B[1;32m" +#define RTT_CTRL_TEXT_BRIGHT_YELLOW "\x1B[1;33m" +#define RTT_CTRL_TEXT_BRIGHT_BLUE "\x1B[1;34m" +#define RTT_CTRL_TEXT_BRIGHT_MAGENTA "\x1B[1;35m" +#define RTT_CTRL_TEXT_BRIGHT_CYAN "\x1B[1;36m" +#define RTT_CTRL_TEXT_BRIGHT_WHITE "\x1B[1;37m" + +#define RTT_CTRL_BG_BLACK "\x1B[24;40m" +#define RTT_CTRL_BG_RED "\x1B[24;41m" +#define RTT_CTRL_BG_GREEN "\x1B[24;42m" +#define RTT_CTRL_BG_YELLOW "\x1B[24;43m" +#define RTT_CTRL_BG_BLUE "\x1B[24;44m" +#define RTT_CTRL_BG_MAGENTA "\x1B[24;45m" +#define RTT_CTRL_BG_CYAN "\x1B[24;46m" +#define RTT_CTRL_BG_WHITE "\x1B[24;47m" + +#define RTT_CTRL_BG_BRIGHT_BLACK "\x1B[4;40m" +#define RTT_CTRL_BG_BRIGHT_RED "\x1B[4;41m" +#define RTT_CTRL_BG_BRIGHT_GREEN "\x1B[4;42m" +#define RTT_CTRL_BG_BRIGHT_YELLOW "\x1B[4;43m" +#define RTT_CTRL_BG_BRIGHT_BLUE "\x1B[4;44m" +#define RTT_CTRL_BG_BRIGHT_MAGENTA "\x1B[4;45m" +#define RTT_CTRL_BG_BRIGHT_CYAN "\x1B[4;46m" +#define RTT_CTRL_BG_BRIGHT_WHITE "\x1B[4;47m" + + +#endif + +/*************************** End of file ****************************/ diff --git a/RTT/SEGGER_RTT_ASM_ARMv7M.S b/RTT/SEGGER_RTT_ASM_ARMv7M.S new file mode 100644 index 0000000..cbbc52f --- /dev/null +++ b/RTT/SEGGER_RTT_ASM_ARMv7M.S @@ -0,0 +1,242 @@ +/********************************************************************* +* (c) SEGGER Microcontroller GmbH * +* The Embedded Experts * +* www.segger.com * +********************************************************************** + +-------------------------- END-OF-HEADER ----------------------------- + +File : SEGGER_RTT_ASM_ARMv7M.S +Purpose : Assembler implementation of RTT functions for ARMv7M + +Additional information: + This module is written to be assembler-independent and works with + GCC and clang (Embedded Studio) and IAR. +*/ + +#define SEGGER_RTT_ASM // Used to control processed input from header file +#include "SEGGER_RTT.h" + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ + +#define _CCIAR 0 +#define _CCCLANG 1 + +#if (defined __SES_ARM) || (defined __GNUC__) || (defined __clang__) + #define _CC_TYPE _CCCLANG + #define _PUB_SYM .global + #define _EXT_SYM .extern + #define _END .end + #define _WEAK .weak + #define _THUMB_FUNC .thumb_func + #define _THUMB_CODE .code 16 + #define _WORD .word + #define _SECTION(Sect, Type, AlignExp) .section Sect ##, "ax" + #define _ALIGN(Exp) .align Exp + #define _PLACE_LITS .ltorg + #define _DATA_SECT_START + #define _C_STARTUP _start + #define _STACK_END __stack_end__ + #define _RAMFUNC + // + // .text => Link to flash + // .fast => Link to RAM + // OtherSect => Usually link to RAM + // Alignment is 2^x + // +#elif defined (__IASMARM__) + #define _CC_TYPE _CCIAR + #define _PUB_SYM PUBLIC + #define _EXT_SYM EXTERN + #define _END END + #define _WEAK _WEAK + #define _THUMB_FUNC + #define _THUMB_CODE THUMB + #define _WORD DCD + #define _SECTION(Sect, Type, AlignExp) SECTION Sect ## : ## Type ## :REORDER:NOROOT ## (AlignExp) + #define _ALIGN(Exp) alignrom Exp + #define _PLACE_LITS + #define _DATA_SECT_START DATA + #define _C_STARTUP __iar_program_start + #define _STACK_END sfe(CSTACK) + #define _RAMFUNC SECTION_TYPE SHT_PROGBITS, SHF_WRITE | SHF_EXECINSTR + // + // .text => Link to flash + // .textrw => Link to RAM + // OtherSect => Usually link to RAM + // NOROOT => Allows linker to throw away the function, if not referenced + // Alignment is 2^x + // +#endif + +#if (_CC_TYPE == _CCIAR) + NAME SEGGER_RTT_ASM_ARMv7M +#else + .syntax unified +#endif + +#if defined (RTT_USE_ASM) && (RTT_USE_ASM == 1) + #define SHT_PROGBITS 0x1 + +/********************************************************************* +* +* Public / external symbols +* +********************************************************************** +*/ + + _EXT_SYM __aeabi_memcpy + _EXT_SYM __aeabi_memcpy4 + _EXT_SYM _SEGGER_RTT + + _PUB_SYM SEGGER_RTT_ASM_WriteSkipNoLock + +/********************************************************************* +* +* SEGGER_RTT_WriteSkipNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block which is then read by the host. +* SEGGER_RTT_WriteSkipNoLock does not lock the application and +* skips all data, if the data does not fit into the buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* MUST be > 0!!! +* This is done for performance reasons, so no initial check has do be done. +* +* Return value +* 1: Data has been copied +* 0: No space, data has not been copied +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, all data is dropped. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +*/ + _SECTION(.text, CODE, 2) + _ALIGN(2) + _THUMB_FUNC +SEGGER_RTT_ASM_WriteSkipNoLock: // unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pData, unsigned NumBytes) { + // + // Cases: + // 1) RdOff <= WrOff => Space until wrap-around is sufficient + // 2) RdOff <= WrOff => Space after wrap-around needed (copy in 2 chunks) + // 3) RdOff < WrOff => No space in buf + // 4) RdOff > WrOff => Space is sufficient + // 5) RdOff > WrOff => No space in buf + // + // 1) is the most common case for large buffers and assuming that J-Link reads the data fast enough + // + // Register usage: + // R0 Temporary needed as RdOff, register later on + // R1 pData + // R2 + // R3 register. Hold free for subroutine calls + // R4 + // R5 pRing->pBuffer + // R6 pRing (Points to active struct SEGGER_RTT_BUFFER_DOWN) + // R7 WrOff + // + PUSH {R4-R7} + ADD R3,R0,R0, LSL #+1 + LDR.W R0,=_SEGGER_RTT // pRing = &_SEGGER_RTT.aUp[BufferIndex]; + ADD R0,R0,R3, LSL #+3 + ADD R6,R0,#+24 + LDR R0,[R6, #+16] // RdOff = pRing->RdOff; + LDR R7,[R6, #+12] // WrOff = pRing->WrOff; + LDR R5,[R6, #+4] // pRing->pBuffer + CMP R7,R0 + BCC.N _CheckCase4 // if (RdOff <= WrOff) { => Case 1), 2) or 3) + // + // Handling for case 1, later on identical to case 4 + // + LDR R3,[R6, #+8] // Avail = pRing->SizeOfBuffer - WrOff - 1u; => Space until wrap-around (assume 1 byte not usable for case that RdOff == 0) + SUBS R4,R3,R7 // (Used in case we jump into case 2 afterwards) + SUBS R3,R4,#+1 // + CMP R3,R2 + BCC.N _CheckCase2 // if (Avail >= NumBytes) { => Case 1)? +_Case4: + ADDS R5,R7,R5 // pBuffer += WrOff + ADDS R0,R2,R7 // v = WrOff + NumBytes + // + // 2x unrolling for the copy loop that is used most of the time + // This is a special optimization for small SystemView packets and makes them even faster + // + _ALIGN(2) +_LoopCopyStraight: // memcpy(pRing->pBuffer + WrOff, pData, NumBytes); + LDRB R3,[R1], #+1 + STRB R3,[R5], #+1 // *pDest++ = *pSrc++ + SUBS R2,R2,#+1 + BEQ _CSDone + LDRB R3,[R1], #+1 + STRB R3,[R5], #+1 // *pDest++ = *pSrc++ + SUBS R2,R2,#+1 + BNE _LoopCopyStraight +_CSDone: +#if _CORE_NEEDS_DMB // Do not slow down cores that do not need a DMB instruction here + DMB // Cortex-M7 may delay memory writes and also change the order in which the writes happen. Therefore, make sure that all buffer writes are finished, before updating the in the struct +#endif + STR R0,[R6, #+12] // pRing->WrOff = WrOff + NumBytes; + MOVS R0,#+1 + POP {R4-R7} + BX LR // Return 1 +_CheckCase2: + ADDS R0,R0,R3 // Avail += RdOff; => Space incl. wrap-around + CMP R0,R2 + BCC.N _Case3 // if (Avail >= NumBytes) { => Case 2? => If not, we have case 3) (does not fit) + // + // Handling for case 2 + // + ADDS R0,R7,R5 // v = pRing->pBuffer + WrOff => Do not change pRing->pBuffer here because 2nd chunk needs org. value + SUBS R2,R2,R4 // NumBytes -= Rem; (Rem = pRing->SizeOfBuffer - WrOff; => Space until end of buffer) +_LoopCopyBeforeWrapAround: // memcpy(pRing->pBuffer + WrOff, pData, Rem); => Copy 1st chunk + LDRB R3,[R1], #+1 + STRB R3,[R0], #+1 // *pDest++ = *pSrc++ + SUBS R4,R4,#+1 + BNE _LoopCopyBeforeWrapAround + // + // Special case: First check that assumed RdOff == 0 calculated that last element before wrap-around could not be used + // But 2nd check (considering space until wrap-around and until RdOff) revealed that RdOff is not 0, so we can use the last element + // In this case, we may use a copy straight until buffer end anyway without needing to copy 2 chunks + // Therefore, check if 2nd memcpy is necessary at all + // + ADDS R4,R2,#+0 // Save (needed as counter in loop but must be written to after the loop). Also use this inst to update the flags to skip 2nd loop if possible + BEQ.N _No2ChunkNeeded // if (NumBytes) { +_LoopCopyAfterWrapAround: // memcpy(pRing->pBuffer, pData + Rem, NumBytes); + LDRB R3,[R1], #+1 // pData already points to the next src byte due to copy loop increment before this loop + STRB R3,[R5], #+1 // *pDest++ = *pSrc++ + SUBS R2,R2,#+1 + BNE _LoopCopyAfterWrapAround +_No2ChunkNeeded: +#if _CORE_NEEDS_DMB // Do not slow down cores that do not need a DMB instruction here + DMB // Cortex-M7 may delay memory writes and also change the order in which the writes happen. Therefore, make sure that all buffer writes are finished, before updating the in the struct +#endif + STR R4,[R6, #+12] // pRing->WrOff = NumBytes; => Must be written after copying data because J-Link may read control block asynchronously while writing into buffer + MOVS R0,#+1 + POP {R4-R7} + BX LR // Return 1 +_CheckCase4: + SUBS R0,R0,R7 + SUBS R0,R0,#+1 // Avail = RdOff - WrOff - 1u; + CMP R0,R2 + BCS.N _Case4 // if (Avail >= NumBytes) { => Case 4) == 1) ? => If not, we have case 5) == 3) (does not fit) +_Case3: + MOVS R0,#+0 + POP {R4-R7} + BX LR // Return 0 + _PLACE_LITS + +#endif // defined (RTT_USE_ASM) && (RTT_USE_ASM == 1) + _END + +/*************************** End of file ****************************/ diff --git a/RTT/SEGGER_RTT_Conf.h b/RTT/SEGGER_RTT_Conf.h new file mode 100644 index 0000000..e386e8b --- /dev/null +++ b/RTT/SEGGER_RTT_Conf.h @@ -0,0 +1,429 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* 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 SEGGER Microcontroller 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. * +* * +********************************************************************** +* * +* RTT version: 8.10g * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT_Conf.h +Purpose : Implementation of SEGGER real-time transfer (RTT) which + allows real-time communication on targets which support + debugger memory accesses while the CPU is running. +Revision: $Rev: 24316 $ + +*/ + +#ifndef SEGGER_RTT_CONF_H +#define SEGGER_RTT_CONF_H + +#ifdef __IAR_SYSTEMS_ICC__ + #include +#endif + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ + +// +// Take in and set to correct values for Cortex-A systems with CPU cache +// +//#define SEGGER_RTT_CPU_CACHE_LINE_SIZE (32) // Largest cache line size (in bytes) in the current system +//#define SEGGER_RTT_UNCACHED_OFF (0xFB000000) // Address alias where RTT CB and buffers can be accessed uncached +// +// Most common case: +// Up-channel 0: RTT +// Up-channel 1: SystemView +// +#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS + #define SEGGER_RTT_MAX_NUM_UP_BUFFERS (3) // Max. number of up-buffers (T->H) available on this target (Default: 3) +#endif +// +// Most common case: +// Down-channel 0: RTT +// Down-channel 1: SystemView +// +#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS + #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (3) // Max. number of down-buffers (H->T) available on this target (Default: 3) +#endif + +#ifndef BUFFER_SIZE_UP + #define BUFFER_SIZE_UP (4096) // Size of the buffer for terminal output of target, up to host (Default: 1k) +#endif + +#ifndef BUFFER_SIZE_DOWN + #define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16) +#endif + +#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE + #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) +#endif + +#ifndef SEGGER_RTT_MODE_DEFAULT + #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_TRIM // Mode for pre-initialized terminal channel (buffer 0) +#endif + +/********************************************************************* +* +* RTT memcpy configuration +* +* memcpy() is good for large amounts of data, +* but the overhead is big for small amounts, which are usually stored via RTT. +* With SEGGER_RTT_MEMCPY_USE_BYTELOOP a simple byte loop can be used instead. +* +* SEGGER_RTT_MEMCPY() can be used to replace standard memcpy() in RTT functions. +* This is may be required with memory access restrictions, +* such as on Cortex-A devices with MMU. +*/ +#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP + #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 // 0: Use memcpy/SEGGER_RTT_MEMCPY, 1: Use a simple byte-loop +#endif +// +// Example definition of SEGGER_RTT_MEMCPY to external memcpy with GCC toolchains and Cortex-A targets +// +//#if ((defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)) && (defined (__ARM_ARCH_7A__)) +// #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) SEGGER_memcpy((pDest), (pSrc), (NumBytes)) +//#endif + +// +// Target is not allowed to perform other RTT operations while string still has not been stored completely. +// Otherwise we would probably end up with a mixed string in the buffer. +// If using RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here. +// +// SEGGER_RTT_MAX_INTERRUPT_PRIORITY can be used in the sample lock routines on Cortex-M3/4. +// Make sure to mask all interrupts which can send RTT data, i.e. generate SystemView events, or cause task switches. +// When high-priority interrupts must not be masked while sending RTT data, SEGGER_RTT_MAX_INTERRUPT_PRIORITY needs to be adjusted accordingly. +// (Higher priority = lower priority number) +// Default value for embOS: 128u +// Default configuration in FreeRTOS: configMAX_SYSCALL_INTERRUPT_PRIORITY: ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) +// In case of doubt mask all interrupts: 1 << (8 - BASEPRI_PRIO_BITS) i.e. 1 << 5 when 3 bits are implemented in NVIC +// or define SEGGER_RTT_LOCK() to completely disable interrupts. +// +#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20) +#endif + +/********************************************************************* +* +* RTT lock configuration for SEGGER Embedded Studio, +* Rowley CrossStudio and GCC +*/ +#if ((defined(__SES_ARM) || defined(__SES_RISCV) || defined(__CROSSWORKS_ARM) || defined(__GNUC__) || defined(__clang__)) && !defined (__CC_ARM) && !defined(WIN32)) + #if (defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__)) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + __asm volatile ("mrs %0, primask \n\t" \ + "movs r1, #1 \n\t" \ + "msr primask, r1 \n\t" \ + : "=r" (_SEGGER_RTT__LockState) \ + : \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \ + : \ + : "r" (_SEGGER_RTT__LockState) \ + : \ + ); \ + } + #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__) || defined(__ARM_ARCH_8_1M_MAIN__)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + __asm volatile ("mrs %0, basepri \n\t" \ + "mov r1, %1 \n\t" \ + "msr basepri, r1 \n\t" \ + : "=r" (_SEGGER_RTT__LockState) \ + : "i"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY) \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("msr basepri, %0 \n\t" \ + : \ + : "r" (_SEGGER_RTT__LockState) \ + : \ + ); \ + } + + #elif (defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__)) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + __asm volatile ("mrs r1, CPSR \n\t" \ + "mov %0, r1 \n\t" \ + "orr r1, r1, #0xC0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : "=r" (_SEGGER_RTT__LockState) \ + : \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ + "mrs r1, CPSR \n\t" \ + "bic r1, r1, #0xC0 \n\t" \ + "and r0, r0, #0xC0 \n\t" \ + "orr r1, r1, r0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : \ + : "r" (_SEGGER_RTT__LockState) \ + : "r0", "r1", "cc" \ + ); \ + } + #elif defined(__riscv) || defined(__riscv_xlen) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + __asm volatile ("csrr %0, mstatus \n\t" \ + "csrci mstatus, 8 \n\t" \ + "andi %0, %0, 8 \n\t" \ + : "=r" (_SEGGER_RTT__LockState) \ + : \ + : \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("csrr a1, mstatus \n\t" \ + "or %0, %0, a1 \n\t" \ + "csrs mstatus, %0 \n\t" \ + : \ + : "r" (_SEGGER_RTT__LockState) \ + : "a1" \ + ); \ + } + #else + #define SEGGER_RTT_LOCK() + #define SEGGER_RTT_UNLOCK() + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for IAR EWARM +*/ +#ifdef __ICCARM__ + #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) || \ + (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = __get_PRIMASK(); \ + __set_PRIMASK(1); + + #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \ + } + #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || \ + (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) || \ + (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) || \ + (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = __get_BASEPRI(); \ + __set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); + + #define SEGGER_RTT_UNLOCK() __set_BASEPRI(_SEGGER_RTT__LockState); \ + } + #elif (defined (__ARM7A__) && (__CORE__ == __ARM7A__)) || \ + (defined (__ARM7R__) && (__CORE__ == __ARM7R__)) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + __asm volatile ("mrs r1, CPSR \n\t" \ + "mov %0, r1 \n\t" \ + "orr r1, r1, #0xC0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : "=r" (_SEGGER_RTT__LockState) \ + : \ + : "r1", "cc" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ + "mrs r1, CPSR \n\t" \ + "bic r1, r1, #0xC0 \n\t" \ + "and r0, r0, #0xC0 \n\t" \ + "orr r1, r1, r0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : \ + : "r" (_SEGGER_RTT__LockState) \ + : "r0", "r1", "cc" \ + ); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for IAR RX +*/ +#ifdef __ICCRX__ + #define SEGGER_RTT_LOCK() { \ + unsigned long _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = __get_interrupt_state(); \ + __disable_interrupt(); + + #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration for IAR RL78 +*/ +#ifdef __ICCRL78__ + #define SEGGER_RTT_LOCK() { \ + __istate_t _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = __get_interrupt_state(); \ + __disable_interrupt(); + + #define SEGGER_RTT_UNLOCK() __set_interrupt_state(_SEGGER_RTT__LockState); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration for KEIL ARM +*/ +#ifdef __CC_ARM + #if (defined __TARGET_ARCH_6S_M) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + register unsigned char _SEGGER_RTT__PRIMASK __asm( "primask"); \ + _SEGGER_RTT__LockState = _SEGGER_RTT__PRIMASK; \ + _SEGGER_RTT__PRIMASK = 1u; \ + __schedule_barrier(); + + #define SEGGER_RTT_UNLOCK() _SEGGER_RTT__PRIMASK = _SEGGER_RTT__LockState; \ + __schedule_barrier(); \ + } + #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + register unsigned char BASEPRI __asm( "basepri"); \ + _SEGGER_RTT__LockState = BASEPRI; \ + BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY; \ + __schedule_barrier(); + + #define SEGGER_RTT_UNLOCK() BASEPRI = _SEGGER_RTT__LockState; \ + __schedule_barrier(); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for TI ARM +*/ +#ifdef __TI_ARM__ + #if defined (__TI_ARM_V6M0__) + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = __get_PRIMASK(); \ + __set_PRIMASK(1); + + #define SEGGER_RTT_UNLOCK() __set_PRIMASK(_SEGGER_RTT__LockState); \ + } + #elif (defined (__TI_ARM_V7M3__) || defined (__TI_ARM_V7M4__)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = _set_interrupt_priority(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); + + #define SEGGER_RTT_UNLOCK() _set_interrupt_priority(_SEGGER_RTT__LockState); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for CCRX +*/ +#ifdef __RX + #include + #define SEGGER_RTT_LOCK() { \ + unsigned long _SEGGER_RTT__LockState; \ + _SEGGER_RTT__LockState = get_psw() & 0x010000; \ + clrpsw_i(); + + #define SEGGER_RTT_UNLOCK() set_psw(get_psw() | _SEGGER_RTT__LockState); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration for embOS Simulation on Windows +* (Can also be used for generic RTT locking with embOS) +*/ +#if defined(WIN32) || defined(SEGGER_RTT_LOCK_EMBOS) + +void OS_SIM_EnterCriticalSection(void); +void OS_SIM_LeaveCriticalSection(void); + +#define SEGGER_RTT_LOCK() { \ + OS_SIM_EnterCriticalSection(); + +#define SEGGER_RTT_UNLOCK() OS_SIM_LeaveCriticalSection(); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration fallback +*/ +#ifndef SEGGER_RTT_LOCK + #define SEGGER_RTT_LOCK() // Lock RTT (nestable) (i.e. disable interrupts) +#endif + +#ifndef SEGGER_RTT_UNLOCK + #define SEGGER_RTT_UNLOCK() // Unlock RTT (nestable) (i.e. enable previous interrupt lock state) +#endif + +#endif +/*************************** End of file ****************************/ diff --git a/RTT/SEGGER_RTT_Syscalls_KEIL.c b/RTT/SEGGER_RTT_Syscalls_KEIL.c new file mode 100644 index 0000000..0ad5840 --- /dev/null +++ b/RTT/SEGGER_RTT_Syscalls_KEIL.c @@ -0,0 +1,394 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* 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 SEGGER Microcontroller 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. * +* * +********************************************************************** +* * +* RTT version: 7.54 * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : RTT_Syscalls_KEIL.c +Purpose : Retargeting module for KEIL MDK-CM3. + Low-level functions for using printf() via RTT +Revision: $Rev: 24316 $ +Notes : (1) https://wiki.segger.com/Keil_MDK-ARM#RTT_in_uVision +---------------------------------------------------------------------- +*/ +#if (defined __CC_ARM) || (defined __ARMCC_VERSION) + +#include +#include +#include +#include +#include + +#include "SEGGER_RTT.h" +/********************************************************************* +* +* #pragmas +* +********************************************************************** +*/ +#if __ARMCC_VERSION < 6000000 +#pragma import(__use_no_semihosting) +#endif + +#ifdef _MICROLIB + #pragma import(__use_full_stdio) +#endif + +/********************************************************************* +* +* Defines non-configurable +* +********************************************************************** +*/ + +/* Standard IO device handles - arbitrary, but any real file system handles must be + less than 0x8000. */ +#define STDIN 0x8001 // Standard Input Stream +#define STDOUT 0x8002 // Standard Output Stream +#define STDERR 0x8003 // Standard Error Stream + +/********************************************************************* +* +* Public const +* +********************************************************************** +*/ +#if __ARMCC_VERSION < 5000000 +//const char __stdin_name[] = "STDIN"; +const char __stdout_name[] = "STDOUT"; +const char __stderr_name[] = "STDERR"; +#endif + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* _ttywrch +* +* Function description: +* Outputs a character to the console +* +* Parameters: +* c - character to output +* +*/ +void _ttywrch(int c) { + fputc(c, stdout); // stdout + fflush(stdout); +} + +/********************************************************************* +* +* _sys_open +* +* Function description: +* Opens the device/file in order to do read/write operations +* +* Parameters: +* sName - sName of the device/file to open +* OpenMode - This parameter is currently ignored +* +* Return value: +* != 0 - Handle to the object to open, otherwise +* == 0 -"device" is not handled by this module +* +*/ +FILEHANDLE _sys_open(const char * sName, int OpenMode) { + (void)OpenMode; + // Register standard Input Output devices. + if (strcmp(sName, __stdout_name) == 0) { + return (STDOUT); + } else if (strcmp(sName, __stderr_name) == 0) { + return (STDERR); + } else + return (0); // Not implemented +} + +/********************************************************************* +* +* _sys_close +* +* Function description: +* Closes the handle to the open device/file +* +* Parameters: +* hFile - Handle to a file opened via _sys_open +* +* Return value: +* 0 - device/file closed +* +*/ +int _sys_close(FILEHANDLE hFile) { + (void)hFile; + return 0; // Not implemented +} + +/********************************************************************* +* +* _sys_write +* +* Function description: +* Writes the data to an open handle. +* Currently this function only outputs data to the console +* +* Parameters: +* hFile - Handle to a file opened via _sys_open +* pBuffer - Pointer to the data that shall be written +* NumBytes - Number of bytes to write +* Mode - The Mode that shall be used +* +* Return value: +* Number of bytes *not* written to the file/device +* +*/ +int _sys_write(FILEHANDLE hFile, const unsigned char * pBuffer, unsigned NumBytes, int Mode) { + int r = 0; + + (void)Mode; + if (hFile == STDOUT) { + SEGGER_RTT_Write(0, (const char*)pBuffer, NumBytes); + return 0; + } + return r; +} + +/********************************************************************* +* +* _sys_read +* +* Function description: +* Reads data from an open handle. +* Currently this modules does nothing. +* +* Parameters: +* hFile - Handle to a file opened via _sys_open +* pBuffer - Pointer to buffer to store the read data +* NumBytes - Number of bytes to read +* Mode - The Mode that shall be used +* +* Return value: +* Number of bytes read from the file/device +* +*/ +int _sys_read(FILEHANDLE hFile, unsigned char * pBuffer, unsigned NumBytes, int Mode) { + (void)hFile; + (void)pBuffer; + (void)NumBytes; + (void)Mode; + return (0); // Not implemented +} + +/********************************************************************* +* +* _sys_istty +* +* Function description: +* This function shall return whether the opened file +* is a console device or not. +* +* Parameters: +* hFile - Handle to a file opened via _sys_open +* +* Return value: +* 1 - Device is a console +* 0 - Device is not a console +* +*/ +int _sys_istty(FILEHANDLE hFile) { + if (hFile > 0x8000) { + return (1); + } + return (0); // Not implemented +} + +/********************************************************************* +* +* _sys_seek +* +* Function description: +* Seeks via the file to a specific position +* +* Parameters: +* hFile - Handle to a file opened via _sys_open +* Pos - +* +* Return value: +* int - +* +*/ +int _sys_seek(FILEHANDLE hFile, long Pos) { + (void)hFile; + (void)Pos; + return (0); // Not implemented +} + +/********************************************************************* +* +* _sys_ensure +* +* Function description: +* +* +* Parameters: +* hFile - Handle to a file opened via _sys_open +* +* Return value: +* int - +* +*/ +int _sys_ensure(FILEHANDLE hFile) { + (void)hFile; + return (-1); // Not implemented +} + +/********************************************************************* +* +* _sys_flen +* +* Function description: +* Returns the length of the opened file handle +* +* Parameters: +* hFile - Handle to a file opened via _sys_open +* +* Return value: +* Length of the file +* +*/ +long _sys_flen(FILEHANDLE hFile) { + (void)hFile; + return (0); // Not implemented +} + +/********************************************************************* +* +* _sys_tmpnam +* +* Function description: +* This function converts the file number fileno for a temporary +* file to a unique filename, for example, tmp0001. +* +* Parameters: +* pBuffer - Pointer to a buffer to store the name +* FileNum - file number to convert +* MaxLen - Size of the buffer +* +* Return value: +* 1 - Error +* 0 - Success +* +*/ +int _sys_tmpnam2(char * pBuffer, int FileNum, unsigned MaxLen) { + (void)pBuffer; + (void)FileNum; + (void)MaxLen; + return (1); // Not implemented +} + +/********************************************************************* +* +* _sys_command_string +* +* Function description: +* This function shall execute a system command. +* +* Parameters: +* cmd - Pointer to the command string +* len - Length of the string +* +* Return value: +* == NULL - Command was not successfully executed +* == sCmd - Command was passed successfully +* +*/ +char * _sys_command_string(char * cmd, int len) { + (void)len; + return cmd; // Not implemented +} + +/********************************************************************* +* +* _sys_exit +* +* Function description: +* This function is called when the application returns from main +* +* Parameters: +* ReturnCode - Return code from the main function +* +* +*/ +void _sys_exit(int ReturnCode) { + (void)ReturnCode; + while (1); // Not implemented +} + +#if __ARMCC_VERSION >= 5000000 +/********************************************************************* +* +* stdout_putchar +* +* Function description: +* Put a character to the stdout +* +* Parameters: +* ch - Character to output +* +* +*/ +int stdout_putchar(int ch) { + (void)ch; + return ch; // Not implemented +} +#endif + +#endif +/*************************** End of file ****************************/ \ No newline at end of file diff --git a/RTT/SEGGER_RTT_printf.c b/RTT/SEGGER_RTT_printf.c new file mode 100644 index 0000000..12533ff --- /dev/null +++ b/RTT/SEGGER_RTT_printf.c @@ -0,0 +1,508 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* 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 SEGGER Microcontroller 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. * +* * +********************************************************************** +* * +* RTT version: 8.10g * +* * +********************************************************************** + +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT_printf.c +Purpose : Replacement for printf to write formatted data via RTT +Revision: $Rev: 17697 $ +---------------------------------------------------------------------- +*/ +#include "SEGGER_RTT.h" +#include "SEGGER_RTT_Conf.h" + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ + +#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE + #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64) +#endif + +#include +#include + + +#define FORMAT_FLAG_LEFT_JUSTIFY (1u << 0) +#define FORMAT_FLAG_PAD_ZERO (1u << 1) +#define FORMAT_FLAG_PRINT_SIGN (1u << 2) +#define FORMAT_FLAG_ALTERNATE (1u << 3) + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef struct { + char* pBuffer; + unsigned BufferSize; + unsigned Cnt; + + int ReturnValue; + + unsigned RTTBufferIndex; +} SEGGER_RTT_PRINTF_DESC; + +/********************************************************************* +* +* Function prototypes +* +********************************************************************** +*/ + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _StoreChar +*/ +static void _StoreChar(SEGGER_RTT_PRINTF_DESC * p, char c) { + unsigned Cnt; + + Cnt = p->Cnt; + if ((Cnt + 1u) <= p->BufferSize) { + *(p->pBuffer + Cnt) = c; + p->Cnt = Cnt + 1u; + p->ReturnValue++; + } + // + // Write part of string, when the buffer is full + // + if (p->Cnt == p->BufferSize) { + if (SEGGER_RTT_Write(p->RTTBufferIndex, p->pBuffer, p->Cnt) != p->Cnt) { + p->ReturnValue = -1; + } else { + p->Cnt = 0u; + } + } +} + +/********************************************************************* +* +* _PrintUnsigned +*/ +static void _PrintUnsigned(SEGGER_RTT_PRINTF_DESC * pBufferDesc, unsigned v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { + static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + unsigned Div; + unsigned Digit; + unsigned Number; + unsigned Width; + char c; + + Number = v; + Digit = 1u; + // + // Get actual field width + // + Width = 1u; + while (Number >= Base) { + Number = (Number / Base); + Width++; + } + if (NumDigits > Width) { + Width = NumDigits; + } + // + // Print leading chars if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) { + if (FieldWidth != 0u) { + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) { + c = '0'; + } else { + c = ' '; + } + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, c); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + if (pBufferDesc->ReturnValue >= 0) { + // + // Compute Digit. + // Loop until Digit has the value of the highest digit required. + // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100. + // + while (1) { + if (NumDigits > 1u) { // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned) + NumDigits--; + } else { + Div = v / Digit; + if (Div < Base) { // Is our divider big enough to extract the highest digit from value? => Done + break; + } + } + Digit *= Base; + } + // + // Output digits + // + do { + Div = v / Digit; + v -= Div * Digit; + _StoreChar(pBufferDesc, _aV2C[Div]); + if (pBufferDesc->ReturnValue < 0) { + break; + } + Digit /= Base; + } while (Digit); + // + // Print trailing spaces if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + } +} + +/********************************************************************* +* +* _PrintInt +*/ +static void _PrintInt(SEGGER_RTT_PRINTF_DESC * pBufferDesc, int v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { + unsigned Width; + int Number; + + Number = (v < 0) ? -v : v; + + // + // Get actual field width + // + Width = 1u; + while (Number >= (int)Base) { + Number = (Number / (int)Base); + Width++; + } + if (NumDigits > Width) { + Width = NumDigits; + } + if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) { + FieldWidth--; + } + + // + // Print leading spaces if necessary + // + if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + // + // Print sign if necessary + // + if (pBufferDesc->ReturnValue >= 0) { + if (v < 0) { + v = -v; + _StoreChar(pBufferDesc, '-'); + } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) { + _StoreChar(pBufferDesc, '+'); + } else { + + } + if (pBufferDesc->ReturnValue >= 0) { + // + // Print leading zeros if necessary + // + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, '0'); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + if (pBufferDesc->ReturnValue >= 0) { + // + // Print number without sign + // + _PrintUnsigned(pBufferDesc, (unsigned)v, Base, NumDigits, FieldWidth, FormatFlags); + } + } + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* SEGGER_RTT_vprintf +* +* Function description +* Stores a formatted string in SEGGER RTT control block. +* This data is read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") +* sFormat Pointer to format string +* pParamList Pointer to the list of arguments for the format string +* +* Return values +* >= 0: Number of bytes which have been stored in the "Up"-buffer. +* < 0: Error +*/ +int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList) { + char c; + SEGGER_RTT_PRINTF_DESC BufferDesc; + int v; + unsigned NumDigits; + unsigned FormatFlags; + unsigned FieldWidth; + char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE]; + + BufferDesc.pBuffer = acBuffer; + BufferDesc.BufferSize = SEGGER_RTT_PRINTF_BUFFER_SIZE; + BufferDesc.Cnt = 0u; + BufferDesc.RTTBufferIndex = BufferIndex; + BufferDesc.ReturnValue = 0; + + do { + c = *sFormat; + sFormat++; + if (c == 0u) { + break; + } + if (c == '%') { + // + // Filter out flags + // + FormatFlags = 0u; + v = 1; + do { + c = *sFormat; + switch (c) { + case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break; + case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO; sFormat++; break; + case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN; sFormat++; break; + case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE; sFormat++; break; + default: v = 0; break; + } + } while (v); + // + // filter out field with + // + FieldWidth = 0u; + do { + c = *sFormat; + if ((c < '0') || (c > '9')) { + break; + } + sFormat++; + FieldWidth = (FieldWidth * 10u) + ((unsigned)c - '0'); + } while (1); + + // + // Filter out precision (number of digits to display) + // + NumDigits = 0u; + c = *sFormat; + if (c == '.') { + sFormat++; + do { + c = *sFormat; + if ((c < '0') || (c > '9')) { + break; + } + sFormat++; + NumDigits = NumDigits * 10u + ((unsigned)c - '0'); + } while (1); + } + // + // Filter out length modifier + // + c = *sFormat; + do { + if ((c == 'l') || (c == 'h')) { + sFormat++; + c = *sFormat; + } else { + break; + } + } while (1); + // + // Handle specifiers + // + switch (c) { + case 'c': { + char c0; + v = va_arg(*pParamList, int); + c0 = (char)v; + _StoreChar(&BufferDesc, c0); + break; + } + case 'd': + v = va_arg(*pParamList, int); + _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'u': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'x': + case 'X': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags); + break; + case 's': + { + const char * s = va_arg(*pParamList, const char *); + if (s == NULL) { + s = "(NULL)"; // Print (NULL) instead of crashing or breaking, as it is more informative to the user. + } + do { + c = *s; + s++; + if (c == '\0') { + break; + } + _StoreChar(&BufferDesc, c); + } while (BufferDesc.ReturnValue >= 0); + } + break; + case 'p': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u); + break; + case '%': + _StoreChar(&BufferDesc, '%'); + break; + default: + break; + } + sFormat++; + } else { + _StoreChar(&BufferDesc, c); + } + } while (BufferDesc.ReturnValue >= 0); + + if (BufferDesc.ReturnValue > 0) { + // + // Write remaining data, if any + // + if (BufferDesc.Cnt != 0u) { + SEGGER_RTT_Write(BufferIndex, acBuffer, BufferDesc.Cnt); + } + BufferDesc.ReturnValue += (int)BufferDesc.Cnt; + } + return BufferDesc.ReturnValue; +} + +/********************************************************************* +* +* SEGGER_RTT_printf +* +* Function description +* Stores a formatted string in SEGGER RTT control block. +* This data is read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") +* sFormat Pointer to format string, followed by the arguments for conversion +* +* Return values +* >= 0: Number of bytes which have been stored in the "Up"-buffer. +* < 0: Error +* +* Notes +* (1) Conversion specifications have following syntax: +* %[flags][FieldWidth][.Precision]ConversionSpecifier +* (2) Supported flags: +* -: Left justify within the field width +* +: Always print sign extension for signed conversions +* 0: Pad with 0 instead of spaces. Ignored when using '-'-flag or precision +* Supported conversion specifiers: +* c: Print the argument as one char +* d: Print the argument as a signed integer +* u: Print the argument as an unsigned integer +* x: Print the argument as an hexadecimal integer +* s: Print the string pointed to by the argument +* p: Print the argument as an 8-digit hexadecimal integer. (Argument shall be a pointer to void.) +*/ +int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...) { + int r; + va_list ParamList; + + va_start(ParamList, sFormat); + r = SEGGER_RTT_vprintf(BufferIndex, sFormat, &ParamList); + va_end(ParamList); + return r; +} +/*************************** End of file ****************************/

    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 diff --git a/Doc/latex/trace_8h__incl.md5 b/Doc/latex/trace_8h__incl.md5 index a1c8f34..3bf9e8b 100644 --- a/Doc/latex/trace_8h__incl.md5 +++ b/Doc/latex/trace_8h__incl.md5 @@ -1 +1 @@ -c825fc7596c334c4e6a628692e58fd83 \ No newline at end of file +25ced8a2b2c0bbd5a0a97e1ea1708d17 \ No newline at end of file diff --git a/Doc/latex/trace_8h__incl.pdf b/Doc/latex/trace_8h__incl.pdf index 69ff32ce3868ccf7f11354ec85ef9db2d31574d4..77a15efebb9efa0a4a837a18d5c2d31725ac325e 100644 GIT binary patch delta 20808 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 X09G^&fRoEu9ttowGzujpMNdWw?zt_` delta 21287 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 iKj*@WLPSe9+w=e*\ Compiler\ -\/>\ I/O\ -\/>\ STDOUT\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00032}00032\ \textcolor{comment}{\ \ \ \ \ \ @endverbatim}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00033}00033\ \textcolor{comment}{\ \ \ \ \ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00034}00034\ \textcolor{comment}{\ \ \ \ \ \ Для\ SWO\ также\ надо\ включить\ трассировку:\ \ \ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00035}00035\ \textcolor{comment}{\ \ \ \ \ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00036}00036\ \textcolor{comment}{\ \ \ \ \ \ @verbatim}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00037}00037\ \textcolor{comment}{\ \ \ \ \ \ \ \ Options\ For\ Target\ -\/>\ Debug\ -\/>\ Debugger\ Settings}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00038}00038\ \textcolor{comment}{\ \ \ \ \ \ @endverbatim}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00039}00039\ \textcolor{comment}{\ \ \ \ \ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00040}00040\ \textcolor{comment}{\ \ \ \ \ \ В\ вкладке\ Debug:\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00041}00041\ \textcolor{comment}{\ \ \ \ \ \ \ \ -\/\ Port\ =\ SW}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00042}00042\ \textcolor{comment}{\ \ \ \ \ \ В\ вкладке\ Trace:\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00043}00043\ \textcolor{comment}{\ \ \ \ \ \ \ \ -\/\ Указать\ Core\ Clock}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00044}00044\ \textcolor{comment}{\ \ \ \ \ \ \ \ -\/\ Выставить\ Trace\ Port\ =\ SWO}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00045}00045\ \textcolor{comment}{\ \ \ \ \ \ \ \ -\/\ ITM\ -\/\ выбрать\ нужный\ порт\ (для\ Keil\ нулевой\ порт)\ \ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00046}00046\ \textcolor{comment}{\ \ \ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00047}00047\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00048}00048\ \textcolor{comment}{\ \ *\ @\{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00049}00049\ \textcolor{comment}{\ \ *}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00050}00050\ \textcolor{comment}{\ \ *\ @def\ my\_printf(...)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00051}00051\ \textcolor{comment}{\ \ *\ @brief\ Универсальный\ макрос\ для\ вывода\ трассировки}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00052}00052\ \textcolor{comment}{\ \ *\ @details\ Варианты\ реализации:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00053}00053\ \textcolor{comment}{\ \ *\ \ -\/\ RTT\_TRACE\_ENABLE\ \ \ \ \`{}SEGGER\_RTT\_printf(0,\ ...)`}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00054}00054\ \textcolor{comment}{\ \ *\ \ -\/\ SWO\_TRACE\_ENABLE\ -\/\ \`{}printf(...)`}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00055}00055\ \textcolor{comment}{\ \ *\ \ -\/\ NO\_TRACE\ -\/\ пустой\ макрос}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00056}00056\ \textcolor{comment}{\ \ *}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00057}00057\ \textcolor{comment}{\ \ *\ @def\ log\_printf(TAG,\ fmt,\ ...)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00058}00058\ \textcolor{comment}{\ \ *\ @brief\ Макрос\ логирования\ с\ поддержкой\ уровней\ LOG\_LEVEL}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00059}00059\ \textcolor{comment}{\ \ *\ @param\ TAG\ \ Тэг\ лога}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00060}00060\ \textcolor{comment}{\ \ *\ @param\ fmt,\ ...\ \ Форматируемая\ строка}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00061}00061\ \textcolor{comment}{\ \ *\ @details\ Варианты\ реализации:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00062}00062\ \textcolor{comment}{\ \ *\ \ -\/\ LOG\_LEVEL\ ==\ 0\ -\/\ логирование\ отключено\ (макрос\ пустой)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00063}00063\ \textcolor{comment}{\ \ *\ \ -\/\ LOG\_LEVEL\ ==\ 1\ -\/\ выводится\ время\ и\ TAG}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00064}00064\ \textcolor{comment}{\ \ *\ \ -\/\ LOG\_LEVEL\ >=\ 2\ -\/\ выводится\ время,\ TAG,\ имя\ файла\ и\ номер\ строки}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00065}00065\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00066}00066\ \textcolor{preprocessor}{\#ifdef\ SERIAL\_TRACE\_ENABLE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00067}00067\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00068}00068\ \textcolor{preprocessor}{\ \ \#if\ defined(RTT\_TRACE\_ENABLE)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00069}00069\ \textcolor{preprocessor}{\ \ \ \ \#undef\ SWO\_TRACE\_ENABLE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00070}00070\ \textcolor{preprocessor}{\ \ \ \ \#include\ "{}SEGGER\_RTT.h"{}}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00071}\mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{00071}}\ \textcolor{preprocessor}{\ \ \ \ \#define\ my\_printf(...)\ \ \ \ \ \ \ \ SEGGER\_RTT\_printf(0,\ \_\_VA\_ARGS\_\_)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00072}00072\ \textcolor{preprocessor}{\ \ \#elif\ defined(SWO\_TRACE\_ENABLE)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00073}00073\ \textcolor{preprocessor}{\ \ \ \ \#undef\ RTT\_TRACE\_ENABLE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00074}00074\ \textcolor{preprocessor}{\ \ \ \ \#define\ my\_printf(...)\ \ \ \ \ \ \ \ printf(\_\_VA\_ARGS\_\_)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00075}00075\ \textcolor{preprocessor}{\ \ \#else\ }\textcolor{comment}{//\ NO\_TRACE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00076}00076\ \textcolor{preprocessor}{\ \ \ \ \#define\ my\_printf(...)\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00077}00077\ \textcolor{preprocessor}{\ \ \ \ \#warning\ No\ trace\ is\ selected.\ Serial\ debug\ wont\ work.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00078}00078\ \textcolor{preprocessor}{\ \ \#endif\ }\textcolor{comment}{//\ RTT\_TRACE\_ENABLE/SWO\_TRACE\_ENABLE/NO\_TRACE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00079}00079\ \textcolor{preprocessor}{\#else\ }\textcolor{comment}{//SERIAL\_TRACE\_ENABLE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00080}00080\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00081}00081\ \textcolor{preprocessor}{\ \ \#define\ my\_printf(...)\ \ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00082}00082\ \textcolor{preprocessor}{\ \ \#undef\ RTT\_TRACE\_ENABLE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00083}00083\ \textcolor{preprocessor}{\ \ \#undef\ SWO\_TRACE\_ENABLE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00084}00084\ \ \ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00085}00085\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//SERIAL\_TRACE\_ENABLE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00086}00086\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00087}00087\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00088}00088\ \textcolor{preprocessor}{\#ifndef\ LOG\_LEVEL}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00089}00089\ \textcolor{preprocessor}{\#define\ LOG\_LEVEL\ 1\ \ }\textcolor{comment}{///<\ @brief\ Уровень\ логирования\ (по\ умолчанию\ ==\ 1)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00090}00090\ \textcolor{preprocessor}{\#endif}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00091}00091\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00092}00092\ \textcolor{preprocessor}{\#if\ LOG\_LEVEL\ ==\ 0\ }\textcolor{comment}{//\ лог\ отключен}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00093}00093\ \textcolor{preprocessor}{\ \ \ \ \#define\ \(\backslash\)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00094}00094\ \textcolor{preprocessor}{log\_printf(TAG,\ fmt,\ ...)\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00095}00095\ \textcolor{preprocessor}{\#elif\ LOG\_LEVEL\ ==\ 1\ }\textcolor{comment}{//\ только\ тэг}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00096}\mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_ga730fb7b8d0bbb348dca73c15bd0e0b26}{00096}}\ \textcolor{preprocessor}{\ \ \ \ \#define\ log\_printf(TAG,\ fmt,\ ...)\ \ \(\backslash\)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00097}00097\ \textcolor{preprocessor}{my\_printf("{}\(\backslash\)n[\%lu]\ [\%s]\ "{}\ fmt,\ \(\backslash\)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00098}00098\ \textcolor{preprocessor}{(unsigned\ long)uwTick,\ TAG,\ \#\#\_\_VA\_ARGS\_\_)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00099}00099\ \textcolor{preprocessor}{\#elif\ LOG\_LEVEL\ >=\ 2\ }\textcolor{comment}{//\ всё}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00100}00100\ \textcolor{preprocessor}{\ \ \ \ \#define\ log\_printf(TAG,\ fmt,\ ...)\ \ \(\backslash\)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00101}00101\ \textcolor{preprocessor}{my\_printf("{}\(\backslash\)n[\%lu]\ [\%s]\ (\%s:\%d)\ "{}\ fmt,\ \(\backslash\)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00102}00102\ \textcolor{preprocessor}{(unsigned\ long)uwTick,\ TAG,\ \_\_FILE\_\_,\ \_\_LINE\_\_,\ \#\#\_\_VA\_ARGS\_\_)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00103}00103\ \textcolor{preprocessor}{\#endif}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00104}00104\ \ \ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00105}00105\ \textcolor{comment}{/**\ TRACE\_SERIAL}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00106}00106\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00107}00107\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00108}00108\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00109}00109\ \textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00110}00110\ \textcolor{comment}{\ \ *\ @addtogroup\ TRACE\_GPIO\ \ \ \ GPIO\ trace\ defines}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00111}00111\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ TRACE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00112}00112\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Дефайны\ для\ работы\ с\ GPIO\ трассировкой}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00113}00113\ \textcolor{comment}{\ \ *\ @details\ \ \ \ Определяется\ дефайны\ для\ работы\ с\ GPIO\ трассировкой:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00114}00114\ \textcolor{comment}{\ \ \ \ -\/\ TRACE\_GPIO\_RESET()\ -\/\ для\ сброса\ ножки\ GPIO\ (через\ BSRR)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00115}00115\ \textcolor{comment}{\ \ \ \ -\/\ TRACE\_GPIO\_SET()\ -\/\ для\ выставления\ ножки\ GPIO\ (через\ BSRR)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00116}00116\ \textcolor{comment}{\ \ \ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00117}00117\ \textcolor{comment}{\ \ \ \ -\/\ Если\ трассировка\ @ref\ GPIO\_TRACE\_ENABLE\ отключена,\ то\ все\ дефайны\ определяются\ как\ 'ничего'\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00118}00118\ \textcolor{comment}{\ \ \ \ \ \ и\ на\ производительность\ кода\ не\ влияют}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00119}00119\ \textcolor{comment}{\ \ *\ @\{\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00120}00120\ \textcolor{comment}{\ \ *}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00121}00121\ \textcolor{comment}{\ \ *\ @def\ TRACE\_GPIO\_RESET(\_gpio\_,\ \_pin\_)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00122}00122\ \textcolor{comment}{\ \ *\ @brief\ Сбросить\ указанную\ ножку\ GPIO}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00123}00123\ \textcolor{comment}{\ \ *\ @param\ \_gpio\_\ \ Указатель\ на\ структуру\ GPIO\ (напр.\ \ GPIOA)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00124}00124\ \textcolor{comment}{\ \ *\ @param\ \_pin\_\ \ \ Номер\ ножки\ (напр.\ GPIO\_PIN\_0)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00125}00125\ \textcolor{comment}{\ \ *\ @details\ Варианты\ реализации:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00126}00126\ \textcolor{comment}{\ \ *\ \ -\/\ GPIO\_TRACE\_ENABLE\ не\ определён\ -\/\ макрос\ пустой}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00127}00127\ \textcolor{comment}{\ \ *\ \ -\/\ GPIO\_TRACE\_ENABLE\ определён\ -\/\ устанавливает\ бит\ сброса\ через\ BSRR\ ((\_pin\_)<<16)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00128}00128\ \textcolor{comment}{\ \ *}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00129}00129\ \textcolor{comment}{\ \ *\ @def\ TRACE\_GPIO\_SET(\_gpio\_,\ \_pin\_)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00130}00130\ \textcolor{comment}{\ \ *\ @brief\ Установить\ указанную\ ножку\ GPIO}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00131}00131\ \textcolor{comment}{\ \ *\ @param\ \_gpio\_\ \ Указатель\ на\ структуру\ GPIO\ (например\ GPIOA)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00132}00132\ \textcolor{comment}{\ \ *\ @param\ \_pin\_\ \ \ Номер\ ножки\ (напр.\ GPIO\_PIN\_0)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00133}00133\ \textcolor{comment}{\ \ *\ @details\ Варианты\ реализации:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00134}00134\ \textcolor{comment}{\ \ *\ \ -\/\ GPIO\_TRACE\_ENABLE\ не\ определён\ -\/\ макрос\ пустой}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00135}00135\ \textcolor{comment}{\ \ *\ \ -\/\ GPIO\_TRACE\_ENABLE\ определён\ -\/\ устанавливает\ бит\ установки\ через\ BSRR\ (\_pin\_)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00136}00136\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00137}00137\ \textcolor{preprocessor}{\#ifndef\ GPIO\_TRACE\_ENABLE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00138}00138\ \textcolor{preprocessor}{\ \ \#define\ TRACE\_GPIO\_SET(\_gpio\_,\_pin\_)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00139}00139\ \textcolor{preprocessor}{\ \ \#define\ TRACE\_GPIO\_RESET(\_gpio\_,\_pin\_)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00140}00140\ \textcolor{preprocessor}{\#else}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00141}\mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga02a6a7b273766121db8ad4a1371373eb}{00141}}\ \textcolor{preprocessor}{\ \ \#define\ TRACE\_GPIO\_SET(\_gpio\_,\_pin\_)\ \ \ \ \ \ \ \ \ \ (\_gpio\_)-\/>BSRR\ =\ (((\_pin\_)))}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00142}\mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga69741d88c991112e99fe7a62e025108a}{00142}}\ \textcolor{preprocessor}{\ \ \#define\ TRACE\_GPIO\_RESET(\_gpio\_,\_pin\_)\ \ \ \ \ \ \ \ (\_gpio\_)-\/>BSRR\ =\ ((\_pin\_)<<16)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00143}00143\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//GPIO\_TRACE\_ENABLE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00144}00144\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00145}00145\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00146}00146\ \textcolor{comment}{/**\ TRACE\_GPIO}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00147}00147\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00148}00148\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00149}00149\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00150}00150\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00151}00151\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00152}00152\ \textcolor{preprocessor}{\#if\ defined(HAL\_MODULE\_ENABLED)\ \&\&\ defined(RTT\_TRACE\_ENABLE)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00153}00153\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00154}00154\ \textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00155}00155\ \textcolor{comment}{\ \ *\ @addtogroup\ TRACE\_RTT\_FLASH\ \ \ \ Flash\ RTT\ Buffer}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00156}00156\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ TRACE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00157}00157\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Макросы\ и\ функции\ для\ сохранения/чтения\ RTT\ буфера\ в\ Flash}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00158}00158\ \textcolor{comment}{\ \ *\ @details\ \ \ \ Модуль\ позволяет\ сохранять\ данные\ RTT\ буфера\ во\ Flash\ и\ читать\ их\ обратно\ по\ тегам.\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00159}00159\ \textcolor{comment}{\ \ *\ Теги\ работают\ следующим\ образом:\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00160}00160\ \textcolor{comment}{\ \ *\ \ -\/\ Базовый\ тег\ (младший\ байт\ =\ 0):\ модуль\ сам\ выбирает\ первый\ свободный\ слот\ во\ Flash;\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00161}00161\ \textcolor{comment}{\ \ *\ \ \ \ новые\ записи\ получают\ автоинкрементированный\ младший\ байт\ тега\ (от\ 0x00\ до\ 0xFF).\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00162}00162\ \textcolor{comment}{\ \ *\ \ -\/\ Конкретный\ тег\ (младший\ байт\ !=\ 0):\ запись\ или\ чтение\ происходит\ строго\ с\ указанным\ тегом;\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00163}00163\ \textcolor{comment}{\ \ *\ \ \ \ если\ слот\ с\ таким\ тегом\ уже\ занят,\ запись\ не\ выполняется.\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00164}00164\ \textcolor{comment}{\ \ *\ \ -\/\ Автоинкремент\ позволяет\ хранить\ несколько\ последовательных\ записей\ в\ пределах\ одного\ базового\ тега,\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00165}00165\ \textcolor{comment}{\ \ *\ \ \ \ без\ необходимости\ вручную\ отслеживать\ адреса\ Flash\ или\ позиции\ буферов.\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00166}00166\ \textcolor{comment}{\ \ *\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00167}00167\ \textcolor{comment}{\ \ *\ Параметры:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00168}00168\ \textcolor{comment}{\ \ *\ -\/\ @ref\ RTT\_FLASH\_BUFFER\_SIZE\ \ \ \ -\/\ Размер\ буфера\ RTT\ в\ Flash}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00169}00169\ \textcolor{comment}{\ \ *\ -\/\ @ref\ RTT\_FLASH\_SECTOR\ \ \ \ \ \ \ \ \ -\/\ Сектор\ FLASH\ куда\ положится\ RTT\ буфер}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00170}00170\ \textcolor{comment}{\ \ *\ -\/\ @ref\ RTT\_FLASH\_SECTOR\_START\ \ \ -\/\ Начало\ сектора\ RTT\_FLASH\_SECTOR}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00171}00171\ \textcolor{comment}{\ \ *\ -\/\ @ref\ RTT\_FLASH\_SECTOR\_END\ \ \ \ \ -\/\ Конец\ сектора\ RTT\_FLASH\_SECTOR}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00172}00172\ \textcolor{comment}{\ \ *\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00173}00173\ \textcolor{comment}{\ \ *\ @\{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00174}00174\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00175}00175\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00176}00176\ \ \ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00177}00177\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00178}00178\ \textcolor{comment}{\ \ *\ @brief\ Структура\ RTT,\ которая\ будет\ положена\ в\ Flash}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00179}00179\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00180}\mbox{\hyperlink{struct_r_t_t___flash_header__t}{00180}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{struct\ }\{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00181}\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{00181}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Уникальный\ идентификатор\ буфера}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00182}\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{00182}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Размер\ данных}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00183}\mbox{\hyperlink{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d042d52a}{00183}}\ \ \ \textcolor{keywordtype}{char}\ \ \ \ \ data[\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}}];\ \ \textcolor{comment}{///<\ Буфер\ RTT}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00184}00184\ \}\ \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}};} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00185}00185\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00186}00186\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00187}00187\ \textcolor{comment}{\ \ *\ @brief\ Подготовка\ Flash\ к\ записи}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00188}00188\ \textcolor{comment}{\ \ *\ @details\ Сбрасывает\ ошибки\ Flash\ и\ ожидает\ готовности\ перед\ записью}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00189}00189\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00190}\mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6}{00190}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6}{RTT\_FlashPrepare}}(\textcolor{keywordtype}{void})} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00191}00191\ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00192}00192\ \ \ HAL\_FLASH\_Unlock();} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00193}00193\ \ \ \_\_HAL\_FLASH\_CLEAR\_FLAG(FLASH\_FLAG\_PGSERR\ |\ FLASH\_FLAG\_WRPERR\ |\ FLASH\_FLAG\_OPERR);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00194}00194\ \ \ \textcolor{keywordflow}{while}\ (\_\_HAL\_FLASH\_GET\_FLAG(FLASH\_FLAG\_BSY))\ \{\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00195}00195\ \ \ \_\_NOP();\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00196}00196\ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00197}00197\ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00023}00023\ \textcolor{comment}{\ \ \ \ -\/\ @ref\ RTT\_TRACE\_ENABLE\ -\/\ для\ RTT\ это\ будет\ вызов\ функции\ SEGGER\_RTT\_printf()}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00024}00024\ \textcolor{comment}{\ \ \ \ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00025}00025\ \textcolor{comment}{\ \ \ \ \ \ Предварительно\ надо\ подключить\ библиотеку\ SEGGER\ RTT\ (SEGGER\_RTT.h)\ и\ вызвать\ функцию\ SEGGER\_RTT\_Init()}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00026}00026\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00027}00027\ \textcolor{comment}{\ \ \ \ -\/\ @ref\ SWO\_TRACE\_ENABLE\ для\ SWO\ это\ будет\ просто\ printf()}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00028}00028\ \textcolor{comment}{\ \ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00029}00029\ \textcolor{comment}{\ \ \ \ \ \ Предварительно\ надо\ подключить\ библиотеку\ STDOUT\ и\ retarget\ под\ ITM:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00030}00030\ \textcolor{comment}{\ \ \ \ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00031}00031\ \textcolor{comment}{\ \ \ \ \ \ @verbatim}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00032}00032\ \textcolor{comment}{\ \ \ \ \ \ \ \ Manage\ Run-\/Time\ Environment\ -\/>\ Compiler\ -\/>\ I/O\ -\/>\ STDOUT\ -\/>\ ITM}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00033}00033\ \textcolor{comment}{\ \ \ \ \ \ @endverbatim}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00034}00034\ \textcolor{comment}{\ \ \ \ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00035}00035\ \textcolor{comment}{\ \ \ \ \ \ Для\ SWO\ также\ надо\ включить\ трассировку:\ \ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00036}00036\ \textcolor{comment}{\ \ \ \ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00037}00037\ \textcolor{comment}{\ \ \ \ \ \ @verbatim}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00038}00038\ \textcolor{comment}{\ \ \ \ \ \ \ \ Options\ For\ Target\ -\/>\ Debug\ -\/>\ Debugger\ Settings}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00039}00039\ \textcolor{comment}{\ \ \ \ \ \ @endverbatim}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00040}00040\ \textcolor{comment}{\ \ \ \ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00041}00041\ \textcolor{comment}{\ \ \ \ \ \ В\ вкладке\ Debug:\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00042}00042\ \textcolor{comment}{\ \ \ \ \ \ \ \ -\/\ Port\ =\ SW}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00043}00043\ \textcolor{comment}{\ \ \ \ \ \ В\ вкладке\ Trace:\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00044}00044\ \textcolor{comment}{\ \ \ \ \ \ \ \ -\/\ Указать\ Core\ Clock}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00045}00045\ \textcolor{comment}{\ \ \ \ \ \ \ \ -\/\ Выставить\ Trace\ Port\ =\ SWO}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00046}00046\ \textcolor{comment}{\ \ \ \ \ \ \ \ -\/\ ITM\ -\/\ выбрать\ нужный\ порт\ (для\ Keil\ нулевой\ порт)\ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00047}00047\ \textcolor{comment}{\ \ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00048}00048\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00049}00049\ \textcolor{comment}{\ \ *\ @\{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00050}00050\ \textcolor{comment}{\ \ *}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00051}00051\ \textcolor{comment}{\ \ *\ @def\ my\_printf(...)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00052}00052\ \textcolor{comment}{\ \ *\ @brief\ Универсальный\ макрос\ для\ вывода\ трассировки}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00053}00053\ \textcolor{comment}{\ \ *\ @details\ Варианты\ реализации:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00054}00054\ \textcolor{comment}{\ \ *\ \ -\/\ RTT\_TRACE\_ENABLE\ \ \ \ \`{}SEGGER\_RTT\_printf(0,\ ...)`}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00055}00055\ \textcolor{comment}{\ \ *\ \ -\/\ SWO\_TRACE\_ENABLE\ -\/\ \`{}printf(...)`}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00056}00056\ \textcolor{comment}{\ \ *\ \ -\/\ NO\_TRACE\ -\/\ пустой\ макрос}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00057}00057\ \textcolor{comment}{\ \ *}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00058}00058\ \textcolor{comment}{\ \ *\ @def\ log\_printf(TAG,\ fmt,\ ...)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00059}00059\ \textcolor{comment}{\ \ *\ @brief\ Макрос\ логирования\ с\ поддержкой\ уровней\ @ref\ LOG\_LEVEL}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00060}00060\ \textcolor{comment}{\ \ *\ @param\ TAG\ \ Тэг\ лога}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00061}00061\ \textcolor{comment}{\ \ *\ @param\ fmt,\ ...\ \ Форматируемая\ строка}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00062}00062\ \textcolor{comment}{\ \ *\ @details\ Варианты\ реализации:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00063}00063\ \textcolor{comment}{\ \ *\ \ -\/\ @ref\ LOG\_LEVEL\ ==\ 0\ -\/\ логирование\ отключено\ (макрос\ пустой)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00064}00064\ \textcolor{comment}{\ \ *\ \ -\/\ @ref\ LOG\_LEVEL\ ==\ 1\ -\/\ выводится\ время\ @ref\ local\_time\ и\ TAG}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00065}00065\ \textcolor{comment}{\ \ *\ @code}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00066}00066\ \textcolor{comment}{\ \ \ \ \ \ \ \ \ \ \ \ [123]\ [ADC]\ Measure\ Done}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00067}00067\ \textcolor{comment}{\ \ \ \ \ \ \ \ \ \ \ \ [456]\ [ADC]\ Measure\ Err}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00068}00068\ \textcolor{comment}{\ \ *\ @endcode}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00069}00069\ \textcolor{comment}{\ \ *\ \ -\/\ @ref\ LOG\_LEVEL\ >=\ 2\ -\/\ выводится\ время,\ TAG,\ имя\ файла\ и\ номер\ строки}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00070}00070\ \textcolor{comment}{\ \ *\ @code}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00071}00071\ \textcolor{comment}{\ \ \ \ \ \ \ \ \ \ \ \ [123]\ [ADC]\ (../Core/Src/adc.c:75)\ Measure\ Done}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00072}00072\ \textcolor{comment}{\ \ \ \ \ \ \ \ \ \ \ \ [456]\ [ADC]\ (../Core/Src/adc.c:80)\ Measure\ Err}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00073}00073\ \textcolor{comment}{\ \ *\ @endcode}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00074}00074\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00075}00075\ \textcolor{preprocessor}{\#ifdef\ SERIAL\_TRACE\_ENABLE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00076}00076\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00077}00077\ \textcolor{preprocessor}{\ \ \#if\ defined(RTT\_TRACE\_ENABLE)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00078}00078\ \textcolor{preprocessor}{\ \ \ \ \#undef\ SWO\_TRACE\_ENABLE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00079}00079\ \textcolor{preprocessor}{\ \ \ \ \#include\ "{}SEGGER\_RTT.h"{}}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00080}\mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{00080}}\ \textcolor{preprocessor}{\ \ \ \ \#define\ my\_printf(...)\ \ \ \ \ \ \ \ SEGGER\_RTT\_printf(0,\ \_\_VA\_ARGS\_\_)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00081}00081\ \textcolor{preprocessor}{\ \ \#elif\ defined(SWO\_TRACE\_ENABLE)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00082}00082\ \textcolor{preprocessor}{\ \ \ \ \#undef\ RTT\_TRACE\_ENABLE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00083}00083\ \textcolor{preprocessor}{\ \ \ \ \#define\ my\_printf(...)\ \ \ \ \ \ \ \ printf(\_\_VA\_ARGS\_\_)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00084}00084\ \textcolor{preprocessor}{\ \ \#else\ }\textcolor{comment}{//\ NO\_TRACE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00085}00085\ \textcolor{preprocessor}{\ \ \ \ \#define\ my\_printf(...)\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00086}00086\ \textcolor{preprocessor}{\ \ \ \ \#warning\ No\ trace\ is\ selected.\ Serial\ debug\ wont\ work.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00087}00087\ \textcolor{preprocessor}{\ \ \#endif\ }\textcolor{comment}{//\ RTT\_TRACE\_ENABLE/SWO\_TRACE\_ENABLE/NO\_TRACE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00088}00088\ \textcolor{preprocessor}{\#else\ }\textcolor{comment}{//SERIAL\_TRACE\_ENABLE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00089}00089\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00090}00090\ \textcolor{preprocessor}{\ \ \#define\ my\_printf(...)\ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00091}00091\ \textcolor{preprocessor}{\ \ \#undef\ RTT\_TRACE\_ENABLE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00092}00092\ \textcolor{preprocessor}{\ \ \#undef\ SWO\_TRACE\_ENABLE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00093}00093\ \ \ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00094}00094\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//SERIAL\_TRACE\_ENABLE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00095}00095\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00096}00096\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00097}00097\ \textcolor{preprocessor}{\#ifndef\ local\_time}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00098}00098\ \textcolor{preprocessor}{\#define\ local\_time()\ \ HAL\_GetTick()\ }\textcolor{comment}{///<\ Локальное\ время}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00099}00099\ \textcolor{preprocessor}{\#endif}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00100}00100\ \textcolor{preprocessor}{\#ifndef\ LOG\_LEVEL}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00101}00101\ \textcolor{preprocessor}{\#define\ LOG\_LEVEL\ 1\ \ }\textcolor{comment}{///<\ @brief\ Уровень\ логирования\ (по\ умолчанию\ ==\ 1)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00102}00102\ \textcolor{preprocessor}{\#endif}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00103}00103\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00104}00104\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00105}00105\ \textcolor{preprocessor}{\#if\ LOG\_LEVEL\ ==\ 0\ }\textcolor{comment}{//\ лог\ отключен}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00106}00106\ \textcolor{preprocessor}{\ \ \ \ \#define\ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00107}00107\ \textcolor{preprocessor}{log\_printf(TAG,\ fmt,\ ...)\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00108}00108\ \textcolor{preprocessor}{\#elif\ LOG\_LEVEL\ ==\ 1\ }\textcolor{comment}{//\ только\ тэг}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00109}\mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_ga730fb7b8d0bbb348dca73c15bd0e0b26}{00109}}\ \textcolor{preprocessor}{\ \ \ \ \#define\ log\_printf(TAG,\ fmt,\ ...)\ \ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00110}00110\ \textcolor{preprocessor}{my\_printf("{}\(\backslash\)n[\%lu]\ [\%s]\ "{}\ fmt,\ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00111}00111\ \textcolor{preprocessor}{(unsigned\ long)local\_time(),\ TAG,\ \#\#\_\_VA\_ARGS\_\_)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00112}00112\ \textcolor{preprocessor}{\#elif\ LOG\_LEVEL\ >=\ 2\ }\textcolor{comment}{//\ всё}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00113}00113\ \textcolor{preprocessor}{\ \ \ \ \#define\ log\_printf(TAG,\ fmt,\ ...)\ \ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00114}00114\ \textcolor{preprocessor}{my\_printf("{}\(\backslash\)n[\%lu]\ [\%s]\ (\%s:\%d)\ "{}\ fmt,\ \(\backslash\)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00115}00115\ \textcolor{preprocessor}{(unsigned\ long)local\_time(),\ TAG,\ \_\_FILE\_\_,\ \_\_LINE\_\_,\ \#\#\_\_VA\_ARGS\_\_)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00116}00116\ \textcolor{preprocessor}{\#endif}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00117}00117\ \ \ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00118}00118\ \textcolor{comment}{/**\ TRACE\_SERIAL}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00119}00119\ \textcolor{comment}{\ \ *\ @\}}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00120}00120\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00121}00121\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00122}00122\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00123}00123\ \textcolor{comment}{\ \ *\ @addtogroup\ TRACE\_GPIO\ \ \ \ GPIO\ trace\ defines}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00124}00124\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ TRACE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00125}00125\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Дефайны\ для\ работы\ с\ GPIO\ трассировкой}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00126}00126\ \textcolor{comment}{\ \ *\ @details\ \ \ \ Определяется\ дефайны\ для\ работы\ с\ GPIO\ трассировкой:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00127}00127\ \textcolor{comment}{\ \ \ \ -\/\ TRACE\_GPIO\_RESET()\ -\/\ для\ сброса\ ножки\ GPIO\ (через\ BSRR)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00128}00128\ \textcolor{comment}{\ \ \ \ -\/\ TRACE\_GPIO\_SET()\ -\/\ для\ выставления\ ножки\ GPIO\ (через\ BSRR)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00129}00129\ \textcolor{comment}{\ \ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00130}00130\ \textcolor{comment}{\ \ \ \ -\/\ Если\ трассировка\ @ref\ GPIO\_TRACE\_ENABLE\ отключена,\ то\ все\ дефайны\ определяются\ как\ 'ничего'\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00131}00131\ \textcolor{comment}{\ \ \ \ \ \ и\ на\ производительность\ кода\ не\ влияют}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00132}00132\ \textcolor{comment}{\ \ *\ @\{\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00133}00133\ \textcolor{comment}{\ \ *}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00134}00134\ \textcolor{comment}{\ \ *\ @def\ TRACE\_GPIO\_RESET(\_gpio\_,\ \_pin\_)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00135}00135\ \textcolor{comment}{\ \ *\ @brief\ Сбросить\ указанную\ ножку\ GPIO}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00136}00136\ \textcolor{comment}{\ \ *\ @param\ \_gpio\_\ \ Указатель\ на\ структуру\ GPIO\ (напр.\ \ GPIOA)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00137}00137\ \textcolor{comment}{\ \ *\ @param\ \_pin\_\ \ \ Номер\ ножки\ (напр.\ GPIO\_PIN\_0)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00138}00138\ \textcolor{comment}{\ \ *\ @details\ Варианты\ реализации:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00139}00139\ \textcolor{comment}{\ \ *\ \ -\/\ GPIO\_TRACE\_ENABLE\ не\ определён\ -\/\ макрос\ пустой}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00140}00140\ \textcolor{comment}{\ \ *\ \ -\/\ GPIO\_TRACE\_ENABLE\ определён\ -\/\ устанавливает\ бит\ сброса\ через\ BSRR\ ((\_pin\_)<<16)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00141}00141\ \textcolor{comment}{\ \ *}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00142}00142\ \textcolor{comment}{\ \ *\ @def\ TRACE\_GPIO\_SET(\_gpio\_,\ \_pin\_)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00143}00143\ \textcolor{comment}{\ \ *\ @brief\ Установить\ указанную\ ножку\ GPIO}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00144}00144\ \textcolor{comment}{\ \ *\ @param\ \_gpio\_\ \ Указатель\ на\ структуру\ GPIO\ (например\ GPIOA)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00145}00145\ \textcolor{comment}{\ \ *\ @param\ \_pin\_\ \ \ Номер\ ножки\ (напр.\ GPIO\_PIN\_0)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00146}00146\ \textcolor{comment}{\ \ *\ @details\ Варианты\ реализации:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00147}00147\ \textcolor{comment}{\ \ *\ \ -\/\ GPIO\_TRACE\_ENABLE\ не\ определён\ -\/\ макрос\ пустой}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00148}00148\ \textcolor{comment}{\ \ *\ \ -\/\ GPIO\_TRACE\_ENABLE\ определён\ -\/\ устанавливает\ бит\ установки\ через\ BSRR\ (\_pin\_)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00149}00149\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00150}00150\ \textcolor{preprocessor}{\#ifndef\ GPIO\_TRACE\_ENABLE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00151}00151\ \textcolor{preprocessor}{\ \ \#define\ TRACE\_GPIO\_SET(\_gpio\_,\_pin\_)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00152}00152\ \textcolor{preprocessor}{\ \ \#define\ TRACE\_GPIO\_RESET(\_gpio\_,\_pin\_)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00153}00153\ \textcolor{preprocessor}{\#else}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00154}\mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga02a6a7b273766121db8ad4a1371373eb}{00154}}\ \textcolor{preprocessor}{\ \ \#define\ TRACE\_GPIO\_SET(\_gpio\_,\_pin\_)\ \ \ \ \ \ \ \ \ \ (\_gpio\_)-\/>BSRR\ =\ (((\_pin\_)))}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00155}\mbox{\hyperlink{group___t_r_a_c_e___g_p_i_o_ga69741d88c991112e99fe7a62e025108a}{00155}}\ \textcolor{preprocessor}{\ \ \#define\ TRACE\_GPIO\_RESET(\_gpio\_,\_pin\_)\ \ \ \ \ \ \ \ (\_gpio\_)-\/>BSRR\ =\ ((\_pin\_)<<16)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00156}00156\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//GPIO\_TRACE\_ENABLE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00157}00157\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00158}00158\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00159}00159\ \textcolor{comment}{/**\ TRACE\_GPIO}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00160}00160\ \textcolor{comment}{\ \ *\ @\}}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00161}00161\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00162}00162\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00163}00163\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00164}00164\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00165}00165\ \textcolor{preprocessor}{\#if\ defined(HAL\_MODULE\_ENABLED)\ \&\&\ defined(RTT\_TRACE\_ENABLE)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00166}00166\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00167}00167\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00168}00168\ \textcolor{comment}{\ \ *\ @addtogroup\ TRACE\_RTT\_FLASH\ \ \ \ Flash\ RTT\ Buffer}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00169}00169\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ TRACE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00170}00170\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ Макросы\ и\ функции\ для\ сохранения/чтения\ RTT\ буфера\ в\ Flash}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00171}00171\ \textcolor{comment}{\ \ *\ @details\ \ \ \ Модуль\ позволяет\ сохранять\ данные\ RTT\ буфера\ во\ Flash\ и\ читать\ их\ обратно\ по\ тегам.\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00172}00172\ \textcolor{comment}{\ \ *\ Теги\ работают\ следующим\ образом:\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00173}00173\ \textcolor{comment}{\ \ *\ \ -\/\ Базовый\ тег\ (младший\ байт\ =\ 0):\ модуль\ сам\ выбирает\ первый\ свободный\ слот\ во\ Flash;\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00174}00174\ \textcolor{comment}{\ \ *\ \ \ \ новые\ записи\ получают\ автоинкрементированный\ младший\ байт\ тега\ (от\ 0x00\ до\ 0xFF).\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00175}00175\ \textcolor{comment}{\ \ *\ \ -\/\ Конкретный\ тег\ (младший\ байт\ !=\ 0):\ запись\ или\ чтение\ происходит\ строго\ с\ указанным\ тегом;\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00176}00176\ \textcolor{comment}{\ \ *\ \ \ \ если\ слот\ с\ таким\ тегом\ уже\ занят,\ запись\ не\ выполняется.\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00177}00177\ \textcolor{comment}{\ \ *\ \ -\/\ Автоинкремент\ позволяет\ хранить\ несколько\ последовательных\ записей\ в\ пределах\ одного\ базового\ тега,\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00178}00178\ \textcolor{comment}{\ \ *\ \ \ \ без\ необходимости\ вручную\ отслеживать\ адреса\ Flash\ или\ позиции\ буферов.\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00179}00179\ \textcolor{comment}{\ \ *\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00180}00180\ \textcolor{comment}{\ \ *\ Параметры:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00181}00181\ \textcolor{comment}{\ \ *\ -\/\ @ref\ RTT\_FLASH\_BUFFER\_SIZE\ \ \ \ -\/\ Размер\ буфера\ RTT\ в\ Flash}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00182}00182\ \textcolor{comment}{\ \ *\ -\/\ @ref\ RTT\_FLASH\_SECTOR\ \ \ \ \ \ \ \ \ -\/\ Сектор\ FLASH\ куда\ положится\ RTT\ буфер}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00183}00183\ \textcolor{comment}{\ \ *\ -\/\ @ref\ RTT\_FLASH\_SECTOR\_START\ \ \ -\/\ Начало\ сектора\ RTT\_FLASH\_SECTOR}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00184}00184\ \textcolor{comment}{\ \ *\ -\/\ @ref\ RTT\_FLASH\_SECTOR\_END\ \ \ \ \ -\/\ Конец\ сектора\ RTT\_FLASH\_SECTOR}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00185}00185\ \textcolor{comment}{\ \ *\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00186}00186\ \textcolor{comment}{\ \ *\ @\{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00187}00187\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00188}00188\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00189}00189\ \ \ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00190}00190\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00191}00191\ \textcolor{comment}{\ \ *\ @brief\ Структура\ RTT,\ которая\ будет\ положена\ в\ Flash}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00192}00192\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00193}\mbox{\hyperlink{struct_r_t_t___flash_header__t}{00193}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{struct\ }\{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00194}\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{00194}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Уникальный\ идентификатор\ буфера}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00195}\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{00195}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{///<\ Размер\ данных}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00196}\mbox{\hyperlink{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d042d52a}{00196}}\ \ \ \textcolor{keywordtype}{char}\ \ \ \ \ \mbox{\hyperlink{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d042d52a}{data}}[\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}}];\ \ \textcolor{comment}{///<\ Буфер\ RTT}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00197}00197\ \}\ \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}};} \DoxyCodeLine{\Hypertarget{trace_8h_source_l00198}00198\ \textcolor{comment}{}} \DoxyCodeLine{\Hypertarget{trace_8h_source_l00199}00199\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00200}00200\ \textcolor{comment}{\ \ *\ @brief\ Сохраняет\ последние\ символы\ RTT-\/буфера\ в\ Flash\ по\ тегу}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00201}00201\ \textcolor{comment}{\ \ *\ @param\ tag\ \ \ \ \ \ \ \ Базовый\ или\ конкретный\ идентификатор\ буфера.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00202}00202\ \textcolor{comment}{\ \ *\ @param\ tail\_size\ \ Количество\ последних\ символов\ RTT\ для\ копирования}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00203}00203\ \textcolor{comment}{\ \ *\ @param\ buf\_num\ \ \ \ Указатель\ на\ переменную\ в\ которую\ запишется\ номер\ буфера\ для\ конкретного\ тега}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00204}00204\ \textcolor{comment}{\ \ *\ @return\ >=0\ —\ номер\ буфера\ (тег)\ для\ записи,\ <0\ —\ ошибка\ (нет\ места,\ тег\ уже\ занят,\ ошибка\ записи\ в\ флеш)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00205}00205\ \textcolor{comment}{\ \ *}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00206}00206\ \textcolor{comment}{\ \ *\ @details\ \ Автоматически\ копирует\ последние\ tail\_size\ символов\ из\ RTT-\/буфера}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00207}00207\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ и\ записывает\ их\ во\ Flash.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00208}00208\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ Тег\ может\ быть\ базовым\ или\ конкретным:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00209}00209\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ \ \ -\/\ Если\ базовый\ (младший\ байт\ ==\ 0)\ —\ будет\ выбран\ первый\ свободный\ слот\ с\ автоинкрементом.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00210}00210\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Автоинкремент\ формируется\ в\ пределах\ от\ 0x1\ до\ 0xFF}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00211}00211\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ \ \ -\/\ Если\ конкретный\ (младший\ байт\ !=\ 0)\ —\ запись\ выполняется\ только\ с\ этим\ тегом,\ иначе\ ошибка.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00212}00212\ \textcolor{comment}{\ \ *\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00213}00213\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00214}\mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga79f222c8ab644de4d47f07528d1edd63}{00214}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga79f222c8ab644de4d47f07528d1edd63}{RTT\_SaveToFlash}}(uint32\_t\ tag,\ uint32\_t\ tail\_size)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00215}00215\ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00216}00216\ \ \ \textcolor{keywordflow}{if}\ (tag\ ==\ 0xFFFFFFFF)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00217}00217\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ Неверный\ тег}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00218}00218\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00219}00219\ \ \ SEGGER\_RTT\_BUFFER\_UP\ *up\ =\ \&\_SEGGER\_RTT.aUp[0];} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00220}00220\ \ \ \textcolor{keywordtype}{unsigned}\ buf\_size\ =\ up-\/>SizeOfBuffer;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00221}00221\ \ \ \textcolor{keywordtype}{unsigned}\ wr\ =\ up-\/>WrOff;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00222}00222\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00223}00223\ \ \ \textcolor{comment}{//\ Ограничиваем\ по\ размеру\ буфера\ RTT\ и\ RTT\_FLASH\_BUFFER\_SIZE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00224}00224\ \ \ \textcolor{keywordtype}{unsigned}\ n\ =\ (tail\_size\ >\ buf\_size)\ ?\ buf\_size\ :\ tail\_size;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00225}00225\ \ \ \textcolor{keywordflow}{if}\ (n\ >\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}})} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00226}00226\ \ \ \ \ n\ =\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}};} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00227}00227\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00228}00228\ \ \ uint32\_t\ addr\ =\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga8e56f75d3ab8a89ddde1404ae23c3297}{RTT\_FLASH\_SECTOR\_START}};} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00229}00229\ \ \ \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ *flash\_hdr\ =\ NULL;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00230}00230\ \ \ uint32\_t\ base\_tag\ =\ tag\ \&\ 0xFFFFFF00;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00231}00231\ \ \ uint32\_t\ next\_tag\ =\ (tag\ \&\ 0xFF)\ ==\ 0\ ?\ tag\ +\ 1\ :\ tag;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00232}00232\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00233}00233\ \ \ \textcolor{comment}{//\ Ищем\ первый\ свободный\ слот,\ параллельно\ автоинкрементируем\ тег}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00234}00234\ \ \ \textcolor{keywordflow}{while}\ ((addr\ +\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}))\ <=\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gafeca0be3688dea07ff443f894668003d}{RTT\_FLASH\_SECTOR\_END}})} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00235}00235\ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00236}00236\ \ \ \ \ flash\_hdr\ =\ (\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ *)addr;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00237}00237\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00238}00238\ \ \ \ \ \textcolor{keywordflow}{if}\ (flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ ==\ 0xFFFFFFFF)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00239}00239\ \ \ \ \ \ \ \textcolor{keywordflow}{break};\ \ \textcolor{comment}{//\ Нашли\ свободное\ место}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00200}00200\ \textcolor{comment}{\ \ *\ @brief\ Подготовка\ Flash\ к\ записи}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00201}00201\ \textcolor{comment}{\ \ *\ @details\ Сбрасывает\ ошибки\ Flash\ и\ ожидает\ готовности\ перед\ записью}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00202}00202\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00203}\mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6}{00203}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6}{RTT\_FlashPrepare}}(\textcolor{keywordtype}{void})} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00204}00204\ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00205}00205\ \ \ HAL\_FLASH\_Unlock();} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00206}00206\ \ \ \_\_HAL\_FLASH\_CLEAR\_FLAG(FLASH\_FLAG\_PGSERR\ |\ FLASH\_FLAG\_WRPERR\ |\ FLASH\_FLAG\_OPERR);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00207}00207\ \ \ \textcolor{keywordflow}{while}\ (\_\_HAL\_FLASH\_GET\_FLAG(FLASH\_FLAG\_BSY))\ \{\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00208}00208\ \ \ \_\_NOP();\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00209}00209\ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00210}00210\ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00211}00211\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00212}00212\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00213}00213\ \textcolor{comment}{\ \ *\ @brief\ Сохраняет\ последние\ символы\ RTT-\/буфера\ в\ Flash\ по\ тегу}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00214}00214\ \textcolor{comment}{\ \ *\ @param\ tag\ \ \ \ \ \ \ \ Базовый\ или\ конкретный\ идентификатор\ буфера.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00215}00215\ \textcolor{comment}{\ \ *\ @param\ tail\_size\ \ Количество\ последних\ символов\ RTT\ для\ копирования}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00216}00216\ \textcolor{comment}{\ \ *\ @param\ buf\_num\ \ \ \ Указатель\ на\ переменную\ в\ которую\ запишется\ номер\ буфера\ для\ конкретного\ тега}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00217}00217\ \textcolor{comment}{\ \ *\ @return\ >=0\ —\ номер\ буфера\ (тег)\ для\ записи,\ <0\ —\ ошибка\ (нет\ места,\ тег\ уже\ занят,\ ошибка\ записи\ в\ флеш)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00218}00218\ \textcolor{comment}{\ \ *}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00219}00219\ \textcolor{comment}{\ \ *\ @details\ \ Автоматически\ копирует\ последние\ tail\_size\ символов\ из\ RTT-\/буфера}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00220}00220\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ и\ записывает\ их\ во\ Flash.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00221}00221\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ Тег\ может\ быть\ базовым\ или\ конкретным:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00222}00222\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ \ \ -\/\ Если\ базовый\ (младший\ байт\ ==\ 0)\ —\ будет\ выбран\ первый\ свободный\ слот\ с\ автоинкрементом.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00223}00223\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Автоинкремент\ формируется\ в\ пределах\ от\ 0x1\ до\ 0xFF}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00224}00224\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ \ \ -\/\ Если\ конкретный\ (младший\ байт\ !=\ 0)\ —\ запись\ выполняется\ только\ с\ этим\ тегом,\ иначе\ ошибка.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00225}00225\ \textcolor{comment}{\ \ *\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00226}00226\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00227}\mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga79f222c8ab644de4d47f07528d1edd63}{00227}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga79f222c8ab644de4d47f07528d1edd63}{RTT\_SaveToFlash}}(uint32\_t\ tag,\ uint32\_t\ tail\_size)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00228}00228\ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00229}00229\ \ \ \textcolor{keywordflow}{if}\ (tag\ ==\ 0xFFFFFFFF)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00230}00230\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ Неверный\ тег}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00231}00231\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00232}00232\ \ \ SEGGER\_RTT\_BUFFER\_UP\ *up\ =\ \&\_SEGGER\_RTT.aUp[0];} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00233}00233\ \ \ \textcolor{keywordtype}{unsigned}\ buf\_size\ =\ up-\/>SizeOfBuffer;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00234}00234\ \ \ \textcolor{keywordtype}{unsigned}\ wr\ =\ up-\/>WrOff;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00235}00235\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00236}00236\ \ \ \textcolor{comment}{//\ Ограничиваем\ по\ размеру\ буфера\ RTT\ и\ RTT\_FLASH\_BUFFER\_SIZE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00237}00237\ \ \ \textcolor{keywordtype}{unsigned}\ n\ =\ (tail\_size\ >\ buf\_size)\ ?\ buf\_size\ :\ tail\_size;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00238}00238\ \ \ \textcolor{keywordflow}{if}\ (n\ >\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}})} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00239}00239\ \ \ \ \ n\ =\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}};} \DoxyCodeLine{\Hypertarget{trace_8h_source_l00240}00240\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00241}00241\ \ \ \ \ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00242}00242\ \ \ \ \ \textcolor{keywordflow}{if}((flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ \&\ 0xFFFFFF00)\ ==\ base\_tag)\ \textcolor{comment}{//\ выбраный\ тег}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00243}00243\ \ \ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00244}00244\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ ((tag\ \&\ 0xFF)\ ==\ 0)\ \textcolor{comment}{//\ если\ он\ базовый\ -\/\ ищем\ последний}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00245}00245\ \ \ \ \ \ \ \ \ next\_tag\ =\ flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ +\ 1;\ \ \textcolor{comment}{//\ автоинкремент}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00246}00246\ \ \ \ \ \ \ \textcolor{keywordflow}{else}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00247}00247\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ ==\ tag)\ \textcolor{comment}{//\ если\ он\ конкретный\ и\ уже\ существует\ -\/\ то\ ошибка}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00248}00248\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ конкретный\ тег\ уже\ занят}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00249}00249\ \ \ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00241}00241\ \ \ uint32\_t\ addr\ =\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga8e56f75d3ab8a89ddde1404ae23c3297}{RTT\_FLASH\_SECTOR\_START}};} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00242}00242\ \ \ \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ *flash\_hdr\ =\ NULL;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00243}00243\ \ \ uint32\_t\ base\_tag\ =\ tag\ \&\ 0xFFFFFF00;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00244}00244\ \ \ uint32\_t\ next\_tag\ =\ (tag\ \&\ 0xFF)\ ==\ 0\ ?\ tag\ +\ 1\ :\ tag;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00245}00245\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00246}00246\ \ \ \textcolor{comment}{//\ Ищем\ первый\ свободный\ слот,\ параллельно\ автоинкрементируем\ тег}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00247}00247\ \ \ \textcolor{keywordflow}{while}\ ((addr\ +\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}))\ <=\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gafeca0be3688dea07ff443f894668003d}{RTT\_FLASH\_SECTOR\_END}})} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00248}00248\ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00249}00249\ \ \ \ \ flash\_hdr\ =\ (\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ *)addr;} \DoxyCodeLine{\Hypertarget{trace_8h_source_l00250}00250\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00251}00251\ \ \ \ \ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00252}00252\ \ \ \ \ \textcolor{keywordflow}{if}(next\_tag\ -\/\ tag\ >\ 0xFF)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00253}00253\ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \textcolor{comment}{//\ автоинкремент\ слишком\ большой}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00251}00251\ \ \ \ \ \textcolor{keywordflow}{if}\ (flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ ==\ 0xFFFFFFFF)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00252}00252\ \ \ \ \ \ \ \textcolor{keywordflow}{break};\ \ \textcolor{comment}{//\ Нашли\ свободное\ место}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00253}00253\ } \DoxyCodeLine{\Hypertarget{trace_8h_source_l00254}00254\ \ \ \ \ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00255}00255\ \ \ \ \ addr\ +=\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00256}00256\ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00257}00257\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00258}00258\ \ \ \textcolor{keywordflow}{if}\ ((addr\ +\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}))\ >\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gafeca0be3688dea07ff443f894668003d}{RTT\_FLASH\_SECTOR\_END}})} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00259}00259\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ Нет\ свободного\ места}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00260}00260\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00261}00261\ \ \ \textcolor{comment}{//\ Копируем\ последние\ n\ символов\ из\ RTT}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00262}00262\ \ \ \textcolor{keywordtype}{char}\ temp[\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}}];} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00263}00263\ \ \ \textcolor{keywordtype}{unsigned}\ valid\_count\ =\ 0;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00264}00264\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00265}00265\ \ \ \textcolor{keywordflow}{for}\ (\textcolor{keywordtype}{unsigned}\ i\ =\ 0;\ i\ <\ n;\ i++)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00266}00266\ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00267}00267\ \ \ \ \ \textcolor{keywordtype}{unsigned}\ idx\ =\ (wr\ +\ buf\_size\ -\/\ n\ +\ i)\ \%\ buf\_size;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00268}00268\ \ \ \ \ \textcolor{keywordtype}{char}\ c\ =\ up-\/>pBuffer[idx];} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00269}00269\ \ \ \ \ \textcolor{keywordflow}{if}\ (c\ !=\ 0)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00270}00270\ \ \ \ \ \ \ temp[valid\_count++]\ =\ c;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00271}00271\ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00272}00272\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00273}00273\ \ \ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6}{RTT\_FlashPrepare}}();} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00274}00274\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00275}00275\ \ \ \textcolor{comment}{//\ Формируем\ структуру\ в\ RAM}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00276}00276\ \ \ \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ flash\_data;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00277}00277\ \ \ flash\_data.\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ \ =\ next\_tag;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00278}00278\ \ \ flash\_data.\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}}\ =\ valid\_count;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00279}00279\ \ \ memcpy(flash\_data.\mbox{\hyperlink{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d042d52a}{data}},\ temp,\ valid\_count);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00280}00280\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00281}00281\ \ \ \textcolor{comment}{//\ Записываем\ структуру\ во\ Flash\ (по\ 4\ байта)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00282}00282\ \ \ \textcolor{keyword}{const}\ uint32\_t\ *p\ =\ (\textcolor{keyword}{const}\ uint32\_t\ *)\&flash\_data;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00283}00283\ \ \ \textcolor{keywordflow}{for}\ (\textcolor{keywordtype}{unsigned}\ i\ =\ 0;\ i\ <\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}})\ /\ 4;\ i++)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00284}00284\ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00285}00285\ \ \ \ \ \textcolor{keywordflow}{if}(HAL\_FLASH\_Program(FLASH\_TYPEPROGRAM\_WORD,\ addr\ +\ i\ *\ 4,\ p[i])\ !=\ HAL\_OK)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00286}00286\ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00287}00287\ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00288}00288\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00289}00289\ \ \ HAL\_FLASH\_Lock();} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00290}00290\ \ \ \_\_DSB();} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00291}00291\ \ \ \_\_ISB();} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00292}00292\ \ \ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00255}00255\ \ \ \ \ \textcolor{keywordflow}{if}((flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ \&\ 0xFFFFFF00)\ ==\ base\_tag)\ \textcolor{comment}{//\ выбраный\ тег}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00256}00256\ \ \ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00257}00257\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ ((tag\ \&\ 0xFF)\ ==\ 0)\ \textcolor{comment}{//\ если\ он\ базовый\ -\/\ ищем\ последний}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00258}00258\ \ \ \ \ \ \ \ \ next\_tag\ =\ flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ +\ 1;\ \ \textcolor{comment}{//\ автоинкремент}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00259}00259\ \ \ \ \ \ \ \textcolor{keywordflow}{else}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00260}00260\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ ==\ tag)\ \textcolor{comment}{//\ если\ он\ конкретный\ и\ уже\ существует\ -\/\ то\ ошибка}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00261}00261\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ конкретный\ тег\ уже\ занят}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00262}00262\ \ \ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00263}00263\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00264}00264\ \ \ \ \ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00265}00265\ \ \ \ \ \textcolor{keywordflow}{if}(next\_tag\ -\/\ tag\ >\ 0xFF)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00266}00266\ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \textcolor{comment}{//\ автоинкремент\ слишком\ большой}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00267}00267\ \ \ \ \ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00268}00268\ \ \ \ \ addr\ +=\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}});} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00269}00269\ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00270}00270\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00271}00271\ \ \ \textcolor{keywordflow}{if}\ ((addr\ +\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}))\ >\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gafeca0be3688dea07ff443f894668003d}{RTT\_FLASH\_SECTOR\_END}})} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00272}00272\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ Нет\ свободного\ места}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00273}00273\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00274}00274\ \ \ \textcolor{comment}{//\ Копируем\ последние\ n\ символов\ из\ RTT}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00275}00275\ \ \ \textcolor{keywordtype}{char}\ temp[\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}}];} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00276}00276\ \ \ \textcolor{keywordtype}{unsigned}\ valid\_count\ =\ 0;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00277}00277\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00278}00278\ \ \ \textcolor{keywordflow}{for}\ (\textcolor{keywordtype}{unsigned}\ i\ =\ 0;\ i\ <\ n;\ i++)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00279}00279\ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00280}00280\ \ \ \ \ \textcolor{keywordtype}{unsigned}\ idx\ =\ (wr\ +\ buf\_size\ -\/\ n\ +\ i)\ \%\ buf\_size;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00281}00281\ \ \ \ \ \textcolor{keywordtype}{char}\ c\ =\ up-\/>pBuffer[idx];} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00282}00282\ \ \ \ \ \textcolor{keywordflow}{if}\ (c\ !=\ 0)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00283}00283\ \ \ \ \ \ \ temp[valid\_count++]\ =\ c;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00284}00284\ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00285}00285\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00286}00286\ \ \ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6}{RTT\_FlashPrepare}}();} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00287}00287\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00288}00288\ \ \ \textcolor{comment}{//\ Формируем\ структуру\ в\ RAM}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00289}00289\ \ \ \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ flash\_data;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00290}00290\ \ \ flash\_data.\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ \ =\ next\_tag;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00291}00291\ \ \ flash\_data.\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}}\ =\ valid\_count;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00292}00292\ \ \ memcpy(flash\_data.\mbox{\hyperlink{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d042d52a}{data}},\ temp,\ valid\_count);} \DoxyCodeLine{\Hypertarget{trace_8h_source_l00293}00293\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00294}00294\ \ \ \textcolor{keywordflow}{return}\ (\textcolor{keywordtype}{int})(next\_tag\&0xFF);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00295}00295\ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00296}00296\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00297}00297\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00298}00298\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00299}00299\ \textcolor{comment}{\ \ *\ @brief\ Читает\ последние\ символы\ RTT-\/буфера\ из\ Flash\ по\ тегу}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00300}00300\ \textcolor{comment}{\ \ *\ @param\ tag\ \ \ \ \ \ \ \ Базовый\ или\ конкретный\ идентификатор\ буфера.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00301}00301\ \textcolor{comment}{\ \ *\ @param\ Buffer\ \ \ \ \ Буфер\ назначения\ для\ копирования\ данных}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00302}00302\ \textcolor{comment}{\ \ *\ @param\ tail\_size\ \ Количество\ последних\ символов,\ которые\ нужно\ прочитать}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00303}00303\ \textcolor{comment}{\ \ *\ @param\ read\_size\ \ Количество\ считанных\ символов}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00304}00304\ \textcolor{comment}{\ \ *\ @return\ >=0\ —\ номер\ буфера\ (тег)\ для\ записи,\ <0\ —\ ошибка\ (тег\ не\ найден\ или\ структура\ повреждена)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00305}00305\ \textcolor{comment}{\ \ *}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00306}00306\ \textcolor{comment}{\ \ *\ @details\ \ Копирует\ последние\ tail\_size\ символов\ из\ найденной\ записи\ Flash\ в\ Buffer.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00307}00307\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ Тег\ может\ быть\ базовым\ или\ конкретным:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00308}00308\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ \ \ -\/\ Если\ базовый\ (младший\ байт\ ==\ 0)\ —\ будет\ прочитана\ последняя\ запись\ из\ группы.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00309}00309\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ \ \ -\/\ Если\ конкретный\ (младший\ байт\ !=\ 0)\ —\ прочитывается\ именно\ эта\ запись.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00310}00310\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00311}\mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga734b2ebbf0c77699b739013878cfd146}{00311}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga734b2ebbf0c77699b739013878cfd146}{RTT\_ReadFromFlash}}(uint32\_t\ tag,\ \textcolor{keywordtype}{char}\ *Buffer,\ uint32\_t\ tail\_size,\ uint32\_t\ *read\_size)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00312}00312\ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00313}00313\ \ \ \textcolor{keywordflow}{if}\ (!Buffer\ ||\ tail\_size\ ==\ 0)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00314}00314\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ Неверные\ параметры}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00315}00315\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00316}00316\ \ \ \textcolor{keywordflow}{if}\ (tag\ ==\ 0xFFFFFFFF)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00317}00317\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ Недопустимый\ тег}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00318}00318\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00319}00319\ \ \ uint32\_t\ addr\ =\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga8e56f75d3ab8a89ddde1404ae23c3297}{RTT\_FLASH\_SECTOR\_START}};} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00320}00320\ \ \ \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ *flash\_hdr\ =\ NULL;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00321}00321\ \ \ \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ *target\_hdr\ =\ NULL;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00322}00322\ \ \ uint32\_t\ base\_tag\ =\ tag\ \&\ 0xFFFFFF00;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00323}00323\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00324}00324\ \ \ \textcolor{comment}{//\ Поиск\ записи\ по\ тегу}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00325}00325\ \ \ \textcolor{keywordflow}{while}\ ((addr\ +\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}))\ <=\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gafeca0be3688dea07ff443f894668003d}{RTT\_FLASH\_SECTOR\_END}})} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00326}00326\ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00327}00327\ \ \ \ \ flash\_hdr\ =\ (\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ *)addr;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00294}00294\ \ \ \textcolor{comment}{//\ Записываем\ структуру\ во\ Flash\ (по\ 4\ байта)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00295}00295\ \ \ \textcolor{keyword}{const}\ uint32\_t\ *p\ =\ (\textcolor{keyword}{const}\ uint32\_t\ *)\&flash\_data;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00296}00296\ \ \ \textcolor{keywordflow}{for}\ (\textcolor{keywordtype}{unsigned}\ i\ =\ 0;\ i\ <\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}})\ /\ 4;\ i++)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00297}00297\ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00298}00298\ \ \ \ \ \textcolor{keywordflow}{if}(HAL\_FLASH\_Program(FLASH\_TYPEPROGRAM\_WORD,\ addr\ +\ i\ *\ 4,\ p[i])\ !=\ HAL\_OK)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00299}00299\ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00300}00300\ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00301}00301\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00302}00302\ \ \ HAL\_FLASH\_Lock();} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00303}00303\ \ \ \_\_DSB();} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00304}00304\ \ \ \_\_ISB();} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00305}00305\ \ \ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00306}00306\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00307}00307\ \ \ \textcolor{keywordflow}{return}\ (\textcolor{keywordtype}{int})(next\_tag\&0xFF);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00308}00308\ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00309}00309\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00310}00310\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00311}00311\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00312}00312\ \textcolor{comment}{\ \ *\ @brief\ Читает\ последние\ символы\ RTT-\/буфера\ из\ Flash\ по\ тегу}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00313}00313\ \textcolor{comment}{\ \ *\ @param\ tag\ \ \ \ \ \ \ \ Базовый\ или\ конкретный\ идентификатор\ буфера.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00314}00314\ \textcolor{comment}{\ \ *\ @param\ Buffer\ \ \ \ \ Буфер\ назначения\ для\ копирования\ данных}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00315}00315\ \textcolor{comment}{\ \ *\ @param\ tail\_size\ \ Количество\ последних\ символов,\ которые\ нужно\ прочитать}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00316}00316\ \textcolor{comment}{\ \ *\ @param\ read\_size\ \ Количество\ считанных\ символов}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00317}00317\ \textcolor{comment}{\ \ *\ @return\ >=0\ —\ номер\ буфера\ (тег)\ для\ записи,\ <0\ —\ ошибка\ (тег\ не\ найден\ или\ структура\ повреждена)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00318}00318\ \textcolor{comment}{\ \ *}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00319}00319\ \textcolor{comment}{\ \ *\ @details\ \ Копирует\ последние\ tail\_size\ символов\ из\ найденной\ записи\ Flash\ в\ Buffer.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00320}00320\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ Тег\ может\ быть\ базовым\ или\ конкретным:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00321}00321\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ \ \ -\/\ Если\ базовый\ (младший\ байт\ ==\ 0)\ —\ будет\ прочитана\ последняя\ запись\ из\ группы.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00322}00322\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ \ \ \ \ \ \ -\/\ Если\ конкретный\ (младший\ байт\ !=\ 0)\ —\ прочитывается\ именно\ эта\ запись.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00323}00323\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00324}\mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga734b2ebbf0c77699b739013878cfd146}{00324}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga734b2ebbf0c77699b739013878cfd146}{RTT\_ReadFromFlash}}(uint32\_t\ tag,\ \textcolor{keywordtype}{char}\ *Buffer,\ uint32\_t\ tail\_size,\ uint32\_t\ *read\_size)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00325}00325\ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00326}00326\ \ \ \textcolor{keywordflow}{if}\ (!Buffer\ ||\ tail\_size\ ==\ 0)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00327}00327\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ Неверные\ параметры}} \DoxyCodeLine{\Hypertarget{trace_8h_source_l00328}00328\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00329}00329\ \ \ \ \ \textcolor{keywordflow}{if}\ (flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ ==\ 0xFFFFFFFF)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00330}00330\ \ \ \ \ \ \ \textcolor{keywordflow}{break};\ \ \textcolor{comment}{//\ Достигнут\ конец\ записанных\ структур}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00329}00329\ \ \ \textcolor{keywordflow}{if}\ (tag\ ==\ 0xFFFFFFFF)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00330}00330\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ Недопустимый\ тег}} \DoxyCodeLine{\Hypertarget{trace_8h_source_l00331}00331\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00332}00332\ \ \ \ \ \textcolor{comment}{//\ выбраный\ тег}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00333}00333\ \ \ \ \ \textcolor{keywordflow}{if}((flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ \&\ 0xFFFFFF00)\ ==\ base\_tag)\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00334}00334\ \ \ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00335}00335\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ ((tag\ \&\ 0xFF)\ ==\ 0)\ \textcolor{comment}{//\ если\ он\ базовый\ -\/\ ищем\ последний\ \ \ \ \ \ \ \ \ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00336}00336\ \ \ \ \ \ \ \ \ target\_hdr\ =\ flash\_hdr;\ \ \textcolor{comment}{//\ сохраняем\ последний\ в\ группе}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00337}00337\ \ \ \ \ \ \ \textcolor{keywordflow}{else}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00338}00338\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ ==\ tag)\ \textcolor{comment}{//\ если\ он\ конкретный\ и\ найден\ -\/\ берем\ его}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00339}00339\ \ \ \ \ \ \ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00340}00340\ \ \ \ \ \ \ \ \ \ \ target\_hdr\ =\ flash\_hdr;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00341}00341\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{break};\ \ \textcolor{comment}{//\ конкретный\ тег\ найден}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00342}00342\ \ \ \ \ \ \ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00343}00343\ \ \ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00344}00344\ \ \ \ \ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00345}00345\ \ \ \ \ addr\ +=\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00346}00346\ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00347}00347\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00348}00348\ \ \ \textcolor{keywordflow}{if}\ (!target\_hdr)\ \textcolor{keywordflow}{return}\ -\/1;\ \textcolor{comment}{//\ Тег\ не\ найден}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00349}00349\ \ \ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00350}00350\ \ \ \textcolor{comment}{//\ Проверка\ корректности\ размера}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00351}00351\ \ \ \textcolor{keywordflow}{if}\ (target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}}\ >\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}})} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00352}00352\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ Повреждённая\ запись\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00353}00353\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00354}00354\ \ \ \textcolor{comment}{//\ Определяем\ количество\ читаемых\ символов}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00355}00355\ \ \ uint32\_t\ n\ =\ (tail\_size\ >\ target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}})\ ?\ target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}}\ :\ tail\_size;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00356}00356\ \ \ \textcolor{comment}{//\ Начальная\ позиция\ для\ чтения\ последних\ tail\_size\ символов}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00357}00357\ \ \ uint32\_t\ start\ =\ target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}}\ -\/\ n;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00358}00358\ \ \ \textcolor{comment}{//\ Копируем\ данные\ из\ Flash\ в\ RAM}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00359}00359\ \ \ memcpy(Buffer,\ \&target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d042d52a}{data}}[start],\ n);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00360}00360\ \ \ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00361}00361\ \ \ \textcolor{keywordflow}{if}(read\_size\ !=\ NULL)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00362}00362\ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00363}00363\ \ \ \ \ *read\_size\ =\ n;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00364}00364\ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00365}00365\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00366}00366\ \ \ \_\_DSB();} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00367}00367\ \ \ \_\_ISB();} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00368}00368\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00369}00369\ \ \ \textcolor{keywordflow}{return}\ (\textcolor{keywordtype}{int})(target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ \&\ 0xFF);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00370}00370\ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00371}00371\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00372}00372\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00373}00373\ \textcolor{comment}{\ \ *\ @brief\ Стирание\ сектора\ Flash\ с\ RTT-\/буфером}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00374}00374\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00375}\mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga8d8c6850e32b42871faefce3352012d1}{00375}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga8d8c6850e32b42871faefce3352012d1}{RTT\_EraseFlash}}(\textcolor{keywordtype}{void})} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00376}00376\ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00377}00377\ \ \ FLASH\_EraseInitTypeDef\ eraseInit;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00378}00378\ \ \ uint32\_t\ pageError\ =\ 0;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00379}00379\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00380}00380\ \ \ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6}{RTT\_FlashPrepare}}();} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00332}00332\ \ \ uint32\_t\ addr\ =\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga8e56f75d3ab8a89ddde1404ae23c3297}{RTT\_FLASH\_SECTOR\_START}};} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00333}00333\ \ \ \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ *flash\_hdr\ =\ NULL;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00334}00334\ \ \ \mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ *target\_hdr\ =\ NULL;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00335}00335\ \ \ uint32\_t\ base\_tag\ =\ tag\ \&\ 0xFFFFFF00;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00336}00336\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00337}00337\ \ \ \textcolor{comment}{//\ Поиск\ записи\ по\ тегу}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00338}00338\ \ \ \textcolor{keywordflow}{while}\ ((addr\ +\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}))\ <=\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gafeca0be3688dea07ff443f894668003d}{RTT\_FLASH\_SECTOR\_END}})} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00339}00339\ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00340}00340\ \ \ \ \ flash\_hdr\ =\ (\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}}\ *)addr;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00341}00341\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00342}00342\ \ \ \ \ \textcolor{keywordflow}{if}\ (flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ ==\ 0xFFFFFFFF)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00343}00343\ \ \ \ \ \ \ \textcolor{keywordflow}{break};\ \ \textcolor{comment}{//\ Достигнут\ конец\ записанных\ структур}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00344}00344\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00345}00345\ \ \ \ \ \textcolor{comment}{//\ выбраный\ тег}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00346}00346\ \ \ \ \ \textcolor{keywordflow}{if}((flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ \&\ 0xFFFFFF00)\ ==\ base\_tag)\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00347}00347\ \ \ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00348}00348\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ ((tag\ \&\ 0xFF)\ ==\ 0)\ \textcolor{comment}{//\ если\ он\ базовый\ -\/\ ищем\ последний\ \ \ \ \ \ \ \ \ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00349}00349\ \ \ \ \ \ \ \ \ target\_hdr\ =\ flash\_hdr;\ \ \textcolor{comment}{//\ сохраняем\ последний\ в\ группе}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00350}00350\ \ \ \ \ \ \ \textcolor{keywordflow}{else}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00351}00351\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(flash\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ ==\ tag)\ \textcolor{comment}{//\ если\ он\ конкретный\ и\ найден\ -\/\ берем\ его}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00352}00352\ \ \ \ \ \ \ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00353}00353\ \ \ \ \ \ \ \ \ \ \ target\_hdr\ =\ flash\_hdr;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00354}00354\ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{break};\ \ \textcolor{comment}{//\ конкретный\ тег\ найден}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00355}00355\ \ \ \ \ \ \ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00356}00356\ \ \ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00357}00357\ \ \ \ \ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00358}00358\ \ \ \ \ addr\ +=\ \textcolor{keyword}{sizeof}(\mbox{\hyperlink{struct_r_t_t___flash_header__t}{RTT\_FlashHeader\_t}});} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00359}00359\ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00360}00360\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00361}00361\ \ \ \textcolor{keywordflow}{if}\ (!target\_hdr)\ \textcolor{keywordflow}{return}\ -\/1;\ \textcolor{comment}{//\ Тег\ не\ найден}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00362}00362\ \ \ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00363}00363\ \ \ \textcolor{comment}{//\ Проверка\ корректности\ размера}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00364}00364\ \ \ \textcolor{keywordflow}{if}\ (target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}}\ >\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}})} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00365}00365\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;\ \ \textcolor{comment}{//\ Повреждённая\ запись\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00366}00366\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00367}00367\ \ \ \textcolor{comment}{//\ Определяем\ количество\ читаемых\ символов}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00368}00368\ \ \ uint32\_t\ n\ =\ (tail\_size\ >\ target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}})\ ?\ target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}}\ :\ tail\_size;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00369}00369\ \ \ \textcolor{comment}{//\ Начальная\ позиция\ для\ чтения\ последних\ tail\_size\ символов}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00370}00370\ \ \ uint32\_t\ start\ =\ target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_afd1a5c51af6f97d170c2ccbbe3e34699}{size}}\ -\/\ n;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00371}00371\ \ \ \textcolor{comment}{//\ Копируем\ данные\ из\ Flash\ в\ RAM}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00372}00372\ \ \ memcpy(Buffer,\ \&target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_ae7276198385c8d6f6508f433d042d52a}{data}}[start],\ n);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00373}00373\ \ \ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00374}00374\ \ \ \textcolor{keywordflow}{if}(read\_size\ !=\ NULL)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00375}00375\ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00376}00376\ \ \ \ \ *read\_size\ =\ n;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00377}00377\ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00378}00378\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00379}00379\ \ \ \_\_DSB();} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00380}00380\ \ \ \_\_ISB();} \DoxyCodeLine{\Hypertarget{trace_8h_source_l00381}00381\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00382}00382\ \ \ eraseInit.TypeErase\ \ \ =\ FLASH\_TYPEERASE\_SECTORS;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00383}00383\ \ \ eraseInit.Sector\ \ \ \ \ \ =\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga3bc1b76864e1d32cbdd174d4caae7724}{RTT\_FLASH\_SECTOR}};} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00384}00384\ \ \ eraseInit.NbSectors\ \ \ =\ 1;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00385}00385\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00386}00386\ \ \ \textcolor{keywordflow}{if}\ (HAL\_FLASHEx\_Erase(\&eraseInit,\ \&pageError)\ !=\ HAL\_OK)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00387}00387\ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00388}00388\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00389}00389\ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00390}00390\ \ \ \textcolor{keywordflow}{return}\ 0;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00391}00391\ \ \ HAL\_FLASH\_Lock();} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00392}00392\ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00393}00393\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00394}00394\ \textcolor{comment}{/**\ TRACE\_RTT\_FLASH}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00395}00395\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00396}00396\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00397}00397\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00398}00398\ \textcolor{preprocessor}{\#else\ }\textcolor{comment}{//\ HAL\_MODULE\_ENABLED\ \&\&\ RTT\_TRACE\_ENABLE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00399}00399\ \textcolor{preprocessor}{\#define\ RTT\_FlashPrepare(...)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00400}00400\ \textcolor{preprocessor}{\#define\ RTT\_EraseFlash(...)\ \ \ \ 0}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00401}00401\ \textcolor{preprocessor}{\#define\ RTT\_SaveToFlash(...)\ \ \ 0}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00402}00402\ \textcolor{preprocessor}{\#define\ RTT\_ReadFromFlash(...)\ 0}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00403}00403\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ HAL\_MODULE\_ENABLED\ \&\&\ RTT\_TRACE\_ENABLE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00404}00404\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00405}00405\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00406}00406\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00407}00407\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00408}00408\ \textcolor{comment}{/**\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00409}00409\ \textcolor{comment}{\ \ *\ @addtogroup\ \ TRACE\_HARDFAULT\ \ \ \ Hardfault\ trace\ defines}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00410}00410\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ \ TRACE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00411}00411\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ \ Модуль\ трассировки\ HardFault\ с\ возможностью\ сохранения\ RTT\ буфера\ во\ Flash}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00412}00412\ \textcolor{comment}{\ \ *\ @details}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00413}00413\ \textcolor{comment}{\ \ *\ Этот\ модуль\ позволяет\ сохранять\ контекст\ процессора\ и\ последние\ символы\ RTT\ буфера\ при\ возникновении\ HardFault.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00414}00414\ \textcolor{comment}{\ \ *}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00415}00415\ \textcolor{comment}{\ \ *\ Механизм\ работы:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00416}00416\ \textcolor{comment}{\ \ *\ \ \ -\/\ При\ срабатывании\ HardFault\ вызывается\ HF\_HandleFault(),\ который:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00417}00417\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 1.\ Получает\ указатель\ на\ стек,\ где\ произошёл\ HardFault\ (MSP\ или\ PSP).}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00418}00418\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 2.\ Выводит\ значения\ регистров\ R0-\/R3,\ R12,\ LR,\ PC,\ PSR\ и\ системных\ регистров\ SCB.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00419}00419\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 3.\ Формирует\ строку\ с\ регистрами\ и\ копирует\ последние\ символы\ RTT\ буфера.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00420}00420\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 4.\ Сохраняет\ данные\ во\ Flash\ с\ базовым\ тегом\ HF\_RTT\_TAG\_BASE.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00421}00421\ \textcolor{comment}{\ \ *\ \ \ -\/\ Для\ восстановления\ последнего\ HardFault\ используется\ HF\_CheckRecovered(),\ который:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00422}00422\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 1.\ Читает\ запись\ во\ Flash\ по\ базовому\ тегу.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00423}00423\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 2.\ Выводит\ сохранённый\ RTT\ буфер\ и\ контекст\ регистров.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00424}00424\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 3.\ Опционально\ стирает\ Flash\ после\ восстановления.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00425}00425\ \textcolor{comment}{\ \ *\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00426}00426\ \textcolor{comment}{\ \ *\ Параметры:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00427}00427\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HARDFAULT\_SERIAL\_TRACE\ \ \ -\/\ Включить\ обработку\ и\ serial\ трассировку\ Hardfault}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00428}00428\ \textcolor{comment}{\ \ *\ \ \ Если\ отключена\ то\ вставляются\ заглушки,\ никак\ не\ влияющие\ на\ параметры\ и\ остальную\ программу}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00429}00429\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HF\_RTT\_TAG\_BASE\ \ \ \ \ \ \ \ \ \ -\/\ Базовый\ тег\ RTT\ Flash\ для\ HardFault\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00430}00430\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HF\_RTT\_TAIL\_SIZE\ \ \ \ \ \ \ \ \ -\/\ Размер\ буфера\ RTT,\ который\ сохранится\ при\ Hardfault}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00431}00431\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HF\_STACK\_DUMP\_WORDS\ \ \ \ \ \ -\/\ Сколько\ слов\ стека\ будет\ проанализировано\ во\ время\ Hardfault}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00432}00432\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HF\_FLASH\_ADDR\ \ \ \ \ \ \ \ \ \ \ \ -\/\ Адрес\ FLASH\ куда\ положится\ RTT\ буфер}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00433}00433\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HF\_RAM\_END\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ -\/\ Конец\ RAM\ памяти\ (чтобы\ во\ время\ анализа\ стека\ не\ выйти\ за\ пределы)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00434}00434\ \textcolor{comment}{\ \ *\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00435}00435\ \textcolor{comment}{\ \ @code}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00436}00436\ \textcolor{comment}{\ \ void\ Hardfault()}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00437}00437\ \textcolor{comment}{\ \ \{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00438}00438\ \textcolor{comment}{\ \ \ \ HF\_HandleFault();}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00439}00439\ \textcolor{comment}{\ \ \ \ NVIC\_SystemReset();}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00440}00440\ \textcolor{comment}{\ \ \}}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00441}00441\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00442}00442\ \textcolor{comment}{\ \ int\ main()}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00443}00443\ \textcolor{comment}{\ \ \{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00444}00444\ \textcolor{comment}{\ \ \ \ if(HF\_CheckRecovered(0))}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00445}00445\ \textcolor{comment}{\ \ \ \ \{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00446}00446\ \textcolor{comment}{\ \ \ \ \ \ //set\ hardfault\ error}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00447}00447\ \textcolor{comment}{\ \ \ \ \ \ RTT\_EraseFlash();\ //\ erase\ rtt\ flash\ after\ message\ readed}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00448}00448\ \textcolor{comment}{\ \ \ \ \}}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00449}00449\ \textcolor{comment}{\ \ \}\ \ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00450}00450\ \textcolor{comment}{\ \ @endcode}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00451}00451\ \textcolor{comment}{\ \ *\ @\{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00452}00452\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00453}00453\ \textcolor{preprocessor}{\#if\ defined(HAL\_MODULE\_ENABLED)\ \&\&\ defined(HARDFAULT\_SERIAL\_TRACE)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00454}00454\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00455}00455\ \textcolor{preprocessor}{\#ifndef\ HF\_RTT\_TAIL\_SIZE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00456}00456\ \textcolor{preprocessor}{\#define\ HF\_RTT\_TAIL\_SIZE\ \ RTT\_FLASH\_BUFFER\_SIZE\ }\textcolor{comment}{///<\ Размер\ буфера\ RTT,\ который\ сохранится\ при\ Hardfault}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00457}00457\ \textcolor{preprocessor}{\#endif}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00458}00458\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00459}00459\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00460}00460\ \textcolor{comment}{\ \ *\ @brief\ Контекст\ стек-\/фрейма\ процессора\ при\ HardFault}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00461}00461\ \textcolor{comment}{\ \ *\ @details\ Сохраняет\ регистры\ R0-\/R3,\ R12,\ LR,\ PC,\ PSR\ для\ последующего\ анализа.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00462}00462\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00463}\mbox{\hyperlink{struct_h_f___stack_frame__t}{00463}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{struct\ }\{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00464}\mbox{\hyperlink{struct_h_f___stack_frame__t_a4146ed28926b5f234132b7112119a413}{00464}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a4146ed28926b5f234132b7112119a413}{r0}};\ \ \ \textcolor{comment}{///<\ Регистр\ R0}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00465}\mbox{\hyperlink{struct_h_f___stack_frame__t_a286104d19185714940645a9df814ddea}{00465}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a286104d19185714940645a9df814ddea}{r1}};\ \ \ \textcolor{comment}{///<\ Регистр\ R1}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00466}\mbox{\hyperlink{struct_h_f___stack_frame__t_a5a52e5006dabcf68c0fa4cfb0e03335b}{00466}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a5a52e5006dabcf68c0fa4cfb0e03335b}{r2}};\ \ \ \textcolor{comment}{///<\ Регистр\ R2}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00467}\mbox{\hyperlink{struct_h_f___stack_frame__t_a453c7af42b6928a693af422e17c981d3}{00467}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a453c7af42b6928a693af422e17c981d3}{r3}};\ \ \ \textcolor{comment}{///<\ Регистр\ R3}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00468}\mbox{\hyperlink{struct_h_f___stack_frame__t_a819ee3bc518c460ece1b7c4079f8f80b}{00468}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a819ee3bc518c460ece1b7c4079f8f80b}{r12}};\ \ \textcolor{comment}{///<\ Регистр\ R12}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00469}\mbox{\hyperlink{struct_h_f___stack_frame__t_a6e51904297f7725e96d5b5fb291ef577}{00469}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a6e51904297f7725e96d5b5fb291ef577}{lr}};\ \ \ \textcolor{comment}{///<\ Link\ Register}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00470}\mbox{\hyperlink{struct_h_f___stack_frame__t_a16563896004751c90e41c81ae4570732}{00470}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a16563896004751c90e41c81ae4570732}{pc}};\ \ \ \textcolor{comment}{///<\ Program\ Counter}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00471}\mbox{\hyperlink{struct_h_f___stack_frame__t_ae47cb051ee3c94471bfd4fe7e49c55f9}{00471}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_ae47cb051ee3c94471bfd4fe7e49c55f9}{psr}};\ \ \textcolor{comment}{///<\ Program\ Status\ Register}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00472}00472\ \}\ \mbox{\hyperlink{struct_h_f___stack_frame__t}{HF\_StackFrame\_t}};} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00473}00473\ \textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00474}00474\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00475}00475\ \textcolor{comment}{\ \ *\ @brief\ Проверка\ и\ вывод\ последнего\ HardFault-\/трейса\ из\ Flash}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00476}00476\ \textcolor{comment}{\ \ *\ @details}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00477}00477\ \textcolor{comment}{\ \ *\ Функция\ ищет\ последнюю\ запись\ HardFault\ по\ базовому\ тегу\ HF\_RTT\_TAG\_BASE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00478}00478\ \textcolor{comment}{\ \ *\ и\ выводит\ её\ содержимое\ в\ консоль.\ После\ успешного\ вывода\ Flash\ можно\ опционально\ очистить.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00479}00479\ \textcolor{comment}{\ \ *}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00480}00480\ \textcolor{comment}{\ \ *\ @return\ int}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00481}00481\ \textcolor{comment}{\ \ *\ \ \ -\/\ 1\ —\ данные\ HardFault\ найдены\ и\ выведены}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00482}00482\ \textcolor{comment}{\ \ *\ \ \ -\/\ 0\ —\ данные\ отсутствуют\ или\ тег\ не\ найден}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00483}00483\ \textcolor{comment}{\ \ *\ }} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00484}00484\ \textcolor{comment}{\ \ *\ @note\ Вызов\ рекомендуется\ при\ инициализации\ приложения\ для\ анализа\ предыдущего\ сбоя.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00485}00485\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00486}\mbox{\hyperlink{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_ga03f8b6f3b537ee1c8e91065c60db504f}{00486}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_ga03f8b6f3b537ee1c8e91065c60db504f}{HF\_CheckRecovered}}(\textcolor{keywordtype}{int}\ erase)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00487}00487\ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00488}00488\ \ \ \textcolor{keywordtype}{char}\ buffer[\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}}];} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00489}00489\ \ \ uint32\_t\ read\_size\ =\ 0;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00490}00490\ \ \ \textcolor{keywordtype}{int}\ n\_hardfault\ =\ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga734b2ebbf0c77699b739013878cfd146}{RTT\_ReadFromFlash}}(\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gadc960255719c7eff4bdfaa850be9b313}{HF\_RTT\_TAG\_BASE}},\ buffer,\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gafcc7ea03d4df8f1909e580b519a7f3ca}{HF\_RTT\_TAIL\_SIZE}},\ \&read\_size);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00491}00491\ \ \ \textcolor{keywordflow}{if}\ (n\_hardfault\ >\ 0)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00492}00492\ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00493}00493\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}\(\backslash\)n-\/-\/-\/\ Recovered\ HardFault\ RTT\ buffer\ \#\%u\ -\/-\/-\/\(\backslash\)n"{}},\ n\_hardfault);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00494}00494\ \ \ \ \ \textcolor{keywordflow}{for}\ (\textcolor{keywordtype}{int}\ i\ =\ 0;\ i\ <\ read\_size;\ i++)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00495}00495\ \ \ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00496}00496\ \ \ \ \ \ \ \textcolor{keywordtype}{char}\ c\ =\ buffer[i];} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00497}00497\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (c\ ==\ 0\ ||\ c\ ==\ (\textcolor{keywordtype}{char})0xFF)\ \textcolor{keywordflow}{break};} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00498}00498\ \ \ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}\%c"{}},\ c);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00499}00499\ \ \ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00500}00500\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00501}00501\ \ \ \ \ \textcolor{keywordflow}{if}(erase)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00502}00502\ \ \ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga8d8c6850e32b42871faefce3352012d1}{RTT\_EraseFlash}}();} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00503}00503\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}\(\backslash\)n-\/-\/-\/-\/-\/-\/-\/-\/-\/\ HardFault\ Dump\ End\ -\/-\/-\/-\/-\/-\/-\/-\/-\/\(\backslash\)n"{}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00504}00504\ \ \ \ \ \textcolor{keywordflow}{return}\ 1;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00505}00505\ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00506}00506\ \ \ \textcolor{keywordflow}{return}\ 0;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00507}00507\ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00508}00508\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00509}00509\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00510}00510\ \textcolor{keyword}{static}\ \mbox{\hyperlink{struct_h_f___stack_frame__t}{HF\_StackFrame\_t}}\ *stack\_frame;} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00511}00511\ \textcolor{keyword}{static}\ uint32\_t\ stack\_dump[\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gaa31234688b333a505aaa57b8ecdedf5b}{HF\_STACK\_DUMP\_WORDS}}];} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00512}00512\ \textcolor{keyword}{static}\ \textcolor{keywordtype}{void}\ *ret\_adr[10]\ =\ \{0\};\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00513}00513\ \textcolor{comment}{/**}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00514}00514\ \textcolor{comment}{\ \ *\ @brief\ Обработчик\ HardFault}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00515}00515\ \textcolor{comment}{\ \ *\ @details}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00516}00516\ \textcolor{comment}{\ \ *\ Вызывается\ из\ прерывания\ HardFault\ или\ в\ любом\ месте\ где\ понятно\ что\ ошибка\ критическая.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00517}00517\ \textcolor{comment}{\ \ *\ Последовательно\ выполняет:}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00518}00518\ \textcolor{comment}{\ \ *\ \ \ 1.\ Определяет\ активный\ стек\ (MSP\ или\ PSP)\ на\ момент\ сбоя.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00519}00519\ \textcolor{comment}{\ \ *\ \ \ 2.\ Сохраняет\ значения\ регистров\ R0-\/R3,\ R12,\ LR,\ PC,\ PSR.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00520}00520\ \textcolor{comment}{\ \ *\ \ \ 3.\ Выводит\ системные\ регистры\ CFSR,\ HFSR,\ DFSR,\ AFSR,\ MMFAR,\ BFAR.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00521}00521\ \textcolor{comment}{\ \ *\ \ \ 4.\ Формирует\ stack\ trace\ с\ 3\ уровнями\ возврата.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00522}00522\ \textcolor{comment}{\ \ *\ \ \ 5.\ Копирует\ последние\ символы\ RTT\ буфера.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00523}00523\ \textcolor{comment}{\ \ *\ \ \ 6.\ Сохраняет\ все\ данные\ во\ Flash\ через\ RTT\_SaveToFlash\ с\ базовым\ тегом\ HF\_RTT\_TAG\_BASE.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00524}00524\ \textcolor{comment}{\ \ *}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00525}00525\ \textcolor{comment}{\ \ *\ @note\ Функция\ защищена,\ так\ как\ вызывается\ в\ контексте\ сбоя\ —\ минимизирует\ использование\ вызовов\ HAL.}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00526}00526\ \textcolor{comment}{\ \ */}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00527}\mbox{\hyperlink{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_gadd8e10e7ec3b0204f7f92062ecd452f7}{00527}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_gadd8e10e7ec3b0204f7f92062ecd452f7}{HF\_HandleFault}}(\textcolor{keywordtype}{void})} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00528}00528\ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00529}00529\ \ \ \ \ \textcolor{comment}{//\ Получаем\ указатель\ на\ стек,\ где\ произошёл\ HardFault}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00530}00530\ \ \ \ \ \_\_ASM\ \textcolor{keyword}{volatile}(} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00531}00531\ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}TST\ lr,\ \#4\ \ \ \ \ \ \ \(\backslash\)n"{}}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00532}00532\ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}ITE\ EQ\ \ \ \ \ \ \ \ \ \ \ \(\backslash\)n"{}}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00533}00533\ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}MRSEQ\ \%[ptr],\ MSP\(\backslash\)n"{}}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00534}00534\ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}MRSNE\ \%[ptr],\ PSP\(\backslash\)n"{}}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00535}00535\ \ \ \ \ \ \ \ \ :\ [ptr]\ \textcolor{stringliteral}{"{}=r"{}}(stack\_frame)} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00536}00536\ \ \ \ \ );} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00537}00537\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00538}00538\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}\(\backslash\)n=====\ HardFault\ occurred!\ =====\(\backslash\)n"{}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00539}00539\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}R0\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>\mbox{\hyperlink{struct_h_f___stack_frame__t_a4146ed28926b5f234132b7112119a413}{r0}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00540}00540\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}R1\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>\mbox{\hyperlink{struct_h_f___stack_frame__t_a286104d19185714940645a9df814ddea}{r1}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00541}00541\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}R2\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>\mbox{\hyperlink{struct_h_f___stack_frame__t_a5a52e5006dabcf68c0fa4cfb0e03335b}{r2}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00542}00542\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}R3\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>\mbox{\hyperlink{struct_h_f___stack_frame__t_a453c7af42b6928a693af422e17c981d3}{r3}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00543}00543\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}R12\ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>\mbox{\hyperlink{struct_h_f___stack_frame__t_a819ee3bc518c460ece1b7c4079f8f80b}{r12}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00544}00544\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}LR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>\mbox{\hyperlink{struct_h_f___stack_frame__t_a6e51904297f7725e96d5b5fb291ef577}{lr}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00545}00545\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}PC\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>\mbox{\hyperlink{struct_h_f___stack_frame__t_a16563896004751c90e41c81ae4570732}{pc}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00546}00546\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}PSR\ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>\mbox{\hyperlink{struct_h_f___stack_frame__t_ae47cb051ee3c94471bfd4fe7e49c55f9}{psr}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00547}00547\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00548}00548\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}CFSR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>CFSR);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00549}00549\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}HFSR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>HFSR);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00550}00550\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}DFSR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>DFSR);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00551}00551\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}AFSR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>AFSR);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00552}00552\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}MMFAR\ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>MMFAR);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00553}00553\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}BFAR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>BFAR);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00554}00554\ \ \ \ \ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00555}00555\ \ \ \ \ \textcolor{comment}{//\ -\/-\/-\/\ Stack\ trace\ -\/-\/-\/}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00556}00556\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}-\/-\/-\/\ Stack\ trace\ -\/-\/-\/\(\backslash\)n"{}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00557}00557\ \ \ \ \ ret\_adr[0]\ =\ \_\_builtin\_return\_address(0);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00558}00558\ \ \ \ \ ret\_adr[1]\ =\ \_\_builtin\_return\_address(1);} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00559}00559\ \ \ \ \ ret\_adr[2]\ =\ \_\_builtin\_return\_address(2);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00382}00382\ \ \ \textcolor{keywordflow}{return}\ (\textcolor{keywordtype}{int})(target\_hdr-\/>\mbox{\hyperlink{struct_r_t_t___flash_header__t_a844ee5470a323a749856cbb7a682dc57}{tag}}\ \&\ 0xFF);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00383}00383\ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00384}00384\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00385}00385\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00386}00386\ \textcolor{comment}{\ \ *\ @brief\ Стирание\ сектора\ Flash\ с\ RTT-\/буфером}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00387}00387\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00388}\mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga8d8c6850e32b42871faefce3352012d1}{00388}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga8d8c6850e32b42871faefce3352012d1}{RTT\_EraseFlash}}(\textcolor{keywordtype}{void})} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00389}00389\ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00390}00390\ \ \ FLASH\_EraseInitTypeDef\ eraseInit;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00391}00391\ \ \ uint32\_t\ pageError\ =\ 0;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00392}00392\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00393}00393\ \ \ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga21353cb4f5af666237739e62ce019cd6}{RTT\_FlashPrepare}}();} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00394}00394\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00395}00395\ \ \ eraseInit.TypeErase\ \ \ =\ FLASH\_TYPEERASE\_SECTORS;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00396}00396\ \ \ eraseInit.Sector\ \ \ \ \ \ =\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga3bc1b76864e1d32cbdd174d4caae7724}{RTT\_FLASH\_SECTOR}};} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00397}00397\ \ \ eraseInit.NbSectors\ \ \ =\ 1;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00398}00398\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00399}00399\ \ \ \textcolor{keywordflow}{if}\ (HAL\_FLASHEx\_Erase(\&eraseInit,\ \&pageError)\ !=\ HAL\_OK)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00400}00400\ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00401}00401\ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00402}00402\ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00403}00403\ \ \ \textcolor{keywordflow}{return}\ 0;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00404}00404\ \ \ HAL\_FLASH\_Lock();} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00405}00405\ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00406}00406\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00407}00407\ \textcolor{comment}{/**\ TRACE\_RTT\_FLASH}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00408}00408\ \textcolor{comment}{\ \ *\ @\}}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00409}00409\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00410}00410\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00411}00411\ \textcolor{preprocessor}{\#else\ }\textcolor{comment}{//\ HAL\_MODULE\_ENABLED\ \&\&\ RTT\_TRACE\_ENABLE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00412}00412\ \textcolor{preprocessor}{\#define\ RTT\_FlashPrepare(...)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00413}00413\ \textcolor{preprocessor}{\#define\ RTT\_EraseFlash(...)\ \ \ \ 0}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00414}00414\ \textcolor{preprocessor}{\#define\ RTT\_SaveToFlash(...)\ \ \ 0}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00415}00415\ \textcolor{preprocessor}{\#define\ RTT\_ReadFromFlash(...)\ 0}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00416}00416\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ HAL\_MODULE\_ENABLED\ \&\&\ RTT\_TRACE\_ENABLE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00417}00417\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00418}00418\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00419}00419\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00420}00420\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00421}00421\ \textcolor{comment}{/**\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00422}00422\ \textcolor{comment}{\ \ *\ @addtogroup\ \ TRACE\_HARDFAULT\ \ \ \ Hardfault\ trace\ defines}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00423}00423\ \textcolor{comment}{\ \ *\ @ingroup\ \ \ \ \ TRACE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00424}00424\ \textcolor{comment}{\ \ *\ @brief\ \ \ \ \ \ \ Модуль\ трассировки\ HardFault\ с\ возможностью\ сохранения\ RTT\ буфера\ во\ Flash}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00425}00425\ \textcolor{comment}{\ \ *\ @details}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00426}00426\ \textcolor{comment}{\ \ *\ Этот\ модуль\ позволяет\ сохранять\ контекст\ процессора\ и\ последние\ символы\ RTT\ буфера\ при\ возникновении\ HardFault.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00427}00427\ \textcolor{comment}{\ \ *}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00428}00428\ \textcolor{comment}{\ \ *\ Механизм\ работы:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00429}00429\ \textcolor{comment}{\ \ *\ \ \ -\/\ При\ срабатывании\ HardFault\ вызывается\ HF\_HandleFault(),\ который:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00430}00430\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 1.\ Получает\ указатель\ на\ стек,\ где\ произошёл\ HardFault\ (MSP\ или\ PSP).}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00431}00431\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 2.\ Выводит\ значения\ регистров\ R0-\/R3,\ R12,\ LR,\ PC,\ PSR\ и\ системных\ регистров\ SCB.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00432}00432\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 3.\ Формирует\ строку\ с\ регистрами\ и\ копирует\ последние\ символы\ RTT\ буфера.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00433}00433\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 4.\ Сохраняет\ данные\ во\ Flash\ с\ базовым\ тегом\ HF\_RTT\_TAG\_BASE.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00434}00434\ \textcolor{comment}{\ \ *\ \ \ -\/\ Для\ восстановления\ последнего\ HardFault\ используется\ HF\_CheckRecovered(),\ который:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00435}00435\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 1.\ Читает\ запись\ во\ Flash\ по\ базовому\ тегу.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00436}00436\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 2.\ Выводит\ сохранённый\ RTT\ буфер\ и\ контекст\ регистров.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00437}00437\ \textcolor{comment}{\ \ *\ \ \ \ \ \ \ 3.\ Опционально\ стирает\ Flash\ после\ восстановления.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00438}00438\ \textcolor{comment}{\ \ *\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00439}00439\ \textcolor{comment}{\ \ *\ Параметры:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00440}00440\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HARDFAULT\_SERIAL\_TRACE\ \ \ -\/\ Включить\ обработку\ и\ serial\ трассировку\ Hardfault}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00441}00441\ \textcolor{comment}{\ \ *\ \ \ Если\ отключена\ то\ вставляются\ заглушки,\ никак\ не\ влияющие\ на\ параметры\ и\ остальную\ программу}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00442}00442\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HF\_RTT\_TAG\_BASE\ \ \ \ \ \ \ \ \ \ -\/\ Базовый\ тег\ RTT\ Flash\ для\ HardFault\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00443}00443\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HF\_RTT\_TAIL\_SIZE\ \ \ \ \ \ \ \ \ -\/\ Размер\ буфера\ RTT,\ который\ сохранится\ при\ Hardfault}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00444}00444\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HF\_STACK\_DUMP\_WORDS\ \ \ \ \ \ -\/\ Сколько\ слов\ стека\ будет\ проанализировано\ во\ время\ Hardfault}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00445}00445\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HF\_FLASH\_ADDR\ \ \ \ \ \ \ \ \ \ \ \ -\/\ Адрес\ FLASH\ куда\ положится\ RTT\ буфер}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00446}00446\ \textcolor{comment}{\ \ *\ -\/\ @ref\ HF\_RAM\_END\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ -\/\ Конец\ RAM\ памяти\ (чтобы\ во\ время\ анализа\ стека\ не\ выйти\ за\ пределы)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00447}00447\ \textcolor{comment}{\ \ *\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00448}00448\ \textcolor{comment}{\ \ @code}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00449}00449\ \textcolor{comment}{\ \ void\ Hardfault()}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00450}00450\ \textcolor{comment}{\ \ \{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00451}00451\ \textcolor{comment}{\ \ \ \ HF\_HandleFault();}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00452}00452\ \textcolor{comment}{\ \ \ \ NVIC\_SystemReset();}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00453}00453\ \textcolor{comment}{\ \ \}}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00454}00454\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00455}00455\ \textcolor{comment}{\ \ int\ main()}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00456}00456\ \textcolor{comment}{\ \ \{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00457}00457\ \textcolor{comment}{\ \ \ \ if(HF\_CheckRecovered(0))}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00458}00458\ \textcolor{comment}{\ \ \ \ \{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00459}00459\ \textcolor{comment}{\ \ \ \ \ \ //set\ hardfault\ error}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00460}00460\ \textcolor{comment}{\ \ \ \ \ \ RTT\_EraseFlash();\ //\ erase\ rtt\ flash\ after\ message\ readed}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00461}00461\ \textcolor{comment}{\ \ \ \ \}}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00462}00462\ \textcolor{comment}{\ \ \}\ \ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00463}00463\ \textcolor{comment}{\ \ @endcode}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00464}00464\ \textcolor{comment}{\ \ *\ @\{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00465}00465\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00466}00466\ \textcolor{preprocessor}{\#if\ defined(HAL\_MODULE\_ENABLED)\ \&\&\ defined(HARDFAULT\_SERIAL\_TRACE)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00467}00467\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00468}00468\ \textcolor{preprocessor}{\#ifndef\ HF\_RTT\_TAIL\_SIZE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00469}00469\ \textcolor{preprocessor}{\#define\ HF\_RTT\_TAIL\_SIZE\ \ RTT\_FLASH\_BUFFER\_SIZE\ }\textcolor{comment}{///<\ Размер\ буфера\ RTT,\ который\ сохранится\ при\ Hardfault}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00470}00470\ \textcolor{preprocessor}{\#endif}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00471}00471\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00472}00472\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00473}00473\ \textcolor{comment}{\ \ *\ @brief\ Контекст\ стек-\/фрейма\ процессора\ при\ HardFault}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00474}00474\ \textcolor{comment}{\ \ *\ @details\ Сохраняет\ регистры\ R0-\/R3,\ R12,\ LR,\ PC,\ PSR\ для\ последующего\ анализа.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00475}00475\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00476}\mbox{\hyperlink{struct_h_f___stack_frame__t}{00476}}\ \textcolor{keyword}{typedef}\ \textcolor{keyword}{struct\ }\{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00477}\mbox{\hyperlink{struct_h_f___stack_frame__t_a4146ed28926b5f234132b7112119a413}{00477}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a4146ed28926b5f234132b7112119a413}{r0}};\ \ \ \textcolor{comment}{///<\ Регистр\ R0}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00478}\mbox{\hyperlink{struct_h_f___stack_frame__t_a286104d19185714940645a9df814ddea}{00478}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a286104d19185714940645a9df814ddea}{r1}};\ \ \ \textcolor{comment}{///<\ Регистр\ R1}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00479}\mbox{\hyperlink{struct_h_f___stack_frame__t_a5a52e5006dabcf68c0fa4cfb0e03335b}{00479}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a5a52e5006dabcf68c0fa4cfb0e03335b}{r2}};\ \ \ \textcolor{comment}{///<\ Регистр\ R2}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00480}\mbox{\hyperlink{struct_h_f___stack_frame__t_a453c7af42b6928a693af422e17c981d3}{00480}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a453c7af42b6928a693af422e17c981d3}{r3}};\ \ \ \textcolor{comment}{///<\ Регистр\ R3}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00481}\mbox{\hyperlink{struct_h_f___stack_frame__t_a819ee3bc518c460ece1b7c4079f8f80b}{00481}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a819ee3bc518c460ece1b7c4079f8f80b}{r12}};\ \ \textcolor{comment}{///<\ Регистр\ R12}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00482}\mbox{\hyperlink{struct_h_f___stack_frame__t_a6e51904297f7725e96d5b5fb291ef577}{00482}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a6e51904297f7725e96d5b5fb291ef577}{lr}};\ \ \ \textcolor{comment}{///<\ Link\ Register}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00483}\mbox{\hyperlink{struct_h_f___stack_frame__t_a16563896004751c90e41c81ae4570732}{00483}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_a16563896004751c90e41c81ae4570732}{pc}};\ \ \ \textcolor{comment}{///<\ Program\ Counter}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00484}\mbox{\hyperlink{struct_h_f___stack_frame__t_ae47cb051ee3c94471bfd4fe7e49c55f9}{00484}}\ \ \ uint32\_t\ \mbox{\hyperlink{struct_h_f___stack_frame__t_ae47cb051ee3c94471bfd4fe7e49c55f9}{psr}};\ \ \textcolor{comment}{///<\ Program\ Status\ Register}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00485}00485\ \}\ \mbox{\hyperlink{struct_h_f___stack_frame__t}{HF\_StackFrame\_t}};} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00486}00486\ \textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00487}00487\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00488}00488\ \textcolor{comment}{\ \ *\ @brief\ Проверка\ и\ вывод\ последнего\ HardFault-\/трейса\ из\ Flash}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00489}00489\ \textcolor{comment}{\ \ *\ @details}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00490}00490\ \textcolor{comment}{\ \ *\ Функция\ ищет\ последнюю\ запись\ HardFault\ по\ базовому\ тегу\ HF\_RTT\_TAG\_BASE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00491}00491\ \textcolor{comment}{\ \ *\ и\ выводит\ её\ содержимое\ в\ консоль.\ После\ успешного\ вывода\ Flash\ можно\ опционально\ очистить.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00492}00492\ \textcolor{comment}{\ \ *}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00493}00493\ \textcolor{comment}{\ \ *\ @return\ int}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00494}00494\ \textcolor{comment}{\ \ *\ \ \ -\/\ 1\ —\ данные\ HardFault\ найдены\ и\ выведены}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00495}00495\ \textcolor{comment}{\ \ *\ \ \ -\/\ 0\ —\ данные\ отсутствуют\ или\ тег\ не\ найден}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00496}00496\ \textcolor{comment}{\ \ *\ }} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00497}00497\ \textcolor{comment}{\ \ *\ @note\ Вызов\ рекомендуется\ при\ инициализации\ приложения\ для\ анализа\ предыдущего\ сбоя.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00498}00498\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00499}\mbox{\hyperlink{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_ga03f8b6f3b537ee1c8e91065c60db504f}{00499}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_ga03f8b6f3b537ee1c8e91065c60db504f}{HF\_CheckRecovered}}(\textcolor{keywordtype}{int}\ erase)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00500}00500\ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00501}00501\ \ \ \textcolor{keywordtype}{char}\ buffer[\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_ga501312b24e322de4dd6755ad442f0ba3}{RTT\_FLASH\_BUFFER\_SIZE}}];} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00502}00502\ \ \ uint32\_t\ read\_size\ =\ 0;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00503}00503\ \ \ \textcolor{keywordtype}{int}\ n\_hardfault\ =\ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga734b2ebbf0c77699b739013878cfd146}{RTT\_ReadFromFlash}}(\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gadc960255719c7eff4bdfaa850be9b313}{HF\_RTT\_TAG\_BASE}},\ buffer,\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gafcc7ea03d4df8f1909e580b519a7f3ca}{HF\_RTT\_TAIL\_SIZE}},\ \&read\_size);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00504}00504\ \ \ \textcolor{keywordflow}{if}\ (n\_hardfault\ >\ 0)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00505}00505\ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00506}00506\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}\(\backslash\)n-\/-\/-\/\ Recovered\ HardFault\ RTT\ buffer\ \#\%u\ -\/-\/-\/\(\backslash\)n"{}},\ n\_hardfault);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00507}00507\ \ \ \ \ \textcolor{keywordflow}{for}\ (\textcolor{keywordtype}{int}\ i\ =\ 0;\ i\ <\ read\_size;\ i++)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00508}00508\ \ \ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00509}00509\ \ \ \ \ \ \ \textcolor{keywordtype}{char}\ c\ =\ buffer[i];} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00510}00510\ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (c\ ==\ 0\ ||\ c\ ==\ (\textcolor{keywordtype}{char})0xFF)\ \textcolor{keywordflow}{break};} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00511}00511\ \ \ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}\%c"{}},\ c);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00512}00512\ \ \ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00513}00513\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00514}00514\ \ \ \ \ \textcolor{keywordflow}{if}(erase)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00515}00515\ \ \ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga8d8c6850e32b42871faefce3352012d1}{RTT\_EraseFlash}}();} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00516}00516\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}\(\backslash\)n-\/-\/-\/-\/-\/-\/-\/-\/-\/\ HardFault\ Dump\ End\ -\/-\/-\/-\/-\/-\/-\/-\/-\/\(\backslash\)n"{}});} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00517}00517\ \ \ \ \ \textcolor{keywordflow}{return}\ 1;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00518}00518\ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00519}00519\ \ \ \textcolor{keywordflow}{return}\ 0;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00520}00520\ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00521}00521\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00522}00522\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00523}00523\ \textcolor{keyword}{static}\ \mbox{\hyperlink{struct_h_f___stack_frame__t}{HF\_StackFrame\_t}}\ *stack\_frame;} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00524}00524\ \textcolor{keyword}{static}\ uint32\_t\ stack\_dump[\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gaa31234688b333a505aaa57b8ecdedf5b}{HF\_STACK\_DUMP\_WORDS}}];} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00525}00525\ \textcolor{keyword}{static}\ \textcolor{keywordtype}{void}\ *ret\_adr[10]\ =\ \{0\};\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00526}00526\ \textcolor{comment}{/**}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00527}00527\ \textcolor{comment}{\ \ *\ @brief\ Обработчик\ HardFault}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00528}00528\ \textcolor{comment}{\ \ *\ @details}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00529}00529\ \textcolor{comment}{\ \ *\ Вызывается\ из\ прерывания\ HardFault\ или\ в\ любом\ месте\ где\ понятно\ что\ ошибка\ критическая.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00530}00530\ \textcolor{comment}{\ \ *\ Последовательно\ выполняет:}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00531}00531\ \textcolor{comment}{\ \ *\ \ \ 1.\ Определяет\ активный\ стек\ (MSP\ или\ PSP)\ на\ момент\ сбоя.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00532}00532\ \textcolor{comment}{\ \ *\ \ \ 2.\ Сохраняет\ значения\ регистров\ R0-\/R3,\ R12,\ LR,\ PC,\ PSR.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00533}00533\ \textcolor{comment}{\ \ *\ \ \ 3.\ Выводит\ системные\ регистры\ CFSR,\ HFSR,\ DFSR,\ AFSR,\ MMFAR,\ BFAR.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00534}00534\ \textcolor{comment}{\ \ *\ \ \ 4.\ Формирует\ stack\ trace\ с\ 3\ уровнями\ возврата.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00535}00535\ \textcolor{comment}{\ \ *\ \ \ 5.\ Копирует\ последние\ символы\ RTT\ буфера.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00536}00536\ \textcolor{comment}{\ \ *\ \ \ 6.\ Сохраняет\ все\ данные\ во\ Flash\ через\ RTT\_SaveToFlash\ с\ базовым\ тегом\ HF\_RTT\_TAG\_BASE.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00537}00537\ \textcolor{comment}{\ \ *}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00538}00538\ \textcolor{comment}{\ \ *\ @note\ Функция\ защищена,\ так\ как\ вызывается\ в\ контексте\ сбоя\ —\ минимизирует\ использование\ вызовов\ HAL.}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00539}00539\ \textcolor{comment}{\ \ */}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00540}\mbox{\hyperlink{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_gadd8e10e7ec3b0204f7f92062ecd452f7}{00540}}\ \_\_STATIC\_FORCEINLINE\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{group___t_r_a_c_e___h_a_r_d_f_a_u_l_t_gadd8e10e7ec3b0204f7f92062ecd452f7}{HF\_HandleFault}}(\textcolor{keywordtype}{void})} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00541}00541\ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00542}00542\ \ \ \ \ \textcolor{comment}{//\ Получаем\ указатель\ на\ стек,\ где\ произошёл\ HardFault}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00543}00543\ \ \ \ \ \_\_ASM\ \textcolor{keyword}{volatile}(} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00544}00544\ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}TST\ lr,\ \#4\ \ \ \ \ \ \ \(\backslash\)n"{}}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00545}00545\ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}ITE\ EQ\ \ \ \ \ \ \ \ \ \ \ \(\backslash\)n"{}}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00546}00546\ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}MRSEQ\ \%[ptr],\ MSP\(\backslash\)n"{}}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00547}00547\ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}MRSNE\ \%[ptr],\ PSP\(\backslash\)n"{}}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00548}00548\ \ \ \ \ \ \ \ \ :\ [ptr]\ \textcolor{stringliteral}{"{}=r"{}}(stack\_frame)} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00549}00549\ \ \ \ \ );} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00550}00550\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00551}00551\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}\(\backslash\)n=====\ HardFault\ occurred!\ =====\(\backslash\)n"{}});} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00552}00552\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}R0\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>r0);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00553}00553\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}R1\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>r1);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00554}00554\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}R2\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>r2);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00555}00555\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}R3\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>r3);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00556}00556\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}R12\ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>r12);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00557}00557\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}LR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>lr);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00558}00558\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}PC\ \ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>pc);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00559}00559\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}PSR\ =\ 0x\%08X\(\backslash\)n"{}},\ stack\_frame-\/>psr);} \DoxyCodeLine{\Hypertarget{trace_8h_source_l00560}00560\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00561}00561\ \ \ \ \ \textcolor{keywordflow}{for}\ (\textcolor{keywordtype}{int}\ i\ =\ 0;\ i\ <\ 3;\ i++)\ \ \textcolor{comment}{//\ развернуть\ n\ уровней}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00562}00562\ \ \ \ \ \{} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00563}00563\ \ \ \ \ \ \ \textcolor{keywordflow}{if}(ret\_adr[i])} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00564}00564\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}\ \ \#\%d:\ 0x\%08lX\(\backslash\)r\(\backslash\)n"{}},\ i,\ ret\_adr[i]);\ \textcolor{comment}{//\ -\/1\ для\ Thumb}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00565}00565\ \ \ \ \ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00566}00566\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga79f222c8ab644de4d47f07528d1edd63}{RTT\_SaveToFlash}}(\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gadc960255719c7eff4bdfaa850be9b313}{HF\_RTT\_TAG\_BASE}},\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gafcc7ea03d4df8f1909e580b519a7f3ca}{HF\_RTT\_TAIL\_SIZE}});} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00567}00567\ \}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00568}00568\ \textcolor{preprocessor}{\#else\ }\textcolor{comment}{//\ HAL\_MODULE\_ENABLED\ \&\&\ HARDFAULT\_SERIAL\_TRACE}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00569}00569\ \textcolor{preprocessor}{\#define\ HF\_CheckRecovered(...)\ 0}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00570}00570\ \textcolor{preprocessor}{\#define\ HF\_HandleFault(...)}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00571}00571\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ HAL\_MODULE\_ENABLED\ \&\&\ HARDFAULT\_SERIAL\_TRACE}\textcolor{comment}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00572}00572\ \textcolor{comment}{/**\ TRACE\_HARDFAULT}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00573}00573\ \textcolor{comment}{\ \ *\ @\}}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00574}00574\ \textcolor{comment}{\ \ */}\textcolor{preprocessor}{}} -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00575}00575\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00576}00576\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00577}00577\ } -\DoxyCodeLine{\Hypertarget{trace_8h_source_l00578}00578\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\_\_TRACE\_H\_}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00561}00561\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}CFSR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>CFSR);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00562}00562\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}HFSR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>HFSR);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00563}00563\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}DFSR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>DFSR);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00564}00564\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}AFSR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>AFSR);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00565}00565\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}MMFAR\ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>MMFAR);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00566}00566\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}BFAR\ \ =\ 0x\%08X\(\backslash\)n"{}},\ SCB-\/>BFAR);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00567}00567\ \ \ \ \ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00568}00568\ \ \ \ \ \textcolor{comment}{//\ -\/-\/-\/\ Stack\ trace\ -\/-\/-\/}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00569}00569\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}-\/-\/-\/\ Stack\ trace\ -\/-\/-\/\(\backslash\)n"{}});} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00570}00570\ \ \ \ \ ret\_adr[0]\ =\ \_\_builtin\_return\_address(0);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00571}00571\ \ \ \ \ ret\_adr[1]\ =\ \_\_builtin\_return\_address(1);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00572}00572\ \ \ \ \ ret\_adr[2]\ =\ \_\_builtin\_return\_address(2);} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00573}00573\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00574}00574\ \ \ \ \ \textcolor{keywordflow}{for}\ (\textcolor{keywordtype}{int}\ i\ =\ 0;\ i\ <\ 3;\ i++)\ \ \textcolor{comment}{//\ развернуть\ n\ уровней}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00575}00575\ \ \ \ \ \{} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00576}00576\ \ \ \ \ \ \ \textcolor{keywordflow}{if}(ret\_adr[i])} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00577}00577\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___s_e_r_i_a_l_gae9b9b8a611e291a2f2aa5abf99f3ebaa}{my\_printf}}(\textcolor{stringliteral}{"{}\ \ \#\%d:\ 0x\%08lX\(\backslash\)r\(\backslash\)n"{}},\ i,\ ret\_adr[i]);\ \textcolor{comment}{//\ -\/1\ для\ Thumb}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00578}00578\ \ \ \ \ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00579}00579\ \ \ \ \ \mbox{\hyperlink{group___t_r_a_c_e___r_t_t___f_l_a_s_h_ga79f222c8ab644de4d47f07528d1edd63}{RTT\_SaveToFlash}}(\mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gadc960255719c7eff4bdfaa850be9b313}{HF\_RTT\_TAG\_BASE}},\ \mbox{\hyperlink{group___t_r_a_c_e___c_o_n_f_i_g_gafcc7ea03d4df8f1909e580b519a7f3ca}{HF\_RTT\_TAIL\_SIZE}});} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00580}00580\ \}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00581}00581\ \textcolor{preprocessor}{\#else\ }\textcolor{comment}{//\ HAL\_MODULE\_ENABLED\ \&\&\ HARDFAULT\_SERIAL\_TRACE}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00582}00582\ \textcolor{preprocessor}{\#define\ HF\_CheckRecovered(...)\ 0}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00583}00583\ \textcolor{preprocessor}{\#define\ HF\_HandleFault(...)}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00584}00584\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ HAL\_MODULE\_ENABLED\ \&\&\ HARDFAULT\_SERIAL\_TRACE}\textcolor{comment}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00585}00585\ \textcolor{comment}{/**\ TRACE\_HARDFAULT}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00586}00586\ \textcolor{comment}{\ \ *\ @\}}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00587}00587\ \textcolor{comment}{\ \ */}\textcolor{preprocessor}{}} +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00588}00588\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00589}00589\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00590}00590\ } +\DoxyCodeLine{\Hypertarget{trace_8h_source_l00591}00591\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\_\_TRACE\_H\_}} \end{DoxyCode} diff --git a/Doc/latex/trackers_8h.tex b/Doc/latex/trackers_8h.tex index 1f402ed..9b09a0e 100644 --- a/Doc/latex/trackers_8h.tex +++ b/Doc/latex/trackers_8h.tex @@ -1,23 +1,25 @@ -\doxysection{F\+:/\+Work/\+Projects/\+STM/.Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/trackers.h File Reference} -\hypertarget{trackers_8h}{}\label{trackers_8h}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trackers.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trackers.h}} +\doxysection{E\+:/.WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/trackers.h File Reference} +\hypertarget{trackers_8h}{}\label{trackers_8h}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trackers.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/trackers.h}} Заголочный файл для работы с трекерами \doxylink{group___t_r_a_c_k_e_r_s}{Trackers defines}. {\ttfamily \#include "{}mylibs\+\_\+defs.\+h"{}}\newline -Include dependency graph for trackers.\+h\+:\nopagebreak +Include dependency graph for trackers.\+h\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode -\includegraphics[width=245pt]{trackers_8h__incl} +\includegraphics[width=229pt]{trackers_8h__incl} \end{center} \end{figure} -This graph shows which files directly or indirectly include this file\+:\nopagebreak +This graph shows which files directly or indirectly include this file\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode -\includegraphics[width=245pt]{trackers_8h__dep__incl} +\includegraphics[width=229pt]{trackers_8h__dep__incl} \end{center} \end{figure} \doxysubsubsection*{Macros} @@ -25,43 +27,43 @@ This graph shows which files directly or indirectly include this file\+:\nopageb \item \#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga50ccb119acf302969b7fdcb58f2130e4}{Tracker\+Type\+Def}}(num\+\_\+user\+\_\+vars) \begin{DoxyCompactList}\small\item\em Структура для счетчиков отладки \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc}{num\+\_\+of\+\_\+usercnts}}(\+\_\+user\+\_\+)~(sizeof(\+\_\+user\+\_\+) / sizeof(uint32\+\_\+t)) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc}{num\+\_\+of\+\_\+usercnts}}(\+\_\+user\+\_\+) \begin{DoxyCompactList}\small\item\em Получить количетство пользовательских переменных \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~((\+\_\+uservarnumb\+\_\+) $<$ \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga72be24629fedb8bf70e830373d151fbc}{num\+\_\+of\+\_\+usercnts}}((\+\_\+cntstruct\+\_\+).user)) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Проверка существует ли указанная пользовательская переменная \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~if(\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Условие для проверки существует ли указанная пользовательская переменная \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30}{tern\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~(\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gadd7fd2c6e3a4800f1d5ddab35fd4b43e}{assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)) ? \+\_\+uservarnumb\+\_\+ \+: 0 +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30}{tern\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Тернарный оператор для проверки существует ли указанная пользовательская переменная \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gab880911066605602a966641682090169}{Tracker\+Get\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+ok +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gab880911066605602a966641682090169}{Tracker\+Get\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Считать счетчик успешных событий \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga9dc91e6b798a081f95f2ccef2c288e5e}{Tracker\+Get\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+err +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga9dc91e6b798a081f95f2ccef2c288e5e}{Tracker\+Get\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Считать счетчик ошибок \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga47ac59a406ee74d4cd9fe0fbaf63a758}{Tracker\+Get\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+warn +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga47ac59a406ee74d4cd9fe0fbaf63a758}{Tracker\+Get\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Считать счетчик предупреждений \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga4b08632669043dfdbd219dda03502bdb}{Tracker\+Get\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~(\+\_\+cntstruct\+\_\+).user\mbox{[}\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga39b6ffbc561f8caac276415e1ad32c30}{tern\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)\mbox{]} +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga4b08632669043dfdbd219dda03502bdb}{Tracker\+Get\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Считать пользовательскую переменную \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga23de0006aa08984cfeddb6aa5e512fa1}{Tracker\+Cnt\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+ok++ +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga23de0006aa08984cfeddb6aa5e512fa1}{Tracker\+Cnt\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Инкрементирование счетчика успешных событий \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga49af29ab3927cad105c1d2b018a767e9}{Tracker\+Cnt\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+err++ +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga49af29ab3927cad105c1d2b018a767e9}{Tracker\+Cnt\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Инкрементирование счетчика ошибок \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga8017fb05a56a1b667244f1f786fa9c57}{Tracker\+Cnt\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+warn++ +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga8017fb05a56a1b667244f1f786fa9c57}{Tracker\+Cnt\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Инкрементирование счетчика предупреждений \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga1b7549afc4a1760b54a9b93b0f6d105e}{Tracker\+Cnt\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) (\+\_\+cntstruct\+\_\+).user\mbox{[}\+\_\+uservarnumb\+\_\+\mbox{]}++; +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga1b7549afc4a1760b54a9b93b0f6d105e}{Tracker\+Cnt\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Инкрементирование пользовательской переменной \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad2f4062a9ac8c2ab062a364f640ebc51}{Tracker\+Write\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+, \+\_\+val\+\_\+)~\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) (\+\_\+cntstruct\+\_\+).user\mbox{[}\+\_\+uservarnumb\+\_\+\mbox{]} = (\+\_\+val\+\_\+) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad2f4062a9ac8c2ab062a364f640ebc51}{Tracker\+Write\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+, \+\_\+val\+\_\+) \begin{DoxyCompactList}\small\item\em Запись числа в пользовательскую переменную \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga704f7b9f8c65c9bcec48ce7cb77a2d3b}{Tracker\+Clear\+\_\+\+All}}(\+\_\+cntstruct\+\_\+)~memset(\&(\+\_\+cntstruct\+\_\+), 0, sizeof(\+\_\+cntstruct\+\_\+)) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga704f7b9f8c65c9bcec48ce7cb77a2d3b}{Tracker\+Clear\+\_\+\+All}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка всей структуры \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga5dd8bac8c7ab5832019d55d7a68371b9}{Tracker\+Clear\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+ok = 0 +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga5dd8bac8c7ab5832019d55d7a68371b9}{Tracker\+Clear\+\_\+\+Ok}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка счетчика успешных событий \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gae860b6947c6e317e14d40bd7b4b8eb74}{Tracker\+Clear\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+err = 0 +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gae860b6947c6e317e14d40bd7b4b8eb74}{Tracker\+Clear\+\_\+\+Err}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка счетчика ошибок \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga365a8c60bd13b75154feda649dd21ead}{Tracker\+Clear\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+)~(\+\_\+cntstruct\+\_\+).cnt\+\_\+warn = 0 +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga365a8c60bd13b75154feda649dd21ead}{Tracker\+Clear\+\_\+\+Warn}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка счетчика предупреждений \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga063dab1067005e1600ea32531fdf3f8d}{Tracker\+Clear\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+)~\mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gad91d8ca89074270fc040c0449e57cf07}{if\+\_\+assert\+\_\+usertracker}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) (\+\_\+cntstruct\+\_\+).user\mbox{[}\+\_\+uservarnumb\+\_\+\mbox{]} = 0; +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_ga063dab1067005e1600ea32531fdf3f8d}{Tracker\+Clear\+\_\+\+User}}(\+\_\+cntstruct\+\_\+, \+\_\+uservarnumb\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка пользовательской переменной \end{DoxyCompactList}\item -\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gaaec7ec19977bb26fa1919dfe920b82d5}{Tracker\+Clear\+\_\+\+User\+All}}(\+\_\+cntstruct\+\_\+)~memset(\&(\+\_\+cntstruct\+\_\+).user, 0, sizeof((\+\_\+cntstruct\+\_\+).user)) +\#define \mbox{\hyperlink{group___t_r_a_c_k_e_r_s_gaaec7ec19977bb26fa1919dfe920b82d5}{Tracker\+Clear\+\_\+\+User\+All}}(\+\_\+cntstruct\+\_\+) \begin{DoxyCompactList}\small\item\em Очистка всех пользовательских переменных \end{DoxyCompactList}\end{DoxyCompactItemize} diff --git a/Doc/latex/trackers_8h__dep__incl.md5 b/Doc/latex/trackers_8h__dep__incl.md5 index db42c88..1f31ff9 100644 --- a/Doc/latex/trackers_8h__dep__incl.md5 +++ b/Doc/latex/trackers_8h__dep__incl.md5 @@ -1 +1 @@ -b846d5f6f730de44071fc47243d7d99d \ No newline at end of file +72159b9328b2b9eb57fcadd1b302af03 \ No newline at end of file diff --git a/Doc/latex/trackers_8h__dep__incl.pdf b/Doc/latex/trackers_8h__dep__incl.pdf index bfb8f20762b7a2469c199dbbda7646d0a25ae569..6187eda8dfd1c50ac48569bb51f8230e92bf2156 100644 GIT binary patch delta 19723 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

    lW?^MB|6E-VpV72XqN@pAE2 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 delta 21191 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\mbox{\hyperlink{struct_t_i_m___encoder_type_def_adc80bd5a90444c31d84157f35c59b95c}{htim}}-\/>Instance);} +\DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00198}00198\ \ \ GPIO\_InitStruct.Alternate\ =\ GPIO\_TIM\_Alternate\_Mapping(henc-\/>\mbox{\hyperlink{struct_t_i_m___encoder_type_def_adc80bd5a90444c31d84157f35c59b95c}{htim}}-\/>Instance);} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00199}00199\ \ \ \textcolor{keywordflow}{if}(GPIO\_InitStruct.Alternate)} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00200}00200\ \ \ \ \ HAL\_GPIO\_Init(henc-\/>\mbox{\hyperlink{struct_t_i_m___encoder_type_def_ad29873fc8cdc71462e6d8744621120e9}{GPIOx}},\ \&GPIO\_InitStruct);} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00201}00201\ \ \ } @@ -259,7 +259,7 @@ \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00255}00255\ \ \ \textcolor{keywordflow}{else}} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00256}00256\ \ \ \ \ GPIO\_InitStruct.Pull\ =\ GPIO\_PULLUP;} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00257}00257\ \ \ GPIO\_InitStruct.Speed\ =\ GPIO\_SPEED\_FREQ\_LOW;\ \ } -\DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00258}00258\ \ \ GPIO\_InitStruct.Alternate\ =\ \mbox{\hyperlink{group___m_y_l_i_b_s___g_p_i_o___g_e_n_e_r_a_l_ga580b842096340b066c28b24d6b315be6}{GPIO\_TIM\_Alternate\_Mapping}}(htim-\/>Instance);} +\DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00258}00258\ \ \ GPIO\_InitStruct.Alternate\ =\ GPIO\_TIM\_Alternate\_Mapping(htim-\/>Instance);} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00259}00259\ \ \ \textcolor{keywordflow}{if}(GPIO\_InitStruct.Alternate)} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00260}00260\ \ \ \ \ HAL\_GPIO\_Init(GPIOx,\ \&GPIO\_InitStruct);} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00261}00261\ \ \ } @@ -407,7 +407,7 @@ \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00403}00403\ \textcolor{comment}{\ \ *\ @brief\ \ Инициализация\ CLK\ и\ NVIC\ таймеров.}} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00404}00404\ \textcolor{comment}{\ \ *\ @param\ \ htim\ Указатель\ на\ хендл\ таймера.}} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00405}00405\ \textcolor{comment}{\ \ *\ @note\ \ \ Чтобы\ не\ генерировать\ функцию\ с\ иницилизацией\ неиспользуемых\ таймеров,}} -\DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00406}00406\ \textcolor{comment}{\ \ \ \ \ \ \ \ \ \ \ \ дефайнами\ в\ general\_tim.h\ определяются\ используемые\ таймеры.}} +\DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00406}00406\ \textcolor{comment}{\ \ \ \ \ \ \ \ \ \ \ \ дефайнами\ @ref\ TIM\_INIT\ в\ @ref\ general\_tim.h\ определяются\ используемые\ таймеры.}} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00407}00407\ \textcolor{comment}{\ \ */}} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00408}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaad47337be7ba2f6c0777c40d7278c931}{00408}}\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaad47337be7ba2f6c0777c40d7278c931}{TIM\_Base\_MspInit}}(TIM\_HandleTypeDef*\ htim,\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\_ITModeTypeDef}}\ it\_mode)} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00409}00409\ \{} @@ -616,7 +616,7 @@ \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00612}00612\ \textcolor{comment}{\ \ *\ @brief\ \ Деинициализация\ CLK\ и\ NVIC\ таймеров.}} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00613}00613\ \textcolor{comment}{\ \ *\ @param\ \ htim\ Указатель\ на\ хендл\ таймера.}} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00614}00614\ \textcolor{comment}{\ \ *\ @note\ \ \ Чтобы\ не\ генерировать\ функцию\ с\ деиницилизацией\ неиспользуемых\ таймеров,}} -\DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00615}00615\ \textcolor{comment}{\ \ \ \ \ \ \ \ \ \ \ \ дефайнами\ в\ general\_tim.h\ определяются\ используемые\ таймеры.}} +\DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00615}00615\ \textcolor{comment}{\ \ \ \ \ \ \ \ \ \ \ \ дефайнами\ @ref\ TIM\_INIT\ в\ @ref\ general\_tim.h\ определяются\ используемые\ таймеры.}} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00616}00616\ \textcolor{comment}{\ \ */}} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00617}\mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga879e3f1c919c02990736730275367115}{00617}}\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga879e3f1c919c02990736730275367115}{TIM\_Base\_MspDeInit}}(TIM\_HandleTypeDef*\ htim)} \DoxyCodeLine{\Hypertarget{general__tim_8c_source_l00618}00618\ \{} diff --git a/Doc/latex/general__tim_8h.tex b/Doc/latex/general__tim_8h.tex index 5e69f8f..b359f78 100644 --- a/Doc/latex/general__tim_8h.tex +++ b/Doc/latex/general__tim_8h.tex @@ -1,5 +1,5 @@ -\doxysection{F\+:/\+Work/\+Projects/\+STM/.Elementary/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/general\+\_\+tim.h File Reference} -\hypertarget{general__tim_8h}{}\label{general__tim_8h}\index{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_tim.h@{F:/Work/Projects/STM/.Elementary/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_tim.h}} +\doxysection{E\+:/.WORK/\+STM32/\+STM32\+\_\+\+Extended\+Libs/\+My\+Libs\+General/\+Inc/general\+\_\+tim.h File Reference} +\hypertarget{general__tim_8h}{}\label{general__tim_8h}\index{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_tim.h@{E:/.WORK/STM32/STM32\_ExtendedLibs/MyLibsGeneral/Inc/general\_tim.h}} Заголовочный файл для модуля инициализации таймеров и работы с ними. @@ -7,14 +7,16 @@ {\ttfamily \#include "{}mylibs\+\_\+defs.\+h"{}}\newline {\ttfamily \#include "{}general\+\_\+gpio.\+h"{}}\newline -Include dependency graph for general\+\_\+tim.\+h\+:\nopagebreak +Include dependency graph for general\+\_\+tim.\+h\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode -\includegraphics[width=260pt]{general__tim_8h__incl} +\includegraphics[width=229pt]{general__tim_8h__incl} \end{center} \end{figure} -This graph shows which files directly or indirectly include this file\+:\nopagebreak +This graph shows which files directly or indirectly include this file\+: +\nopagebreak \begin{figure}[H] \begin{center} \leavevmode @@ -86,6 +88,18 @@ enum \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaa0a51c870325 \doxysubsubsection*{Functions} \begin{DoxyCompactItemize} \item +HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga7044214f24a9868ba7e1650b55e639ec}{TIM\+\_\+\+Base\+\_\+\+Init}} (\mbox{\hyperlink{struct_t_i_m___settings_type_def}{TIM\+\_\+\+Settings\+Type\+Def}} \texorpdfstring{$\ast$}{*}stim) +\begin{DoxyCompactList}\small\item\em Инициализация таймера. \end{DoxyCompactList}\item +void \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaad47337be7ba2f6c0777c40d7278c931}{TIM\+\_\+\+Base\+\_\+\+Msp\+Init}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim, \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\+\_\+\+ITMode\+Type\+Def}} it\+\_\+mode) +\begin{DoxyCompactList}\small\item\em Инициализация CLK и NVIC таймеров. \end{DoxyCompactList}\item +void \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga879e3f1c919c02990736730275367115}{TIM\+\_\+\+Base\+\_\+\+Msp\+De\+Init}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim) +\begin{DoxyCompactList}\small\item\em Деинициализация CLK и NVIC таймеров. \end{DoxyCompactList}\item +HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga4c0dfde4e15f677600605348b4e97834}{TIM\+\_\+\+Delay\+\_\+\+Start}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim) +\begin{DoxyCompactList}\small\item\em Начать отсчет неблокирующей задержки. \end{DoxyCompactList}\item +HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga88c552a133cb6e3015453cccab74c07e}{TIM\+\_\+\+Delay}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim, uint16\+\_\+t delay) +\begin{DoxyCompactList}\small\item\em Задержка в тиках таймера (блокирующая). \end{DoxyCompactList}\item +HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga108637af414bff3373059273b815ce9b}{TIM\+\_\+\+Delay\+\_\+\+Non\+Blocking}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim, uint16\+\_\+t delay) +\begin{DoxyCompactList}\small\item\em Задержка в тиках таймера (неблокирующая). \end{DoxyCompactList}\item HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___o_c_gadb2f465d89f609e035867e980c3a29c6}{TIM\+\_\+\+Output\+\_\+\+PWM\+\_\+\+Init}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim, TIM\+\_\+\+OC\+\_\+\+Init\+Type\+Def \texorpdfstring{$\ast$}{*}s\+Config\+OC, uint32\+\_\+t TIM\+\_\+\+CHANNEL, GPIO\+\_\+\+Type\+Def \texorpdfstring{$\ast$}{*}GPIOx, uint32\+\_\+t PWM\+\_\+\+PIN) \begin{DoxyCompactList}\small\item\em Инициализация выхода ШИМ таймера. \end{DoxyCompactList}\item HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___o_c_gae2608ca8023e9a0713af0b4fbfbc1889}{TIM\+\_\+\+OC\+\_\+\+Comparator\+\_\+\+Init}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim, uint32\+\_\+t TIM\+\_\+\+CHANNEL) @@ -95,19 +109,7 @@ HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_ HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_gac3bc6525f88c275e47eb864e6d567501}{TIM\+\_\+\+Encoder\+\_\+\+Read}} (\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\+\_\+\+Encoder\+Type\+Def}} \texorpdfstring{$\ast$}{*}henc) \begin{DoxyCompactList}\small\item\em Считать энкодер. \end{DoxyCompactList}\item int \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___e_n_c_o_d_e_r_ga117b795017e9e3a357ddefe323412761}{TIM\+\_\+\+Encoder\+\_\+\+Read\+Switch}} (\mbox{\hyperlink{struct_t_i_m___encoder_type_def}{TIM\+\_\+\+Encoder\+Type\+Def}} \texorpdfstring{$\ast$}{*}henc) -\begin{DoxyCompactList}\small\item\em Считать кнопку энкодера. \end{DoxyCompactList}\item -HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga4c0dfde4e15f677600605348b4e97834}{TIM\+\_\+\+Delay\+\_\+\+Start}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim) -\begin{DoxyCompactList}\small\item\em Начать отсчет неблокирующей задержки. \end{DoxyCompactList}\item -HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga88c552a133cb6e3015453cccab74c07e}{TIM\+\_\+\+Delay}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim, uint16\+\_\+t delay) -\begin{DoxyCompactList}\small\item\em Задержка в тиках таймера (блокирующая). \end{DoxyCompactList}\item -HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___d_e_l_a_y_ga108637af414bff3373059273b815ce9b}{TIM\+\_\+\+Delay\+\_\+\+Non\+Blocking}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim, uint16\+\_\+t delay) -\begin{DoxyCompactList}\small\item\em Задержка в тиках таймера (неблокирующая). \end{DoxyCompactList}\item -HAL\+\_\+\+Status\+Type\+Def \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga7044214f24a9868ba7e1650b55e639ec}{TIM\+\_\+\+Base\+\_\+\+Init}} (\mbox{\hyperlink{struct_t_i_m___settings_type_def}{TIM\+\_\+\+Settings\+Type\+Def}} \texorpdfstring{$\ast$}{*}stim) -\begin{DoxyCompactList}\small\item\em Инициализация таймера. \end{DoxyCompactList}\item -void \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaad47337be7ba2f6c0777c40d7278c931}{TIM\+\_\+\+Base\+\_\+\+Msp\+Init}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim, \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_gaeb611874216a4661fb83366b99b9e787}{TIM\+\_\+\+ITMode\+Type\+Def}} it\+\_\+mode) -\begin{DoxyCompactList}\small\item\em Инициализация CLK и NVIC таймеров. \end{DoxyCompactList}\item -void \mbox{\hyperlink{group___m_y_l_i_b_s___t_i_m___g_e_n_e_r_a_l_ga879e3f1c919c02990736730275367115}{TIM\+\_\+\+Base\+\_\+\+Msp\+De\+Init}} (TIM\+\_\+\+Handle\+Type\+Def \texorpdfstring{$\ast$}{*}htim) -\begin{DoxyCompactList}\small\item\em Деинициализация CLK и NVIC таймеров. \end{DoxyCompactList}\end{DoxyCompactItemize} +\begin{DoxyCompactList}\small\item\em Считать кнопку энкодера. \end{DoxyCompactList}\end{DoxyCompactItemize} \doxysubsection{Detailed Description} @@ -119,24 +121,26 @@ Definition in file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h +\label{doc-define-members} +\Hypertarget{general__tim_8h_doc-define-members} \doxysubsection{Macro Definition Documentation} -\Hypertarget{general__tim_8h_a867308f75c1be4f2090bcda3bcd900c9}\label{general__tim_8h_a867308f75c1be4f2090bcda3bcd900c9} -\index{general\_tim.h@{general\_tim.h}!TIM\_IT\_CONF\_Pos@{TIM\_IT\_CONF\_Pos}} +\Hypertarget{general__tim_8h_a867308f75c1be4f2090bcda3bcd900c9}\index{general\_tim.h@{general\_tim.h}!TIM\_IT\_CONF\_Pos@{TIM\_IT\_CONF\_Pos}} \index{TIM\_IT\_CONF\_Pos@{TIM\_IT\_CONF\_Pos}!general\_tim.h@{general\_tim.h}} \doxysubsubsection{\texorpdfstring{TIM\_IT\_CONF\_Pos}{TIM\_IT\_CONF\_Pos}} -{\footnotesize\ttfamily \#define TIM\+\_\+\+IT\+\_\+\+CONF\+\_\+\+Pos~0} +{\footnotesize\ttfamily \label{general__tim_8h_a867308f75c1be4f2090bcda3bcd900c9} +\#define TIM\+\_\+\+IT\+\_\+\+CONF\+\_\+\+Pos~0} -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00056}{56}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00057}{57}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. -\Hypertarget{general__tim_8h_a8c43257cbfd6ac70b6eb0839e47bbd07}\label{general__tim_8h_a8c43257cbfd6ac70b6eb0839e47bbd07} -\index{general\_tim.h@{general\_tim.h}!TIM\_IT\_CONF@{TIM\_IT\_CONF}} +\Hypertarget{general__tim_8h_a8c43257cbfd6ac70b6eb0839e47bbd07}\index{general\_tim.h@{general\_tim.h}!TIM\_IT\_CONF@{TIM\_IT\_CONF}} \index{TIM\_IT\_CONF@{TIM\_IT\_CONF}!general\_tim.h@{general\_tim.h}} \doxysubsubsection{\texorpdfstring{TIM\_IT\_CONF}{TIM\_IT\_CONF}} -{\footnotesize\ttfamily \#define TIM\+\_\+\+IT\+\_\+\+CONF~(1$<$$<$(TIM\+\_\+\+IT\+\_\+\+CONF\+\_\+\+Pos))} +{\footnotesize\ttfamily \label{general__tim_8h_a8c43257cbfd6ac70b6eb0839e47bbd07} +\#define TIM\+\_\+\+IT\+\_\+\+CONF~(1$<$$<$(TIM\+\_\+\+IT\+\_\+\+CONF\+\_\+\+Pos))} -Definition at line \mbox{\hyperlink{general__tim_8h_source_l00063}{63}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. +Definition at line \mbox{\hyperlink{general__tim_8h_source_l00064}{64}} of file \mbox{\hyperlink{general__tim_8h_source}{general\+\_\+tim.\+h}}. diff --git a/Doc/latex/general__tim_8h__dep__incl.md5 b/Doc/latex/general__tim_8h__dep__incl.md5 index 7a3703b..85cb58d 100644 --- a/Doc/latex/general__tim_8h__dep__incl.md5 +++ b/Doc/latex/general__tim_8h__dep__incl.md5 @@ -1 +1 @@ -a485be779e2e5c082a1deb15eb121995 \ No newline at end of file +48912ae69413105687efed9fcdd23d2d \ No newline at end of file diff --git a/Doc/latex/general__tim_8h__dep__incl.pdf b/Doc/latex/general__tim_8h__dep__incl.pdf index e465df7932511c08f74018561f727146bd5bb5eb..d15d1098fac39401efe5033c045d5f3093f44dab 100644 GIT binary patch delta 19886 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