From 5e93fc20994cb792137f3968f3169a1de16b76ab Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Thu, 12 Jun 2025 21:43:34 +0300 Subject: [PATCH] =?UTF-8?q?=D1=8D=D1=82=D0=BE.=20=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=BE.=20=D0=B0=D1=85=D1=83=D0=B5=D0=BD=D0=BE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit конфиги работают можно делать окно настроек для симуляции периферии мб конечно причесать это все потом, но это потом --- .../STM32F1xx_SIMULINK/stm32f1xx_matlab_rcc.h | 10 +- MCU_STM32F1xx_Matlab/periph_config.json | 252 ++++++ MCU_STM32F1xx_Matlab/stm32f1xx_matlab_conf.h | 2 +- MCU_Wrapper/mexing.m | 718 ++++++++++++++++++ mcu_test_r2023.slx | Bin 68374 -> 69550 bytes mexing.asv | 155 +++- mexing.m | 153 +++- periph_config.json | 262 ++++++- 8 files changed, 1453 insertions(+), 99 deletions(-) create mode 100644 MCU_STM32F1xx_Matlab/periph_config.json create mode 100644 MCU_Wrapper/mexing.m diff --git a/MCU_STM32F1xx_Matlab/Drivers/STM32F1xx_SIMULINK/stm32f1xx_matlab_rcc.h b/MCU_STM32F1xx_Matlab/Drivers/STM32F1xx_SIMULINK/stm32f1xx_matlab_rcc.h index 6fc5019..8767828 100644 --- a/MCU_STM32F1xx_Matlab/Drivers/STM32F1xx_SIMULINK/stm32f1xx_matlab_rcc.h +++ b/MCU_STM32F1xx_Matlab/Drivers/STM32F1xx_SIMULINK/stm32f1xx_matlab_rcc.h @@ -9,11 +9,11 @@ //#define AHB_Prescaler ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos) //#define AHB_Prescaler ((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos) -#define HCLK_Value (double)72000000; -#define ABP1_Value (double)36000000; -#define ABP1_TIMS_Value (double)72000000; -#define ABP2_Value (double)72000000; -#define ABP2_TIMS_Value (double)72000000; +//#define HCLK_Value (double)72000000; +//#define ABP1_Value (double)36000000; +//#define ABP1_TIMS_Value (double)72000000; +//#define ABP2_Value (double)72000000; +//#define ABP2_TIMS_Value (double)72000000; /* stm32f4xx_hal_rcc.c, */ /* MCU_Periph_Simulation(), */ diff --git a/MCU_STM32F1xx_Matlab/periph_config.json b/MCU_STM32F1xx_Matlab/periph_config.json new file mode 100644 index 0000000..8d354ed --- /dev/null +++ b/MCU_STM32F1xx_Matlab/periph_config.json @@ -0,0 +1,252 @@ +{ + "RCC": { + "Defines": { + "HCLK_Clock": { + "Prompt": "HCLK Clock (Hz)", + "Def": "HCLK_Value", + "Type": "edit", + "Default": 7.2E+7, + "NewRow": true + }, + "ABP1_Clock": { + "Prompt": "ABP1 Clock (Hz)", + "Def": "ABP1_Value", + "Type": "edit", + "Default": 7.2E+7, + "NewRow": true + }, + "ABP1_TIMS_Clock": { + "Prompt": "ABP1 Tim's Clock (Hz)", + "Def": "ABP1_TIMS_Value", + "Type": "edit", + "Default": 7.2E+7, + "NewRow": true + }, + "ABP2_Clock": { + "Prompt": "ABP2 Clock (Hz)", + "Def": "ABP2_Value", + "Type": "edit", + "Default": 7.2E+7, + "NewRow": true + }, + "ABP2_TIMS_Clock": { + "Prompt": "ABP2 Tim's Clock (Hz)", + "Def": "ABP2_TIMS_Value", + "Type": "edit", + "Default": 7.2E+7, + "NewRow": true + } + } + }, + "TIM": { + "Defines": { + "TIM1_Enable": { + "Prompt": "TIM1 Enable", + "Def": "USE_TIM1", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM1_UP_TIM10_Handler": { + "Prompt": "TIM1_UP_TIM10 Handler", + "Def": "USE_TIM1_UP_TIM10_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM2_Enable": { + "Prompt": "TIM2 Enable", + "Def": "USE_TIM2", + "Type": "checkbox", + "Default": true, + "NewRow": true + }, + "TIM2_Handler": { + "Prompt": "TIM2 Handler", + "Def": "USE_TIM2_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM3_Enable": { + "Prompt": "TIM3 Enable", + "Def": "USE_TIM3", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM3_Handler": { + "Prompt": "TIM3 Handler", + "Def": "USE_TIM3_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM4_Enable": { + "Prompt": "TIM4 Enable", + "Def": "USE_TIM4", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM4_Handler": { + "Prompt": "TIM4 Handler", + "Def": "USE_TIM4_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM5_Enable": { + "Prompt": "TIM5 Enable", + "Def": "USE_TIM5", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM5_Handler": { + "Prompt": "TIM5 Handler", + "Def": "USE_TIM5_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM6_Enable": { + "Prompt": "TIM6 Enable", + "Def": "USE_TIM6", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM6_Handler": { + "Prompt": "TIM6 Handler", + "Def": "USE_TIM6_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM7_Enable": { + "Prompt": "TIM7 Enable", + "Def": "USE_TIM7", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM7_Handler": { + "Prompt": "TIM7 Handler", + "Def": "USE_TIM7_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM8_Enable": { + "Prompt": "TIM8 Enable", + "Def": "USE_TIM8", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM8_UP_TIM13_Handler": { + "Prompt": "TIM8_UP_TIM13 Handler", + "Def": "USE_TIM8_UP_TIM13_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM9_Enable": { + "Prompt": "TIM9 Enable", + "Def": "USE_TIM9", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM1_BRK_TIM9_Handler": { + "Prompt": "TIM1_BRK_TIM9 Handler", + "Def": "USE_TIM1_BRK_TIM9_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM10_Enable": { + "Prompt": "TIM10 Enable", + "Def": "USE_TIM10", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM11_Enable": { + "Prompt": "TIM11 Enable", + "Def": "USE_TIM11", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM1_TRG_COM_TIM11_Handler": { + "Prompt": "TIM1_TRG_COM_TIM11 Handler", + "Def": "USE_TIM1_TRG_COM_TIM11_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM12_Enable": { + "Prompt": "TIM12 Enable", + "Def": "USE_TIM12", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM8_BRK_TIM12_Handler": { + "Prompt": "TIM8_BRK_TIM12 Handler", + "Def": "USE_TIM8_BRK_TIM12_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM13_Enable": { + "Prompt": "TIM13 Enable", + "Def": "USE_TIM13", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM14_Enable": { + "Prompt": "TIM14 Enable", + "Def": "USE_TIM14", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM8_TRG_COM_TIM14_Handler": { + "Prompt": "TIM8_TRG_COM_TIM14 Handler", + "Def": "USE_TIM8_TRG_COM_TIM14_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + } + } + }, + "ADC": { + "Defines": { + "ADC1_Enable": { + "Prompt": "ADC1 Enable", + "Def": "ADC1_ENABLE", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "ADC2_Enable": { + "Prompt": "ADC2 Enable", + "Def": "ADC2_ENABLE", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "Sample_Rate": { + "Prompt": "Sample Rate (Hz)", + "Def": "SAMPLE_RATE", + "Type": "edit", + "Default": 48000, + "NewRow": true + } + } + } +} \ No newline at end of file diff --git a/MCU_STM32F1xx_Matlab/stm32f1xx_matlab_conf.h b/MCU_STM32F1xx_Matlab/stm32f1xx_matlab_conf.h index 2690909..6ad9d73 100644 --- a/MCU_STM32F1xx_Matlab/stm32f1xx_matlab_conf.h +++ b/MCU_STM32F1xx_Matlab/stm32f1xx_matlab_conf.h @@ -12,7 +12,7 @@ // DEFINES (UNCOMMENT WHAT YOU WILL SIMULATE) // TIMS //#define USE_TIM1 -#define USE_TIM2 +//#define USE_TIM2 //#define USE_TIM3 //#define USE_TIM4 //#define USE_TIM5 diff --git a/MCU_Wrapper/mexing.m b/MCU_Wrapper/mexing.m new file mode 100644 index 0000000..a3c2709 --- /dev/null +++ b/MCU_Wrapper/mexing.m @@ -0,0 +1,718 @@ +% Компилирует S-function +function mexing(compile_mode) + global Ts + Ts = 0.00001; + + if compile_mode == 1 + delete("*.mexw64") + delete("*.mexw64.pdb") + delete(".\MCU_Wrapper\Outputs\*.*"); + set_param(gcb, 'consoleOutput', ''); + % Дефайны + definesWrapperArg = buildWrapperDefinesString(); + definesUserArg = parseDefinesMaskText(); + definesConfigArg = buildConfigDefinesString(); + definesAllArg = [definesUserArg + " " + definesWrapperArg + " " + definesConfigArg]; + + %режимы компиляции + if read_checkbox('enableDebug') + modeArg = "debug"; + else + modeArg = "release"; + end + if read_checkbox('fullOutput') || read_checkbox('extConsol') + echoArg = 'echo_enable'; + else + echoArg = 'echo_disable'; + end + + [includesArg, codeArg] = make_mex_arguments('incTable', 'srcTable'); + + % Вызов батника с двумя параметрами: includes и code + cmd = sprintf('.\\MCU_Wrapper\\run_mex.bat "%s" "%s" "%s" %s %s', includesArg, codeArg, definesAllArg, modeArg, echoArg); + + if read_checkbox('extConsol') + cmdout = runBatAndShowOutput(cmd); + else + [status, cmdout]= system(cmd); + end + + % Сохраним вывод в параметр маски с именем 'consoleOutput' + set_param(gcb, 'consoleOutput', cmdout); + + beep + else + blockPath = bdroot; + config = read_periph_config(); + config = update_config_from_mask(blockPath, config); + write_periph_config(config); + update_mask_from_config(blockPath, config); + % set_param(gcb, 'consoleOutput', 'Peripheral configuration file loaded. Re-open Block Parameters'); + end +end + +%% COMPILE PARAMS + + +function [includesArg, codeArg] = make_mex_arguments(incTableName, srcTableame) +%MAKE_MEX_ARGUMENTS Формирует строки аргументов для вызова mex-компиляции через батник +% +% [includesArg, codeArg] = make_mex_arguments(includesCell, codeCell) +% +% Вход: +% includesCell — ячейковый массив путей к директориям include +% codeCell — ячейковый массив исходных файлов +% +% Выход: +% includesArg — строка для передачи в батник, например: "-I"inc1" -I"inc2"" +% codeArg — строка с исходниками, например: ""src1.c" "src2.cpp"" + + + % Здесь пример получения из маски текущего блока (замени по своему) + blockHandle = gcbh; % или замени на нужный блок + + includesCell = parseCellString(get_param(blockHandle, incTableName)); + codeCell = parseCellString(get_param(blockHandle, srcTableame)); + + % Оборачиваем пути в кавычки и добавляем -I + includesStr = strjoin(cellfun(@(f) ['-I"' f '"'], includesCell, 'UniformOutput', false), ' '); + + % Оборачиваем имена файлов в кавычки + codeStr = strjoin(cellfun(@(f) ['"' f '"'], codeCell, 'UniformOutput', false), ' '); + + % Удаляем символ переноса строки и пробел в конце, если вдруг попал + codeStr = strtrim(codeStr); + includesStr = strtrim(includesStr); + + % Оборачиваем всю строку в кавычки, чтобы батник корректно понял + % includesArg = ['"' includesStr '"']; + % codeArg = ['"' codeStr '"']; + includesArg = includesStr; + codeArg = codeStr; + +end + + +function definesWrapperArg = buildWrapperDefinesString() + + definesWrapperArg = ''; + definesWrapperArg = addDefineByParam(definesWrapperArg, 'enableThreading', 0); + definesWrapperArg = addDefineByParam(definesWrapperArg, 'enableDeinit', 0); + definesWrapperArg = addDefineByParam(definesWrapperArg, 'threadCycles', 1); + definesWrapperArg = addDefineByParam(definesWrapperArg, 'mcuClk', 1); +end + + +function definesUserArg = parseDefinesMaskText() + blockHandle = gcbh; + % Получаем MaskValues и MaskNames + maskValues = get_param(blockHandle, 'MaskValues'); + paramNames = get_param(blockHandle, 'MaskNames'); + + % Индекс параметра userDefs + idxUserDefs = find(strcmp(paramNames, 'userDefs')); + definesText = maskValues{idxUserDefs}; % Текст с пользовательскими определениями + + % Убираем буквальные символы \n и \r + definesText = strrep(definesText, '\n', ' '); + definesText = strrep(definesText, '\r', ' '); + + % Разбиваем по переносам строк + lines = split(definesText, {'\n', '\r\n', '\r'}); + + parts = strings(1,0); % пустой массив строк + + for k = 1:numel(lines) + line = strtrim(lines{k}); + if isempty(line) + continue; + end + + % Разбиваем по пробелам, чтобы получить отдельные определения в строке + tokens = split(line); + + for t = 1:numel(tokens) + token = strtrim(tokens{t}); + if isempty(token) + continue; + end + + eqIdx = strfind(token, '='); + if isempty(eqIdx) + % Просто ключ без значения + parts(end+1) = sprintf('-D"%s"', token); + else + key = strtrim(token(1:eqIdx(1)-1)); + val = strtrim(token(eqIdx(1)+1:end)); + parts(end+1) = sprintf('-D"%s__EQ__%s"', key, val); + end + end + end + + definesUserArg = strjoin(parts, ' '); +end + + + +function definesWrapperArg = buildConfigDefinesString() + blockHandle = gcbh; + mask = Simulink.Mask.get(blockHandle); + + tabName = 'configTab'; % Имя вкладки (Prompt) + + allControls = mask.getDialogControls(); + tabCtrl = find_tab_by_name(allControls, tabName); + + if isempty(tabCtrl) + error('Вкладка с названием "%s" не найдена в маске', tabName); + end + definesWrapperArg = ''; + % Получаем все контролы внутри вкладки + children = tabCtrl.DialogControls; + for i = 1:numel(children) + ctrl = children(i); + % Получаем имя параметра из контрола + paramName = ctrl.Name; + try + % Получаем объект параметра по имени + param = mask.getParameter(paramName); + + % Определяем тип параметра + switch lower(param.Type) + case 'checkbox' + definesWrapperArg = addDefineByParam(definesWrapperArg, paramName, 0); + case 'edit' + definesWrapperArg = addDefineByParam(definesWrapperArg, paramName, 1); + otherwise + % Необрабатываемые типы + end + catch ME + warning('Не удалось получить параметр "%s": %s', paramName, ME.message); + end + end +end + + +%% PARSE FUNCTIONS + +function out = parseCellString(str) + str = strtrim(str); + if startsWith(str, '{') && endsWith(str, '}') + str = str(2:end-1); + end + + parts = split(str, ';'); + out = cell(numel(parts), 1); + for i = 1:numel(parts) + el = strtrim(parts{i}); + if startsWith(el, '''') && endsWith(el, '''') + el = el(2:end-1); + end + out{i} = el; + end + + if isempty(out) || (numel(out) == 1 && isempty(out{1})) + out = {}; + end +end + +function str = cellArrayToString(cellArray) + quoted = cellfun(@(s) ['''' s ''''], cellArray, 'UniformOutput', false); + str = ['{' strjoin(quoted, ';') '}']; +end + + +function definesWrapperArg = addDefineByParam(definesWrapperArg, paramName, val_define) + blockHandle = gcbh; + mask = Simulink.Mask.get(blockHandle); + + % Получаем MaskValues, MaskNames + maskValues = get_param(blockHandle, 'MaskValues'); + paramNames = get_param(blockHandle, 'MaskNames'); + param = mask.getParameter(paramName); % для alias + + % Найдём индекс нужного параметра + idxParam = find(strcmp(paramNames, paramName), 1); + if isempty(idxParam) + error('Parameter "%s" not found in block mask parameters.', paramName); + end + + % Берём alias из маски + alias = param.Alias; + + if val_define ~= 0 + % Значение параметра + val = maskValues{idxParam}; + % Формируем define с кавычками и значением + newDefine = ['-D"' alias '__EQ__' val '"']; + else + if read_checkbox(paramName) + % Формируем define с кавычками без значения + newDefine = ['-D"' alias '"']; + else + newDefine = ''; + end + end + + + + % Добавляем новый define к существующему (string) + if isempty(definesWrapperArg) || strlength(strtrim(definesWrapperArg)) == 0 + definesWrapperArg = newDefine; + else + definesWrapperArg = definesWrapperArg + " " + newDefine; + end +end + + + +function checkbox_state = read_checkbox(checkboxName) + maskValues = get_param(gcbh, 'MaskValues'); + paramNames = get_param(gcbh, 'MaskNames'); + + inxCheckBox = find(strcmp(paramNames, checkboxName)); + + checkbox_state_str = maskValues{inxCheckBox}; + if strcmpi(checkbox_state_str, 'on') + checkbox_state = 1; + else + checkbox_state = 0; + end +end + +%% CONSOLE FUNCTIONS + +function cmdret = runBatAndShowOutput(cmd) + import java.io.*; + import java.lang.*; + cmdEnglish = ['chcp 437 > nul && ' cmd]; + pb = java.lang.ProcessBuilder({'cmd.exe', '/c', cmdEnglish}); + pb.redirectErrorStream(true); + process = pb.start(); + + reader = BufferedReader(InputStreamReader(process.getInputStream())); + + cmdret = ""; % Здесь будем накапливать весь вывод + + while true + if reader.ready() + line = char(reader.readLine()); + if isempty(line) + break; + end + cmdret = cmdret + string(line) + newline; % сохраняем вывод + % Здесь выводим только новую строку + safeLine = strrep(line, '''', ''''''); % Экранируем апострофы + logWindow_append(safeLine); + drawnow; % обновляем GUI + else + if ~process.isAlive() + % дочитываем оставшиеся строки + while reader.ready() + line = char(reader.readLine()); + if isempty(line) + break; + end + cmdret = cmdret + string(line) + newline; % сохраняем вывод + safeLine = strrep(line, '''', ''''''); + logWindow_append(safeLine); + drawnow; + end + break; + end + pause(0.2); + end + end + process.waitFor(); +end + + +function logWindow_append(line) + persistent fig hEdit jScrollPane jTextArea + + if isempty(fig) || ~isvalid(fig) + fig = figure('Name', 'Log Window', 'Position', [100 100 600 400]); + hEdit = uicontrol('Style', 'edit', ... + 'Max', 2, 'Min', 0, ... + 'Enable', 'on', ... + 'FontName', 'Courier New', ... + 'Position', [10 10 580 380], ... + 'HorizontalAlignment', 'left', ... + 'BackgroundColor', 'white', ... + 'Tag', 'LogWindowFigure'); + + jScrollPane = findjobj(hEdit); % JScrollPane + jTextArea = jScrollPane.getViewport.getView; % JTextArea внутри JScrollPane + end + + oldText = get(hEdit, 'String'); + if ischar(oldText) + oldText = {oldText}; + end + + set(hEdit, 'String', [oldText; {line}]); + drawnow; + % Автоскролл вниз: + jTextArea.setCaretPosition(jTextArea.getDocument.getLength); + drawnow; +end + + +%% READ CONFIGS +function config = read_periph_config() + jsonText = fileread('periph_config.json'); + config = jsondecode(jsonText); +end + +function write_periph_config(config) + jsonText = jsonencode(config, 'PrettyPrint', true); + fid = fopen('periph_config.json', 'w'); + if fid == -1 + error('Не удалось открыть файл periph_config.json для записи.'); + end + fwrite(fid, jsonText, 'char'); + fclose(fid); +end + +%% CONFIG MASK TOOLS +function update_mask_from_config(blockPath, config) + blockPath = [blockPath '/MCU']; + + % Проверяем, была ли маска открыта + wasOpen = isMaskDialogOpen(blockPath); + close_system(blockPath, 0); + mask = Simulink.Mask.get(blockPath); + + tableNames = {'incTable', 'srcTable'}; + columns_backup = clear_tables(blockPath, tableNames); + + containerName = 'configTabAll'; + clear_all_from_container(mask, containerName); + + % Ищем контейнер, в который будем добавлять вкладки + allControls = mask.getDialogControls(); + container = find_container_by_name(allControls, containerName); + if isempty(container) + error('Контейнер "%s" не найден в маске.', containerName); + end + + % Проходим по каждому модулю (ADC, TIM...) + periphs = fieldnames(config); + for i = 1:numel(periphs) + periph = periphs{i}; + defines = config.(periph).Defines; + defNames = fieldnames(defines); + + % Создаём вкладку для модуля + tabCtrl = container.addDialogControl('tab', periph); + tabCtrl.Prompt = [periph ' Config']; + + for j = 1:numel(defNames) + defPrompt = defNames{j}; + def = defines.(defPrompt); + prompt = def.Prompt; + + % Только checkbox и edit + switch lower(def.Type) + case 'checkbox' + paramType = 'checkbox'; + case 'edit' + paramType = 'edit'; + otherwise + continue; + end + + paramName = matlab.lang.makeValidName(defPrompt); + + % Преобразуем значение по типу + val = def.Default; + if islogical(val) + if val + valStr = 'on'; + else + valStr = 'off'; + end + elseif isnumeric(val) + valStr = num2str(val); + elseif ischar(val) + valStr = val; + else + error('Unsupported default value type for %s.%s', periph, defPrompt); + end + + % Добавляем параметр в соответствующую вкладку + param = mask.addParameter( ... + 'Type', paramType, ... + 'Prompt', prompt, ... + 'Name', paramName, ... + 'Value', valStr, ... + 'Container', periph ... + ); + + param.Alias = def.Def; + if def.NewRow + row_param = 'new'; + else + row_param = 'current'; + end + param.DialogControl.Row = row_param; + end + end + + % Восстанавливаем таблицы + restore_tables(blockPath, tableNames, columns_backup); + + % Повторно открываем маску, если она была открыта + if wasOpen + open_system(blockPath, 'mask'); + end +end + +function config = update_config_from_mask(blockPath, config) + blockPath = [blockPath '/MCU']; + mask = Simulink.Mask.get(blockPath); + + periphs = fieldnames(config); + + for i = 1:numel(periphs) + periph = periphs{i}; + defines = config.(periph).Defines; + defNames = fieldnames(defines); + + for j = 1:numel(defNames) + defPrompt = defNames{j}; + paramName = matlab.lang.makeValidName(defPrompt); + param = mask.getParameter(paramName); + + % Получаем значение из маски и сохраняем в конфиг + valStr = param.Value; + + % Преобразуем строку в соответствующий тип + if strcmpi(defines.(defPrompt).Type, 'checkbox') + config.(periph).Defines.(defPrompt).Default = strcmpi(valStr, 'on'); + elseif strcmpi(defines.(defPrompt).Type, 'edit') + valNum = str2double(valStr); + if isnan(valNum) + config.(periph).Defines.(defPrompt).Default = valStr; + else + config.(periph).Defines.(defPrompt).Default = valNum; + end + end + end + end +end + + +function clear_all_from_container(mask, containerName) + allControls = mask.getDialogControls(); + container = find_container_by_name(allControls, containerName); + if isempty(container) + warning('Контейнер "%s" не найден.', containerName); + return; + end + + % Рекурсивно собрать все параметры (не вкладки) + paramsToDelete = collect_all_parameters(container); + + % Удаляем все параметры + for i = 1:numel(paramsToDelete) + try + mask.removeParameter(paramsToDelete{i}); + catch + warning('Не удалось удалить параметр %s', paramsToDelete{i}); + end + end + + % Рекурсивно удалить все вкладки внутри контейнера + delete_all_tabs(mask, container); +end + +function params = collect_all_parameters(container) + params = {}; + children = container.DialogControls; + for i = 1:numel(children) + ctrl = children(i); + if isa(ctrl, 'Simulink.dialog.Tab') + % Если вкладка — рекурсивно собираем параметры внутри неё + params = [params, collect_all_parameters(ctrl)]; + else + % Иначе это параметр — добавляем имя + params{end+1} = ctrl.Name; %#ok + end + end +end + + + +function delete_all_tabs(mask, container) + children = container.DialogControls; + % Идём в обратном порядке, чтобы безопасно удалять + for i = numel(children):-1:1 + ctrl = children(i); + if isa(ctrl, 'Simulink.dialog.Tab') + % Сначала рекурсивно удаляем вкладки внутри текущей вкладки + delete_all_tabs(mask, ctrl); + try + container.removeDialogControl(ctrl.Name); + catch ME + warning('Не удалось удалить вкладку %s: %s', ctrl.Name, ME.message); + end + end + end +end + + +function isOpen = isMaskDialogOpen(blockPath) + isOpen = false; + + try + % Получаем имя блока + blockName = get_param(blockPath, 'Name'); + + % Получаем список окон MATLAB GUI + jWindows = java.awt.Window.getWindows(); + + for i = 1:numel(jWindows) + win = jWindows(i); + + % Проверка, что окно видимое и активно + if win.isShowing() + try + title = char(win.getTitle()); + % Проверка по ключевому слову, соответствующему заголовку маски + if contains(title, ['Mask Editor: ' blockName]) || ... + contains(title, ['Mask: ' blockName]) || ... + contains(title, blockName) + isOpen = true; + return; + end + catch + % Окно не имеет заголовка — пропускаем + end + end + end + catch + isOpen = false; + end +end + + + +function column_titles = clear_tables(block, table_names) + % Очищает столбцы в каждой таблице из массива имен table_names + % Возвращает cell-массив с названиями первых столбцов каждой таблицы + + % Получить объект маски блока + maskObj = Simulink.Mask.get(block); + + % Инициализировать cell-массив для хранения названий столбцов + column_titles = cell(size(table_names)); + + for k = 1:numel(table_names) + table_name = table_names{k}; + + % Получить объект управления таблицей + tableControl = maskObj.getDialogControl(table_name); + + % Получить количество столбцов + nCols = tableControl.getNumberOfColumns; + + if nCols > 0 + % Получить первый столбец (который будем удалять) + column = tableControl.getColumn(1); + column_titles{k} = column.Name; + + % Удаляем все столбцы + % Важно: при удалении столбцов индексы меняются, + % поэтому удаляем всегда первый столбец nCols раз + for i = 1:nCols + tableControl.removeColumn(1); + end + else + % Если столбцов нет, возвращаем пустую строку + column_titles{k} = ''; + end + end +end + +function restore_tables(block, table_names, column_titles) + % Восстанавливает первый столбец в каждой таблице из массива имен + % Использует массив column_titles для установки имени столбца + + % Получить объект маски блока + maskObj = Simulink.Mask.get(block); + + for k = 1:numel(table_names) + table_name = table_names{k}; + title = column_titles{k}; + + % Получить объект управления таблицей + tableControl = maskObj.getDialogControl(table_name); + + % Добавить новый столбец + column = tableControl.addColumn(Name='title', Type='edit'); + column.Name = title; + end +end + + + + +function tab = find_tab_by_name(controls, targetName) + tab = []; + + for i = 1:numel(controls) + ctrl = controls(i); + + % Проверяем, вкладка ли это и совпадает ли имя + if isa(ctrl, 'Simulink.dialog.Tab') && strcmp(ctrl.Name, targetName) + tab = ctrl; + return; + end + + % Если это контейнер — обходим его детей + children = get_children(ctrl); + if ~isempty(children) + tab = find_tab_by_name(children, targetName); + if ~isempty(tab) + return; + end + end + end +end + +function container = find_container_by_name(controls, targetName) + container = []; + + for i = 1:numel(controls) + ctrl = controls(i); + + % Проверяем, контейнер ли это и совпадает ли имя + if isa(ctrl, 'Simulink.dialog.Container') && strcmp(ctrl.Name, targetName) + container = ctrl; + return; + end + + % Если это вложенный контрол — обходим его детей + children = get_children(ctrl); + if ~isempty(children) + container = find_container_by_name(children, targetName); + if ~isempty(container) + return; + end + end + end +end + + +function children = get_children(ctrl) + if isprop(ctrl, 'DialogControls') + children = ctrl.DialogControls; + elseif isprop(ctrl, 'Controls') + children = ctrl.Controls; + elseif isprop(ctrl, 'Children') + children = ctrl.Children; + else + children = []; + end +end diff --git a/mcu_test_r2023.slx b/mcu_test_r2023.slx index 07ba88c2a90d8907dfa7380850346998fe2b5b4c..68dd38efc3da09d7ce554394c5d40ec705075fd0 100644 GIT binary patch delta 49441 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 E08s|_>)GJl*^P+dXWr4R1z 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 q3I0!?!55GuzfZ#du7cqIZ + end + end +end + + + +function delete_all_tabs(mask, container) + children = container.DialogControls; + % Идём в обратном порядке, чтобы безопасно удалять for i = numel(children):-1:1 ctrl = children(i); - try - % Пытаемся удалить как контрол (вкладка, контейнер и пр.) - mask.removeDialogControl(ctrl.Name); - catch + if isa(ctrl, 'Simulink.dialog.Tab') + % Сначала рекурсивно удаляем вкладки внутри текущей вкладки + delete_all_tabs(mask, ctrl); try - % Если не получилось — пробуем как параметр - res = mask.removeParameter(ctrl.Name); - catch - warning('Не удалось удалить "%s".', ctrl.Name); + container.removeDialogControl(ctrl.Name); + catch ME + warning('Не удалось удалить вкладку %s: %s', ctrl.Name, ME.message); end end end diff --git a/mexing.m b/mexing.m index 3be5e77..0188a9d 100644 --- a/mexing.m +++ b/mexing.m @@ -43,7 +43,9 @@ function mexing(compile_mode) beep else blockPath = bdroot; - config = load_periph_config(); + config = read_periph_config(); + config = update_config_from_mask(blockPath, config); + write_periph_config(config); update_mask_from_config(blockPath, config); % set_param(gcb, 'consoleOutput', 'Peripheral configuration file loaded. Re-open Block Parameters'); end @@ -156,37 +158,37 @@ function definesWrapperArg = buildConfigDefinesString() blockHandle = gcbh; mask = Simulink.Mask.get(blockHandle); - tabName = 'configTab'; % Имя вкладки (Prompt) + tabName = 'configTabAll'; % Имя вкладки (Prompt) allControls = mask.getDialogControls(); - tabCtrl = find_tab_by_name(allControls, tabName); + tabCtrl = find_container_by_name(allControls, tabName); if isempty(tabCtrl) error('Вкладка с названием "%s" не найдена в маске', tabName); end + + + params = collect_all_parameters(tabCtrl); definesWrapperArg = ''; - % Получаем все контролы внутри вкладки - children = tabCtrl.DialogControls; - for i = 1:numel(children) - ctrl = children(i); + for i = 1:numel(params) % Получаем имя параметра из контрола - paramName = ctrl.Name; - try - % Получаем объект параметра по имени - param = mask.getParameter(paramName); - - % Определяем тип параметра - switch lower(param.Type) - case 'checkbox' - definesWrapperArg = addDefineByParam(definesWrapperArg, paramName, 0); - case 'edit' - definesWrapperArg = addDefineByParam(definesWrapperArg, paramName, 1); - otherwise - % Необрабатываемые типы - end - catch ME - warning('Не удалось получить параметр "%s": %s', paramName, ME.message); + paramName = string(params(i)); + try + % Получаем объект параметра по имени + param = mask.getParameter(paramName); + + % Определяем тип параметра + switch lower(param.Type) + case 'checkbox' + definesWrapperArg = addDefineByParam(definesWrapperArg, paramName, 0); + case 'edit' + definesWrapperArg = addDefineByParam(definesWrapperArg, paramName, 1); + otherwise + % Необрабатываемые типы end + catch ME + % warning('Не удалось получить параметр "%s": %s', paramName, ME.message); + end end end @@ -357,11 +359,33 @@ end %% READ CONFIGS -function config = load_periph_config() - jsonText = fileread('periph_config.json'); +function config = read_periph_config() + blockHandle = gcbh; + mask = Simulink.Mask.get(blockHandle); + + pathparam = mask.getParameter('periphPath'); + config_path = pathparam.Value; + + jsonText = fileread(config_path); config = jsondecode(jsonText); end +function write_periph_config(config) + blockHandle = gcbh; + mask = Simulink.Mask.get(blockHandle); + + pathparam = mask.getParameter('periphPath'); + config_path = pathparam.Value; + + jsonText = jsonencode(config, 'PrettyPrint', true); + fid = fopen(config_path, 'w'); + if fid == -1 + error('Не удалось открыть файл periph_config.json для записи.'); + end + fwrite(fid, jsonText, 'char'); + fclose(fid); +end + %% CONFIG MASK TOOLS function update_mask_from_config(blockPath, config) blockPath = [blockPath '/MCU']; @@ -392,16 +416,13 @@ function update_mask_from_config(blockPath, config) defNames = fieldnames(defines); % Создаём вкладку для модуля - tabCtrl = mask.addDialogControl( ... - 'Type', 'Tab', ... - 'Prompt', periph, ... - 'Name', [periph '_Tab'], ... - 'Container', containerName ... - ); + tabCtrl = container.addDialogControl('tab', periph); + tabCtrl.Prompt = [periph ' Config']; for j = 1:numel(defNames) defPrompt = defNames{j}; def = defines.(defPrompt); + prompt = def.Prompt; % Только checkbox и edit switch lower(def.Type) @@ -418,7 +439,11 @@ function update_mask_from_config(blockPath, config) % Преобразуем значение по типу val = def.Default; if islogical(val) - valStr = logical(val) * "on" + ~val * "off"; + if val + valStr = 'on'; + else + valStr = 'off'; + end elseif isnumeric(val) valStr = num2str(val); elseif ischar(val) @@ -428,16 +453,21 @@ function update_mask_from_config(blockPath, config) end % Добавляем параметр в соответствующую вкладку - mask.addParameter( ... + param = mask.addParameter( ... 'Type', paramType, ... - 'Prompt', defPrompt, ... + 'Prompt', prompt, ... 'Name', paramName, ... 'Value', valStr, ... 'Container', periph ... ); - param = mask.getParameter(paramName); param.Alias = def.Def; + if def.NewRow + row_param = 'new'; + else + row_param = 'current'; + end + param.DialogControl.Row = row_param; end end @@ -450,6 +480,49 @@ function update_mask_from_config(blockPath, config) end end +function config = update_config_from_mask(blockPath, config) + blockPath = [blockPath '/MCU']; + mask = Simulink.Mask.get(blockPath); + maskParams = mask.Parameters; + paramNames = arrayfun(@(p) p.Name, maskParams, 'UniformOutput', false); + + periphs = fieldnames(config); + + for i = 1:numel(periphs) + periph = periphs{i}; + defines = config.(periph).Defines; + defNames = fieldnames(defines); + + for j = 1:numel(defNames) + defPrompt = defNames{j}; + paramName = matlab.lang.makeValidName(defPrompt); + + % Проверка, существует ли параметр с таким именем + if ismember(paramName, paramNames) + param = mask.getParameter(paramName); + % Получаем значение из маски и сохраняем в конфиг + valStr = param.Value; + + % Проверяем, существует ли элемент defPrompt в структуре defines + if isfield(defines, defPrompt) + % Преобразуем строку в соответствующий тип + if strcmpi(defines.(defPrompt).Type, 'checkbox') + config.(periph).Defines.(defPrompt).Default = strcmpi(valStr, 'on'); + elseif strcmpi(defines.(defPrompt).Type, 'edit') + valNum = str2double(valStr); + if isnan(valNum) + config.(periph).Defines.(defPrompt).Default = valStr; + else + config.(periph).Defines.(defPrompt).Default = valNum; + end + end + end + end + end + end +end + + function clear_all_from_container(mask, containerName) allControls = mask.getDialogControls(); container = find_container_by_name(allControls, containerName); @@ -489,18 +562,20 @@ function params = collect_all_parameters(container) end end + + function delete_all_tabs(mask, container) children = container.DialogControls; % Идём в обратном порядке, чтобы безопасно удалять for i = numel(children):-1:1 ctrl = children(i); if isa(ctrl, 'Simulink.dialog.Tab') - % Рекурсивно удаляем вкладки внутри текущей вкладки + % Сначала рекурсивно удаляем вкладки внутри текущей вкладки delete_all_tabs(mask, ctrl); try - mask.removeParameter(ctrl.Name); - catch - warning('Не удалось удалить вкладку %s', ctrl.Name); + container.removeDialogControl(ctrl.Name); + catch ME + warning('Не удалось удалить вкладку %s: %s', ctrl.Name, ME.message); end end end diff --git a/periph_config.json b/periph_config.json index 379ebce..768cae8 100644 --- a/periph_config.json +++ b/periph_config.json @@ -1,40 +1,252 @@ { - "ADC": { + "RCC": { "Defines": { - "ADC1 Enable": { - "Def": "ADC1_ENABLE", - "Type": "checkbox", - "Default": true - }, - "ADC2 Enable": { - "Def": "ADC2_ENABLE", - "Type": "checkbox", - "Default": true - }, - "Sample Rate (Hz)": { - "Def": "SAMPLE_RATE", + "HCLK_Clock": { + "Prompt": "HCLK Clock (Hz)", + "Def": "HCLK_Value", "Type": "edit", - "Default": 48000 + "Default": 7.2E+7, + "NewRow": true + }, + "ABP1_Clock": { + "Prompt": "ABP1 Clock (Hz)", + "Def": "ABP1_Value", + "Type": "edit", + "Default": 7.2E+7, + "NewRow": true + }, + "ABP1_TIMS_Clock": { + "Prompt": "ABP1 Tim's Clock (Hz)", + "Def": "ABP1_TIMS_Value", + "Type": "edit", + "Default": 7.2E+7, + "NewRow": true + }, + "ABP2_Clock": { + "Prompt": "ABP2 Clock (Hz)", + "Def": "ABP2_Value", + "Type": "edit", + "Default": 7.2E+7, + "NewRow": true + }, + "ABP2_TIMS_Clock": { + "Prompt": "ABP2 Tim's Clock (Hz)", + "Def": "ABP2_TIMS_Value", + "Type": "edit", + "Default": 7.2E+7, + "NewRow": true } } }, "TIM": { "Defines": { - "TIM1 Enable": { - "Def": "TIM1_ENABLE", + "TIM1_Enable": { + "Prompt": "TIM1 Enable", + "Def": "USE_TIM1", "Type": "checkbox", - "Default": true + "Default": false, + "NewRow": true }, - "TIM2 Enable": { - "Def": "TIM2_ENABLE", + "TIM1_UP_TIM10_Handler": { + "Prompt": "TIM1_UP_TIM10 Handler", + "Def": "USE_TIM1_UP_TIM10_HANDLER", "Type": "checkbox", - "Default": true + "Default": false, + "NewRow": false }, - "AHB Buf Clock Rate (MHz)": { - "Def": "AHB_BUS_FREQ", - "Type": "edit", - "Default": 72 + "TIM2_Enable": { + "Prompt": "TIM2 Enable", + "Def": "USE_TIM2", + "Type": "checkbox", + "Default": true, + "NewRow": true + }, + "TIM2_Handler": { + "Prompt": "TIM2 Handler", + "Def": "USE_TIM2_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM3_Enable": { + "Prompt": "TIM3 Enable", + "Def": "USE_TIM3", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM3_Handler": { + "Prompt": "TIM3 Handler", + "Def": "USE_TIM3_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM4_Enable": { + "Prompt": "TIM4 Enable", + "Def": "USE_TIM4", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM4_Handler": { + "Prompt": "TIM4 Handler", + "Def": "USE_TIM4_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM5_Enable": { + "Prompt": "TIM5 Enable", + "Def": "USE_TIM5", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM5_Handler": { + "Prompt": "TIM5 Handler", + "Def": "USE_TIM5_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM6_Enable": { + "Prompt": "TIM6 Enable", + "Def": "USE_TIM6", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM6_Handler": { + "Prompt": "TIM6 Handler", + "Def": "USE_TIM6_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM7_Enable": { + "Prompt": "TIM7 Enable", + "Def": "USE_TIM7", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM7_Handler": { + "Prompt": "TIM7 Handler", + "Def": "USE_TIM7_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM8_Enable": { + "Prompt": "TIM8 Enable", + "Def": "USE_TIM8", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM8_UP_TIM13_Handler": { + "Prompt": "TIM8_UP_TIM13 Handler", + "Def": "USE_TIM8_UP_TIM13_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM9_Enable": { + "Prompt": "TIM9 Enable", + "Def": "USE_TIM9", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM1_BRK_TIM9_Handler": { + "Prompt": "TIM1_BRK_TIM9 Handler", + "Def": "USE_TIM1_BRK_TIM9_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM10_Enable": { + "Prompt": "TIM10 Enable", + "Def": "USE_TIM10", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM11_Enable": { + "Prompt": "TIM11 Enable", + "Def": "USE_TIM11", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM1_TRG_COM_TIM11_Handler": { + "Prompt": "TIM1_TRG_COM_TIM11 Handler", + "Def": "USE_TIM1_TRG_COM_TIM11_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM12_Enable": { + "Prompt": "TIM12 Enable", + "Def": "USE_TIM12", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM8_BRK_TIM12_Handler": { + "Prompt": "TIM8_BRK_TIM12 Handler", + "Def": "USE_TIM8_BRK_TIM12_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false + }, + "TIM13_Enable": { + "Prompt": "TIM13 Enable", + "Def": "USE_TIM13", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM14_Enable": { + "Prompt": "TIM14 Enable", + "Def": "USE_TIM14", + "Type": "checkbox", + "Default": false, + "NewRow": true + }, + "TIM8_TRG_COM_TIM14_Handler": { + "Prompt": "TIM8_TRG_COM_TIM14 Handler", + "Def": "USE_TIM8_TRG_COM_TIM14_HANDLER", + "Type": "checkbox", + "Default": false, + "NewRow": false } } } -} + "ADC": { + "Defines": { + "ADC1_Enable": { + "Prompt": "ADC1 Enable", + "Def": "ADC1_ENABLE", + "Type": "checkbox", + "Default": true, + "NewRow": true + }, + "ADC2_Enable": { + "Prompt": "ADC2 Enable", + "Def": "ADC2_ENABLE", + "Type": "checkbox", + "Default": true, + "NewRow": true + }, + "Sample_Rate": { + "Prompt": "Sample Rate (Hz)", + "Def": "SAMPLE_RATE", + "Type": "edit", + "Default": 48000, + "NewRow": true + } + } + }, +} \ No newline at end of file