diff --git a/Vsrc/SM_Sys.c b/Vsrc/SM_Sys.c
index aac8def..4e69f2d 100644
--- a/Vsrc/SM_Sys.c
+++ b/Vsrc/SM_Sys.c
@@ -118,16 +118,6 @@ void SM_Sys_Init(TSM_Sys *p) {
TMR2->LOAD_bit.VAL = 0xFFFFFFFF;
TMR2->CTRL = (1 << 0); // Запуск
- extern int *g_pfnVectors; //там, где-то в стартап файле есть такой символ
- //Надо показать в этом регистре, где лежит таблица прерываний.
- //А лежит она там, куда записал её линкер, в зависимости от файла компоновки.
- //Поэтому берем адрес от массива g_pfnVectors и кладем туда
-#if defined (__CMCPPARM__)
- SCB->VTOR = (uint32_t) (&__Vectors);
-#elif defined (__GNUC__)
- extern int *g_pfnVectors;
- SCB->VTOR = (uint32_t) (&g_pfnVectors);
-#endif
/*
У микроконтроллера К1921ВК035 производителем заложено 3 бита из 8-ми битного поля PRI_n [7:0] для настройки приоритетов прерываний и
diff --git a/Vsrc/main.c b/Vsrc/main.c
index 85ec58a..175d0f4 100644
--- a/Vsrc/main.c
+++ b/Vsrc/main.c
@@ -107,15 +107,6 @@ int main(void) {
/* Настройка тактирования, включение периферии */
SystemInit(); // Настройка клоков
SystemCoreClockUpdate(); // Апдейти системных переменных настроенными клоками (хз зачем, необязательно)
- // Копирование некоторых функций и всех прерываний в RAM
-#if defined (__GNUC__)
- memcpy(&__isr_vector_ram_start, &__isr_vector_flash_start,
- ((Uint32) (&__isr_vector_ram_end)
- - (Uint32) (&__isr_vector_ram_start)));
-#elif defined (__CMCPPARM__)
- // Для CodeMaster непонятно, как разместить таблицу прерываний во флеше, а обращатся к ней в раме,
- // так что пока так.
-#endif
pwm.Off(&pwm); //выключить ШИМ (на всякий случай)
DINT;
diff --git a/asm/startup_K1921VK035.S b/asm/startup_K1921VK035.S
new file mode 100644
index 0000000..d7db2db
--- /dev/null
+++ b/asm/startup_K1921VK035.S
@@ -0,0 +1,334 @@
+/*****************************************************************************
+ * @file: startup_K1921VK035.S
+ * @author NIIET
+ * @version: V1.7
+ * @date: 02.05.2018
+ * @brief: K1921VK035 startup file for GCC
+ *****************************************************************************
+ *
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, NIIET NOT BE HELD LIABLE FOR ANY DIRECT,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ *
© COPYRIGHT 2018 NIIET
+ *****************************************************************************
+ * FILE startup_K1921VK035.S
+ */
+
+ .syntax unified
+ .arch armv7e-m
+
+ .section .stack
+ .align 3
+#ifdef __STACK_SIZE
+ .equ Stack_Size, __STACK_SIZE
+#else
+ .equ Stack_Size, 0xc00
+#endif
+ .globl __StackTop
+ .globl __StackLimit
+__StackLimit:
+ .space Stack_Size
+ .size __StackLimit, . - __StackLimit
+__StackTop:
+ .size __StackTop, . - __StackTop
+
+ .section .heap
+ .align 3
+#ifdef __HEAP_SIZE
+ .equ Heap_Size, __HEAP_SIZE
+#else
+ .equ Heap_Size, 0
+#endif
+ .globl __HeapBase
+ .globl __HeapLimit
+__HeapBase:
+ .if Heap_Size
+ .space Heap_Size
+ .endif
+ .size __HeapBase, . - __HeapBase
+__HeapLimit:
+ .size __HeapLimit, . - __HeapLimit
+
+ .section .isr_vector
+ .align 2
+ .globl __isr_vector
+__isr_vector:
+ .long __StackTop /* Top of Stack */
+ .long Reset_Handler /* Reset Handler */
+ .long NMI_Handler /* NMI Handler */
+ .long HardFault_Handler /* Hard Fault Handler */
+ .long MemManage_Handler /* MPU Fault Handler */
+ .long BusFault_Handler /* Bus Fault Handler */
+ .long UsageFault_Handler /* Usage Fault Handler */
+ .long 0 /* Reserved */
+ .long 0 /* Reserved */
+ .long 0 /* Reserved */
+ .long 0 /* Reserved */
+ .long SVC_Handler /* SVCall Handler */
+ .long DebugMon_Handler /* Debug Monitor Handler */
+ .long 0 /* Reserved */
+ .long PendSV_Handler /* PendSV Handler */
+ .long SysTick_Handler /* SysTick Handler */
+
+ /* External interrupts */
+ .long WDT_IRQHandler
+ .long RCU_IRQHandler
+ .long MFLASH_IRQHandler
+ .long GPIOA_IRQHandler
+ .long GPIOB_IRQHandler
+ .long DMA_CH0_IRQHandler
+ .long DMA_CH1_IRQHandler
+ .long DMA_CH2_IRQHandler
+ .long DMA_CH3_IRQHandler
+ .long DMA_CH4_IRQHandler
+ .long DMA_CH5_IRQHandler
+ .long DMA_CH6_IRQHandler
+ .long DMA_CH7_IRQHandler
+ .long DMA_CH8_IRQHandler
+ .long DMA_CH9_IRQHandler
+ .long DMA_CH10_IRQHandler
+ .long DMA_CH11_IRQHandler
+ .long DMA_CH12_IRQHandler
+ .long DMA_CH13_IRQHandler
+ .long DMA_CH14_IRQHandler
+ .long DMA_CH15_IRQHandler
+ .long TMR0_IRQHandler
+ .long TMR1_IRQHandler
+ .long TMR2_IRQHandler
+ .long TMR3_IRQHandler
+ .long UART0_TD_IRQHandler
+ .long UART0_RX_IRQHandler
+ .long UART0_TX_IRQHandler
+ .long UART0_E_RT_IRQHandler
+ .long UART1_TD_IRQHandler
+ .long UART1_RX_IRQHandler
+ .long UART1_TX_IRQHandler
+ .long UART1_E_RT_IRQHandler
+ .long SPI_RO_RT_IRQHandler
+ .long SPI_RX_IRQHandler
+ .long SPI_TX_IRQHandler
+ .long I2C_IRQHandler
+ .long ECAP0_IRQHandler
+ .long ECAP1_IRQHandler
+ .long ECAP2_IRQHandler
+ .long PWM0_IRQHandler
+ .long PWM0_HD_IRQHandler
+ .long PWM0_TZ_IRQHandler
+ .long PWM1_IRQHandler
+ .long PWM1_HD_IRQHandler
+ .long PWM1_TZ_IRQHandler
+ .long PWM2_IRQHandler
+ .long PWM2_HD_IRQHandler
+ .long PWM2_TZ_IRQHandler
+ .long QEP_IRQHandler
+ .long ADC_SEQ0_IRQHandler
+ .long ADC_SEQ1_IRQHandler
+ .long ADC_DC_IRQHandler
+ .long CAN0_IRQHandler
+ .long CAN1_IRQHandler
+ .long CAN2_IRQHandler
+ .long CAN3_IRQHandler
+ .long CAN4_IRQHandler
+ .long CAN5_IRQHandler
+ .long CAN6_IRQHandler
+ .long CAN7_IRQHandler
+ .long CAN8_IRQHandler
+ .long CAN9_IRQHandler
+ .long CAN10_IRQHandler
+ .long CAN11_IRQHandler
+ .long CAN12_IRQHandler
+ .long CAN13_IRQHandler
+ .long CAN14_IRQHandler
+ .long CAN15_IRQHandler
+ .long FPU_IRQHandler
+
+
+ .size __isr_vector, . - __isr_vector
+
+ .text
+ .thumb
+ .thumb_func
+ .align 2
+ .globl Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+/* Firstly it copies data from read only memory to RAM.
+ * Multiple sections scheme:
+ *
+ * Between symbol address __copy_table_start__ and __copy_table_end__,
+ * there are array of triplets, each of which specify:
+ * offset 0: LMA of start of a section to copy from
+ * offset 4: VMA of start of a section to copy to
+ * offset 8: size of the section to copy. Must be multiply of 4
+ *
+ * All addresses must be aligned to 4 bytes boundary.
+ */
+ ldr r4, =__copy_table_start__
+ ldr r5, =__copy_table_end__
+
+.L_loop0:
+ cmp r4, r5
+ bge .L_loop0_done
+ ldr r1, [r4]
+ ldr r2, [r4, #4]
+ ldr r3, [r4, #8]
+
+.L_loop0_0:
+ subs r3, #4
+ ittt ge
+ ldrge r0, [r1, r3]
+ strge r0, [r2, r3]
+ bge .L_loop0_0
+
+ adds r4, #12
+ b .L_loop0
+
+.L_loop0_done:
+
+/* This part of work usually is done in C library startup code. Otherwise,
+ * define this macro to enable it in this startup.
+ *
+ * Multiple sections scheme.
+ *
+ * Between symbol address __copy_table_start__ and __copy_table_end__,
+ * there are array of tuples specifying:
+ * offset 0: Start of a BSS section
+ * offset 4: Size of this BSS section. Must be multiply of 4
+ */
+ ldr r3, =__zero_table_start__
+ ldr r4, =__zero_table_end__
+
+.L_loop2:
+ cmp r3, r4
+ bge .L_loop2_done
+ ldr r1, [r3]
+ ldr r2, [r3, #4]
+ movs r0, 0
+
+.L_loop2_0:
+ subs r2, #4
+ itt ge
+ strge r0, [r1, r2]
+ bge .L_loop2_0
+
+ adds r3, #8
+ b .L_loop2
+.L_loop2_done:
+#define __NO_SYSTEM_INIT
+#ifndef __NO_SYSTEM_INIT
+ bl SystemInit
+#endif
+
+#ifndef __START
+#define __START main
+#endif
+ bl __START
+
+ .pool
+ .size Reset_Handler, . - Reset_Handler
+
+ .align 1
+ .thumb_func
+ .weak Default_Handler
+ .type Default_Handler, %function
+Default_Handler:
+ b .
+ .size Default_Handler, . - Default_Handler
+
+/* Macro to define default handlers. Default handler
+ * will be weak symbol and just dead loops. They can be
+ * overwritten by other handlers */
+ .macro def_irq_handler handler_name
+ .weak \handler_name
+ .set \handler_name, Default_Handler
+ .endm
+
+ def_irq_handler NMI_Handler
+ def_irq_handler HardFault_Handler
+ def_irq_handler MemManage_Handler
+ def_irq_handler BusFault_Handler
+ def_irq_handler UsageFault_Handler
+ def_irq_handler SVC_Handler
+ def_irq_handler DebugMon_Handler
+ def_irq_handler PendSV_Handler
+ def_irq_handler SysTick_Handler
+
+ /* External Interrupt Handlers */
+ def_irq_handler WDT_IRQHandler
+ def_irq_handler RCU_IRQHandler
+ def_irq_handler MFLASH_IRQHandler
+ def_irq_handler GPIOA_IRQHandler
+ def_irq_handler GPIOB_IRQHandler
+ def_irq_handler DMA_CH0_IRQHandler
+ def_irq_handler DMA_CH1_IRQHandler
+ def_irq_handler DMA_CH2_IRQHandler
+ def_irq_handler DMA_CH3_IRQHandler
+ def_irq_handler DMA_CH4_IRQHandler
+ def_irq_handler DMA_CH5_IRQHandler
+ def_irq_handler DMA_CH6_IRQHandler
+ def_irq_handler DMA_CH7_IRQHandler
+ def_irq_handler DMA_CH8_IRQHandler
+ def_irq_handler DMA_CH9_IRQHandler
+ def_irq_handler DMA_CH10_IRQHandler
+ def_irq_handler DMA_CH11_IRQHandler
+ def_irq_handler DMA_CH12_IRQHandler
+ def_irq_handler DMA_CH13_IRQHandler
+ def_irq_handler DMA_CH14_IRQHandler
+ def_irq_handler DMA_CH15_IRQHandler
+ def_irq_handler TMR0_IRQHandler
+ def_irq_handler TMR1_IRQHandler
+ def_irq_handler TMR2_IRQHandler
+ def_irq_handler TMR3_IRQHandler
+ def_irq_handler UART0_TD_IRQHandler
+ def_irq_handler UART0_RX_IRQHandler
+ def_irq_handler UART0_TX_IRQHandler
+ def_irq_handler UART0_E_RT_IRQHandler
+ def_irq_handler UART1_TD_IRQHandler
+ def_irq_handler UART1_RX_IRQHandler
+ def_irq_handler UART1_TX_IRQHandler
+ def_irq_handler UART1_E_RT_IRQHandler
+ def_irq_handler SPI_RO_RT_IRQHandler
+ def_irq_handler SPI_RX_IRQHandler
+ def_irq_handler SPI_TX_IRQHandler
+ def_irq_handler I2C_IRQHandler
+ def_irq_handler ECAP0_IRQHandler
+ def_irq_handler ECAP1_IRQHandler
+ def_irq_handler ECAP2_IRQHandler
+ def_irq_handler PWM0_IRQHandler
+ def_irq_handler PWM0_HD_IRQHandler
+ def_irq_handler PWM0_TZ_IRQHandler
+ def_irq_handler PWM1_IRQHandler
+ def_irq_handler PWM1_HD_IRQHandler
+ def_irq_handler PWM1_TZ_IRQHandler
+ def_irq_handler PWM2_IRQHandler
+ def_irq_handler PWM2_HD_IRQHandler
+ def_irq_handler PWM2_TZ_IRQHandler
+ def_irq_handler QEP_IRQHandler
+ def_irq_handler ADC_SEQ0_IRQHandler
+ def_irq_handler ADC_SEQ1_IRQHandler
+ def_irq_handler ADC_DC_IRQHandler
+ def_irq_handler CAN0_IRQHandler
+ def_irq_handler CAN1_IRQHandler
+ def_irq_handler CAN2_IRQHandler
+ def_irq_handler CAN3_IRQHandler
+ def_irq_handler CAN4_IRQHandler
+ def_irq_handler CAN5_IRQHandler
+ def_irq_handler CAN6_IRQHandler
+ def_irq_handler CAN7_IRQHandler
+ def_irq_handler CAN8_IRQHandler
+ def_irq_handler CAN9_IRQHandler
+ def_irq_handler CAN10_IRQHandler
+ def_irq_handler CAN11_IRQHandler
+ def_irq_handler CAN12_IRQHandler
+ def_irq_handler CAN13_IRQHandler
+ def_irq_handler CAN14_IRQHandler
+ def_irq_handler CAN15_IRQHandler
+ def_irq_handler FPU_IRQHandler
+
+
+ .end
diff --git a/asm/startup_K1921VK035_vector.S b/asm/startup_K1921VK035_vector.S
deleted file mode 100644
index 40cd656..0000000
--- a/asm/startup_K1921VK035_vector.S
+++ /dev/null
@@ -1,307 +0,0 @@
-/**
- ******************************************************************************
- * @file startup_MCP.s
- * @author Vector / NIIET
- * @version V1.0.0
- * @date 28 - September - 2014
- * @brief NIIET MC01 vector table for Sourcery Codebench.
- * This module performs:
- * - Set the initial SP
- * - Set the initial PC == Reset_Handler,
- * - Set the vector table entries with the exceptions ISR address
- * - Branches to main in the C library (which eventually
- * calls main()).
- * - enables FPU (COMING SOON!)
- * After Reset the Cortex-M4 processor is in Thread mode,
- * priority is Privileged, and the Stack is set to Main.
- */
-
- .syntax unified
- .cpu cortex-m3
- .fpu vfpv4
- .thumb
-
-.global g_pfnVectors
-.global Default_Handler
-
-/* start address for the initialization values of the .data section.
-defined in linker script */
-.word _sidata
-/* start address for the .data section. defined in linker script */
-.word _sdata
-/* end address for the .data section. defined in linker script */
-.word _edata
-/* start address for the .bss section. defined in linker script */
-.word _sbss
-/* end address for the .bss section. defined in linker script */
-.word _ebss
-/* stack used for SystemInit_ExtMemCtl; always internal RAM used */
-
-/**
- * @brief This is the code that gets called when the processor first
- * starts execution following a reset event. Only the absolutely
- * necessary set is performed, after which the application
- * supplied main() routine is called.
- * @param None
- * @retval : None
-*/
-
- .section .text.Reset_Handler
- .weak Reset_Handler
- .type Reset_Handler, %function
-Reset_Handler:
-
-/* Copy the data segment initializers from flash to SRAM */
- movs r1, #0
- b LoopCopyDataInit
-
-CopyDataInit:
- ldr r3, =_sidata
- ldr r3, [r3, r1]
- str r3, [r0, r1]
- adds r1, r1, #4
-
-LoopCopyDataInit:
- ldr r0, =_sdata
- ldr r3, =_edata
- adds r2, r0, r1
- cmp r2, r3
- bcc CopyDataInit
- ldr r2, =_sbss
- b LoopFillZerobss
-/* Zero fill the bss segment. */
-FillZerobss:
- movs r3, #0
- str r3, [r2], #4
-
-LoopFillZerobss:
- ldr r3, = _ebss
- cmp r2, r3
- bcc FillZerobss
-
-
-/* Включение плавоточки*/
-
- ldr.w R0, =0xE000ED88
- ldr R1, [R0]
- orr R1, R1, #(0xF << 20)
- str R1, [R0]
- dsb
- isb /*reset pipeline now the FPU is enabled*/
-
- ldr r0, = _estack /* Эти две строки - загрузка SP адресом 2000а000 в случае, если флешка потёрта. Если проект шьётся во флеш - удалить.*/
- msr msp, r0 /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
- bl main
- bx lr
-.size Reset_Handler, .-Reset_Handler
-
-/**
- * @brief This is the code that gets called when the processor receives an
- * unexpected interrupt. This simply enters an infinite loop, preserving
- * the system state for examination by a debugger.
- * @param None
- * @retval None
-*/
- .section .text.Default_Handler,"ax",%progbits
-Default_Handler:
-Infinite_Loop:
- b Infinite_Loop
- .size Default_Handler, .-Default_Handler
-/******************************************************************************
-*
-* The minimal vector table for a Cortex M3. Note that the proper constructs
-* must be placed on this to ensure that it ends up at physical address
-* 0x0000.0000.
-*
-*******************************************************************************/
- .section .isr_vector,"a",%progbits
- .type g_pfnVectors, %object
- .size g_pfnVectors, .-g_pfnVectors
-
-
-g_pfnVectors:
- .word _estack
- .word Reset_Handler
- .word NMI_Handler
- .word HardFault_Handler
- .word MemManage_Handler
- .word BusFault_Handler
- .word UsageFault_Handler
- .word 0
- .word 0
- .word 0
- .word 0
- .word SVC_Handler
- .word DebugMon_Handler
- .word 0
- .word PendSV_Handler
- .word SysTick_Handler
-
-
- .word WDT_IRQHandler
- .word RCU_IRQHandler
- .word MFLASH_IRQHandler
- .word GPIOA_IRQHandler
- .word GPIOB_IRQHandler
- .word DMA_CH0_IRQHandler
- .word DMA_CH1_IRQHandler
- .word DMA_CH2_IRQHandler
- .word DMA_CH3_IRQHandler
- .word DMA_CH4_IRQHandler
- .word DMA_CH5_IRQHandler
- .word DMA_CH6_IRQHandler
- .word DMA_CH7_IRQHandler
- .word DMA_CH8_IRQHandler
- .word DMA_CH9_IRQHandler
- .word DMA_CH10_IRQHandler
- .word DMA_CH11_IRQHandler
- .word DMA_CH12_IRQHandler
- .word DMA_CH13_IRQHandler
- .word DMA_CH14_IRQHandler
- .word DMA_CH15_IRQHandler
- .word TMR0_IRQHandler
- .word TMR1_IRQHandler
- .word TMR2_IRQHandler
- .word TMR3_IRQHandler
- .word UART0_TD_IRQHandler
- .word UART0_RX_IRQHandler
- .word UART0_TX_IRQHandler
- .word UART0_E_RT_IRQHandler
- .word UART1_TD_IRQHandler
- .word UART1_RX_IRQHandler
- .word UART1_TX_IRQHandler
- .word UART1_E_RT_IRQHandler
- .word SPI_RO_RT_IRQHandler
- .word SPI_RX_IRQHandler
- .word SPI_TX_IRQHandler
- .word I2C_IRQHandler
- .word ECAP0_IRQHandler
- .word ECAP1_IRQHandler
- .word ECAP2_IRQHandler
- .word PWM0_IRQHandler
- .word PWM0_HD_IRQHandler
- .word PWM0_TZ_IRQHandler
- .word PWM1_IRQHandler
- .word PWM1_HD_IRQHandler
- .word PWM1_TZ_IRQHandler
- .word PWM2_IRQHandler
- .word PWM2_HD_IRQHandler
- .word PWM2_TZ_IRQHandler
- .word QEP_IRQHandler
- .word ADC_SEQ0_IRQHandler
- .word ADC_SEQ1_IRQHandler
- .word ADC_DC_IRQHandler
- .word CAN0_IRQHandler
- .word CAN1_IRQHandler
- .word CAN2_IRQHandler
- .word CAN3_IRQHandler
- .word CAN4_IRQHandler
- .word CAN5_IRQHandler
- .word CAN6_IRQHandler
- .word CAN7_IRQHandler
- .word CAN8_IRQHandler
- .word CAN9_IRQHandler
- .word CAN10_IRQHandler
- .word CAN11_IRQHandler
- .word CAN12_IRQHandler
- .word CAN13_IRQHandler
- .word CAN14_IRQHandler
- .word CAN15_IRQHandler
- .word FPU_IRQHandler
-
-/*******************************************************************************
-*
-* Provide weak aliases for each Exception handler to the Default_Handler.
-* As they are weak aliases, any function with the same name will override
-* this definition.
-*
-*******************************************************************************/
-/* Macro to define default handlers. Default handler
- * will be weak symbol and just dead loops. They can be
- * overwritten by other handlers */
- .macro def_irq_handler handler_name
- .weak \handler_name
- .thumb_set \handler_name, Default_Handler
- .endm
-
- def_irq_handler NMI_Handler
- def_irq_handler HardFault_Handler
- def_irq_handler MemManage_Handler
- def_irq_handler BusFault_Handler
- def_irq_handler UsageFault_Handler
- def_irq_handler SVC_Handler
- def_irq_handler DebugMon_Handler
- def_irq_handler PendSV_Handler
- def_irq_handler SysTick_Handler
-
- /* External Interrupt Handlers */
- def_irq_handler WDT_IRQHandler
- def_irq_handler RCU_IRQHandler
- def_irq_handler MFLASH_IRQHandler
- def_irq_handler GPIOA_IRQHandler
- def_irq_handler GPIOB_IRQHandler
- def_irq_handler DMA_CH0_IRQHandler
- def_irq_handler DMA_CH1_IRQHandler
- def_irq_handler DMA_CH2_IRQHandler
- def_irq_handler DMA_CH3_IRQHandler
- def_irq_handler DMA_CH4_IRQHandler
- def_irq_handler DMA_CH5_IRQHandler
- def_irq_handler DMA_CH6_IRQHandler
- def_irq_handler DMA_CH7_IRQHandler
- def_irq_handler DMA_CH8_IRQHandler
- def_irq_handler DMA_CH9_IRQHandler
- def_irq_handler DMA_CH10_IRQHandler
- def_irq_handler DMA_CH11_IRQHandler
- def_irq_handler DMA_CH12_IRQHandler
- def_irq_handler DMA_CH13_IRQHandler
- def_irq_handler DMA_CH14_IRQHandler
- def_irq_handler DMA_CH15_IRQHandler
- def_irq_handler TMR0_IRQHandler
- def_irq_handler TMR1_IRQHandler
- def_irq_handler TMR2_IRQHandler
- def_irq_handler TMR3_IRQHandler
- def_irq_handler UART0_TD_IRQHandler
- def_irq_handler UART0_RX_IRQHandler
- def_irq_handler UART0_TX_IRQHandler
- def_irq_handler UART0_E_RT_IRQHandler
- def_irq_handler UART1_TD_IRQHandler
- def_irq_handler UART1_RX_IRQHandler
- def_irq_handler UART1_TX_IRQHandler
- def_irq_handler UART1_E_RT_IRQHandler
- def_irq_handler SPI_RO_RT_IRQHandler
- def_irq_handler SPI_RX_IRQHandler
- def_irq_handler SPI_TX_IRQHandler
- def_irq_handler I2C_IRQHandler
- def_irq_handler ECAP0_IRQHandler
- def_irq_handler ECAP1_IRQHandler
- def_irq_handler ECAP2_IRQHandler
- def_irq_handler PWM0_IRQHandler
- def_irq_handler PWM0_HD_IRQHandler
- def_irq_handler PWM0_TZ_IRQHandler
- def_irq_handler PWM1_IRQHandler
- def_irq_handler PWM1_HD_IRQHandler
- def_irq_handler PWM1_TZ_IRQHandler
- def_irq_handler PWM2_IRQHandler
- def_irq_handler PWM2_HD_IRQHandler
- def_irq_handler PWM2_TZ_IRQHandler
- def_irq_handler QEP_IRQHandler
- def_irq_handler ADC_SEQ0_IRQHandler
- def_irq_handler ADC_SEQ1_IRQHandler
- def_irq_handler ADC_DC_IRQHandler
- def_irq_handler CAN0_IRQHandler
- def_irq_handler CAN1_IRQHandler
- def_irq_handler CAN2_IRQHandler
- def_irq_handler CAN3_IRQHandler
- def_irq_handler CAN4_IRQHandler
- def_irq_handler CAN5_IRQHandler
- def_irq_handler CAN6_IRQHandler
- def_irq_handler CAN7_IRQHandler
- def_irq_handler CAN8_IRQHandler
- def_irq_handler CAN9_IRQHandler
- def_irq_handler CAN10_IRQHandler
- def_irq_handler CAN11_IRQHandler
- def_irq_handler CAN12_IRQHandler
- def_irq_handler CAN13_IRQHandler
- def_irq_handler CAN14_IRQHandler
- def_irq_handler CAN15_IRQHandler
- def_irq_handler FPU_IRQHandler
diff --git a/cmd/build.ld b/cmd/build.ld
index 72c31a7..44f1a16 100644
--- a/cmd/build.ld
+++ b/cmd/build.ld
@@ -1,242 +1,155 @@
-/******************************************************************************
- Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
- * @file build.ld
- * @brief Файл распределения памяти для выполнения из FLASH
- * @version v1.0
- * @date 11 декабря 2015
- *
- * @author ООО "НПФ Вектор", http://motorcontrol.ru
- *
- ******************************************************************************/
-
-/* Entry Point */
-ENTRY(Reset_Handler)
-
-
-/* Generate a link error if heap and stack don't fit into RAM */
-_Stack_Size = 0x1000; /* required amount of stack */
-
-/* Specify the memory areas */
-/* Буквы в скобках определяют атрибуты: доступ на чтение,
- * запись, исполнение, выделение памяти. */
-MEMORY
-{
- FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x4000
-}
-/* Конец РАМы на НИИЭТЕ (с запасиком) - отсюда внутрь будет расти стек*/
-_estack = ORIGIN(RAM) + LENGTH(RAM) - 4;
-
-
-/* Define output sections */
-SECTIONS
-{
- . = ORIGIN(RAM);
- /* таблица векторов прерываний, обязана быть выровнена по 0х80 */
- .isr_vector ALIGN(0x80):
- {
- __isr_vector_flash_start = LOADADDR (.isr_vector); /* Берем адрес, где на флеше лежит эта таблица */
- __isr_vector_ram_start = .;
- KEEP(*(.isr_vector)) /* Startup code - KEEP запрещает удалить секцию сборщику мусора */
- . = ALIGN(4);
- __isr_vector_ram_end = .; /* конец оперативки, куда будет скопирован код */
- } >RAM AT>FLASH
-
- /* Секция для кода, который исполняется в оперативке, а лежит на флеше.
- * В начале мейна он копируется из ROM в RAM.*/
- .fastcode ALIGN(4): {
- __fastcode_flash_start = LOADADDR (.fastcode); /* Берем адрес, где на флеше лежит код. */
- /* Точка - это курсор текущего размещения в памяти. Т.е. в
- * __fastcode_ram_start будет лежать адрес оперативки, где будет исполняться скопированный код.*/
- __fastcode_ram_start = .;
- *(.glue_7t) *(.glue_7)
- *(.fastcode)
- *(.fastcode*)
- . = ALIGN (4);
- __fastcode_ram_end = .; /* конец оперативки, куда будет скопирован код */
- } >RAM AT>FLASH
-
- /* The program code and other data goes into RAM */
- .text :
- {
- . = ALIGN(4);
- *(.text) /* .text sections (code) */
- *(.text*) /* .text* sections (code) */
- *(.rodata) /* .rodata sections (constants, strings, etc.) */
- *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
- *(.glue_7) /* glue arm to thumb code */
- *(.glue_7t) /* glue thumb to arm code */
- *(.eh_frame)
-
- KEEP (*(.init))
- KEEP (*(.fini))
-
- . = ALIGN(4);
-
- /* define a global symbols at end of code - указатель на конец кода,
- т.к. точка - это переменная с инкрементирующимся значением адреса (называют её курсор)*/
- _etext = .;
- } >FLASH
-
-
- /* .preinit_array - секция для указателей на функции пре-инициализации,
- * вызываемых перед любыми другими функциями
- * инициализации (перед выполнением кода из секции
- * '.init' и вызовами функций из секции '.init_array').
- *
- * Специальная секция с именем '.preinit_array' и вышеназванным
- * назначением описана в System V gABI. Вызов функций, указатели на
- * которые содержатся в секции '.preinit_array', возлагается на библиотеку
- * времени выполнения (runtime library) -- например, на C runtime. Если в
- * библиотеке не предусмотрен такой вызов, то функции из секции
- * '.preinit_array' не будут вызваны.
- *
- * Секция '.preinit_array' предназначена для пре-инициализации
- * исполняемого файла (executable), выполняемой перед инициализацией
- * динамически скомпонованных с ним разделяемых объектов (shared objects).
- *
- * Символы __preinit_array_start и __preinit_array_end используются
- * библиотекой C времени выполнения (newlib, glibc).
- */
- .preinit_array :
- {
- PROVIDE_HIDDEN (__preinit_array_start = .);
- KEEP (*(.preinit_array*))
- PROVIDE_HIDDEN (__preinit_array_end = .);
- } >FLASH
-
- /* .init_array - секции с указателями на функции инициализации,
- * выполняющиеся перед вызовом входной точки программы, т.е.
- * перед вызовом функции main.
- *
- * Специальная секция с именем '.init_array' и вышеназванным назначением
- * описана в System V gABI. Вызов функций, указатели на которые содержатся в
- * секции '.init_array', возлагается на библиотеку времени выполнения
- * (runtime library) -- например, на C runtime. Если в библиотеке не
- * предусмотрен такой вызов, то функции из секции '.init_array' не будут
- * вызваны.
- *
- * GCC использует секцию '.init_array' для обеспечения вызова статических
- * конструкторов: функций, объявленных с __attribute__((constructor)).
- *
- * Для статических конструкторов с объявленным приоритетом PRIORITY,
- * используются секции с именем '.init_array.PRIORITY'
- *
- * Также GCC использует секцию '.init_array' для вызова конструкторов
- * статических объектов C++.
- *
- * Символы __init_array_start и __init_array_end используются библиотекой
- * C времени выполнения (newlib, glibc).
- */
- .init_array :
- {
- PROVIDE_HIDDEN (__init_array_start = .);
- KEEP (*(SORT(.init_array.*)))
- KEEP (*(.init_array*))
- PROVIDE_HIDDEN (__init_array_end = .);
- } >FLASH
- /* .fini_array - секции с указателями на функции терминации,
- * выполняющиеся по завершению программы (после возврата из
- * входной точки программы, т.е. из функции main).
- *
- * Специальная секция с именем '.fini_array' и вышеназванным назначением
- * описана в System V gABI. Вызов функций, указатели на которые содержатся в
- * секции '.fini_array', возлагается на библиотеку времени выполнения
- * (runtime library) -- например, на C runtime. Если в библиотеке не
- * предусмотрен такой вызов, то функции из секции '.fini_array' не будут
- * вызваны.
- *
- * GCC использует секцию '.fini_array' для обеспечения вызова статических
- * деструкторов: функций, объявленных с __attribute__((destructor)).
- *
- * Для статических деструкторов с объявленным приоритетом PRIORITY,
- * используются секции с именем '.fini_array.PRIORITY'
- *
- * Символы __fini_array_start и __fini_array_end используются библиотекой
- * C времени выполнения (newlib, glibc).
- */
- .fini_array :
- {
- PROVIDE_HIDDEN (__fini_array_start = .);
- KEEP (*(.fini_array*))
- KEEP (*(SORT(.fini_array.*)))
- PROVIDE_HIDDEN (__fini_array_end = .);
- } >FLASH
-
- /* used by the startup to initialize data */
- _sidata = .;
-
-
- /* Выражение _sidata, которое следует за ключевым словом AT,
- * определяет адрес загрузки секции. По умолчанию, если Вы
- * не использовали ключевое слово AT, адрес загрузки равен адресу перемещения.
- * Так как _sidata до этого было равно точке (указатель на текущий адрес),
- * то .data пойдет сразу дальше после неё. Как бы динамическое смещение такое.
- * */
- /* Initialized data sections goes into RAM, load LMA copy after code */
- .data : AT ( _sidata )
- {
- . = ALIGN(4);
- _sdata = .; /* create a global symbol at data start */
- *(.data) /* .data sections */
- *(.data*) /* .data* sections */
-
- . = ALIGN(4);
- _edata = .; /* define a global symbol at data end */
- } >RAM
- _________________________ZHOPA__________________________ = .;
- /* Uninitialized data section */
- . = ALIGN(4);
- .bss :
- {
- /* This is used by the startup in order to initialize the .bss secion */
- _sbss = .; /* define a global symbol at bss start */
- __bss_start__ = _sbss;
- *(.bss)
- *(.bss*)
- *(COMMON)
-
- . = ALIGN(4);
- _ebss = .; /* define a global symbol at bss end */
- __bss_end__ = _ebss;
- } >RAM
-
-
- /* Функци проверяет, что после всего кода осталось место под стек.
- * Стек сделан снизу оперативки!
- * Не размещайте свои секции после этой функции, только перед!*/
- ._user_heap_stack :
- {
- . = ALIGN(4);
- PROVIDE ( end = . );
- PROVIDE ( _end = . );
- . = . + _Stack_Size + 4;
- . = ALIGN(4);
- } >RAM
-
-
- /* Remove information from the standard libraries */
- /DISCARD/ :
- {
- libc.a ( * )
- libm.a ( * )
- libgcc.a ( * )
- }
-
- /* Тут какие-то атрибуты об особенностях компиляции, специфичная инфа производителя и хз еще что, читайте
- * 4.3.6 Build Attributes http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044e/IHI0044E_aaelf.pdf */
- .ARM.attributes 0 : { *(.ARM.attributes) }
-}
+MEMORY
+{
+ MFLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K
+ BFLASH (rx) : ORIGIN = 0x00000000, LENGTH = 3K
+ RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 16K
+}
+
+/* Aliases */
+REGION_ALIAS("CODE_FLASH", MFLASH); /* Replace this with BFLASH for bootloader */
+REGION_ALIAS("DATA_RAM", RAM);
+REGION_ALIAS("HEAP_RAM", RAM);
+REGION_ALIAS("STACK_RAM", RAM);
+REGION_ALIAS("BSS_RAM", RAM);
+
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.isr_vector))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > CODE_FLASH
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > CODE_FLASH
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > CODE_FLASH
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __textdata_start__ = LOADADDR(.data);
+ __copy_table_start__ = .;
+ LONG (__textdata_start__)
+ LONG (__data_start__)
+ LONG (__data_end__ - __data_start__)
+ __copy_table_end__ = .;
+ } > CODE_FLASH
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+ LONG (__bss_start__)
+ LONG (__bss_end__ - __bss_start__)
+ __zero_table_end__ = .;
+ } > CODE_FLASH
+
+ . = ALIGN(4);
+ .data :
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data*)
+ *(.ramfunc*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > DATA_RAM AT > CODE_FLASH
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > BSS_RAM
+
+ .heap (COPY):
+ {
+ __end__ = .;
+ PROVIDE(end = .);
+ *(.heap*)
+ __HeapLimit = .;
+ } > HEAP_RAM
+
+ /DISCARD/ :
+ {
+ libc.a ( * )
+ libm.a ( * )
+ libgcc.a ( * )
+ }
+ /* .stack_dummy section doesn't contains any symbols. It is only
+ * used for linker to calculate size of stack sections, and assign
+ * values to stack symbols later */
+ .stack_dummy (COPY):
+ {
+ *(.stack*)
+ } > STACK_RAM
+
+ /* Set stack top to end of STACK_RAM, and stack limit move down by
+ * size of stack_dummy section */
+ __StackTop = ORIGIN(STACK_RAM) + LENGTH(STACK_RAM);
+ __StackLimit = __StackTop - SIZEOF(.stack_dummy);
+ PROVIDE(__stack = __StackTop);
+
+ /* Check if data + heap + stack exceeds STACK_RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region STACK_RAM overflowed with stack")
+}
+