### Simultaneous Timer Start Example Source: https://support.milandr.ru/base/spravka/32-razryadnye-mikrokontrollery/dlya-programmirovaniya/24260?save_PDF=Y Example code for simultaneously starting timers 1 and 2 in the K1986VE9x microcontroller. ```c // Тактирование для управления регистрами MDR_RST_CLK->PER_CLOCK |= (3<<14); // Подача тактовой частоты для таймеров MDR_RST_CLK->TIM_CLOCK = (3<<24); // Настройки таймеров TMR1_HW_Init(); TMR2_HW_Init(); // Отключение тактовой частоты для таймеров MDR_RST_CLK->TIM_CLOCK = 0x0000; // Запуск тактовой частоты на таймеры MDR_TIMER1->CNTRL |= 0x0001; MDR_TIMER2->CNTRL |= 0x0001; // Подача частоты счета - синхронный запуск MDR_RST_CLK->TIM_CLOCK = (3<<24); ``` -------------------------------- ### Файл инициализации Setup.ini Source: https://support.milandr.ru/base/primenenie/programmirovanie-32-razryadnykh-mk/nachalo-raboty/47417 Файл инициализации, который будет выполнять дополнительные действия при запуске отладки. Функция Setup() указывает отладчику, как инициализировать необходимые регистры в зависимости от стартового адреса программы. ```c FUNC void Setup (unsigned int region) { region &= 0xFFFFF000; SP = _RDWORD(region); // Setup Stack Pointer PC = _RDWORD(region + 4); // Setup Program Counter _WDWORD(0xE000ED08, region); // Setup Vector Table Offset Register } Setup(&__Vectors); ``` -------------------------------- ### main.c Source: https://support.milandr.ru/base/primenenie/programmirovanie-32-razryadnykh-mk/nachalo-raboty/49498?save_PDF=Y Пример кода для проекта "Hello, World" на микроконтроллере К1901ВЦ1QI. Код включает настройку порта для управления светодиодом и простую функцию задержки. ```c // Содержимое файла main.c // Заголовочные файлы #include "MDR32FxQI_rst_clk.h" #include "MDR32FxQI_port.h" // Прототип функции задержки, реализованной ниже void Delay(int waitTicks); #define _test1901 // Выбираем секцию К1901ВЦ1QI для компиляции #ifdef _testBE9x // Определения для К1986ВЕ92QI - неактивна при выбранном ключе #define PORT_LedClock RST_CLK_PCLK_PORTC #define PORT_Led MDR_PORTC #define PORT_LedPin PORT_Pin_0 #define DELAY_Ticks 1000000 #endif #ifdef _test1901 // Определения для К1901ВЦ1QI - активна #define PORT_LedClock RST_CLK_PCLK_PORTB #define PORT_Led MDR_PORTB #define PORT_LedPin PORT_Pin_11 #define DELAY_Ticks 1000000 #endif // Точка входа, отсюда начинается исполнение программы int main() { // Заводим структуру конфигурации вывода(-ов) порта PORT_InitTypeDef GPIOInitStruct; // Включаем тактирование порта В (для К1901ВЦ1QI) RST_CLK_PCLKcmd (PORT_LedClock, ENABLE); // Инициализируем структуру конфигурации вывода(-ов) порта значениями по умолчанию PORT_StructInit(&GPIOInitStruct); // Изменяем значения по умолчанию на необходимые нам настройки GPIOInitStruct.PORT_Pin = PORT_LedPin; GPIOInitStruct.PORT_OE = PORT_OE_OUT; GPIOInitStruct.PORT_SPEED = PORT_SPEED_SLOW; GPIOInitStruct.PORT_MODE = PORT_MODE_DIGITAL; // Применяем заполненную нами структуру для PORTB PORT_Init(PORT_Led, &GPIOInitStruct); // Запускаем бесконечный цикл обработки - Основной цикл while (1){ // Считываем состояние вывода PB11 // Если на выводе логический "0", то выставляем вывод в логическую "1" if (PORT_ReadInputDataBit (PORT_Led, PORT_LedPin) == 0){ PORT_SetBits(PORT_Led, PORT_LedPin); // LED } // Задержка Delay(1000000); // Считываем состояние вывода PB11 // Если на выводе = "1", то выставляем "0" if (PORT_ReadInputDataBit (PORT_Led, PORT_LedPin) == 1){ PORT_ResetBits(PORT_Led, PORT_LedPin); } // Задержка Delay(1000000); } } // Простейшая функция задержки, позднее мы заменим ее на реализацию через таймер void Delay(int waitTicks){ int i; for (i = 0; i < waitTicks; i++){ __NOP(); } } ``` -------------------------------- ### Macro M8: RUN command example Source: https://support.milandr.ru/base/primenenie/programmirovanie-32-razryadnykh-mk/rabota_s_uart/47891?save_PDF=Y Example of configuring macro M8 for the RUN command, specifying the start address of the program in Flash memory. ```Assembly Код макроса М8: R$00$00$00$08 = R 00000008 Запускаем: > R 00 00 00 08 < 52 = 'R' - подтверждение команды Run ``` -------------------------------- ### Microcontroller Configuration Header Source: https://support.milandr.ru/base/primenenie/programmirovanie-32-razryadnykh-mk/nachalo-raboty/24204?save_PDF=Y Example of how to configure the target microcontroller by uncommenting the appropriate macro definition in the _MDR32FxQI_config.h_ file. ```c /* Uncomment the line corresponding to the target microcontroller */ // #define USE_MDR32F9Q2I // #define USE_MDR32F1QI_REV3_4 // #define USE_MDR32F1QI_REV6 // #define USE_MDR32FG16S1QI ``` -------------------------------- ### Реализация функции execUserSetup() для установки VTOR Source: https://support.milandr.ru/base/primenenie/programmirovanie-32-razryadnykh-mk/debug/48186 Пример реализации специальной функции IAR execUserSetup() для установки значения VTOR в процессе отладки. ```c execUserSetup() {       __writeMemory32(0x08000000, 0xE000ED08, "Memory"); } ``` -------------------------------- ### Start.ini Initialization File Source: https://support.milandr.ru/base/primenenie/programmirovanie-32-razryadnykh-mk/nachalo-raboty/61319 This is the content of the Start.ini file, which is used to initialize the stack pointer, program counter, and vector table offset register when debugging starts. A similar file is included in the project examples within the Software Pack. ```c FUNC void Setup (unsigned int region) { region &= 0xFFFFF000; SP = _RDWORD(region); // Setup Stack Pointer PC = _RDWORD(region + 4); // Setup Program Counter _WDWORD(0xE000ED08, region); // Setup Vector Table Offset Register } LOAD $L%L INCREMENTAL Setup(&__Vectors); g,main FUNC void OnResetExec (void) { Setup(&__Vectors); } ``` -------------------------------- ### Функция __user_setup_stackheap_ Source: https://support.milandr.ru/base/primenenie/programmirovanie-32-razryadnykh-mk/osobennosti-primeneniya-know-how/47861?save_PDF=Y Функция __user_setup_stackheap_, осуществляющая выделение для ядер отдельных областей стека и кучи. ```assembly __user_setup_stackheap_ LDR R0, =SMP_REG LDR R0,[R0] TST R0,#1 ; Если значение по адресу SMP_REG == 1, тогда перейти в функцию setup_core1 BNE setup_core1 setup_core0 LDR R0, =(Heap_Mem0 ) LDR R2, =(Heap_Mem0 + Heap_Size ) LDR sp, =(Stack_Mem ) BX LR setup_core1 LDR R0, =(Heap_Mem1 ) LDR R2, =(Heap_Mem1 + Heap_Size ) LDR sp, =(Stack_Mem1 ) BX LR ``` -------------------------------- ### Функция __user_setup_stackheap_ Source: https://support.milandr.ru/base/primenenie/programmirovanie-32-razryadnykh-mk/osobennosti-primeneniya-know-how/47861 Функция __user_setup_stackheap_, осуществляющая выделение для ядер отдельных областей стека и кучи. ```assembly __user_setup_stackheap_ LDR R0, =SMP_REG LDR R0,[R0] TST R0,#1 ; Если значение по адресу SMP_REG == 1, тогда перейти в функцию setup_core1 BNE setup_core1 setup_core0 LDR R0, =(Heap_Mem0 ) LDR R2, =(Heap_Mem0 + Heap_Size ) LDR sp, =(Stack_Mem ) BX LR setup_core1 LDR R0, =(Heap_Mem1 ) LDR R2, =(Heap_Mem1 + Heap_Size ) LDR sp, =(Stack_Mem1 ) BX LR ``` -------------------------------- ### Terminal Output Example Source: https://support.milandr.ru/base/primenenie/programmirovanie-32-razryadnykh-mk/rabota_s_uart/47905 Example of the protocol exchange in the terminal window when receiving a 'Run' command. ```text >R - т.е. получили приглашение и выполнили команду Run. в Hex окне видим пришедшие данные: 0D 0A 3E = '>' 52 = 'R' ``` -------------------------------- ### Инициализация порта Source: https://support.milandr.ru/base/primenenie/programmirovanie-32-razryadnykh-mk/nachalo-raboty/47553?save_PDF=Y Инициализация структуры конфигурации порта значениями по умолчанию и применение настроек. ```c // Инициализируем структуру конфигурации вывода(-ов) порта значениями по умолчанию PORT_StructInit(&GPIOInitStruct); // Изменяем значения по умолчанию на необходимые нам настройки GPIOInitStruct.PORT_Pin = PORT_Pin_7; GPIOInitStruct.PORT_OE = PORT_OE_OUT; GPIOInitStruct.PORT_SPEED = PORT_SPEED_SLOW; GPIOInitStruct.PORT_MODE = PORT_MODE_DIGITAL; // Применяем заполненную нами структуру для PORTD. PORT_Init(MDR_PORTD, &GPIOInitStruct); ```