Initial commit
This commit is contained in:
		@ -0,0 +1,242 @@
 | 
			
		||||
;/**************************************************************************//**
 | 
			
		||||
; * @file     startup_ARMCM0.s
 | 
			
		||||
; * @brief    CMSIS Core Device Startup File for
 | 
			
		||||
; *           ARMCM0 Device Series
 | 
			
		||||
; * @version  V5.00
 | 
			
		||||
; * @date     02. March 2016
 | 
			
		||||
; ******************************************************************************/
 | 
			
		||||
;/*
 | 
			
		||||
; * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
; *
 | 
			
		||||
; * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
; *
 | 
			
		||||
; * 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
 | 
			
		||||
; *
 | 
			
		||||
; * 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.
 | 
			
		||||
; */
 | 
			
		||||
 | 
			
		||||
;/*
 | 
			
		||||
;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
 | 
			
		||||
;*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Stack Configuration
 | 
			
		||||
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Stack_Size      EQU     0x00000400
 | 
			
		||||
 | 
			
		||||
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
Stack_Mem       SPACE   Stack_Size
 | 
			
		||||
__initial_sp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Heap Configuration
 | 
			
		||||
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Heap_Size       EQU     0x00000C00
 | 
			
		||||
 | 
			
		||||
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
__heap_base
 | 
			
		||||
Heap_Mem        SPACE   Heap_Size
 | 
			
		||||
__heap_limit
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                PRESERVE8
 | 
			
		||||
                THUMB
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Vector Table Mapped to Address 0 at Reset
 | 
			
		||||
 | 
			
		||||
                AREA    RESET, DATA, READONLY
 | 
			
		||||
                EXPORT  __Vectors
 | 
			
		||||
                EXPORT  __Vectors_End
 | 
			
		||||
                EXPORT  __Vectors_Size
 | 
			
		||||
 | 
			
		||||
__Vectors       DCD     __initial_sp              ; Top of Stack
 | 
			
		||||
                DCD     Reset_Handler             ; Reset Handler
 | 
			
		||||
                DCD     NMI_Handler               ; NMI Handler
 | 
			
		||||
                DCD     HardFault_Handler         ; Hard Fault Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     SVC_Handler               ; SVCall Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     PendSV_Handler            ; PendSV Handler
 | 
			
		||||
                DCD     SysTick_Handler           ; SysTick Handler
 | 
			
		||||
 | 
			
		||||
                ; External Interrupts
 | 
			
		||||
                DCD     WDT_IRQHandler            ;  0:  Watchdog Timer
 | 
			
		||||
                DCD     RTC_IRQHandler            ;  1:  Real Time Clock
 | 
			
		||||
                DCD     TIM0_IRQHandler           ;  2:  Timer0 / Timer1
 | 
			
		||||
                DCD     TIM2_IRQHandler           ;  3:  Timer2 / Timer3
 | 
			
		||||
                DCD     MCIA_IRQHandler           ;  4:  MCIa
 | 
			
		||||
                DCD     MCIB_IRQHandler           ;  5:  MCIb
 | 
			
		||||
                DCD     UART0_IRQHandler          ;  6:  UART0 - DUT FPGA
 | 
			
		||||
                DCD     UART1_IRQHandler          ;  7:  UART1 - DUT FPGA
 | 
			
		||||
                DCD     UART2_IRQHandler          ;  8:  UART2 - DUT FPGA
 | 
			
		||||
                DCD     UART4_IRQHandler          ;  9:  UART4 - not connected
 | 
			
		||||
                DCD     AACI_IRQHandler           ; 10: AACI / AC97
 | 
			
		||||
                DCD     CLCD_IRQHandler           ; 11: CLCD Combined Interrupt
 | 
			
		||||
                DCD     ENET_IRQHandler           ; 12: Ethernet
 | 
			
		||||
                DCD     USBDC_IRQHandler          ; 13: USB Device
 | 
			
		||||
                DCD     USBHC_IRQHandler          ; 14: USB Host Controller
 | 
			
		||||
                DCD     CHLCD_IRQHandler          ; 15: Character LCD
 | 
			
		||||
                DCD     FLEXRAY_IRQHandler        ; 16: Flexray
 | 
			
		||||
                DCD     CAN_IRQHandler            ; 17: CAN
 | 
			
		||||
                DCD     LIN_IRQHandler            ; 18: LIN
 | 
			
		||||
                DCD     I2C_IRQHandler            ; 19: I2C ADC/DAC
 | 
			
		||||
                DCD     0                         ; 20: Reserved
 | 
			
		||||
                DCD     0                         ; 21: Reserved
 | 
			
		||||
                DCD     0                         ; 22: Reserved
 | 
			
		||||
                DCD     0                         ; 23: Reserved
 | 
			
		||||
                DCD     0                         ; 24: Reserved
 | 
			
		||||
                DCD     0                         ; 25: Reserved
 | 
			
		||||
                DCD     0                         ; 26: Reserved
 | 
			
		||||
                DCD     0                         ; 27: Reserved
 | 
			
		||||
                DCD     CPU_CLCD_IRQHandler       ; 28: Reserved - CPU FPGA CLCD
 | 
			
		||||
                DCD     0                         ; 29: Reserved - CPU FPGA
 | 
			
		||||
                DCD     UART3_IRQHandler          ; 30: UART3    - CPU FPGA
 | 
			
		||||
                DCD     SPI_IRQHandler            ; 31: SPI Touchscreen - CPU FPGA
 | 
			
		||||
__Vectors_End
 | 
			
		||||
 | 
			
		||||
__Vectors_Size  EQU     __Vectors_End - __Vectors
 | 
			
		||||
 | 
			
		||||
                AREA    |.text|, CODE, READONLY
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Reset Handler
 | 
			
		||||
 | 
			
		||||
Reset_Handler   PROC
 | 
			
		||||
                EXPORT  Reset_Handler             [WEAK]
 | 
			
		||||
                IMPORT  SystemInit
 | 
			
		||||
                IMPORT  __main
 | 
			
		||||
                LDR     R0, =SystemInit
 | 
			
		||||
                BLX     R0
 | 
			
		||||
                LDR     R0, =__main
 | 
			
		||||
                BX      R0
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Dummy Exception Handlers (infinite loops which can be modified)
 | 
			
		||||
 | 
			
		||||
NMI_Handler     PROC
 | 
			
		||||
                EXPORT  NMI_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
HardFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  HardFault_Handler         [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SVC_Handler     PROC
 | 
			
		||||
                EXPORT  SVC_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
PendSV_Handler  PROC
 | 
			
		||||
                EXPORT  PendSV_Handler            [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SysTick_Handler PROC
 | 
			
		||||
                EXPORT  SysTick_Handler           [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
Default_Handler PROC
 | 
			
		||||
 | 
			
		||||
                EXPORT  WDT_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  RTC_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  TIM0_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  TIM2_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  MCIA_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  MCIB_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  UART0_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART1_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART2_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART3_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART4_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  AACI_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  CLCD_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  ENET_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  USBDC_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  USBHC_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  CHLCD_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  FLEXRAY_IRQHandler        [WEAK]
 | 
			
		||||
                EXPORT  CAN_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  LIN_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  I2C_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  CPU_CLCD_IRQHandler       [WEAK]
 | 
			
		||||
                EXPORT  SPI_IRQHandler            [WEAK]
 | 
			
		||||
 | 
			
		||||
WDT_IRQHandler
 | 
			
		||||
RTC_IRQHandler
 | 
			
		||||
TIM0_IRQHandler
 | 
			
		||||
TIM2_IRQHandler
 | 
			
		||||
MCIA_IRQHandler
 | 
			
		||||
MCIB_IRQHandler
 | 
			
		||||
UART0_IRQHandler
 | 
			
		||||
UART1_IRQHandler
 | 
			
		||||
UART2_IRQHandler
 | 
			
		||||
UART3_IRQHandler
 | 
			
		||||
UART4_IRQHandler
 | 
			
		||||
AACI_IRQHandler
 | 
			
		||||
CLCD_IRQHandler
 | 
			
		||||
ENET_IRQHandler
 | 
			
		||||
USBDC_IRQHandler
 | 
			
		||||
USBHC_IRQHandler
 | 
			
		||||
CHLCD_IRQHandler
 | 
			
		||||
FLEXRAY_IRQHandler
 | 
			
		||||
CAN_IRQHandler
 | 
			
		||||
LIN_IRQHandler
 | 
			
		||||
I2C_IRQHandler
 | 
			
		||||
CPU_CLCD_IRQHandler
 | 
			
		||||
SPI_IRQHandler
 | 
			
		||||
                B       .
 | 
			
		||||
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; User Initial Stack & Heap
 | 
			
		||||
 | 
			
		||||
                IF      :DEF:__MICROLIB
 | 
			
		||||
 | 
			
		||||
                EXPORT  __initial_sp
 | 
			
		||||
                EXPORT  __heap_base
 | 
			
		||||
                EXPORT  __heap_limit
 | 
			
		||||
 | 
			
		||||
                ELSE
 | 
			
		||||
 | 
			
		||||
                IMPORT  __use_two_region_memory
 | 
			
		||||
                EXPORT  __user_initial_stackheap
 | 
			
		||||
 | 
			
		||||
__user_initial_stackheap PROC
 | 
			
		||||
                LDR     R0, =  Heap_Mem
 | 
			
		||||
                LDR     R1, =(Stack_Mem + Stack_Size)
 | 
			
		||||
                LDR     R2, = (Heap_Mem +  Heap_Size)
 | 
			
		||||
                LDR     R3, = Stack_Mem
 | 
			
		||||
                BX      LR
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
                ENDIF
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                END
 | 
			
		||||
@ -0,0 +1,56 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMCM0.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMCM0 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     08. April 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ARMCM0.h"
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000U)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5 * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,262 @@
 | 
			
		||||
;/**************************************************************************//**
 | 
			
		||||
; * @file     startup_ARMCM3.s
 | 
			
		||||
; * @brief    CMSIS Core Device Startup File for
 | 
			
		||||
; *           ARMCM3 Device Series
 | 
			
		||||
; * @version  V5.00
 | 
			
		||||
; * @date     02. March 2016
 | 
			
		||||
; ******************************************************************************/
 | 
			
		||||
;/*
 | 
			
		||||
; * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
; *
 | 
			
		||||
; * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
; *
 | 
			
		||||
; * 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
 | 
			
		||||
; *
 | 
			
		||||
; * 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.
 | 
			
		||||
; */
 | 
			
		||||
 | 
			
		||||
;/*
 | 
			
		||||
;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
 | 
			
		||||
;*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Stack Configuration
 | 
			
		||||
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Stack_Size      EQU     0x00000400
 | 
			
		||||
 | 
			
		||||
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
Stack_Mem       SPACE   Stack_Size
 | 
			
		||||
__initial_sp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Heap Configuration
 | 
			
		||||
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Heap_Size       EQU     0x00080000
 | 
			
		||||
 | 
			
		||||
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
__heap_base
 | 
			
		||||
Heap_Mem        SPACE   Heap_Size
 | 
			
		||||
__heap_limit
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                PRESERVE8
 | 
			
		||||
                THUMB
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Vector Table Mapped to Address 0 at Reset
 | 
			
		||||
 | 
			
		||||
                AREA    RESET, DATA, READONLY
 | 
			
		||||
                EXPORT  __Vectors
 | 
			
		||||
                EXPORT  __Vectors_End
 | 
			
		||||
                EXPORT  __Vectors_Size
 | 
			
		||||
 | 
			
		||||
__Vectors       DCD     __initial_sp              ; Top of Stack
 | 
			
		||||
                DCD     Reset_Handler             ; Reset Handler
 | 
			
		||||
                DCD     NMI_Handler               ; NMI Handler
 | 
			
		||||
                DCD     HardFault_Handler         ; Hard Fault Handler
 | 
			
		||||
                DCD     MemManage_Handler         ; MPU Fault Handler
 | 
			
		||||
                DCD     BusFault_Handler          ; Bus Fault Handler
 | 
			
		||||
                DCD     UsageFault_Handler        ; Usage Fault Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     SVC_Handler               ; SVCall Handler
 | 
			
		||||
                DCD     DebugMon_Handler          ; Debug Monitor Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     PendSV_Handler            ; PendSV Handler
 | 
			
		||||
                DCD     SysTick_Handler           ; SysTick Handler
 | 
			
		||||
 | 
			
		||||
                ; External Interrupts
 | 
			
		||||
                DCD     WDT_IRQHandler            ;  0:  Watchdog Timer
 | 
			
		||||
                DCD     RTC_IRQHandler            ;  1:  Real Time Clock
 | 
			
		||||
                DCD     TIM0_IRQHandler           ;  2:  Timer0 / Timer1
 | 
			
		||||
                DCD     TIM2_IRQHandler           ;  3:  Timer2 / Timer3
 | 
			
		||||
                DCD     MCIA_IRQHandler           ;  4:  MCIa
 | 
			
		||||
                DCD     MCIB_IRQHandler           ;  5:  MCIb
 | 
			
		||||
                DCD     UART0_IRQHandler          ;  6:  UART0 - DUT FPGA
 | 
			
		||||
                DCD     UART1_IRQHandler          ;  7:  UART1 - DUT FPGA
 | 
			
		||||
                DCD     UART2_IRQHandler          ;  8:  UART2 - DUT FPGA
 | 
			
		||||
                DCD     UART4_IRQHandler          ;  9:  UART4 - not connected
 | 
			
		||||
                DCD     AACI_IRQHandler           ; 10: AACI / AC97
 | 
			
		||||
                DCD     CLCD_IRQHandler           ; 11: CLCD Combined Interrupt
 | 
			
		||||
                DCD     ENET_IRQHandler           ; 12: Ethernet
 | 
			
		||||
                DCD     USBDC_IRQHandler          ; 13: USB Device
 | 
			
		||||
                DCD     USBHC_IRQHandler          ; 14: USB Host Controller
 | 
			
		||||
                DCD     CHLCD_IRQHandler          ; 15: Character LCD
 | 
			
		||||
                DCD     FLEXRAY_IRQHandler        ; 16: Flexray
 | 
			
		||||
                DCD     CAN_IRQHandler            ; 17: CAN
 | 
			
		||||
                DCD     LIN_IRQHandler            ; 18: LIN
 | 
			
		||||
                DCD     I2C_IRQHandler            ; 19: I2C ADC/DAC
 | 
			
		||||
                DCD     0                         ; 20: Reserved
 | 
			
		||||
                DCD     0                         ; 21: Reserved
 | 
			
		||||
                DCD     0                         ; 22: Reserved
 | 
			
		||||
                DCD     0                         ; 23: Reserved
 | 
			
		||||
                DCD     0                         ; 24: Reserved
 | 
			
		||||
                DCD     0                         ; 25: Reserved
 | 
			
		||||
                DCD     0                         ; 26: Reserved
 | 
			
		||||
                DCD     0                         ; 27: Reserved
 | 
			
		||||
                DCD     CPU_CLCD_IRQHandler       ; 28: Reserved - CPU FPGA CLCD
 | 
			
		||||
                DCD     0                         ; 29: Reserved - CPU FPGA
 | 
			
		||||
                DCD     UART3_IRQHandler          ; 30: UART3    - CPU FPGA
 | 
			
		||||
                DCD     SPI_IRQHandler            ; 31: SPI Touchscreen - CPU FPGA
 | 
			
		||||
__Vectors_End
 | 
			
		||||
 | 
			
		||||
__Vectors_Size  EQU     __Vectors_End - __Vectors
 | 
			
		||||
 | 
			
		||||
                AREA    |.text|, CODE, READONLY
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Reset Handler
 | 
			
		||||
 | 
			
		||||
Reset_Handler   PROC
 | 
			
		||||
                EXPORT  Reset_Handler             [WEAK]
 | 
			
		||||
                IMPORT  SystemInit
 | 
			
		||||
                IMPORT  __main
 | 
			
		||||
                LDR     R0, =SystemInit
 | 
			
		||||
                BLX     R0
 | 
			
		||||
                LDR     R0, =__main
 | 
			
		||||
                BX      R0
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Dummy Exception Handlers (infinite loops which can be modified)
 | 
			
		||||
 | 
			
		||||
NMI_Handler     PROC
 | 
			
		||||
                EXPORT  NMI_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
HardFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  HardFault_Handler         [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
MemManage_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  MemManage_Handler         [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
BusFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  BusFault_Handler          [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
UsageFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  UsageFault_Handler        [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SVC_Handler     PROC
 | 
			
		||||
                EXPORT  SVC_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
DebugMon_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  DebugMon_Handler          [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
PendSV_Handler  PROC
 | 
			
		||||
                EXPORT  PendSV_Handler            [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SysTick_Handler PROC
 | 
			
		||||
                EXPORT  SysTick_Handler           [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
Default_Handler PROC
 | 
			
		||||
 | 
			
		||||
                EXPORT  WDT_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  RTC_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  TIM0_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  TIM2_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  MCIA_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  MCIB_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  UART0_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART1_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART2_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART3_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART4_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  AACI_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  CLCD_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  ENET_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  USBDC_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  USBHC_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  CHLCD_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  FLEXRAY_IRQHandler        [WEAK]
 | 
			
		||||
                EXPORT  CAN_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  LIN_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  I2C_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  CPU_CLCD_IRQHandler       [WEAK]
 | 
			
		||||
                EXPORT  SPI_IRQHandler            [WEAK]
 | 
			
		||||
 | 
			
		||||
WDT_IRQHandler
 | 
			
		||||
RTC_IRQHandler
 | 
			
		||||
TIM0_IRQHandler
 | 
			
		||||
TIM2_IRQHandler
 | 
			
		||||
MCIA_IRQHandler
 | 
			
		||||
MCIB_IRQHandler
 | 
			
		||||
UART0_IRQHandler
 | 
			
		||||
UART1_IRQHandler
 | 
			
		||||
UART2_IRQHandler
 | 
			
		||||
UART3_IRQHandler
 | 
			
		||||
UART4_IRQHandler
 | 
			
		||||
AACI_IRQHandler
 | 
			
		||||
CLCD_IRQHandler
 | 
			
		||||
ENET_IRQHandler
 | 
			
		||||
USBDC_IRQHandler
 | 
			
		||||
USBHC_IRQHandler
 | 
			
		||||
CHLCD_IRQHandler
 | 
			
		||||
FLEXRAY_IRQHandler
 | 
			
		||||
CAN_IRQHandler
 | 
			
		||||
LIN_IRQHandler
 | 
			
		||||
I2C_IRQHandler
 | 
			
		||||
CPU_CLCD_IRQHandler
 | 
			
		||||
SPI_IRQHandler
 | 
			
		||||
                B       .
 | 
			
		||||
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; User Initial Stack & Heap
 | 
			
		||||
 | 
			
		||||
                IF      :DEF:__MICROLIB
 | 
			
		||||
 | 
			
		||||
                EXPORT  __initial_sp
 | 
			
		||||
                EXPORT  __heap_base
 | 
			
		||||
                EXPORT  __heap_limit
 | 
			
		||||
 | 
			
		||||
                ELSE
 | 
			
		||||
 | 
			
		||||
                IMPORT  __use_two_region_memory
 | 
			
		||||
                EXPORT  __user_initial_stackheap
 | 
			
		||||
 | 
			
		||||
__user_initial_stackheap PROC
 | 
			
		||||
                LDR     R0, =  Heap_Mem
 | 
			
		||||
                LDR     R1, =(Stack_Mem + Stack_Size)
 | 
			
		||||
                LDR     R2, = (Heap_Mem +  Heap_Size)
 | 
			
		||||
                LDR     R3, = Stack_Mem
 | 
			
		||||
                BX      LR
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
                ENDIF
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                END
 | 
			
		||||
@ -0,0 +1,68 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMCM3.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMCM3 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     08. April 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ARMCM3.h"
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000U)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5 * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,262 @@
 | 
			
		||||
;/**************************************************************************//**
 | 
			
		||||
; * @file     startup_ARMCM4.s
 | 
			
		||||
; * @brief    CMSIS Core Device Startup File for
 | 
			
		||||
; *           ARMCM4 Device Series
 | 
			
		||||
; * @version  V5.00
 | 
			
		||||
; * @date     02. March 2016
 | 
			
		||||
; ******************************************************************************/
 | 
			
		||||
;/*
 | 
			
		||||
; * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
; *
 | 
			
		||||
; * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
; *
 | 
			
		||||
; * 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
 | 
			
		||||
; *
 | 
			
		||||
; * 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.
 | 
			
		||||
; */
 | 
			
		||||
 | 
			
		||||
;/*
 | 
			
		||||
;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
 | 
			
		||||
;*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Stack Configuration
 | 
			
		||||
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Stack_Size      EQU     0x00000400
 | 
			
		||||
 | 
			
		||||
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
Stack_Mem       SPACE   Stack_Size
 | 
			
		||||
__initial_sp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Heap Configuration
 | 
			
		||||
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Heap_Size       EQU     0x00000C00
 | 
			
		||||
 | 
			
		||||
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
__heap_base
 | 
			
		||||
Heap_Mem        SPACE   Heap_Size
 | 
			
		||||
__heap_limit
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                PRESERVE8
 | 
			
		||||
                THUMB
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Vector Table Mapped to Address 0 at Reset
 | 
			
		||||
 | 
			
		||||
                AREA    RESET, DATA, READONLY
 | 
			
		||||
                EXPORT  __Vectors
 | 
			
		||||
                EXPORT  __Vectors_End
 | 
			
		||||
                EXPORT  __Vectors_Size
 | 
			
		||||
 | 
			
		||||
__Vectors       DCD     __initial_sp              ; Top of Stack
 | 
			
		||||
                DCD     Reset_Handler             ; Reset Handler
 | 
			
		||||
                DCD     NMI_Handler               ; NMI Handler
 | 
			
		||||
                DCD     HardFault_Handler         ; Hard Fault Handler
 | 
			
		||||
                DCD     MemManage_Handler         ; MPU Fault Handler
 | 
			
		||||
                DCD     BusFault_Handler          ; Bus Fault Handler
 | 
			
		||||
                DCD     UsageFault_Handler        ; Usage Fault Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     SVC_Handler               ; SVCall Handler
 | 
			
		||||
                DCD     DebugMon_Handler          ; Debug Monitor Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     PendSV_Handler            ; PendSV Handler
 | 
			
		||||
                DCD     SysTick_Handler           ; SysTick Handler
 | 
			
		||||
 | 
			
		||||
                ; External Interrupts
 | 
			
		||||
                DCD     WDT_IRQHandler            ;  0:  Watchdog Timer
 | 
			
		||||
                DCD     RTC_IRQHandler            ;  1:  Real Time Clock
 | 
			
		||||
                DCD     TIM0_IRQHandler           ;  2:  Timer0 / Timer1
 | 
			
		||||
                DCD     TIM2_IRQHandler           ;  3:  Timer2 / Timer3
 | 
			
		||||
                DCD     MCIA_IRQHandler           ;  4:  MCIa
 | 
			
		||||
                DCD     MCIB_IRQHandler           ;  5:  MCIb
 | 
			
		||||
                DCD     UART0_IRQHandler          ;  6:  UART0 - DUT FPGA
 | 
			
		||||
                DCD     UART1_IRQHandler          ;  7:  UART1 - DUT FPGA
 | 
			
		||||
                DCD     UART2_IRQHandler          ;  8:  UART2 - DUT FPGA
 | 
			
		||||
                DCD     UART4_IRQHandler          ;  9:  UART4 - not connected
 | 
			
		||||
                DCD     AACI_IRQHandler           ; 10: AACI / AC97
 | 
			
		||||
                DCD     CLCD_IRQHandler           ; 11: CLCD Combined Interrupt
 | 
			
		||||
                DCD     ENET_IRQHandler           ; 12: Ethernet
 | 
			
		||||
                DCD     USBDC_IRQHandler          ; 13: USB Device
 | 
			
		||||
                DCD     USBHC_IRQHandler          ; 14: USB Host Controller
 | 
			
		||||
                DCD     CHLCD_IRQHandler          ; 15: Character LCD
 | 
			
		||||
                DCD     FLEXRAY_IRQHandler        ; 16: Flexray
 | 
			
		||||
                DCD     CAN_IRQHandler            ; 17: CAN
 | 
			
		||||
                DCD     LIN_IRQHandler            ; 18: LIN
 | 
			
		||||
                DCD     I2C_IRQHandler            ; 19: I2C ADC/DAC
 | 
			
		||||
                DCD     0                         ; 20: Reserved
 | 
			
		||||
                DCD     0                         ; 21: Reserved
 | 
			
		||||
                DCD     0                         ; 22: Reserved
 | 
			
		||||
                DCD     0                         ; 23: Reserved
 | 
			
		||||
                DCD     0                         ; 24: Reserved
 | 
			
		||||
                DCD     0                         ; 25: Reserved
 | 
			
		||||
                DCD     0                         ; 26: Reserved
 | 
			
		||||
                DCD     0                         ; 27: Reserved
 | 
			
		||||
                DCD     CPU_CLCD_IRQHandler       ; 28: Reserved - CPU FPGA CLCD
 | 
			
		||||
                DCD     0                         ; 29: Reserved - CPU FPGA
 | 
			
		||||
                DCD     UART3_IRQHandler          ; 30: UART3    - CPU FPGA
 | 
			
		||||
                DCD     SPI_IRQHandler            ; 31: SPI Touchscreen - CPU FPGA
 | 
			
		||||
__Vectors_End
 | 
			
		||||
 | 
			
		||||
__Vectors_Size  EQU     __Vectors_End - __Vectors
 | 
			
		||||
 | 
			
		||||
                AREA    |.text|, CODE, READONLY
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Reset Handler
 | 
			
		||||
 | 
			
		||||
Reset_Handler   PROC
 | 
			
		||||
                EXPORT  Reset_Handler             [WEAK]
 | 
			
		||||
                IMPORT  SystemInit
 | 
			
		||||
                IMPORT  __main
 | 
			
		||||
                LDR     R0, =SystemInit
 | 
			
		||||
                BLX     R0
 | 
			
		||||
                LDR     R0, =__main
 | 
			
		||||
                BX      R0
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Dummy Exception Handlers (infinite loops which can be modified)
 | 
			
		||||
 | 
			
		||||
NMI_Handler     PROC
 | 
			
		||||
                EXPORT  NMI_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
HardFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  HardFault_Handler         [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
MemManage_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  MemManage_Handler         [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
BusFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  BusFault_Handler          [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
UsageFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  UsageFault_Handler        [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SVC_Handler     PROC
 | 
			
		||||
                EXPORT  SVC_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
DebugMon_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  DebugMon_Handler          [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
PendSV_Handler  PROC
 | 
			
		||||
                EXPORT  PendSV_Handler            [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SysTick_Handler PROC
 | 
			
		||||
                EXPORT  SysTick_Handler           [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
Default_Handler PROC
 | 
			
		||||
 | 
			
		||||
                EXPORT  WDT_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  RTC_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  TIM0_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  TIM2_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  MCIA_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  MCIB_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  UART0_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART1_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART2_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART3_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART4_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  AACI_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  CLCD_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  ENET_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  USBDC_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  USBHC_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  CHLCD_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  FLEXRAY_IRQHandler        [WEAK]
 | 
			
		||||
                EXPORT  CAN_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  LIN_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  I2C_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  CPU_CLCD_IRQHandler       [WEAK]
 | 
			
		||||
                EXPORT  SPI_IRQHandler            [WEAK]
 | 
			
		||||
 | 
			
		||||
WDT_IRQHandler
 | 
			
		||||
RTC_IRQHandler
 | 
			
		||||
TIM0_IRQHandler
 | 
			
		||||
TIM2_IRQHandler
 | 
			
		||||
MCIA_IRQHandler
 | 
			
		||||
MCIB_IRQHandler
 | 
			
		||||
UART0_IRQHandler
 | 
			
		||||
UART1_IRQHandler
 | 
			
		||||
UART2_IRQHandler
 | 
			
		||||
UART3_IRQHandler
 | 
			
		||||
UART4_IRQHandler
 | 
			
		||||
AACI_IRQHandler
 | 
			
		||||
CLCD_IRQHandler
 | 
			
		||||
ENET_IRQHandler
 | 
			
		||||
USBDC_IRQHandler
 | 
			
		||||
USBHC_IRQHandler
 | 
			
		||||
CHLCD_IRQHandler
 | 
			
		||||
FLEXRAY_IRQHandler
 | 
			
		||||
CAN_IRQHandler
 | 
			
		||||
LIN_IRQHandler
 | 
			
		||||
I2C_IRQHandler
 | 
			
		||||
CPU_CLCD_IRQHandler
 | 
			
		||||
SPI_IRQHandler
 | 
			
		||||
                B       .
 | 
			
		||||
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; User Initial Stack & Heap
 | 
			
		||||
 | 
			
		||||
                IF      :DEF:__MICROLIB
 | 
			
		||||
 | 
			
		||||
                EXPORT  __initial_sp
 | 
			
		||||
                EXPORT  __heap_base
 | 
			
		||||
                EXPORT  __heap_limit
 | 
			
		||||
 | 
			
		||||
                ELSE
 | 
			
		||||
 | 
			
		||||
                IMPORT  __use_two_region_memory
 | 
			
		||||
                EXPORT  __user_initial_stackheap
 | 
			
		||||
 | 
			
		||||
__user_initial_stackheap PROC
 | 
			
		||||
                LDR     R0, =  Heap_Mem
 | 
			
		||||
                LDR     R1, =(Stack_Mem + Stack_Size)
 | 
			
		||||
                LDR     R2, = (Heap_Mem +  Heap_Size)
 | 
			
		||||
                LDR     R3, = Stack_Mem
 | 
			
		||||
                BX      LR
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
                ENDIF
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                END
 | 
			
		||||
@ -0,0 +1,83 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMCM4.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMCM4 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     07. September 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined (ARMCM4)
 | 
			
		||||
  #include "ARMCM4.h"
 | 
			
		||||
#elif defined (ARMCM4_FP)
 | 
			
		||||
  #include "ARMCM4_FP.h"
 | 
			
		||||
#else
 | 
			
		||||
  #error device not specified!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000UL)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5U * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__FPU_USED) && (__FPU_USED == 1U)
 | 
			
		||||
  SCB->CPACR |= ((3U << 10U*2U) |           /* set CP10 Full Access */
 | 
			
		||||
                 (3U << 11U*2U)  );         /* set CP11 Full Access */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef UNALIGNED_SUPPORT_DISABLE
 | 
			
		||||
  SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,262 @@
 | 
			
		||||
;/**************************************************************************//**
 | 
			
		||||
; * @file     startup_ARMCM4.s
 | 
			
		||||
; * @brief    CMSIS Core Device Startup File for
 | 
			
		||||
; *           ARMCM4 Device Series
 | 
			
		||||
; * @version  V5.00
 | 
			
		||||
; * @date     02. March 2016
 | 
			
		||||
; ******************************************************************************/
 | 
			
		||||
;/*
 | 
			
		||||
; * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
; *
 | 
			
		||||
; * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
; *
 | 
			
		||||
; * 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
 | 
			
		||||
; *
 | 
			
		||||
; * 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.
 | 
			
		||||
; */
 | 
			
		||||
 | 
			
		||||
;/*
 | 
			
		||||
;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
 | 
			
		||||
;*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Stack Configuration
 | 
			
		||||
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Stack_Size      EQU     0x00004000
 | 
			
		||||
 | 
			
		||||
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
Stack_Mem       SPACE   Stack_Size
 | 
			
		||||
__initial_sp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Heap Configuration
 | 
			
		||||
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Heap_Size       EQU     0x00100000
 | 
			
		||||
 | 
			
		||||
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
__heap_base
 | 
			
		||||
Heap_Mem        SPACE   Heap_Size
 | 
			
		||||
__heap_limit
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                PRESERVE8
 | 
			
		||||
                THUMB
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Vector Table Mapped to Address 0 at Reset
 | 
			
		||||
 | 
			
		||||
                AREA    RESET, DATA, READONLY
 | 
			
		||||
                EXPORT  __Vectors
 | 
			
		||||
                EXPORT  __Vectors_End
 | 
			
		||||
                EXPORT  __Vectors_Size
 | 
			
		||||
 | 
			
		||||
__Vectors       DCD     __initial_sp              ; Top of Stack
 | 
			
		||||
                DCD     Reset_Handler             ; Reset Handler
 | 
			
		||||
                DCD     NMI_Handler               ; NMI Handler
 | 
			
		||||
                DCD     HardFault_Handler         ; Hard Fault Handler
 | 
			
		||||
                DCD     MemManage_Handler         ; MPU Fault Handler
 | 
			
		||||
                DCD     BusFault_Handler          ; Bus Fault Handler
 | 
			
		||||
                DCD     UsageFault_Handler        ; Usage Fault Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     SVC_Handler               ; SVCall Handler
 | 
			
		||||
                DCD     DebugMon_Handler          ; Debug Monitor Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     PendSV_Handler            ; PendSV Handler
 | 
			
		||||
                DCD     SysTick_Handler           ; SysTick Handler
 | 
			
		||||
 | 
			
		||||
                ; External Interrupts
 | 
			
		||||
                DCD     WDT_IRQHandler            ;  0:  Watchdog Timer
 | 
			
		||||
                DCD     RTC_IRQHandler            ;  1:  Real Time Clock
 | 
			
		||||
                DCD     TIM0_IRQHandler           ;  2:  Timer0 / Timer1
 | 
			
		||||
                DCD     TIM2_IRQHandler           ;  3:  Timer2 / Timer3
 | 
			
		||||
                DCD     MCIA_IRQHandler           ;  4:  MCIa
 | 
			
		||||
                DCD     MCIB_IRQHandler           ;  5:  MCIb
 | 
			
		||||
                DCD     UART0_IRQHandler          ;  6:  UART0 - DUT FPGA
 | 
			
		||||
                DCD     UART1_IRQHandler          ;  7:  UART1 - DUT FPGA
 | 
			
		||||
                DCD     UART2_IRQHandler          ;  8:  UART2 - DUT FPGA
 | 
			
		||||
                DCD     UART4_IRQHandler          ;  9:  UART4 - not connected
 | 
			
		||||
                DCD     AACI_IRQHandler           ; 10: AACI / AC97
 | 
			
		||||
                DCD     CLCD_IRQHandler           ; 11: CLCD Combined Interrupt
 | 
			
		||||
                DCD     ENET_IRQHandler           ; 12: Ethernet
 | 
			
		||||
                DCD     USBDC_IRQHandler          ; 13: USB Device
 | 
			
		||||
                DCD     USBHC_IRQHandler          ; 14: USB Host Controller
 | 
			
		||||
                DCD     CHLCD_IRQHandler          ; 15: Character LCD
 | 
			
		||||
                DCD     FLEXRAY_IRQHandler        ; 16: Flexray
 | 
			
		||||
                DCD     CAN_IRQHandler            ; 17: CAN
 | 
			
		||||
                DCD     LIN_IRQHandler            ; 18: LIN
 | 
			
		||||
                DCD     I2C_IRQHandler            ; 19: I2C ADC/DAC
 | 
			
		||||
                DCD     0                         ; 20: Reserved
 | 
			
		||||
                DCD     0                         ; 21: Reserved
 | 
			
		||||
                DCD     0                         ; 22: Reserved
 | 
			
		||||
                DCD     0                         ; 23: Reserved
 | 
			
		||||
                DCD     0                         ; 24: Reserved
 | 
			
		||||
                DCD     0                         ; 25: Reserved
 | 
			
		||||
                DCD     0                         ; 26: Reserved
 | 
			
		||||
                DCD     0                         ; 27: Reserved
 | 
			
		||||
                DCD     CPU_CLCD_IRQHandler       ; 28: Reserved - CPU FPGA CLCD
 | 
			
		||||
                DCD     0                         ; 29: Reserved - CPU FPGA
 | 
			
		||||
                DCD     UART3_IRQHandler          ; 30: UART3    - CPU FPGA
 | 
			
		||||
                DCD     SPI_IRQHandler            ; 31: SPI Touchscreen - CPU FPGA
 | 
			
		||||
__Vectors_End
 | 
			
		||||
 | 
			
		||||
__Vectors_Size  EQU     __Vectors_End - __Vectors
 | 
			
		||||
 | 
			
		||||
                AREA    |.text|, CODE, READONLY
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Reset Handler
 | 
			
		||||
 | 
			
		||||
Reset_Handler   PROC
 | 
			
		||||
                EXPORT  Reset_Handler             [WEAK]
 | 
			
		||||
                IMPORT  SystemInit
 | 
			
		||||
                IMPORT  __main
 | 
			
		||||
                LDR     R0, =SystemInit
 | 
			
		||||
                BLX     R0
 | 
			
		||||
                LDR     R0, =__main
 | 
			
		||||
                BX      R0
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Dummy Exception Handlers (infinite loops which can be modified)
 | 
			
		||||
 | 
			
		||||
NMI_Handler     PROC
 | 
			
		||||
                EXPORT  NMI_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
HardFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  HardFault_Handler         [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
MemManage_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  MemManage_Handler         [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
BusFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  BusFault_Handler          [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
UsageFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  UsageFault_Handler        [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SVC_Handler     PROC
 | 
			
		||||
                EXPORT  SVC_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
DebugMon_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  DebugMon_Handler          [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
PendSV_Handler  PROC
 | 
			
		||||
                EXPORT  PendSV_Handler            [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SysTick_Handler PROC
 | 
			
		||||
                EXPORT  SysTick_Handler           [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
Default_Handler PROC
 | 
			
		||||
 | 
			
		||||
                EXPORT  WDT_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  RTC_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  TIM0_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  TIM2_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  MCIA_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  MCIB_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  UART0_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART1_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART2_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART3_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART4_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  AACI_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  CLCD_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  ENET_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  USBDC_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  USBHC_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  CHLCD_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  FLEXRAY_IRQHandler        [WEAK]
 | 
			
		||||
                EXPORT  CAN_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  LIN_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  I2C_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  CPU_CLCD_IRQHandler       [WEAK]
 | 
			
		||||
                EXPORT  SPI_IRQHandler            [WEAK]
 | 
			
		||||
 | 
			
		||||
WDT_IRQHandler
 | 
			
		||||
RTC_IRQHandler
 | 
			
		||||
TIM0_IRQHandler
 | 
			
		||||
TIM2_IRQHandler
 | 
			
		||||
MCIA_IRQHandler
 | 
			
		||||
MCIB_IRQHandler
 | 
			
		||||
UART0_IRQHandler
 | 
			
		||||
UART1_IRQHandler
 | 
			
		||||
UART2_IRQHandler
 | 
			
		||||
UART3_IRQHandler
 | 
			
		||||
UART4_IRQHandler
 | 
			
		||||
AACI_IRQHandler
 | 
			
		||||
CLCD_IRQHandler
 | 
			
		||||
ENET_IRQHandler
 | 
			
		||||
USBDC_IRQHandler
 | 
			
		||||
USBHC_IRQHandler
 | 
			
		||||
CHLCD_IRQHandler
 | 
			
		||||
FLEXRAY_IRQHandler
 | 
			
		||||
CAN_IRQHandler
 | 
			
		||||
LIN_IRQHandler
 | 
			
		||||
I2C_IRQHandler
 | 
			
		||||
CPU_CLCD_IRQHandler
 | 
			
		||||
SPI_IRQHandler
 | 
			
		||||
                B       .
 | 
			
		||||
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; User Initial Stack & Heap
 | 
			
		||||
 | 
			
		||||
                IF      :DEF:__MICROLIB
 | 
			
		||||
 | 
			
		||||
                EXPORT  __initial_sp
 | 
			
		||||
                EXPORT  __heap_base
 | 
			
		||||
                EXPORT  __heap_limit
 | 
			
		||||
 | 
			
		||||
                ELSE
 | 
			
		||||
 | 
			
		||||
                IMPORT  __use_two_region_memory
 | 
			
		||||
                EXPORT  __user_initial_stackheap
 | 
			
		||||
 | 
			
		||||
__user_initial_stackheap PROC
 | 
			
		||||
                LDR     R0, =  Heap_Mem
 | 
			
		||||
                LDR     R1, =(Stack_Mem + Stack_Size)
 | 
			
		||||
                LDR     R2, = (Heap_Mem +  Heap_Size)
 | 
			
		||||
                LDR     R3, = Stack_Mem
 | 
			
		||||
                BX      LR
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
                ENDIF
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                END
 | 
			
		||||
@ -0,0 +1,83 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMCM4.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMCM4 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     08. April 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined (ARMCM4)
 | 
			
		||||
  #include "ARMCM4.h"
 | 
			
		||||
#elif defined (ARMCM4_FP)
 | 
			
		||||
  #include "ARMCM4_FP.h"
 | 
			
		||||
#else
 | 
			
		||||
  #error device not specified!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000U)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5 * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__FPU_USED) && (__FPU_USED == 1)
 | 
			
		||||
  SCB->CPACR |= ((3U << 10*2) |           /* set CP10 Full Access */
 | 
			
		||||
                 (3U << 11*2)  );         /* set CP11 Full Access */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef UNALIGNED_SUPPORT_DISABLE
 | 
			
		||||
  SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,295 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     startup_ARMCM7.s
 | 
			
		||||
 * @brief    CMSIS Core Device Startup File for
 | 
			
		||||
 *           ARMCM7 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     26. April 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Linker generated Symbols
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
extern uint32_t __etext;
 | 
			
		||||
extern uint32_t __data_start__;
 | 
			
		||||
extern uint32_t __data_end__;
 | 
			
		||||
extern uint32_t __copy_table_start__;
 | 
			
		||||
extern uint32_t __copy_table_end__;
 | 
			
		||||
extern uint32_t __zero_table_start__;
 | 
			
		||||
extern uint32_t __zero_table_end__;
 | 
			
		||||
extern uint32_t __bss_start__;
 | 
			
		||||
extern uint32_t __bss_end__;
 | 
			
		||||
extern uint32_t __StackTop;
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Exception / Interrupt Handler Function Prototype
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
typedef void( *pFunc )( void );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  External References
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#ifndef __START
 | 
			
		||||
extern void  _start(void) __attribute__((noreturn));    /* PreeMain (C library entry point) */
 | 
			
		||||
#else
 | 
			
		||||
extern int  __START(void) __attribute__((noreturn));    /* main entry point */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __NO_SYSTEM_INIT
 | 
			
		||||
extern void SystemInit (void);            /* CMSIS System Initialization      */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Internal References
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void Default_Handler(void);                          /* Default empty handler */
 | 
			
		||||
void Reset_Handler(void);                            /* Reset Handler */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  User Initial Stack & Heap
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#ifndef __STACK_SIZE
 | 
			
		||||
  #define	__STACK_SIZE  0x00000400
 | 
			
		||||
#endif
 | 
			
		||||
static uint8_t stack[__STACK_SIZE] __attribute__ ((aligned(8), used, section(".stack")));
 | 
			
		||||
 | 
			
		||||
#ifndef __HEAP_SIZE
 | 
			
		||||
  #define	__HEAP_SIZE   0x00000C00
 | 
			
		||||
#endif
 | 
			
		||||
#if __HEAP_SIZE > 0
 | 
			
		||||
static uint8_t heap[__HEAP_SIZE]   __attribute__ ((aligned(8), used, section(".heap")));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Exception / Interrupt Handler
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
/* Cortex-M7 Processor Exceptions */
 | 
			
		||||
void NMI_Handler         (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void HardFault_Handler   (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void MemManage_Handler   (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void BusFault_Handler    (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void UsageFault_Handler  (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void SVC_Handler         (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void DebugMon_Handler    (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void PendSV_Handler      (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void SysTick_Handler     (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
 | 
			
		||||
/* ARMCM7 Specific Interrupts */
 | 
			
		||||
void WDT_IRQHandler      (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void RTC_IRQHandler      (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void TIM0_IRQHandler     (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void TIM2_IRQHandler     (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void MCIA_IRQHandler     (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void MCIB_IRQHandler     (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void UART0_IRQHandler    (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void UART1_IRQHandler    (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void UART2_IRQHandler    (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void UART4_IRQHandler    (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void AACI_IRQHandler     (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void CLCD_IRQHandler     (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void ENET_IRQHandler     (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void USBDC_IRQHandler    (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void USBHC_IRQHandler    (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void CHLCD_IRQHandler    (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void FLEXRAY_IRQHandler  (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void CAN_IRQHandler      (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void LIN_IRQHandler      (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void I2C_IRQHandler      (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void CPU_CLCD_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void UART3_IRQHandler    (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
void SPI_IRQHandler      (void) __attribute__ ((weak, alias("Default_Handler")));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Exception / Interrupt Vector table
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
const pFunc __Vectors[] __attribute__ ((section(".vectors"))) = {
 | 
			
		||||
  /* Cortex-M7 Exceptions Handler */
 | 
			
		||||
  (pFunc)((uint32_t)&__StackTop),           /*      Initial Stack Pointer     */
 | 
			
		||||
  Reset_Handler,                            /*      Reset Handler             */
 | 
			
		||||
  NMI_Handler,                              /*      NMI Handler               */
 | 
			
		||||
  HardFault_Handler,                        /*      Hard Fault Handler        */
 | 
			
		||||
  MemManage_Handler,                        /*      MPU Fault Handler         */
 | 
			
		||||
  BusFault_Handler,                         /*      Bus Fault Handler         */
 | 
			
		||||
  UsageFault_Handler,                       /*      Usage Fault Handler       */
 | 
			
		||||
  0,                                        /*      Reserved                  */
 | 
			
		||||
  0,                                        /*      Reserved                  */
 | 
			
		||||
  0,                                        /*      Reserved                  */
 | 
			
		||||
  0,                                        /*      Reserved                  */
 | 
			
		||||
  SVC_Handler,                              /*      SVCall Handler            */
 | 
			
		||||
  DebugMon_Handler,                         /*      Debug Monitor Handler     */
 | 
			
		||||
  0,                                        /*      Reserved                  */
 | 
			
		||||
  PendSV_Handler,                           /*      PendSV Handler            */
 | 
			
		||||
  SysTick_Handler,                          /*      SysTick Handler           */
 | 
			
		||||
 | 
			
		||||
  /* External interrupts */
 | 
			
		||||
  WDT_IRQHandler,                           /*  0:  Watchdog Timer            */
 | 
			
		||||
  RTC_IRQHandler,                           /*  1:  Real Time Clock           */
 | 
			
		||||
  TIM0_IRQHandler,                          /*  2:  Timer0 / Timer1           */
 | 
			
		||||
  TIM2_IRQHandler,                          /*  3:  Timer2 / Timer3           */
 | 
			
		||||
  MCIA_IRQHandler,                          /*  4:  MCIa                      */
 | 
			
		||||
  MCIB_IRQHandler,                          /*  5:  MCIb                      */
 | 
			
		||||
  UART0_IRQHandler,                         /*  6:  UART0 - DUT FPGA          */
 | 
			
		||||
  UART1_IRQHandler,                         /*  7:  UART1 - DUT FPGA          */
 | 
			
		||||
  UART2_IRQHandler,                         /*  8:  UART2 - DUT FPGA          */
 | 
			
		||||
  UART4_IRQHandler,                         /*  9:  UART4 - not connected     */
 | 
			
		||||
  AACI_IRQHandler,                          /* 10: AACI / AC97                */
 | 
			
		||||
  CLCD_IRQHandler,                          /* 11: CLCD Combined Interrupt    */
 | 
			
		||||
  ENET_IRQHandler,                          /* 12: Ethernet                   */
 | 
			
		||||
  USBDC_IRQHandler,                         /* 13: USB Device                 */
 | 
			
		||||
  USBHC_IRQHandler,                         /* 14: USB Host Controller        */
 | 
			
		||||
  CHLCD_IRQHandler,                         /* 15: Character LCD              */
 | 
			
		||||
  FLEXRAY_IRQHandler,                       /* 16: Flexray                    */
 | 
			
		||||
  CAN_IRQHandler,                           /* 17: CAN                        */
 | 
			
		||||
  LIN_IRQHandler,                           /* 18: LIN                        */
 | 
			
		||||
  I2C_IRQHandler,                           /* 19: I2C ADC/DAC                */
 | 
			
		||||
  0,                                        /* 20: Reserved                   */
 | 
			
		||||
  0,                                        /* 21: Reserved                   */
 | 
			
		||||
  0,                                        /* 22: Reserved                   */
 | 
			
		||||
  0,                                        /* 23: Reserved                   */
 | 
			
		||||
  0,                                        /* 24: Reserved                   */
 | 
			
		||||
  0,                                        /* 25: Reserved                   */
 | 
			
		||||
  0,                                        /* 26: Reserved                   */
 | 
			
		||||
  0,                                        /* 27: Reserved                   */
 | 
			
		||||
  CPU_CLCD_IRQHandler,                      /* 28: Reserved - CPU FPGA CLCD   */
 | 
			
		||||
  0,                                        /* 29: Reserved - CPU FPGA        */
 | 
			
		||||
  UART3_IRQHandler,                         /* 30: UART3    - CPU FPGA        */
 | 
			
		||||
  SPI_IRQHandler                            /* 31: SPI Touchscreen - CPU FPGA */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Reset Handler called on controller reset
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void Reset_Handler(void) {
 | 
			
		||||
  uint32_t *pSrc, *pDest;
 | 
			
		||||
  uint32_t *pTable __attribute__((unused));
 | 
			
		||||
 | 
			
		||||
/*  Firstly it copies data from read only memory to RAM. There are two schemes
 | 
			
		||||
 *  to copy. One can copy more than one sections. Another can only copy
 | 
			
		||||
 *  one section.  The former scheme needs more instructions and read-only
 | 
			
		||||
 *  data to implement than the latter.
 | 
			
		||||
 *  Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes.  */
 | 
			
		||||
 | 
			
		||||
#ifdef __STARTUP_COPY_MULTIPLE
 | 
			
		||||
/*  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.
 | 
			
		||||
 */
 | 
			
		||||
  pTable = &__copy_table_start__;
 | 
			
		||||
 | 
			
		||||
  for (; pTable < &__copy_table_end__; pTable = pTable + 3) {
 | 
			
		||||
		pSrc  = (uint32_t*)*(pTable + 0);
 | 
			
		||||
		pDest = (uint32_t*)*(pTable + 1);
 | 
			
		||||
		for (; pDest < (uint32_t*)(*(pTable + 1) + *(pTable + 2)) ; ) {
 | 
			
		||||
      *pDest++ = *pSrc++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
/*  Single section scheme.
 | 
			
		||||
 *
 | 
			
		||||
 *  The ranges of copy from/to are specified by following symbols
 | 
			
		||||
 *    __etext: LMA of start of the section to copy from. Usually end of text
 | 
			
		||||
 *    __data_start__: VMA of start of the section to copy to
 | 
			
		||||
 *    __data_end__: VMA of end of the section to copy to
 | 
			
		||||
 *
 | 
			
		||||
 *  All addresses must be aligned to 4 bytes boundary.
 | 
			
		||||
 */
 | 
			
		||||
  pSrc  = &__etext;
 | 
			
		||||
  pDest = &__data_start__;
 | 
			
		||||
 | 
			
		||||
  for ( ; pDest < &__data_end__ ; ) {
 | 
			
		||||
    *pDest++ = *pSrc++;
 | 
			
		||||
  }
 | 
			
		||||
#endif /*__STARTUP_COPY_MULTIPLE */
 | 
			
		||||
 | 
			
		||||
/*  This part of work usually is done in C library startup code. Otherwise,
 | 
			
		||||
 *  define this macro to enable it in this startup.
 | 
			
		||||
 *
 | 
			
		||||
 *  There are two schemes too. One can clear multiple BSS sections. Another
 | 
			
		||||
 *  can only clear one section. The former is more size expensive than the
 | 
			
		||||
 *  latter.
 | 
			
		||||
 *
 | 
			
		||||
 *  Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former.
 | 
			
		||||
 *  Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef __STARTUP_CLEAR_BSS_MULTIPLE
 | 
			
		||||
/*  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
 | 
			
		||||
 */
 | 
			
		||||
  pTable = &__zero_table_start__;
 | 
			
		||||
 | 
			
		||||
  for (; pTable < &__zero_table_end__; pTable = pTable + 2) {
 | 
			
		||||
		pDest = (uint32_t*)*(pTable + 0);
 | 
			
		||||
		for (; pDest < (uint32_t*)(*(pTable + 0) + *(pTable + 1)) ; ) {
 | 
			
		||||
      *pDest++ = 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
#elif defined (__STARTUP_CLEAR_BSS)
 | 
			
		||||
/*  Single BSS section scheme.
 | 
			
		||||
 *
 | 
			
		||||
 *  The BSS section is specified by following symbols
 | 
			
		||||
 *    __bss_start__: start of the BSS section.
 | 
			
		||||
 *    __bss_end__: end of the BSS section.
 | 
			
		||||
 *
 | 
			
		||||
 *  Both addresses must be aligned to 4 bytes boundary.
 | 
			
		||||
 */
 | 
			
		||||
  pDest = &__bss_start__;
 | 
			
		||||
 | 
			
		||||
  for ( ; pDest < &__bss_end__ ; ) {
 | 
			
		||||
    *pDest++ = 0UL;
 | 
			
		||||
  }
 | 
			
		||||
#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */
 | 
			
		||||
 | 
			
		||||
#ifndef __NO_SYSTEM_INIT
 | 
			
		||||
	SystemInit();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __START
 | 
			
		||||
#define __START _start
 | 
			
		||||
#endif
 | 
			
		||||
	__START();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Default Handler for Exceptions / Interrupts
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void Default_Handler(void) {
 | 
			
		||||
 | 
			
		||||
	while(1);
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,262 @@
 | 
			
		||||
;/**************************************************************************//**
 | 
			
		||||
; * @file     startup_ARMCM7.s
 | 
			
		||||
; * @brief    CMSIS Core Device Startup File for
 | 
			
		||||
; *           ARMCM7 Device Series
 | 
			
		||||
; * @version  V5.00
 | 
			
		||||
; * @date     02. March 2016
 | 
			
		||||
; ******************************************************************************/
 | 
			
		||||
;/*
 | 
			
		||||
; * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
; *
 | 
			
		||||
; * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
; *
 | 
			
		||||
; * 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
 | 
			
		||||
; *
 | 
			
		||||
; * 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.
 | 
			
		||||
; */
 | 
			
		||||
 | 
			
		||||
;/*
 | 
			
		||||
;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
 | 
			
		||||
;*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Stack Configuration
 | 
			
		||||
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Stack_Size      EQU     0x00000400
 | 
			
		||||
 | 
			
		||||
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
Stack_Mem       SPACE   Stack_Size
 | 
			
		||||
__initial_sp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Heap Configuration
 | 
			
		||||
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Heap_Size       EQU     0x00080000
 | 
			
		||||
 | 
			
		||||
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
__heap_base
 | 
			
		||||
Heap_Mem        SPACE   Heap_Size
 | 
			
		||||
__heap_limit
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                PRESERVE8
 | 
			
		||||
                THUMB
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Vector Table Mapped to Address 0 at Reset
 | 
			
		||||
 | 
			
		||||
                AREA    RESET, DATA, READONLY
 | 
			
		||||
                EXPORT  __Vectors
 | 
			
		||||
                EXPORT  __Vectors_End
 | 
			
		||||
                EXPORT  __Vectors_Size
 | 
			
		||||
 | 
			
		||||
__Vectors       DCD     __initial_sp              ; Top of Stack
 | 
			
		||||
                DCD     Reset_Handler             ; Reset Handler
 | 
			
		||||
                DCD     NMI_Handler               ; NMI Handler
 | 
			
		||||
                DCD     HardFault_Handler         ; Hard Fault Handler
 | 
			
		||||
                DCD     MemManage_Handler         ; MPU Fault Handler
 | 
			
		||||
                DCD     BusFault_Handler          ; Bus Fault Handler
 | 
			
		||||
                DCD     UsageFault_Handler        ; Usage Fault Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     SVC_Handler               ; SVCall Handler
 | 
			
		||||
                DCD     DebugMon_Handler          ; Debug Monitor Handler
 | 
			
		||||
                DCD     0                         ; Reserved
 | 
			
		||||
                DCD     PendSV_Handler            ; PendSV Handler
 | 
			
		||||
                DCD     SysTick_Handler           ; SysTick Handler
 | 
			
		||||
 | 
			
		||||
                ; External Interrupts
 | 
			
		||||
                DCD     WDT_IRQHandler            ;  0:  Watchdog Timer
 | 
			
		||||
                DCD     RTC_IRQHandler            ;  1:  Real Time Clock
 | 
			
		||||
                DCD     TIM0_IRQHandler           ;  2:  Timer0 / Timer1
 | 
			
		||||
                DCD     TIM2_IRQHandler           ;  3:  Timer2 / Timer3
 | 
			
		||||
                DCD     MCIA_IRQHandler           ;  4:  MCIa
 | 
			
		||||
                DCD     MCIB_IRQHandler           ;  5:  MCIb
 | 
			
		||||
                DCD     UART0_IRQHandler          ;  6:  UART0 - DUT FPGA
 | 
			
		||||
                DCD     UART1_IRQHandler          ;  7:  UART1 - DUT FPGA
 | 
			
		||||
                DCD     UART2_IRQHandler          ;  8:  UART2 - DUT FPGA
 | 
			
		||||
                DCD     UART4_IRQHandler          ;  9:  UART4 - not connected
 | 
			
		||||
                DCD     AACI_IRQHandler           ; 10: AACI / AC97
 | 
			
		||||
                DCD     CLCD_IRQHandler           ; 11: CLCD Combined Interrupt
 | 
			
		||||
                DCD     ENET_IRQHandler           ; 12: Ethernet
 | 
			
		||||
                DCD     USBDC_IRQHandler          ; 13: USB Device
 | 
			
		||||
                DCD     USBHC_IRQHandler          ; 14: USB Host Controller
 | 
			
		||||
                DCD     CHLCD_IRQHandler          ; 15: Character LCD
 | 
			
		||||
                DCD     FLEXRAY_IRQHandler        ; 16: Flexray
 | 
			
		||||
                DCD     CAN_IRQHandler            ; 17: CAN
 | 
			
		||||
                DCD     LIN_IRQHandler            ; 18: LIN
 | 
			
		||||
                DCD     I2C_IRQHandler            ; 19: I2C ADC/DAC
 | 
			
		||||
                DCD     0                         ; 20: Reserved
 | 
			
		||||
                DCD     0                         ; 21: Reserved
 | 
			
		||||
                DCD     0                         ; 22: Reserved
 | 
			
		||||
                DCD     0                         ; 23: Reserved
 | 
			
		||||
                DCD     0                         ; 24: Reserved
 | 
			
		||||
                DCD     0                         ; 25: Reserved
 | 
			
		||||
                DCD     0                         ; 26: Reserved
 | 
			
		||||
                DCD     0                         ; 27: Reserved
 | 
			
		||||
                DCD     CPU_CLCD_IRQHandler       ; 28: Reserved - CPU FPGA CLCD
 | 
			
		||||
                DCD     0                         ; 29: Reserved - CPU FPGA
 | 
			
		||||
                DCD     UART3_IRQHandler          ; 30: UART3    - CPU FPGA
 | 
			
		||||
                DCD     SPI_IRQHandler            ; 31: SPI Touchscreen - CPU FPGA
 | 
			
		||||
__Vectors_End
 | 
			
		||||
 | 
			
		||||
__Vectors_Size  EQU     __Vectors_End - __Vectors
 | 
			
		||||
 | 
			
		||||
                AREA    |.text|, CODE, READONLY
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Reset Handler
 | 
			
		||||
 | 
			
		||||
Reset_Handler   PROC
 | 
			
		||||
                EXPORT  Reset_Handler             [WEAK]
 | 
			
		||||
                IMPORT  SystemInit
 | 
			
		||||
                IMPORT  __main
 | 
			
		||||
                LDR     R0, =SystemInit
 | 
			
		||||
                BLX     R0
 | 
			
		||||
                LDR     R0, =__main
 | 
			
		||||
                BX      R0
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Dummy Exception Handlers (infinite loops which can be modified)
 | 
			
		||||
 | 
			
		||||
NMI_Handler     PROC
 | 
			
		||||
                EXPORT  NMI_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
HardFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  HardFault_Handler         [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
MemManage_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  MemManage_Handler         [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
BusFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  BusFault_Handler          [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
UsageFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  UsageFault_Handler        [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SVC_Handler     PROC
 | 
			
		||||
                EXPORT  SVC_Handler               [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
DebugMon_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  DebugMon_Handler          [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
PendSV_Handler  PROC
 | 
			
		||||
                EXPORT  PendSV_Handler            [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SysTick_Handler PROC
 | 
			
		||||
                EXPORT  SysTick_Handler           [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
Default_Handler PROC
 | 
			
		||||
 | 
			
		||||
                EXPORT  WDT_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  RTC_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  TIM0_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  TIM2_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  MCIA_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  MCIB_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  UART0_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART1_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART2_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART3_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  UART4_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  AACI_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  CLCD_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  ENET_IRQHandler           [WEAK]
 | 
			
		||||
                EXPORT  USBDC_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  USBHC_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  CHLCD_IRQHandler          [WEAK]
 | 
			
		||||
                EXPORT  FLEXRAY_IRQHandler        [WEAK]
 | 
			
		||||
                EXPORT  CAN_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  LIN_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  I2C_IRQHandler            [WEAK]
 | 
			
		||||
                EXPORT  CPU_CLCD_IRQHandler       [WEAK]
 | 
			
		||||
                EXPORT  SPI_IRQHandler            [WEAK]
 | 
			
		||||
 | 
			
		||||
WDT_IRQHandler
 | 
			
		||||
RTC_IRQHandler
 | 
			
		||||
TIM0_IRQHandler
 | 
			
		||||
TIM2_IRQHandler
 | 
			
		||||
MCIA_IRQHandler
 | 
			
		||||
MCIB_IRQHandler
 | 
			
		||||
UART0_IRQHandler
 | 
			
		||||
UART1_IRQHandler
 | 
			
		||||
UART2_IRQHandler
 | 
			
		||||
UART3_IRQHandler
 | 
			
		||||
UART4_IRQHandler
 | 
			
		||||
AACI_IRQHandler
 | 
			
		||||
CLCD_IRQHandler
 | 
			
		||||
ENET_IRQHandler
 | 
			
		||||
USBDC_IRQHandler
 | 
			
		||||
USBHC_IRQHandler
 | 
			
		||||
CHLCD_IRQHandler
 | 
			
		||||
FLEXRAY_IRQHandler
 | 
			
		||||
CAN_IRQHandler
 | 
			
		||||
LIN_IRQHandler
 | 
			
		||||
I2C_IRQHandler
 | 
			
		||||
CPU_CLCD_IRQHandler
 | 
			
		||||
SPI_IRQHandler
 | 
			
		||||
                B       .
 | 
			
		||||
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; User Initial Stack & Heap
 | 
			
		||||
 | 
			
		||||
                IF      :DEF:__MICROLIB
 | 
			
		||||
 | 
			
		||||
                EXPORT  __initial_sp
 | 
			
		||||
                EXPORT  __heap_base
 | 
			
		||||
                EXPORT  __heap_limit
 | 
			
		||||
 | 
			
		||||
                ELSE
 | 
			
		||||
 | 
			
		||||
                IMPORT  __use_two_region_memory
 | 
			
		||||
                EXPORT  __user_initial_stackheap
 | 
			
		||||
 | 
			
		||||
__user_initial_stackheap PROC
 | 
			
		||||
                LDR     R0, =  Heap_Mem
 | 
			
		||||
                LDR     R1, =(Stack_Mem + Stack_Size)
 | 
			
		||||
                LDR     R2, = (Heap_Mem +  Heap_Size)
 | 
			
		||||
                LDR     R3, = Stack_Mem
 | 
			
		||||
                BX      LR
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
                ENDIF
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                END
 | 
			
		||||
@ -0,0 +1,85 @@
 | 
			
		||||
/**************************************************************************//**
 | 
			
		||||
 * @file     system_ARMCM7.c
 | 
			
		||||
 * @brief    CMSIS Device System Source File for
 | 
			
		||||
 *           ARMCM7 Device Series
 | 
			
		||||
 * @version  V5.00
 | 
			
		||||
 * @date     08. April 2016
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined (ARMCM7)
 | 
			
		||||
  #include "ARMCM7.h"
 | 
			
		||||
#elif defined (ARMCM7_SP)
 | 
			
		||||
  #include "ARMCM7_SP.h"
 | 
			
		||||
#elif defined (ARMCM7_DP)
 | 
			
		||||
  #include "ARMCM7_DP.h"
 | 
			
		||||
#else
 | 
			
		||||
  #error device not specified!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Define clocks
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#define  XTAL            ( 5000000U)      /* Oscillator frequency */
 | 
			
		||||
 | 
			
		||||
#define  SYSTEM_CLOCK    (5 * XTAL)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  Externals
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1)
 | 
			
		||||
  extern uint32_t __Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock Variable
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
uint32_t SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System Core Clock update function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemCoreClockUpdate (void)
 | 
			
		||||
{
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------------
 | 
			
		||||
  System initialization function
 | 
			
		||||
 *----------------------------------------------------------------------------*/
 | 
			
		||||
void SystemInit (void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1)
 | 
			
		||||
  SCB->VTOR = (uint32_t) &__Vectors;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__FPU_USED) && (__FPU_USED == 1)
 | 
			
		||||
  SCB->CPACR |= ((3U << 10*2) |           /* set CP10 Full Access */
 | 
			
		||||
                 (3U << 11*2)  );         /* set CP11 Full Access */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef UNALIGNED_SUPPORT_DISABLE
 | 
			
		||||
  SCB->CCR |= SCB_CCR_UNALIGN_TRP_Msk;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  SystemCoreClock = SYSTEM_CLOCK;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,395 @@
 | 
			
		||||
;******************** (C) COPYRIGHT 2016 STMicroelectronics ********************
 | 
			
		||||
;* File Name          : startup_stm32f411xe.s
 | 
			
		||||
;* Author             : MCD Application Team
 | 
			
		||||
;* Version            : V2.6.0
 | 
			
		||||
;* Date               : 04-November-2016
 | 
			
		||||
;* Description        : STM32F411xExx devices vector table for MDK-ARM toolchain. 
 | 
			
		||||
;*                      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()).
 | 
			
		||||
;*                      After Reset the CortexM4 processor is in Thread mode,
 | 
			
		||||
;*                      priority is Privileged, and the Stack is set to Main.
 | 
			
		||||
;* <<< Use Configuration Wizard in Context Menu >>>   
 | 
			
		||||
;*******************************************************************************
 | 
			
		||||
; 
 | 
			
		||||
;* Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
;* are permitted provided that the following conditions are met:
 | 
			
		||||
;*   1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
;*      this list of conditions and the following disclaimer.
 | 
			
		||||
;*   2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
;*      this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
;*      and/or other materials provided with the distribution.
 | 
			
		||||
;*   3. Neither the name of STMicroelectronics nor the names of its contributors
 | 
			
		||||
;*      may be used to endorse or promote products derived from this software
 | 
			
		||||
;*      without specific prior written permission.
 | 
			
		||||
;*
 | 
			
		||||
;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 | 
			
		||||
;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
			
		||||
;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | 
			
		||||
;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
			
		||||
;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
			
		||||
;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
; 
 | 
			
		||||
;*******************************************************************************
 | 
			
		||||
 | 
			
		||||
; Amount of memory (in bytes) allocated for Stack
 | 
			
		||||
; Tailor this value to your application needs
 | 
			
		||||
; <h> Stack Configuration
 | 
			
		||||
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Stack_Size      EQU     0x00000400
 | 
			
		||||
 | 
			
		||||
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
Stack_Mem       SPACE   Stack_Size
 | 
			
		||||
__initial_sp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; <h> Heap Configuration
 | 
			
		||||
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 | 
			
		||||
; </h>
 | 
			
		||||
 | 
			
		||||
Heap_Size       EQU     0x00000200
 | 
			
		||||
 | 
			
		||||
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
 | 
			
		||||
__heap_base
 | 
			
		||||
Heap_Mem        SPACE   Heap_Size
 | 
			
		||||
__heap_limit
 | 
			
		||||
 | 
			
		||||
                PRESERVE8
 | 
			
		||||
                THUMB
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
; Vector Table Mapped to Address 0 at Reset
 | 
			
		||||
                AREA    RESET, DATA, READONLY
 | 
			
		||||
                EXPORT  __Vectors
 | 
			
		||||
                EXPORT  __Vectors_End
 | 
			
		||||
                EXPORT  __Vectors_Size
 | 
			
		||||
 | 
			
		||||
__Vectors       DCD     __initial_sp               ; Top of Stack
 | 
			
		||||
                DCD     Reset_Handler              ; Reset Handler
 | 
			
		||||
                DCD     NMI_Handler                ; NMI Handler
 | 
			
		||||
                DCD     HardFault_Handler          ; Hard Fault Handler
 | 
			
		||||
                DCD     MemManage_Handler          ; MPU Fault Handler
 | 
			
		||||
                DCD     BusFault_Handler           ; Bus Fault Handler
 | 
			
		||||
                DCD     UsageFault_Handler         ; Usage Fault Handler
 | 
			
		||||
                DCD     0                          ; Reserved
 | 
			
		||||
                DCD     0                          ; Reserved
 | 
			
		||||
                DCD     0                          ; Reserved
 | 
			
		||||
                DCD     0                          ; Reserved
 | 
			
		||||
                DCD     SVC_Handler                ; SVCall Handler
 | 
			
		||||
                DCD     DebugMon_Handler           ; Debug Monitor Handler
 | 
			
		||||
                DCD     0                          ; Reserved
 | 
			
		||||
                DCD     PendSV_Handler             ; PendSV Handler
 | 
			
		||||
                DCD     SysTick_Handler            ; SysTick Handler
 | 
			
		||||
 | 
			
		||||
                ; External Interrupts
 | 
			
		||||
                DCD     WWDG_IRQHandler                   ; Window WatchDog                                        
 | 
			
		||||
                DCD     PVD_IRQHandler                    ; PVD through EXTI Line detection                        
 | 
			
		||||
                DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line            
 | 
			
		||||
                DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line                       
 | 
			
		||||
                DCD     FLASH_IRQHandler                  ; FLASH                                           
 | 
			
		||||
                DCD     RCC_IRQHandler                    ; RCC                                             
 | 
			
		||||
                DCD     EXTI0_IRQHandler                  ; EXTI Line0                                             
 | 
			
		||||
                DCD     EXTI1_IRQHandler                  ; EXTI Line1                                             
 | 
			
		||||
                DCD     EXTI2_IRQHandler                  ; EXTI Line2                                             
 | 
			
		||||
                DCD     EXTI3_IRQHandler                  ; EXTI Line3                                             
 | 
			
		||||
                DCD     EXTI4_IRQHandler                  ; EXTI Line4                                             
 | 
			
		||||
                DCD     DMA1_Stream0_IRQHandler           ; DMA1 Stream 0                                   
 | 
			
		||||
                DCD     DMA1_Stream1_IRQHandler           ; DMA1 Stream 1                                   
 | 
			
		||||
                DCD     DMA1_Stream2_IRQHandler           ; DMA1 Stream 2                                   
 | 
			
		||||
                DCD     DMA1_Stream3_IRQHandler           ; DMA1 Stream 3                                   
 | 
			
		||||
                DCD     DMA1_Stream4_IRQHandler           ; DMA1 Stream 4                                   
 | 
			
		||||
                DCD     DMA1_Stream5_IRQHandler           ; DMA1 Stream 5                                   
 | 
			
		||||
                DCD     DMA1_Stream6_IRQHandler           ; DMA1 Stream 6                                   
 | 
			
		||||
                DCD     ADC_IRQHandler                    ; ADC1, ADC2 and ADC3s                            
 | 
			
		||||
                DCD     0                                 ; Reserved                                                
 | 
			
		||||
                DCD     0                                 ; Reserved                                               
 | 
			
		||||
                DCD     0                                 ; Reserved                                             
 | 
			
		||||
                DCD     0                                 ; Reserved                                               
 | 
			
		||||
                DCD     EXTI9_5_IRQHandler                ; External Line[9:5]s                                    
 | 
			
		||||
                DCD     TIM1_BRK_TIM9_IRQHandler          ; TIM1 Break and TIM9                   
 | 
			
		||||
                DCD     TIM1_UP_TIM10_IRQHandler          ; TIM1 Update and TIM10                 
 | 
			
		||||
                DCD     TIM1_TRG_COM_TIM11_IRQHandler     ; TIM1 Trigger and Commutation and TIM11
 | 
			
		||||
                DCD     TIM1_CC_IRQHandler                ; TIM1 Capture Compare                                   
 | 
			
		||||
                DCD     TIM2_IRQHandler                   ; TIM2                                            
 | 
			
		||||
                DCD     TIM3_IRQHandler                   ; TIM3                                            
 | 
			
		||||
                DCD     TIM4_IRQHandler                   ; TIM4                                            
 | 
			
		||||
                DCD     I2C1_EV_IRQHandler                ; I2C1 Event                                             
 | 
			
		||||
                DCD     I2C1_ER_IRQHandler                ; I2C1 Error                                             
 | 
			
		||||
                DCD     I2C2_EV_IRQHandler                ; I2C2 Event                                             
 | 
			
		||||
                DCD     I2C2_ER_IRQHandler                ; I2C2 Error                                               
 | 
			
		||||
                DCD     SPI1_IRQHandler                   ; SPI1                                            
 | 
			
		||||
                DCD     SPI2_IRQHandler                   ; SPI2                                            
 | 
			
		||||
                DCD     USART1_IRQHandler                 ; USART1                                          
 | 
			
		||||
                DCD     USART2_IRQHandler                 ; USART2                                          
 | 
			
		||||
                DCD     0                                 ; Reserved                                          
 | 
			
		||||
                DCD     EXTI15_10_IRQHandler              ; External Line[15:10]s                                  
 | 
			
		||||
                DCD     RTC_Alarm_IRQHandler              ; RTC Alarm (A and B) through EXTI Line                  
 | 
			
		||||
                DCD     OTG_FS_WKUP_IRQHandler            ; USB OTG FS Wakeup through EXTI line                        
 | 
			
		||||
                DCD     0                                 ; Reserved                  
 | 
			
		||||
                DCD     0                                 ; Reserved                 
 | 
			
		||||
                DCD     0                                 ; Reserved
 | 
			
		||||
                DCD     0                                 ; Reserved                                   
 | 
			
		||||
                DCD     DMA1_Stream7_IRQHandler           ; DMA1 Stream7                                           
 | 
			
		||||
                DCD     0                                 ; Reserved                                             
 | 
			
		||||
                DCD     SDIO_IRQHandler                   ; SDIO                                            
 | 
			
		||||
                DCD     TIM5_IRQHandler                   ; TIM5                                            
 | 
			
		||||
                DCD     SPI3_IRQHandler                   ; SPI3                                            
 | 
			
		||||
                DCD     0                                 ; Reserved                                           
 | 
			
		||||
                DCD     0                                 ; Reserved                                           
 | 
			
		||||
                DCD     0                                 ; Reserved                   
 | 
			
		||||
                DCD     0                                 ; Reserved                   
 | 
			
		||||
                DCD     DMA2_Stream0_IRQHandler           ; DMA2 Stream 0                                   
 | 
			
		||||
                DCD     DMA2_Stream1_IRQHandler           ; DMA2 Stream 1                                   
 | 
			
		||||
                DCD     DMA2_Stream2_IRQHandler           ; DMA2 Stream 2                                   
 | 
			
		||||
                DCD     DMA2_Stream3_IRQHandler           ; DMA2 Stream 3                                   
 | 
			
		||||
                DCD     DMA2_Stream4_IRQHandler           ; DMA2 Stream 4
 | 
			
		||||
                DCD     0                                 ; Reserved  
 | 
			
		||||
                DCD     0                                 ; Reserved  
 | 
			
		||||
                DCD     0                                 ; Reserved                                              
 | 
			
		||||
                DCD     0                                 ; Reserved                                               
 | 
			
		||||
                DCD     0                                 ; Reserved                                               
 | 
			
		||||
                DCD     0                                 ; Reserved                                               
 | 
			
		||||
                DCD     OTG_FS_IRQHandler                 ; USB OTG FS                                      
 | 
			
		||||
                DCD     DMA2_Stream5_IRQHandler           ; DMA2 Stream 5                                   
 | 
			
		||||
                DCD     DMA2_Stream6_IRQHandler           ; DMA2 Stream 6                                   
 | 
			
		||||
                DCD     DMA2_Stream7_IRQHandler           ; DMA2 Stream 7                                   
 | 
			
		||||
                DCD     USART6_IRQHandler                 ; USART6                                           
 | 
			
		||||
                DCD     I2C3_EV_IRQHandler                ; I2C3 event                                             
 | 
			
		||||
                DCD     I2C3_ER_IRQHandler                ; I2C3 error                                             
 | 
			
		||||
                DCD     0                                 ; Reserved                     
 | 
			
		||||
                DCD     0                                 ; Reserved                       
 | 
			
		||||
                DCD     0                                 ; Reserved                         
 | 
			
		||||
                DCD     0                                 ; Reserved                                    
 | 
			
		||||
                DCD     0                                 ; Reserved  
 | 
			
		||||
                DCD     0                                 ; Reserved				                              
 | 
			
		||||
                DCD     0                                 ; Reserved
 | 
			
		||||
                DCD     FPU_IRQHandler                    ; FPU
 | 
			
		||||
                DCD     0                                 ; Reserved
 | 
			
		||||
		        DCD     0                                 ; Reserved
 | 
			
		||||
		        DCD     SPI4_IRQHandler                   ; SPI4
 | 
			
		||||
				DCD     SPI5_IRQHandler                   ; SPI5
 | 
			
		||||
                                         
 | 
			
		||||
__Vectors_End
 | 
			
		||||
 | 
			
		||||
__Vectors_Size  EQU  __Vectors_End - __Vectors
 | 
			
		||||
 | 
			
		||||
                AREA    |.text|, CODE, READONLY
 | 
			
		||||
 | 
			
		||||
; Reset handler
 | 
			
		||||
Reset_Handler    PROC
 | 
			
		||||
                 EXPORT  Reset_Handler             [WEAK]
 | 
			
		||||
        IMPORT  SystemInit
 | 
			
		||||
        IMPORT  __main
 | 
			
		||||
 | 
			
		||||
                 LDR     R0, =SystemInit
 | 
			
		||||
                 BLX     R0
 | 
			
		||||
                 LDR     R0, =__main
 | 
			
		||||
                 BX      R0
 | 
			
		||||
                 ENDP
 | 
			
		||||
 | 
			
		||||
; Dummy Exception Handlers (infinite loops which can be modified)
 | 
			
		||||
 | 
			
		||||
NMI_Handler     PROC
 | 
			
		||||
                EXPORT  NMI_Handler                [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
HardFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  HardFault_Handler          [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
MemManage_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  MemManage_Handler          [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
BusFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  BusFault_Handler           [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
UsageFault_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  UsageFault_Handler         [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SVC_Handler     PROC
 | 
			
		||||
                EXPORT  SVC_Handler                [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
DebugMon_Handler\
 | 
			
		||||
                PROC
 | 
			
		||||
                EXPORT  DebugMon_Handler           [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
PendSV_Handler  PROC
 | 
			
		||||
                EXPORT  PendSV_Handler             [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
SysTick_Handler PROC
 | 
			
		||||
                EXPORT  SysTick_Handler            [WEAK]
 | 
			
		||||
                B       .
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
Default_Handler PROC
 | 
			
		||||
 | 
			
		||||
                EXPORT  WWDG_IRQHandler                   [WEAK]                                        
 | 
			
		||||
                EXPORT  PVD_IRQHandler                    [WEAK]                      
 | 
			
		||||
                EXPORT  TAMP_STAMP_IRQHandler             [WEAK]         
 | 
			
		||||
                EXPORT  RTC_WKUP_IRQHandler               [WEAK]                     
 | 
			
		||||
                EXPORT  FLASH_IRQHandler                  [WEAK]                                         
 | 
			
		||||
                EXPORT  RCC_IRQHandler                    [WEAK]                                            
 | 
			
		||||
                EXPORT  EXTI0_IRQHandler                  [WEAK]                                            
 | 
			
		||||
                EXPORT  EXTI1_IRQHandler                  [WEAK]                                             
 | 
			
		||||
                EXPORT  EXTI2_IRQHandler                  [WEAK]                                            
 | 
			
		||||
                EXPORT  EXTI3_IRQHandler                  [WEAK]                                           
 | 
			
		||||
                EXPORT  EXTI4_IRQHandler                  [WEAK]                                            
 | 
			
		||||
                EXPORT  DMA1_Stream0_IRQHandler           [WEAK]                                
 | 
			
		||||
                EXPORT  DMA1_Stream1_IRQHandler           [WEAK]                                   
 | 
			
		||||
                EXPORT  DMA1_Stream2_IRQHandler           [WEAK]                                   
 | 
			
		||||
                EXPORT  DMA1_Stream3_IRQHandler           [WEAK]                                   
 | 
			
		||||
                EXPORT  DMA1_Stream4_IRQHandler           [WEAK]                                   
 | 
			
		||||
                EXPORT  DMA1_Stream5_IRQHandler           [WEAK]                                   
 | 
			
		||||
                EXPORT  DMA1_Stream6_IRQHandler           [WEAK]                                   
 | 
			
		||||
                EXPORT  ADC_IRQHandler                    [WEAK]                                                                        
 | 
			
		||||
                EXPORT  EXTI9_5_IRQHandler                [WEAK]                                    
 | 
			
		||||
                EXPORT  TIM1_BRK_TIM9_IRQHandler          [WEAK]                  
 | 
			
		||||
                EXPORT  TIM1_UP_TIM10_IRQHandler          [WEAK]                
 | 
			
		||||
                EXPORT  TIM1_TRG_COM_TIM11_IRQHandler     [WEAK] 
 | 
			
		||||
                EXPORT  TIM1_CC_IRQHandler                [WEAK]                                   
 | 
			
		||||
                EXPORT  TIM2_IRQHandler                   [WEAK]                                            
 | 
			
		||||
                EXPORT  TIM3_IRQHandler                   [WEAK]                                            
 | 
			
		||||
                EXPORT  TIM4_IRQHandler                   [WEAK]                                            
 | 
			
		||||
                EXPORT  I2C1_EV_IRQHandler                [WEAK]                                             
 | 
			
		||||
                EXPORT  I2C1_ER_IRQHandler                [WEAK]                                             
 | 
			
		||||
                EXPORT  I2C2_EV_IRQHandler                [WEAK]                                            
 | 
			
		||||
                EXPORT  I2C2_ER_IRQHandler                [WEAK]                                               
 | 
			
		||||
                EXPORT  SPI1_IRQHandler                   [WEAK]                                           
 | 
			
		||||
                EXPORT  SPI2_IRQHandler                   [WEAK]                                            
 | 
			
		||||
                EXPORT  USART1_IRQHandler                 [WEAK]                                          
 | 
			
		||||
                EXPORT  USART2_IRQHandler                 [WEAK]                                                                                  
 | 
			
		||||
                EXPORT  EXTI15_10_IRQHandler              [WEAK]                                  
 | 
			
		||||
                EXPORT  RTC_Alarm_IRQHandler              [WEAK]                  
 | 
			
		||||
                EXPORT  OTG_FS_WKUP_IRQHandler            [WEAK]                        
 | 
			
		||||
                EXPORT  DMA1_Stream7_IRQHandler           [WEAK]                                                                                     
 | 
			
		||||
                EXPORT  SDIO_IRQHandler                   [WEAK]                                             
 | 
			
		||||
                EXPORT  TIM5_IRQHandler                   [WEAK]                                             
 | 
			
		||||
                EXPORT  SPI3_IRQHandler                   [WEAK]                                                               
 | 
			
		||||
                EXPORT  DMA2_Stream0_IRQHandler           [WEAK]                                  
 | 
			
		||||
                EXPORT  DMA2_Stream1_IRQHandler           [WEAK]                                   
 | 
			
		||||
                EXPORT  DMA2_Stream2_IRQHandler           [WEAK]                                    
 | 
			
		||||
                EXPORT  DMA2_Stream3_IRQHandler           [WEAK]                                    
 | 
			
		||||
                EXPORT  DMA2_Stream4_IRQHandler           [WEAK]                                                                                                     
 | 
			
		||||
                EXPORT  OTG_FS_IRQHandler                 [WEAK]                                       
 | 
			
		||||
                EXPORT  DMA2_Stream5_IRQHandler           [WEAK]                                   
 | 
			
		||||
                EXPORT  DMA2_Stream6_IRQHandler           [WEAK]                                   
 | 
			
		||||
                EXPORT  DMA2_Stream7_IRQHandler           [WEAK]                                   
 | 
			
		||||
                EXPORT  USART6_IRQHandler                 [WEAK]                                           
 | 
			
		||||
                EXPORT  I2C3_EV_IRQHandler                [WEAK]                                              
 | 
			
		||||
                EXPORT  I2C3_ER_IRQHandler                [WEAK]                                              
 | 
			
		||||
                EXPORT  FPU_IRQHandler                    [WEAK]
 | 
			
		||||
				EXPORT  SPI4_IRQHandler                   [WEAK]
 | 
			
		||||
                EXPORT  SPI5_IRQHandler                   [WEAK]
 | 
			
		||||
 | 
			
		||||
WWDG_IRQHandler                                                       
 | 
			
		||||
PVD_IRQHandler                                      
 | 
			
		||||
TAMP_STAMP_IRQHandler                  
 | 
			
		||||
RTC_WKUP_IRQHandler                                
 | 
			
		||||
FLASH_IRQHandler                                                       
 | 
			
		||||
RCC_IRQHandler                                                            
 | 
			
		||||
EXTI0_IRQHandler                                                          
 | 
			
		||||
EXTI1_IRQHandler                                                           
 | 
			
		||||
EXTI2_IRQHandler                                                          
 | 
			
		||||
EXTI3_IRQHandler                                                         
 | 
			
		||||
EXTI4_IRQHandler                                                          
 | 
			
		||||
DMA1_Stream0_IRQHandler                                       
 | 
			
		||||
DMA1_Stream1_IRQHandler                                          
 | 
			
		||||
DMA1_Stream2_IRQHandler                                          
 | 
			
		||||
DMA1_Stream3_IRQHandler                                          
 | 
			
		||||
DMA1_Stream4_IRQHandler                                          
 | 
			
		||||
DMA1_Stream5_IRQHandler                                          
 | 
			
		||||
DMA1_Stream6_IRQHandler                                          
 | 
			
		||||
ADC_IRQHandler                                                                                                    
 | 
			
		||||
EXTI9_5_IRQHandler                                                
 | 
			
		||||
TIM1_BRK_TIM9_IRQHandler                        
 | 
			
		||||
TIM1_UP_TIM10_IRQHandler                      
 | 
			
		||||
TIM1_TRG_COM_TIM11_IRQHandler  
 | 
			
		||||
TIM1_CC_IRQHandler                                               
 | 
			
		||||
TIM2_IRQHandler                                                           
 | 
			
		||||
TIM3_IRQHandler                                                           
 | 
			
		||||
TIM4_IRQHandler                                                           
 | 
			
		||||
I2C1_EV_IRQHandler                                                         
 | 
			
		||||
I2C1_ER_IRQHandler                                                         
 | 
			
		||||
I2C2_EV_IRQHandler                                                        
 | 
			
		||||
I2C2_ER_IRQHandler                                                           
 | 
			
		||||
SPI1_IRQHandler                                                          
 | 
			
		||||
SPI2_IRQHandler                                                           
 | 
			
		||||
USART1_IRQHandler                                                       
 | 
			
		||||
USART2_IRQHandler                                                                                                           
 | 
			
		||||
EXTI15_10_IRQHandler                                            
 | 
			
		||||
RTC_Alarm_IRQHandler                            
 | 
			
		||||
OTG_FS_WKUP_IRQHandler                                                                           
 | 
			
		||||
DMA1_Stream7_IRQHandler                                                                                                             
 | 
			
		||||
SDIO_IRQHandler                                                            
 | 
			
		||||
TIM5_IRQHandler                                                            
 | 
			
		||||
SPI3_IRQHandler                                                                                     
 | 
			
		||||
DMA2_Stream0_IRQHandler                                         
 | 
			
		||||
DMA2_Stream1_IRQHandler                                          
 | 
			
		||||
DMA2_Stream2_IRQHandler                                           
 | 
			
		||||
DMA2_Stream3_IRQHandler                                           
 | 
			
		||||
DMA2_Stream4_IRQHandler                                                                                                                                  
 | 
			
		||||
OTG_FS_IRQHandler                                                    
 | 
			
		||||
DMA2_Stream5_IRQHandler                                          
 | 
			
		||||
DMA2_Stream6_IRQHandler                                          
 | 
			
		||||
DMA2_Stream7_IRQHandler                                          
 | 
			
		||||
USART6_IRQHandler                                                        
 | 
			
		||||
I2C3_EV_IRQHandler                                                          
 | 
			
		||||
I2C3_ER_IRQHandler                                                          
 | 
			
		||||
FPU_IRQHandler
 | 
			
		||||
SPI4_IRQHandler
 | 
			
		||||
SPI5_IRQHandler
 | 
			
		||||
 | 
			
		||||
                B       .
 | 
			
		||||
 | 
			
		||||
                ENDP
 | 
			
		||||
 | 
			
		||||
                ALIGN
 | 
			
		||||
 | 
			
		||||
;*******************************************************************************
 | 
			
		||||
; User Stack and Heap initialization
 | 
			
		||||
;*******************************************************************************
 | 
			
		||||
                 IF      :DEF:__MICROLIB
 | 
			
		||||
                
 | 
			
		||||
                 EXPORT  __initial_sp
 | 
			
		||||
                 EXPORT  __heap_base
 | 
			
		||||
                 EXPORT  __heap_limit
 | 
			
		||||
                
 | 
			
		||||
                 ELSE
 | 
			
		||||
                
 | 
			
		||||
                 IMPORT  __use_two_region_memory
 | 
			
		||||
                 EXPORT  __user_initial_stackheap
 | 
			
		||||
                 
 | 
			
		||||
__user_initial_stackheap
 | 
			
		||||
 | 
			
		||||
                 LDR     R0, =  Heap_Mem
 | 
			
		||||
                 LDR     R1, =(Stack_Mem + Stack_Size)
 | 
			
		||||
                 LDR     R2, = (Heap_Mem +  Heap_Size)
 | 
			
		||||
                 LDR     R3, = Stack_Mem
 | 
			
		||||
                 BX      LR
 | 
			
		||||
 | 
			
		||||
                 ALIGN
 | 
			
		||||
 | 
			
		||||
                 ENDIF
 | 
			
		||||
 | 
			
		||||
                 END
 | 
			
		||||
 | 
			
		||||
;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
 | 
			
		||||
@ -0,0 +1,763 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file    system_stm32f4xx.c
 | 
			
		||||
  * @author  MCD Application Team
 | 
			
		||||
  * @version V2.6.0
 | 
			
		||||
  * @date    04-November-2016
 | 
			
		||||
  * @brief   CMSIS Cortex-M4 Device Peripheral Access Layer System Source File.
 | 
			
		||||
  *
 | 
			
		||||
  *   This file provides two functions and one global variable to be called from 
 | 
			
		||||
  *   user application:
 | 
			
		||||
  *      - SystemInit(): This function is called at startup just after reset and 
 | 
			
		||||
  *                      before branch to main program. This call is made inside
 | 
			
		||||
  *                      the "startup_stm32f4xx.s" file.
 | 
			
		||||
  *
 | 
			
		||||
  *      - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
 | 
			
		||||
  *                                  by the user application to setup the SysTick 
 | 
			
		||||
  *                                  timer or configure other parameters.
 | 
			
		||||
  *                                     
 | 
			
		||||
  *      - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
 | 
			
		||||
  *                                 be called whenever the core clock is changed
 | 
			
		||||
  *                                 during program execution.
 | 
			
		||||
  *
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * <h2><center>© COPYRIGHT 2016 STMicroelectronics</center></h2>
 | 
			
		||||
  *
 | 
			
		||||
  * Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
  * are permitted provided that the following conditions are met:
 | 
			
		||||
  *   1. Redistributions of source code must retain the above copyright notice,
 | 
			
		||||
  *      this list of conditions and the following disclaimer.
 | 
			
		||||
  *   2. Redistributions in binary form must reproduce the above copyright notice,
 | 
			
		||||
  *      this list of conditions and the following disclaimer in the documentation
 | 
			
		||||
  *      and/or other materials provided with the distribution.
 | 
			
		||||
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
 | 
			
		||||
  *      may be used to endorse or promote products derived from this software
 | 
			
		||||
  *      without specific prior written permission.
 | 
			
		||||
  *
 | 
			
		||||
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
			
		||||
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 | 
			
		||||
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
			
		||||
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | 
			
		||||
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
			
		||||
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | 
			
		||||
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup CMSIS
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup stm32f4xx_system
 | 
			
		||||
  * @{
 | 
			
		||||
  */  
 | 
			
		||||
  
 | 
			
		||||
/** @addtogroup STM32F4xx_System_Private_Includes
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "stm32f4xx.h"
 | 
			
		||||
 | 
			
		||||
#if !defined  (HSE_VALUE) 
 | 
			
		||||
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */
 | 
			
		||||
#endif /* HSE_VALUE */
 | 
			
		||||
 | 
			
		||||
#if !defined  (HSI_VALUE)
 | 
			
		||||
  #define HSI_VALUE    ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
 | 
			
		||||
#endif /* HSI_VALUE */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32F4xx_System_Private_TypesDefinitions
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32F4xx_System_Private_Defines
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/************************* Miscellaneous Configuration ************************/
 | 
			
		||||
/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory  */
 | 
			
		||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\
 | 
			
		||||
 || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
 | 
			
		||||
 || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx)
 | 
			
		||||
/* #define DATA_IN_ExtSRAM */
 | 
			
		||||
#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\
 | 
			
		||||
          STM32F412Zx || STM32F412Vx */
 | 
			
		||||
 
 | 
			
		||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
 | 
			
		||||
 || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx)
 | 
			
		||||
/* #define DATA_IN_ExtSDRAM */
 | 
			
		||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\
 | 
			
		||||
          STM32F479xx */
 | 
			
		||||
 | 
			
		||||
/*!< Uncomment the following line if you need to relocate your vector Table in
 | 
			
		||||
     Internal SRAM. */
 | 
			
		||||
/* #define VECT_TAB_SRAM */
 | 
			
		||||
#define VECT_TAB_OFFSET  0x00 /*!< Vector Table base offset field. 
 | 
			
		||||
                                   This value must be a multiple of 0x200. */
 | 
			
		||||
/******************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32F4xx_System_Private_Macros
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32F4xx_System_Private_Variables
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
  /* This variable is updated in three ways:
 | 
			
		||||
      1) by calling CMSIS function SystemCoreClockUpdate()
 | 
			
		||||
      2) by calling HAL API function HAL_RCC_GetHCLKFreq()
 | 
			
		||||
      3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency 
 | 
			
		||||
         Note: If you use this function to configure the system clock; then there
 | 
			
		||||
               is no need to call the 2 first functions listed above, since SystemCoreClock
 | 
			
		||||
               variable is updated automatically.
 | 
			
		||||
  */
 | 
			
		||||
uint32_t SystemCoreClock = 16000000;
 | 
			
		||||
const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
 | 
			
		||||
const uint8_t APBPrescTable[8]  = {0, 0, 0, 0, 1, 2, 3, 4};
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
 | 
			
		||||
  static void SystemInit_ExtMemCtl(void); 
 | 
			
		||||
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32F4xx_System_Private_Functions
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Setup the microcontroller system
 | 
			
		||||
  *         Initialize the FPU setting, vector table location and External memory 
 | 
			
		||||
  *         configuration.
 | 
			
		||||
  * @param  None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void SystemInit(void)
 | 
			
		||||
{
 | 
			
		||||
  /* FPU settings ------------------------------------------------------------*/
 | 
			
		||||
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
 | 
			
		||||
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
 | 
			
		||||
  #endif
 | 
			
		||||
  /* Reset the RCC clock configuration to the default reset state ------------*/
 | 
			
		||||
  /* Set HSION bit */
 | 
			
		||||
  RCC->CR |= (uint32_t)0x00000001;
 | 
			
		||||
 | 
			
		||||
  /* Reset CFGR register */
 | 
			
		||||
  RCC->CFGR = 0x00000000;
 | 
			
		||||
 | 
			
		||||
  /* Reset HSEON, CSSON and PLLON bits */
 | 
			
		||||
  RCC->CR &= (uint32_t)0xFEF6FFFF;
 | 
			
		||||
 | 
			
		||||
  /* Reset PLLCFGR register */
 | 
			
		||||
  RCC->PLLCFGR = 0x24003010;
 | 
			
		||||
 | 
			
		||||
  /* Reset HSEBYP bit */
 | 
			
		||||
  RCC->CR &= (uint32_t)0xFFFBFFFF;
 | 
			
		||||
 | 
			
		||||
  /* Disable all interrupts */
 | 
			
		||||
  RCC->CIR = 0x00000000;
 | 
			
		||||
 | 
			
		||||
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
 | 
			
		||||
  SystemInit_ExtMemCtl(); 
 | 
			
		||||
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
 | 
			
		||||
 | 
			
		||||
  /* Configure the Vector Table location add offset address ------------------*/
 | 
			
		||||
#ifdef VECT_TAB_SRAM
 | 
			
		||||
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
 | 
			
		||||
#else
 | 
			
		||||
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
   * @brief  Update SystemCoreClock variable according to Clock Register Values.
 | 
			
		||||
  *         The SystemCoreClock variable contains the core clock (HCLK), it can
 | 
			
		||||
  *         be used by the user application to setup the SysTick timer or configure
 | 
			
		||||
  *         other parameters.
 | 
			
		||||
  *           
 | 
			
		||||
  * @note   Each time the core clock (HCLK) changes, this function must be called
 | 
			
		||||
  *         to update SystemCoreClock variable value. Otherwise, any configuration
 | 
			
		||||
  *         based on this variable will be incorrect.         
 | 
			
		||||
  *     
 | 
			
		||||
  * @note   - The system frequency computed by this function is not the real 
 | 
			
		||||
  *           frequency in the chip. It is calculated based on the predefined 
 | 
			
		||||
  *           constant and the selected clock source:
 | 
			
		||||
  *             
 | 
			
		||||
  *           - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
 | 
			
		||||
  *                                              
 | 
			
		||||
  *           - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
 | 
			
		||||
  *                          
 | 
			
		||||
  *           - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) 
 | 
			
		||||
  *             or HSI_VALUE(*) multiplied/divided by the PLL factors.
 | 
			
		||||
  *         
 | 
			
		||||
  *         (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value
 | 
			
		||||
  *             16 MHz) but the real value may vary depending on the variations
 | 
			
		||||
  *             in voltage and temperature.   
 | 
			
		||||
  *    
 | 
			
		||||
  *         (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value
 | 
			
		||||
  *              depends on the application requirements), user has to ensure that HSE_VALUE
 | 
			
		||||
  *              is same as the real frequency of the crystal used. Otherwise, this function
 | 
			
		||||
  *              may have wrong result.
 | 
			
		||||
  *                
 | 
			
		||||
  *         - The result of this function could be not correct when using fractional
 | 
			
		||||
  *           value for HSE crystal.
 | 
			
		||||
  *     
 | 
			
		||||
  * @param  None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void SystemCoreClockUpdate(void)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
 | 
			
		||||
  
 | 
			
		||||
  /* Get SYSCLK source -------------------------------------------------------*/
 | 
			
		||||
  tmp = RCC->CFGR & RCC_CFGR_SWS;
 | 
			
		||||
 | 
			
		||||
  switch (tmp)
 | 
			
		||||
  {
 | 
			
		||||
    case 0x00:  /* HSI used as system clock source */
 | 
			
		||||
      SystemCoreClock = HSI_VALUE;
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x04:  /* HSE used as system clock source */
 | 
			
		||||
      SystemCoreClock = HSE_VALUE;
 | 
			
		||||
      break;
 | 
			
		||||
    case 0x08:  /* PLL used as system clock source */
 | 
			
		||||
 | 
			
		||||
      /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
 | 
			
		||||
         SYSCLK = PLL_VCO / PLL_P
 | 
			
		||||
         */    
 | 
			
		||||
      pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
 | 
			
		||||
      pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
 | 
			
		||||
      
 | 
			
		||||
      if (pllsource != 0)
 | 
			
		||||
      {
 | 
			
		||||
        /* HSE used as PLL clock source */
 | 
			
		||||
        pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        /* HSI used as PLL clock source */
 | 
			
		||||
        pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
 | 
			
		||||
      SystemCoreClock = pllvco/pllp;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      SystemCoreClock = HSI_VALUE;
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
  /* Compute HCLK frequency --------------------------------------------------*/
 | 
			
		||||
  /* Get HCLK prescaler */
 | 
			
		||||
  tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
 | 
			
		||||
  /* HCLK frequency */
 | 
			
		||||
  SystemCoreClock >>= tmp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM)
 | 
			
		||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
 | 
			
		||||
 || defined(STM32F469xx) || defined(STM32F479xx)
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Setup the external memory controller.
 | 
			
		||||
  *         Called in startup_stm32f4xx.s before jump to main.
 | 
			
		||||
  *         This function configures the external memories (SRAM/SDRAM)
 | 
			
		||||
  *         This SRAM/SDRAM will be used as program data memory (including heap and stack).
 | 
			
		||||
  * @param  None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void SystemInit_ExtMemCtl(void)
 | 
			
		||||
{
 | 
			
		||||
  __IO uint32_t tmp = 0x00;
 | 
			
		||||
 | 
			
		||||
  register uint32_t tmpreg = 0, timeout = 0xFFFF;
 | 
			
		||||
  register __IO uint32_t index;
 | 
			
		||||
 | 
			
		||||
  /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */
 | 
			
		||||
  RCC->AHB1ENR |= 0x000001F8;
 | 
			
		||||
 | 
			
		||||
  /* Delay after an RCC peripheral clock enabling */
 | 
			
		||||
  tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);
 | 
			
		||||
  
 | 
			
		||||
  /* Connect PDx pins to FMC Alternate function */
 | 
			
		||||
  GPIOD->AFR[0]  = 0x00CCC0CC;
 | 
			
		||||
  GPIOD->AFR[1]  = 0xCCCCCCCC;
 | 
			
		||||
  /* Configure PDx pins in Alternate function mode */  
 | 
			
		||||
  GPIOD->MODER   = 0xAAAA0A8A;
 | 
			
		||||
  /* Configure PDx pins speed to 100 MHz */  
 | 
			
		||||
  GPIOD->OSPEEDR = 0xFFFF0FCF;
 | 
			
		||||
  /* Configure PDx pins Output type to push-pull */  
 | 
			
		||||
  GPIOD->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PDx pins */ 
 | 
			
		||||
  GPIOD->PUPDR   = 0x00000000;
 | 
			
		||||
 | 
			
		||||
  /* Connect PEx pins to FMC Alternate function */
 | 
			
		||||
  GPIOE->AFR[0]  = 0xC00CC0CC;
 | 
			
		||||
  GPIOE->AFR[1]  = 0xCCCCCCCC;
 | 
			
		||||
  /* Configure PEx pins in Alternate function mode */ 
 | 
			
		||||
  GPIOE->MODER   = 0xAAAA828A;
 | 
			
		||||
  /* Configure PEx pins speed to 100 MHz */ 
 | 
			
		||||
  GPIOE->OSPEEDR = 0xFFFFC3CF;
 | 
			
		||||
  /* Configure PEx pins Output type to push-pull */  
 | 
			
		||||
  GPIOE->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PEx pins */ 
 | 
			
		||||
  GPIOE->PUPDR   = 0x00000000;
 | 
			
		||||
  
 | 
			
		||||
  /* Connect PFx pins to FMC Alternate function */
 | 
			
		||||
  GPIOF->AFR[0]  = 0xCCCCCCCC;
 | 
			
		||||
  GPIOF->AFR[1]  = 0xCCCCCCCC;
 | 
			
		||||
  /* Configure PFx pins in Alternate function mode */   
 | 
			
		||||
  GPIOF->MODER   = 0xAA800AAA;
 | 
			
		||||
  /* Configure PFx pins speed to 50 MHz */ 
 | 
			
		||||
  GPIOF->OSPEEDR = 0xAA800AAA;
 | 
			
		||||
  /* Configure PFx pins Output type to push-pull */  
 | 
			
		||||
  GPIOF->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PFx pins */ 
 | 
			
		||||
  GPIOF->PUPDR   = 0x00000000;
 | 
			
		||||
 | 
			
		||||
  /* Connect PGx pins to FMC Alternate function */
 | 
			
		||||
  GPIOG->AFR[0]  = 0xCCCCCCCC;
 | 
			
		||||
  GPIOG->AFR[1]  = 0xCCCCCCCC;
 | 
			
		||||
  /* Configure PGx pins in Alternate function mode */ 
 | 
			
		||||
  GPIOG->MODER   = 0xAAAAAAAA;
 | 
			
		||||
  /* Configure PGx pins speed to 50 MHz */ 
 | 
			
		||||
  GPIOG->OSPEEDR = 0xAAAAAAAA;
 | 
			
		||||
  /* Configure PGx pins Output type to push-pull */  
 | 
			
		||||
  GPIOG->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PGx pins */ 
 | 
			
		||||
  GPIOG->PUPDR   = 0x00000000;
 | 
			
		||||
  
 | 
			
		||||
  /* Connect PHx pins to FMC Alternate function */
 | 
			
		||||
  GPIOH->AFR[0]  = 0x00C0CC00;
 | 
			
		||||
  GPIOH->AFR[1]  = 0xCCCCCCCC;
 | 
			
		||||
  /* Configure PHx pins in Alternate function mode */ 
 | 
			
		||||
  GPIOH->MODER   = 0xAAAA08A0;
 | 
			
		||||
  /* Configure PHx pins speed to 50 MHz */ 
 | 
			
		||||
  GPIOH->OSPEEDR = 0xAAAA08A0;
 | 
			
		||||
  /* Configure PHx pins Output type to push-pull */  
 | 
			
		||||
  GPIOH->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PHx pins */ 
 | 
			
		||||
  GPIOH->PUPDR   = 0x00000000;
 | 
			
		||||
  
 | 
			
		||||
  /* Connect PIx pins to FMC Alternate function */
 | 
			
		||||
  GPIOI->AFR[0]  = 0xCCCCCCCC;
 | 
			
		||||
  GPIOI->AFR[1]  = 0x00000CC0;
 | 
			
		||||
  /* Configure PIx pins in Alternate function mode */ 
 | 
			
		||||
  GPIOI->MODER   = 0x0028AAAA;
 | 
			
		||||
  /* Configure PIx pins speed to 50 MHz */ 
 | 
			
		||||
  GPIOI->OSPEEDR = 0x0028AAAA;
 | 
			
		||||
  /* Configure PIx pins Output type to push-pull */  
 | 
			
		||||
  GPIOI->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PIx pins */ 
 | 
			
		||||
  GPIOI->PUPDR   = 0x00000000;
 | 
			
		||||
  
 | 
			
		||||
/*-- FMC Configuration -------------------------------------------------------*/
 | 
			
		||||
  /* Enable the FMC interface clock */
 | 
			
		||||
  RCC->AHB3ENR |= 0x00000001;
 | 
			
		||||
  /* Delay after an RCC peripheral clock enabling */
 | 
			
		||||
  tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
 | 
			
		||||
 | 
			
		||||
  FMC_Bank5_6->SDCR[0] = 0x000019E4;
 | 
			
		||||
  FMC_Bank5_6->SDTR[0] = 0x01115351;      
 | 
			
		||||
  
 | 
			
		||||
  /* SDRAM initialization sequence */
 | 
			
		||||
  /* Clock enable command */
 | 
			
		||||
  FMC_Bank5_6->SDCMR = 0x00000011; 
 | 
			
		||||
  tmpreg = FMC_Bank5_6->SDSR & 0x00000020; 
 | 
			
		||||
  while((tmpreg != 0) && (timeout-- > 0))
 | 
			
		||||
  {
 | 
			
		||||
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020; 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Delay */
 | 
			
		||||
  for (index = 0; index<1000; index++);
 | 
			
		||||
  
 | 
			
		||||
  /* PALL command */
 | 
			
		||||
  FMC_Bank5_6->SDCMR = 0x00000012;           
 | 
			
		||||
  timeout = 0xFFFF;
 | 
			
		||||
  while((tmpreg != 0) && (timeout-- > 0))
 | 
			
		||||
  {
 | 
			
		||||
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020; 
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  /* Auto refresh command */
 | 
			
		||||
  FMC_Bank5_6->SDCMR = 0x00000073;
 | 
			
		||||
  timeout = 0xFFFF;
 | 
			
		||||
  while((tmpreg != 0) && (timeout-- > 0))
 | 
			
		||||
  {
 | 
			
		||||
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020; 
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
  /* MRD register program */
 | 
			
		||||
  FMC_Bank5_6->SDCMR = 0x00046014;
 | 
			
		||||
  timeout = 0xFFFF;
 | 
			
		||||
  while((tmpreg != 0) && (timeout-- > 0))
 | 
			
		||||
  {
 | 
			
		||||
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020; 
 | 
			
		||||
  } 
 | 
			
		||||
  
 | 
			
		||||
  /* Set refresh count */
 | 
			
		||||
  tmpreg = FMC_Bank5_6->SDRTR;
 | 
			
		||||
  FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1));
 | 
			
		||||
  
 | 
			
		||||
  /* Disable write protection */
 | 
			
		||||
  tmpreg = FMC_Bank5_6->SDCR[0]; 
 | 
			
		||||
  FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF);
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
 | 
			
		||||
  /* Configure and enable Bank1_SRAM2 */
 | 
			
		||||
  FMC_Bank1->BTCR[2]  = 0x00001011;
 | 
			
		||||
  FMC_Bank1->BTCR[3]  = 0x00000201;
 | 
			
		||||
  FMC_Bank1E->BWTR[2] = 0x0fffffff;
 | 
			
		||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ 
 | 
			
		||||
#if defined(STM32F469xx) || defined(STM32F479xx)
 | 
			
		||||
  /* Configure and enable Bank1_SRAM2 */
 | 
			
		||||
  FMC_Bank1->BTCR[2]  = 0x00001091;
 | 
			
		||||
  FMC_Bank1->BTCR[3]  = 0x00110212;
 | 
			
		||||
  FMC_Bank1E->BWTR[2] = 0x0fffffff;
 | 
			
		||||
#endif /* STM32F469xx || STM32F479xx */
 | 
			
		||||
 | 
			
		||||
  (void)(tmp); 
 | 
			
		||||
}
 | 
			
		||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
 | 
			
		||||
#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  Setup the external memory controller.
 | 
			
		||||
  *         Called in startup_stm32f4xx.s before jump to main.
 | 
			
		||||
  *         This function configures the external memories (SRAM/SDRAM)
 | 
			
		||||
  *         This SRAM/SDRAM will be used as program data memory (including heap and stack).
 | 
			
		||||
  * @param  None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
void SystemInit_ExtMemCtl(void)
 | 
			
		||||
{
 | 
			
		||||
  __IO uint32_t tmp = 0x00;
 | 
			
		||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
 | 
			
		||||
 || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx)
 | 
			
		||||
#if defined (DATA_IN_ExtSDRAM)
 | 
			
		||||
  register uint32_t tmpreg = 0, timeout = 0xFFFF;
 | 
			
		||||
  register __IO uint32_t index;
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F446xx)
 | 
			
		||||
  /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface
 | 
			
		||||
      clock */
 | 
			
		||||
  RCC->AHB1ENR |= 0x0000007D;
 | 
			
		||||
#else
 | 
			
		||||
  /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface 
 | 
			
		||||
      clock */
 | 
			
		||||
  RCC->AHB1ENR |= 0x000001F8;
 | 
			
		||||
#endif /* STM32F446xx */  
 | 
			
		||||
  /* Delay after an RCC peripheral clock enabling */
 | 
			
		||||
  tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);
 | 
			
		||||
  
 | 
			
		||||
#if defined(STM32F446xx)
 | 
			
		||||
  /* Connect PAx pins to FMC Alternate function */
 | 
			
		||||
  GPIOA->AFR[0]  |= 0xC0000000;
 | 
			
		||||
  GPIOA->AFR[1]  |= 0x00000000;
 | 
			
		||||
  /* Configure PDx pins in Alternate function mode */
 | 
			
		||||
  GPIOA->MODER   |= 0x00008000;
 | 
			
		||||
  /* Configure PDx pins speed to 50 MHz */
 | 
			
		||||
  GPIOA->OSPEEDR |= 0x00008000;
 | 
			
		||||
  /* Configure PDx pins Output type to push-pull */
 | 
			
		||||
  GPIOA->OTYPER  |= 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PDx pins */
 | 
			
		||||
  GPIOA->PUPDR   |= 0x00000000;
 | 
			
		||||
 | 
			
		||||
  /* Connect PCx pins to FMC Alternate function */
 | 
			
		||||
  GPIOC->AFR[0]  |= 0x00CC0000;
 | 
			
		||||
  GPIOC->AFR[1]  |= 0x00000000;
 | 
			
		||||
  /* Configure PDx pins in Alternate function mode */
 | 
			
		||||
  GPIOC->MODER   |= 0x00000A00;
 | 
			
		||||
  /* Configure PDx pins speed to 50 MHz */
 | 
			
		||||
  GPIOC->OSPEEDR |= 0x00000A00;
 | 
			
		||||
  /* Configure PDx pins Output type to push-pull */
 | 
			
		||||
  GPIOC->OTYPER  |= 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PDx pins */
 | 
			
		||||
  GPIOC->PUPDR   |= 0x00000000;
 | 
			
		||||
#endif /* STM32F446xx */
 | 
			
		||||
 | 
			
		||||
  /* Connect PDx pins to FMC Alternate function */
 | 
			
		||||
  GPIOD->AFR[0]  = 0x000000CC;
 | 
			
		||||
  GPIOD->AFR[1]  = 0xCC000CCC;
 | 
			
		||||
  /* Configure PDx pins in Alternate function mode */  
 | 
			
		||||
  GPIOD->MODER   = 0xA02A000A;
 | 
			
		||||
  /* Configure PDx pins speed to 50 MHz */  
 | 
			
		||||
  GPIOD->OSPEEDR = 0xA02A000A;
 | 
			
		||||
  /* Configure PDx pins Output type to push-pull */  
 | 
			
		||||
  GPIOD->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PDx pins */ 
 | 
			
		||||
  GPIOD->PUPDR   = 0x00000000;
 | 
			
		||||
 | 
			
		||||
  /* Connect PEx pins to FMC Alternate function */
 | 
			
		||||
  GPIOE->AFR[0]  = 0xC00000CC;
 | 
			
		||||
  GPIOE->AFR[1]  = 0xCCCCCCCC;
 | 
			
		||||
  /* Configure PEx pins in Alternate function mode */ 
 | 
			
		||||
  GPIOE->MODER   = 0xAAAA800A;
 | 
			
		||||
  /* Configure PEx pins speed to 50 MHz */ 
 | 
			
		||||
  GPIOE->OSPEEDR = 0xAAAA800A;
 | 
			
		||||
  /* Configure PEx pins Output type to push-pull */  
 | 
			
		||||
  GPIOE->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PEx pins */ 
 | 
			
		||||
  GPIOE->PUPDR   = 0x00000000;
 | 
			
		||||
 | 
			
		||||
  /* Connect PFx pins to FMC Alternate function */
 | 
			
		||||
  GPIOF->AFR[0]  = 0xCCCCCCCC;
 | 
			
		||||
  GPIOF->AFR[1]  = 0xCCCCCCCC;
 | 
			
		||||
  /* Configure PFx pins in Alternate function mode */   
 | 
			
		||||
  GPIOF->MODER   = 0xAA800AAA;
 | 
			
		||||
  /* Configure PFx pins speed to 50 MHz */ 
 | 
			
		||||
  GPIOF->OSPEEDR = 0xAA800AAA;
 | 
			
		||||
  /* Configure PFx pins Output type to push-pull */  
 | 
			
		||||
  GPIOF->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PFx pins */ 
 | 
			
		||||
  GPIOF->PUPDR   = 0x00000000;
 | 
			
		||||
 | 
			
		||||
  /* Connect PGx pins to FMC Alternate function */
 | 
			
		||||
  GPIOG->AFR[0]  = 0xCCCCCCCC;
 | 
			
		||||
  GPIOG->AFR[1]  = 0xCCCCCCCC;
 | 
			
		||||
  /* Configure PGx pins in Alternate function mode */ 
 | 
			
		||||
  GPIOG->MODER   = 0xAAAAAAAA;
 | 
			
		||||
  /* Configure PGx pins speed to 50 MHz */ 
 | 
			
		||||
  GPIOG->OSPEEDR = 0xAAAAAAAA;
 | 
			
		||||
  /* Configure PGx pins Output type to push-pull */  
 | 
			
		||||
  GPIOG->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PGx pins */ 
 | 
			
		||||
  GPIOG->PUPDR   = 0x00000000;
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
 | 
			
		||||
 || defined(STM32F469xx) || defined(STM32F479xx)  
 | 
			
		||||
  /* Connect PHx pins to FMC Alternate function */
 | 
			
		||||
  GPIOH->AFR[0]  = 0x00C0CC00;
 | 
			
		||||
  GPIOH->AFR[1]  = 0xCCCCCCCC;
 | 
			
		||||
  /* Configure PHx pins in Alternate function mode */ 
 | 
			
		||||
  GPIOH->MODER   = 0xAAAA08A0;
 | 
			
		||||
  /* Configure PHx pins speed to 50 MHz */ 
 | 
			
		||||
  GPIOH->OSPEEDR = 0xAAAA08A0;
 | 
			
		||||
  /* Configure PHx pins Output type to push-pull */  
 | 
			
		||||
  GPIOH->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PHx pins */ 
 | 
			
		||||
  GPIOH->PUPDR   = 0x00000000;
 | 
			
		||||
  
 | 
			
		||||
  /* Connect PIx pins to FMC Alternate function */
 | 
			
		||||
  GPIOI->AFR[0]  = 0xCCCCCCCC;
 | 
			
		||||
  GPIOI->AFR[1]  = 0x00000CC0;
 | 
			
		||||
  /* Configure PIx pins in Alternate function mode */ 
 | 
			
		||||
  GPIOI->MODER   = 0x0028AAAA;
 | 
			
		||||
  /* Configure PIx pins speed to 50 MHz */ 
 | 
			
		||||
  GPIOI->OSPEEDR = 0x0028AAAA;
 | 
			
		||||
  /* Configure PIx pins Output type to push-pull */  
 | 
			
		||||
  GPIOI->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PIx pins */ 
 | 
			
		||||
  GPIOI->PUPDR   = 0x00000000;
 | 
			
		||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
 | 
			
		||||
  
 | 
			
		||||
/*-- FMC Configuration -------------------------------------------------------*/
 | 
			
		||||
  /* Enable the FMC interface clock */
 | 
			
		||||
  RCC->AHB3ENR |= 0x00000001;
 | 
			
		||||
  /* Delay after an RCC peripheral clock enabling */
 | 
			
		||||
  tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
 | 
			
		||||
 | 
			
		||||
  /* Configure and enable SDRAM bank1 */
 | 
			
		||||
#if defined(STM32F446xx)
 | 
			
		||||
  FMC_Bank5_6->SDCR[0] = 0x00001954;
 | 
			
		||||
#else  
 | 
			
		||||
  FMC_Bank5_6->SDCR[0] = 0x000019E4;
 | 
			
		||||
#endif /* STM32F446xx */
 | 
			
		||||
  FMC_Bank5_6->SDTR[0] = 0x01115351;      
 | 
			
		||||
  
 | 
			
		||||
  /* SDRAM initialization sequence */
 | 
			
		||||
  /* Clock enable command */
 | 
			
		||||
  FMC_Bank5_6->SDCMR = 0x00000011; 
 | 
			
		||||
  tmpreg = FMC_Bank5_6->SDSR & 0x00000020; 
 | 
			
		||||
  while((tmpreg != 0) && (timeout-- > 0))
 | 
			
		||||
  {
 | 
			
		||||
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020; 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Delay */
 | 
			
		||||
  for (index = 0; index<1000; index++);
 | 
			
		||||
  
 | 
			
		||||
  /* PALL command */
 | 
			
		||||
  FMC_Bank5_6->SDCMR = 0x00000012;           
 | 
			
		||||
  timeout = 0xFFFF;
 | 
			
		||||
  while((tmpreg != 0) && (timeout-- > 0))
 | 
			
		||||
  {
 | 
			
		||||
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020; 
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  /* Auto refresh command */
 | 
			
		||||
#if defined(STM32F446xx)
 | 
			
		||||
  FMC_Bank5_6->SDCMR = 0x000000F3;
 | 
			
		||||
#else  
 | 
			
		||||
  FMC_Bank5_6->SDCMR = 0x00000073;
 | 
			
		||||
#endif /* STM32F446xx */
 | 
			
		||||
  timeout = 0xFFFF;
 | 
			
		||||
  while((tmpreg != 0) && (timeout-- > 0))
 | 
			
		||||
  {
 | 
			
		||||
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020; 
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
  /* MRD register program */
 | 
			
		||||
#if defined(STM32F446xx)
 | 
			
		||||
  FMC_Bank5_6->SDCMR = 0x00044014;
 | 
			
		||||
#else  
 | 
			
		||||
  FMC_Bank5_6->SDCMR = 0x00046014;
 | 
			
		||||
#endif /* STM32F446xx */
 | 
			
		||||
  timeout = 0xFFFF;
 | 
			
		||||
  while((tmpreg != 0) && (timeout-- > 0))
 | 
			
		||||
  {
 | 
			
		||||
    tmpreg = FMC_Bank5_6->SDSR & 0x00000020; 
 | 
			
		||||
  } 
 | 
			
		||||
  
 | 
			
		||||
  /* Set refresh count */
 | 
			
		||||
  tmpreg = FMC_Bank5_6->SDRTR;
 | 
			
		||||
#if defined(STM32F446xx)
 | 
			
		||||
  FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1));
 | 
			
		||||
#else    
 | 
			
		||||
  FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1));
 | 
			
		||||
#endif /* STM32F446xx */
 | 
			
		||||
  
 | 
			
		||||
  /* Disable write protection */
 | 
			
		||||
  tmpreg = FMC_Bank5_6->SDCR[0]; 
 | 
			
		||||
  FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF);
 | 
			
		||||
#endif /* DATA_IN_ExtSDRAM */
 | 
			
		||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\
 | 
			
		||||
 || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
 | 
			
		||||
 || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx)
 | 
			
		||||
 | 
			
		||||
#if defined(DATA_IN_ExtSRAM)
 | 
			
		||||
/*-- GPIOs Configuration -----------------------------------------------------*/
 | 
			
		||||
   /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
 | 
			
		||||
  RCC->AHB1ENR   |= 0x00000078;
 | 
			
		||||
  /* Delay after an RCC peripheral clock enabling */
 | 
			
		||||
  tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);
 | 
			
		||||
  
 | 
			
		||||
  /* Connect PDx pins to FMC Alternate function */
 | 
			
		||||
  GPIOD->AFR[0]  = 0x00CCC0CC;
 | 
			
		||||
  GPIOD->AFR[1]  = 0xCCCCCCCC;
 | 
			
		||||
  /* Configure PDx pins in Alternate function mode */  
 | 
			
		||||
  GPIOD->MODER   = 0xAAAA0A8A;
 | 
			
		||||
  /* Configure PDx pins speed to 100 MHz */  
 | 
			
		||||
  GPIOD->OSPEEDR = 0xFFFF0FCF;
 | 
			
		||||
  /* Configure PDx pins Output type to push-pull */  
 | 
			
		||||
  GPIOD->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PDx pins */ 
 | 
			
		||||
  GPIOD->PUPDR   = 0x00000000;
 | 
			
		||||
 | 
			
		||||
  /* Connect PEx pins to FMC Alternate function */
 | 
			
		||||
  GPIOE->AFR[0]  = 0xC00CC0CC;
 | 
			
		||||
  GPIOE->AFR[1]  = 0xCCCCCCCC;
 | 
			
		||||
  /* Configure PEx pins in Alternate function mode */ 
 | 
			
		||||
  GPIOE->MODER   = 0xAAAA828A;
 | 
			
		||||
  /* Configure PEx pins speed to 100 MHz */ 
 | 
			
		||||
  GPIOE->OSPEEDR = 0xFFFFC3CF;
 | 
			
		||||
  /* Configure PEx pins Output type to push-pull */  
 | 
			
		||||
  GPIOE->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PEx pins */ 
 | 
			
		||||
  GPIOE->PUPDR   = 0x00000000;
 | 
			
		||||
 | 
			
		||||
  /* Connect PFx pins to FMC Alternate function */
 | 
			
		||||
  GPIOF->AFR[0]  = 0x00CCCCCC;
 | 
			
		||||
  GPIOF->AFR[1]  = 0xCCCC0000;
 | 
			
		||||
  /* Configure PFx pins in Alternate function mode */   
 | 
			
		||||
  GPIOF->MODER   = 0xAA000AAA;
 | 
			
		||||
  /* Configure PFx pins speed to 100 MHz */ 
 | 
			
		||||
  GPIOF->OSPEEDR = 0xFF000FFF;
 | 
			
		||||
  /* Configure PFx pins Output type to push-pull */  
 | 
			
		||||
  GPIOF->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PFx pins */ 
 | 
			
		||||
  GPIOF->PUPDR   = 0x00000000;
 | 
			
		||||
 | 
			
		||||
  /* Connect PGx pins to FMC Alternate function */
 | 
			
		||||
  GPIOG->AFR[0]  = 0x00CCCCCC;
 | 
			
		||||
  GPIOG->AFR[1]  = 0x000000C0;
 | 
			
		||||
  /* Configure PGx pins in Alternate function mode */ 
 | 
			
		||||
  GPIOG->MODER   = 0x00085AAA;
 | 
			
		||||
  /* Configure PGx pins speed to 100 MHz */ 
 | 
			
		||||
  GPIOG->OSPEEDR = 0x000CAFFF;
 | 
			
		||||
  /* Configure PGx pins Output type to push-pull */  
 | 
			
		||||
  GPIOG->OTYPER  = 0x00000000;
 | 
			
		||||
  /* No pull-up, pull-down for PGx pins */ 
 | 
			
		||||
  GPIOG->PUPDR   = 0x00000000;
 | 
			
		||||
  
 | 
			
		||||
/*-- FMC/FSMC Configuration --------------------------------------------------*/
 | 
			
		||||
  /* Enable the FMC/FSMC interface clock */
 | 
			
		||||
  RCC->AHB3ENR         |= 0x00000001;
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
 | 
			
		||||
  /* Delay after an RCC peripheral clock enabling */
 | 
			
		||||
  tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
 | 
			
		||||
  /* Configure and enable Bank1_SRAM2 */
 | 
			
		||||
  FMC_Bank1->BTCR[2]  = 0x00001011;
 | 
			
		||||
  FMC_Bank1->BTCR[3]  = 0x00000201;
 | 
			
		||||
  FMC_Bank1E->BWTR[2] = 0x0fffffff;
 | 
			
		||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ 
 | 
			
		||||
#if defined(STM32F469xx) || defined(STM32F479xx)
 | 
			
		||||
  /* Delay after an RCC peripheral clock enabling */
 | 
			
		||||
  tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
 | 
			
		||||
  /* Configure and enable Bank1_SRAM2 */
 | 
			
		||||
  FMC_Bank1->BTCR[2]  = 0x00001091;
 | 
			
		||||
  FMC_Bank1->BTCR[3]  = 0x00110212;
 | 
			
		||||
  FMC_Bank1E->BWTR[2] = 0x0fffffff;
 | 
			
		||||
#endif /* STM32F469xx || STM32F479xx */
 | 
			
		||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\
 | 
			
		||||
   || defined(STM32F412Zx) || defined(STM32F412Vx)
 | 
			
		||||
  /* Delay after an RCC peripheral clock enabling */
 | 
			
		||||
  tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);
 | 
			
		||||
  /* Configure and enable Bank1_SRAM2 */
 | 
			
		||||
  FSMC_Bank1->BTCR[2]  = 0x00001011;
 | 
			
		||||
  FSMC_Bank1->BTCR[3]  = 0x00000201;
 | 
			
		||||
  FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF;
 | 
			
		||||
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */
 | 
			
		||||
 | 
			
		||||
#endif /* DATA_IN_ExtSRAM */
 | 
			
		||||
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\
 | 
			
		||||
          STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx  */ 
 | 
			
		||||
  (void)(tmp); 
 | 
			
		||||
}
 | 
			
		||||
#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 | 
			
		||||
@ -0,0 +1,20 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Auto generated Run-Time-Environment Component Configuration File
 | 
			
		||||
 *      *** Do not modify ! ***
 | 
			
		||||
 *
 | 
			
		||||
 * Project: 'arm_nnexamples_cifar10' 
 | 
			
		||||
 * Target:  'ARMCM0' 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTE_COMPONENTS_H
 | 
			
		||||
#define RTE_COMPONENTS_H
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Define the Device Header File: 
 | 
			
		||||
 */
 | 
			
		||||
#define CMSIS_device_header "ARMCM0.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* RTE_COMPONENTS_H */
 | 
			
		||||
@ -0,0 +1,26 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Auto generated Run-Time-Environment Component Configuration File
 | 
			
		||||
 *      *** Do not modify ! ***
 | 
			
		||||
 *
 | 
			
		||||
 * Project: 'arm_nnexamples_nn_test' 
 | 
			
		||||
 * Target:  'ARMCM3' 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTE_COMPONENTS_H
 | 
			
		||||
#define RTE_COMPONENTS_H
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Define the Device Header File: 
 | 
			
		||||
 */
 | 
			
		||||
#define CMSIS_device_header "ARMCM3.h"
 | 
			
		||||
 | 
			
		||||
#define RTE_Compiler_IO_STDERR          /* Compiler I/O: STDERR */
 | 
			
		||||
          #define RTE_Compiler_IO_STDERR_ITM      /* Compiler I/O: STDERR ITM */
 | 
			
		||||
#define RTE_Compiler_IO_STDOUT          /* Compiler I/O: STDOUT */
 | 
			
		||||
          #define RTE_Compiler_IO_STDOUT_ITM      /* Compiler I/O: STDOUT ITM */
 | 
			
		||||
#define RTE_Compiler_IO_TTY             /* Compiler I/O: TTY */
 | 
			
		||||
          #define RTE_Compiler_IO_TTY_ITM         /* Compiler I/O: TTY ITM */
 | 
			
		||||
 | 
			
		||||
#endif /* RTE_COMPONENTS_H */
 | 
			
		||||
@ -0,0 +1,26 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Auto generated Run-Time-Environment Component Configuration File
 | 
			
		||||
 *      *** Do not modify ! ***
 | 
			
		||||
 *
 | 
			
		||||
 * Project: 'arm_nnexamples_nn_test' 
 | 
			
		||||
 * Target:  'ARMCM4_FP' 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTE_COMPONENTS_H
 | 
			
		||||
#define RTE_COMPONENTS_H
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Define the Device Header File: 
 | 
			
		||||
 */
 | 
			
		||||
#define CMSIS_device_header "ARMCM4_FP.h"
 | 
			
		||||
 | 
			
		||||
#define RTE_Compiler_IO_STDERR          /* Compiler I/O: STDERR */
 | 
			
		||||
          #define RTE_Compiler_IO_STDERR_ITM      /* Compiler I/O: STDERR ITM */
 | 
			
		||||
#define RTE_Compiler_IO_STDOUT          /* Compiler I/O: STDOUT */
 | 
			
		||||
          #define RTE_Compiler_IO_STDOUT_ITM      /* Compiler I/O: STDOUT ITM */
 | 
			
		||||
#define RTE_Compiler_IO_TTY             /* Compiler I/O: TTY */
 | 
			
		||||
          #define RTE_Compiler_IO_TTY_ITM         /* Compiler I/O: TTY ITM */
 | 
			
		||||
 | 
			
		||||
#endif /* RTE_COMPONENTS_H */
 | 
			
		||||
@ -0,0 +1,26 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Auto generated Run-Time-Environment Component Configuration File
 | 
			
		||||
 *      *** Do not modify ! ***
 | 
			
		||||
 *
 | 
			
		||||
 * Project: 'arm_nnexamples_nn_test' 
 | 
			
		||||
 * Target:  'ARMCM7_SP' 
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef RTE_COMPONENTS_H
 | 
			
		||||
#define RTE_COMPONENTS_H
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Define the Device Header File: 
 | 
			
		||||
 */
 | 
			
		||||
#define CMSIS_device_header "ARMCM7_SP.h"
 | 
			
		||||
 | 
			
		||||
#define RTE_Compiler_IO_STDERR          /* Compiler I/O: STDERR */
 | 
			
		||||
          #define RTE_Compiler_IO_STDERR_ITM      /* Compiler I/O: STDERR ITM */
 | 
			
		||||
#define RTE_Compiler_IO_STDOUT          /* Compiler I/O: STDOUT */
 | 
			
		||||
          #define RTE_Compiler_IO_STDOUT_ITM      /* Compiler I/O: STDOUT ITM */
 | 
			
		||||
#define RTE_Compiler_IO_TTY             /* Compiler I/O: TTY */
 | 
			
		||||
          #define RTE_Compiler_IO_TTY_ITM         /* Compiler I/O: TTY ITM */
 | 
			
		||||
 | 
			
		||||
#endif /* RTE_COMPONENTS_H */
 | 
			
		||||
@ -0,0 +1,71 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_convolve_HWC_q15_ref(const q15_t * Im_in,  // input image
 | 
			
		||||
                              const uint16_t dim_im_in, // input image dimention
 | 
			
		||||
                              const uint16_t ch_im_in,  // number of input image channels
 | 
			
		||||
                              const q15_t * wt, // kernel weights 
 | 
			
		||||
                              const uint16_t ch_im_out, // number of filters, i.e., output image channels
 | 
			
		||||
                              const uint16_t dim_kernel,    // filter kernel size
 | 
			
		||||
                              const uint16_t padding,   // padding sizes
 | 
			
		||||
                              const uint16_t stride,    // stride
 | 
			
		||||
                              const q15_t * bias,   // bias
 | 
			
		||||
                              const uint16_t bias_shift, const uint16_t out_shift, q15_t * Im_out,  // output image
 | 
			
		||||
                              const uint16_t dim_im_out,    // output image dimension
 | 
			
		||||
                              q15_t * bufferA,  //buffer space for input
 | 
			
		||||
                              q7_t * bufferB    //buffer space for output
 | 
			
		||||
    )
 | 
			
		||||
{
 | 
			
		||||
    int       i, j, k, l, m, n;
 | 
			
		||||
    int       conv_out;
 | 
			
		||||
    int       in_row, in_col;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < ch_im_out; i++)
 | 
			
		||||
    {
 | 
			
		||||
        for (j = 0; j < dim_im_out; j++)
 | 
			
		||||
        {
 | 
			
		||||
            for (k = 0; k < dim_im_out; k++)
 | 
			
		||||
            {
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
                conv_out = (bias[i] << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
                conv_out = bias[i] << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
                for (m = 0; m < dim_kernel; m++)
 | 
			
		||||
                {
 | 
			
		||||
                    for (n = 0; n < dim_kernel; n++)
 | 
			
		||||
                    {
 | 
			
		||||
                        in_row = stride * j + m - padding;
 | 
			
		||||
                        in_col = stride * k + n - padding;
 | 
			
		||||
                        if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in && in_col < dim_im_in)
 | 
			
		||||
                        {
 | 
			
		||||
                            for (l = 0; l < ch_im_in; l++)
 | 
			
		||||
                            {
 | 
			
		||||
                                conv_out += Im_in[(in_row * dim_im_in + in_col) * ch_im_in + l] *
 | 
			
		||||
                                    wt[i * ch_im_in * dim_kernel * dim_kernel + (m * dim_kernel + n) * ch_im_in + l];
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Im_out[i + (j * dim_im_out + k) * ch_im_out] = (q15_t) __SSAT((conv_out >> out_shift), 16);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,83 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
arm_convolve_HWC_q15_nonsquare_ref(const q15_t * Im_in,
 | 
			
		||||
                          const uint16_t dim_im_in_x,
 | 
			
		||||
                          const uint16_t dim_im_in_y,
 | 
			
		||||
                          const uint16_t ch_im_in,
 | 
			
		||||
                          const q15_t * wt,
 | 
			
		||||
                          const uint16_t ch_im_out,
 | 
			
		||||
                          const uint16_t dim_kernel_x,
 | 
			
		||||
                          const uint16_t dim_kernel_y,
 | 
			
		||||
                          const uint16_t padding_x,
 | 
			
		||||
                          const uint16_t padding_y,
 | 
			
		||||
                          const uint16_t stride_x,
 | 
			
		||||
                          const uint16_t stride_y,
 | 
			
		||||
                          const q15_t * bias,
 | 
			
		||||
                          const uint16_t bias_shift,
 | 
			
		||||
                          const uint16_t out_shift,
 | 
			
		||||
                          q15_t * Im_out,
 | 
			
		||||
                          const uint16_t dim_im_out_x,
 | 
			
		||||
                          const uint16_t dim_im_out_y, 
 | 
			
		||||
                          q15_t * bufferA, 
 | 
			
		||||
                          q7_t * bufferB)
 | 
			
		||||
 | 
			
		||||
{	
 | 
			
		||||
    uint16_t  i, j, k, l, m, n;
 | 
			
		||||
    int       conv_out;
 | 
			
		||||
    signed char in_row, in_col;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < ch_im_out; i++)
 | 
			
		||||
    {
 | 
			
		||||
        for (j = 0; j < dim_im_out_y; j++)
 | 
			
		||||
        {
 | 
			
		||||
            for (k = 0; k < dim_im_out_x; k++)
 | 
			
		||||
            {
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
                conv_out = (bias[i] << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
                conv_out = bias[i] << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
                for (m = 0; m < dim_kernel_y; m++)
 | 
			
		||||
                {
 | 
			
		||||
                    for (n = 0; n < dim_kernel_x; n++)
 | 
			
		||||
                    {
 | 
			
		||||
                        in_row = stride_y * j + m - padding_y;
 | 
			
		||||
                        in_col = stride_x * k + n - padding_x;
 | 
			
		||||
                        if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in_y && in_col < dim_im_in_x)
 | 
			
		||||
                        {
 | 
			
		||||
                            for (l = 0; l < ch_im_in; l++)
 | 
			
		||||
                            {
 | 
			
		||||
                                conv_out +=
 | 
			
		||||
                                    Im_in[(in_row * dim_im_in_x + in_col) * ch_im_in +
 | 
			
		||||
                                          l] * wt[i * ch_im_in * dim_kernel_x * dim_kernel_y + (m * dim_kernel_x +
 | 
			
		||||
                                                                                            n) * ch_im_in + l];
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Im_out[i + (j * dim_im_out_x + k) * ch_im_out] = (q15_t) __SSAT((conv_out >> out_shift), 16);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}	
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
@ -0,0 +1,72 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_convolve_HWC_q7_ref(const q7_t * Im_in,    // input image
 | 
			
		||||
                             const uint16_t dim_im_in,  // input image dimention
 | 
			
		||||
                             const uint16_t ch_im_in,   // number of input image channels
 | 
			
		||||
                             const q7_t * wt,   // kernel weights 
 | 
			
		||||
                             const uint16_t ch_im_out,  // number of filters, i.e., output image channels
 | 
			
		||||
                             const uint16_t dim_kernel, // filter kernel size
 | 
			
		||||
                             const uint16_t padding,    // padding sizes
 | 
			
		||||
                             const uint16_t stride, // stride
 | 
			
		||||
                             const q7_t * bias, // bias
 | 
			
		||||
                             const uint16_t bias_shift, const uint16_t out_shift, q7_t * Im_out,    // output image
 | 
			
		||||
                             const uint16_t dim_im_out, // output image dimension
 | 
			
		||||
                             q15_t * bufferA,   //buffer space for input
 | 
			
		||||
                             q7_t * bufferB //buffer space for output
 | 
			
		||||
    )
 | 
			
		||||
{
 | 
			
		||||
    int       i, j, k, l, m, n;
 | 
			
		||||
    int       conv_out;
 | 
			
		||||
    int       in_row, in_col;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < ch_im_out; i++)
 | 
			
		||||
    {
 | 
			
		||||
        for (j = 0; j < dim_im_out; j++)
 | 
			
		||||
        {
 | 
			
		||||
            for (k = 0; k < dim_im_out; k++)
 | 
			
		||||
            {
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
                conv_out = ((q31_t) (bias[i]) << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
                conv_out = bias[i] << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
                for (m = 0; m < dim_kernel; m++)
 | 
			
		||||
                {
 | 
			
		||||
                    for (n = 0; n < dim_kernel; n++)
 | 
			
		||||
                    {
 | 
			
		||||
                        // if-for implementation
 | 
			
		||||
                        in_row = stride * j + m - padding;
 | 
			
		||||
                        in_col = stride * k + n - padding;
 | 
			
		||||
                        if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in && in_col < dim_im_in)
 | 
			
		||||
                        {
 | 
			
		||||
                            for (l = 0; l < ch_im_in; l++)
 | 
			
		||||
                            {
 | 
			
		||||
                                conv_out += Im_in[(in_row * dim_im_in + in_col) * ch_im_in + l] *
 | 
			
		||||
                                    wt[i * ch_im_in * dim_kernel * dim_kernel + (m * dim_kernel + n) * ch_im_in + l];
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Im_out[i + (j * dim_im_out + k) * ch_im_out] = (q7_t) __SSAT((conv_out >> out_shift), 8);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,78 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_convolve_HWC_q7_ref_nonsquare(const q7_t * Im_in,  // input image
 | 
			
		||||
                                       const uint16_t dim_im_in_x,  // input image dimention x
 | 
			
		||||
                                       const uint16_t dim_im_in_y,  // input image dimention y
 | 
			
		||||
                                       const uint16_t ch_im_in, // number of input image channels
 | 
			
		||||
                                       const q7_t * wt, // kernel weights 
 | 
			
		||||
                                       const uint16_t ch_im_out,    // number of filters, i.e., output image channels
 | 
			
		||||
                                       const uint16_t dim_kernel_x, // filter kernel size x
 | 
			
		||||
                                       const uint16_t dim_kernel_y, // filter kernel size y
 | 
			
		||||
                                       const uint16_t padding_x,    // padding sizes x
 | 
			
		||||
                                       const uint16_t padding_y,    // padding sizes y
 | 
			
		||||
                                       const uint16_t stride_x, // stride x
 | 
			
		||||
                                       const uint16_t stride_y, // stride y
 | 
			
		||||
                                       const q7_t * bias,   // bias
 | 
			
		||||
                                       const uint16_t bias_shift, const uint16_t out_shift, q7_t * Im_out,  // output image
 | 
			
		||||
                                       const uint16_t dim_im_out_x, // output image dimension x
 | 
			
		||||
                                       const uint16_t dim_im_out_y, // output image dimension y
 | 
			
		||||
                                       q15_t * bufferA, //buffer space for input
 | 
			
		||||
                                       q7_t * bufferB   //buffer space for output
 | 
			
		||||
    )
 | 
			
		||||
{
 | 
			
		||||
    int       i, j, k, l, m, n;
 | 
			
		||||
    int       conv_out;
 | 
			
		||||
    int       in_row, in_col;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < ch_im_out; i++)
 | 
			
		||||
    {
 | 
			
		||||
        for (j = 0; j < dim_im_out_y; j++)
 | 
			
		||||
        {
 | 
			
		||||
            for (k = 0; k < dim_im_out_x; k++)
 | 
			
		||||
            {
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
                conv_out = ((q31_t) (bias[i]) << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
                conv_out = bias[i] << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
                for (m = 0; m < dim_kernel_y; m++)
 | 
			
		||||
                {
 | 
			
		||||
                    for (n = 0; n < dim_kernel_x; n++)
 | 
			
		||||
                    {
 | 
			
		||||
                        // if-for implementation
 | 
			
		||||
                        in_row = stride_y * j + m - padding_y;
 | 
			
		||||
                        in_col = stride_x * k + n - padding_x;
 | 
			
		||||
                        if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in_y && in_col < dim_im_in_x)
 | 
			
		||||
                        {
 | 
			
		||||
                            for (l = 0; l < ch_im_in; l++)
 | 
			
		||||
                            {
 | 
			
		||||
                                conv_out += Im_in[(in_row * dim_im_in_x + in_col) * ch_im_in + l] *
 | 
			
		||||
                                    wt[i * ch_im_in * dim_kernel_y * dim_kernel_x + (m * dim_kernel_x + n) * ch_im_in +
 | 
			
		||||
                                       l];
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Im_out[i + (j * dim_im_out_x + k) * ch_im_out] = (q7_t) __SSAT((conv_out >> out_shift), 8);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,70 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_depthwise_separable_conv_HWC_q7_ref(const q7_t * Im_in,    // input image
 | 
			
		||||
                                             const uint16_t dim_im_in,  // input image dimention
 | 
			
		||||
                                             const uint16_t ch_im_in,   // number of input image channels
 | 
			
		||||
                                             const q7_t * wt,   // kernel weights 
 | 
			
		||||
                                             const uint16_t ch_im_out,  // number of filters, i.e., output image channels
 | 
			
		||||
                                             const uint16_t dim_kernel, // filter kernel size
 | 
			
		||||
                                             const uint16_t padding,    // padding sizes
 | 
			
		||||
                                             const uint16_t stride, // stride
 | 
			
		||||
                                             const q7_t * bias, // bias
 | 
			
		||||
                                             const uint16_t bias_shift, // amount of left-shift for bias
 | 
			
		||||
                                             const uint16_t out_shift,  // amount of right-shift for output
 | 
			
		||||
                                             q7_t * Im_out, // output image
 | 
			
		||||
                                             const uint16_t dim_im_out, // output image dimension
 | 
			
		||||
                                             q15_t * bufferA,   //buffer space for input
 | 
			
		||||
                                             q7_t * bufferB //buffer space for output
 | 
			
		||||
    )
 | 
			
		||||
{
 | 
			
		||||
    int       i_out_y, i_out_x, i_ch_out;
 | 
			
		||||
    int       i_ker_y, i_ker_x;
 | 
			
		||||
    for (i_out_y = 0; i_out_y < dim_im_out; i_out_y++)
 | 
			
		||||
    {
 | 
			
		||||
        for (i_out_x = 0; i_out_x < dim_im_out; i_out_x++)
 | 
			
		||||
        {
 | 
			
		||||
            for (i_ch_out = 0; i_ch_out < ch_im_out; i_ch_out++)
 | 
			
		||||
            {
 | 
			
		||||
                // for each output
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
                int       conv_out = (bias[i_ch_out] << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
                int       conv_out = bias[i_ch_out] << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
                for (i_ker_y = 0; i_ker_y < dim_kernel; i_ker_y++)
 | 
			
		||||
                {
 | 
			
		||||
                    for (i_ker_x = 0; i_ker_x < dim_kernel; i_ker_x++)
 | 
			
		||||
                    {
 | 
			
		||||
                        int       in_row = stride * i_out_y + i_ker_y - padding;
 | 
			
		||||
                        int       in_col = stride * i_out_x + i_ker_x - padding;
 | 
			
		||||
                        if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in && in_col < dim_im_in)
 | 
			
		||||
                        {
 | 
			
		||||
                            conv_out += Im_in[(in_row * dim_im_in + in_col) * ch_im_in + i_ch_out] *
 | 
			
		||||
                                wt[(i_ker_y * dim_kernel + i_ker_x) * ch_im_out + i_ch_out];
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Im_out[(i_out_y * dim_im_out + i_out_x) * ch_im_out + i_ch_out] =
 | 
			
		||||
                    (q7_t) __SSAT((conv_out >> out_shift), 8);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,75 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_depthwise_separable_conv_HWC_q7_ref_nonsquare(const q7_t * Im_in,  // input image
 | 
			
		||||
                                                       const uint16_t dim_im_in_x,  // input image dimention x
 | 
			
		||||
                                                       const uint16_t dim_im_in_y,  // input image dimention y
 | 
			
		||||
                                                       const uint16_t ch_im_in, // number of input image channels
 | 
			
		||||
                                                       const q7_t * wt, // kernel weights 
 | 
			
		||||
                                                       const uint16_t ch_im_out,    // number of filters, i.e., output image channels
 | 
			
		||||
                                                       const uint16_t dim_kernel_x, // filter kernel size x
 | 
			
		||||
                                                       const uint16_t dim_kernel_y, // filter kernel size y
 | 
			
		||||
                                                       const uint16_t padding_x,    // padding sizes x
 | 
			
		||||
                                                       const uint16_t padding_y,    // padding sizes y
 | 
			
		||||
                                                       const uint16_t stride_x, // stride x
 | 
			
		||||
                                                       const uint16_t stride_y, // stride y
 | 
			
		||||
                                                       const q7_t * bias,   // bias
 | 
			
		||||
                                                       const uint16_t bias_shift,   // amount of left-shift for bias
 | 
			
		||||
                                                       const uint16_t out_shift,    // amount of right-shift for output
 | 
			
		||||
                                                       q7_t * Im_out,   // output image
 | 
			
		||||
                                                       const uint16_t dim_im_out_x, // output image dimension x
 | 
			
		||||
                                                       const uint16_t dim_im_out_y, // output image dimension y
 | 
			
		||||
                                                       q15_t * bufferA, //buffer space for input
 | 
			
		||||
                                                       q7_t * bufferB   //buffer space for output
 | 
			
		||||
    )
 | 
			
		||||
{
 | 
			
		||||
    int       i_out_y, i_out_x, i_ch_out;
 | 
			
		||||
    int       i_ker_y, i_ker_x;
 | 
			
		||||
    for (i_out_y = 0; i_out_y < dim_im_out_y; i_out_y++)
 | 
			
		||||
    {
 | 
			
		||||
        for (i_out_x = 0; i_out_x < dim_im_out_x; i_out_x++)
 | 
			
		||||
        {
 | 
			
		||||
            for (i_ch_out = 0; i_ch_out < ch_im_out; i_ch_out++)
 | 
			
		||||
            {
 | 
			
		||||
                // for each output
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
                int       conv_out = (bias[i_ch_out] << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
                int       conv_out = bias[i_ch_out] << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
                for (i_ker_y = 0; i_ker_y < dim_kernel_y; i_ker_y++)
 | 
			
		||||
                {
 | 
			
		||||
                    for (i_ker_x = 0; i_ker_x < dim_kernel_x; i_ker_x++)
 | 
			
		||||
                    {
 | 
			
		||||
                        int       in_row = stride_y * i_out_y + i_ker_y - padding_y;
 | 
			
		||||
                        int       in_col = stride_x * i_out_x + i_ker_x - padding_x;
 | 
			
		||||
                        if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in_y && in_col < dim_im_in_x)
 | 
			
		||||
                        {
 | 
			
		||||
                            conv_out += Im_in[(in_row * dim_im_in_x + in_col) * ch_im_in + i_ch_out] *
 | 
			
		||||
                                wt[(i_ker_y * dim_kernel_x + i_ker_x) * ch_im_out + i_ch_out];
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Im_out[(i_out_y * dim_im_out_x + i_out_x) * ch_im_out + i_ch_out] =
 | 
			
		||||
                    (q7_t) __SSAT((conv_out >> out_shift), 8);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,120 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_fully_connected_mat_q7_vec_q15_opt_ref(const q15_t * pV,   // pointer to vector
 | 
			
		||||
                                                const q7_t * pM,    // pointer to matrix
 | 
			
		||||
                                                const uint16_t dim_vec, // length of the vector
 | 
			
		||||
                                                const uint16_t num_of_rows, // numCol of A
 | 
			
		||||
                                                const uint16_t bias_shift,  // amount of left-shift for bias
 | 
			
		||||
                                                const uint16_t out_shift,   // amount of right-shift for output
 | 
			
		||||
                                                const q7_t * bias, q15_t * pOut,    // output operand
 | 
			
		||||
                                                q15_t * vec_buffer)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    uint16_t  rowCnt = num_of_rows >> 2;
 | 
			
		||||
    const q7_t *pB = pM;
 | 
			
		||||
    const q15_t *pA;
 | 
			
		||||
    q15_t    *pO = pOut;
 | 
			
		||||
    const q7_t *pBias = bias;
 | 
			
		||||
 | 
			
		||||
    while (rowCnt)
 | 
			
		||||
    {
 | 
			
		||||
        pA = pV;
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
        q31_t     sum = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
        q31_t     sum2 = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
        q31_t     sum3 = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
        q31_t     sum4 = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
        q31_t     sum = *pBias++ << bias_shift;
 | 
			
		||||
        q31_t     sum2 = *pBias++ << bias_shift;
 | 
			
		||||
        q31_t     sum3 = *pBias++ << bias_shift;
 | 
			
		||||
        q31_t     sum4 = *pBias++ << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        uint16_t  colCnt = dim_vec >> 1;
 | 
			
		||||
 | 
			
		||||
        while (colCnt)
 | 
			
		||||
        {
 | 
			
		||||
            q15_t     inA1 = *pA++;
 | 
			
		||||
            q15_t     inA2 = *pA++;
 | 
			
		||||
 | 
			
		||||
            q7_t      inB1 = *pB++;
 | 
			
		||||
            q7_t      inB3 = *pB++;
 | 
			
		||||
            q7_t      inB2 = *pB++;
 | 
			
		||||
            q7_t      inB4 = *pB++;
 | 
			
		||||
 | 
			
		||||
            sum += inA1 * inB1 + inA2 * inB2;
 | 
			
		||||
            sum2 += inA1 * inB3 + inA2 * inB4;
 | 
			
		||||
 | 
			
		||||
            inB1 = *pB++;
 | 
			
		||||
            inB3 = *pB++;
 | 
			
		||||
            inB2 = *pB++;
 | 
			
		||||
            inB4 = *pB++;
 | 
			
		||||
 | 
			
		||||
            sum3 += inA1 * inB1 + inA2 * inB2;
 | 
			
		||||
            sum4 += inA1 * inB3 + inA2 * inB4;
 | 
			
		||||
 | 
			
		||||
            colCnt--;
 | 
			
		||||
        }
 | 
			
		||||
        colCnt = dim_vec & 0x1;
 | 
			
		||||
        while (colCnt)
 | 
			
		||||
        {
 | 
			
		||||
            q15_t     inA = *pA++;
 | 
			
		||||
            q7_t      inB = *pB++;
 | 
			
		||||
            sum += inA * inB;
 | 
			
		||||
            inB = *pB++;
 | 
			
		||||
            sum2 += inA * inB;
 | 
			
		||||
            inB = *pB++;
 | 
			
		||||
            sum3 += inA * inB;
 | 
			
		||||
            inB = *pB++;
 | 
			
		||||
            sum4 += inA * inB;
 | 
			
		||||
 | 
			
		||||
            colCnt--;
 | 
			
		||||
        }
 | 
			
		||||
        *pO++ = (q15_t) __SSAT((sum >> out_shift), 16);
 | 
			
		||||
        *pO++ = (q15_t) __SSAT((sum2 >> out_shift), 16);
 | 
			
		||||
        *pO++ = (q15_t) __SSAT((sum3 >> out_shift), 16);
 | 
			
		||||
        *pO++ = (q15_t) __SSAT((sum4 >> out_shift), 16);
 | 
			
		||||
 | 
			
		||||
        rowCnt--;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    rowCnt = num_of_rows & 0x3;
 | 
			
		||||
 | 
			
		||||
    while (rowCnt)
 | 
			
		||||
    {
 | 
			
		||||
        pA = pV;
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
        int       ip_out = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
        int       ip_out = *pBias++ << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
        for (int j = 0; j < dim_vec; j++)
 | 
			
		||||
        {
 | 
			
		||||
            q15_t     inA = *pA++;
 | 
			
		||||
            q7_t      inB = *pB++;
 | 
			
		||||
            ip_out += inA * inB;
 | 
			
		||||
        }
 | 
			
		||||
        *pO++ = (q15_t) __SSAT((ip_out >> out_shift), 16);
 | 
			
		||||
 | 
			
		||||
        rowCnt--;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,43 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_fully_connected_mat_q7_vec_q15_ref(const q15_t * pV,   // pointer to vector
 | 
			
		||||
                                            const q7_t * pM,    // pointer to matrix
 | 
			
		||||
                                            const uint16_t dim_vec, // length of the vector
 | 
			
		||||
                                            const uint16_t num_of_rows, // numCol of A
 | 
			
		||||
                                            const uint16_t bias_shift,  // amount of left-shift for bias
 | 
			
		||||
                                            const uint16_t out_shift,   // amount of right-shift for output
 | 
			
		||||
                                            const q7_t * bias, q15_t * pOut,    // output operand
 | 
			
		||||
                                            q15_t * vec_buffer)
 | 
			
		||||
{
 | 
			
		||||
    for (int i = 0; i < num_of_rows; i++)
 | 
			
		||||
    {
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
        int       ip_out = (bias[i] << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
        int       ip_out = bias[i] << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
        for (int j = 0; j < dim_vec; j++)
 | 
			
		||||
        {
 | 
			
		||||
            ip_out += pV[j] * pM[i * dim_vec + j];
 | 
			
		||||
        }
 | 
			
		||||
        pOut[i] = (q15_t) __SSAT((ip_out >> out_shift), 16);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,119 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_fully_connected_q15_opt_ref(const q15_t * pV,  // pointer to vector
 | 
			
		||||
                                     const q15_t * pM,  // pointer to matrix
 | 
			
		||||
                                     const uint16_t dim_vec,    // length of the vector
 | 
			
		||||
                                     const uint16_t num_of_rows,    // numCol of A
 | 
			
		||||
                                     const uint16_t bias_shift, // amount of left-shift for bias
 | 
			
		||||
                                     const uint16_t out_shift,  // amount of right-shift for output
 | 
			
		||||
                                     const q15_t * bias, q15_t * pOut,  // output operand
 | 
			
		||||
                                     q15_t * vec_buffer)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    uint16_t  rowCnt = num_of_rows >> 2;
 | 
			
		||||
    const q15_t *pB = pM;
 | 
			
		||||
    const q15_t *pA;
 | 
			
		||||
    q15_t    *pO = pOut;
 | 
			
		||||
    const q15_t *pBias = bias;
 | 
			
		||||
 | 
			
		||||
    while (rowCnt)
 | 
			
		||||
    {
 | 
			
		||||
        pA = pV;
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
        q31_t     sum = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
        q31_t     sum2 = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
        q31_t     sum3 = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
        q31_t     sum4 = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
        q31_t     sum = *pBias++ << bias_shift;
 | 
			
		||||
        q31_t     sum2 = *pBias++ << bias_shift;
 | 
			
		||||
        q31_t     sum3 = *pBias++ << bias_shift;
 | 
			
		||||
        q31_t     sum4 = *pBias++ << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        uint16_t  colCnt = dim_vec >> 1;
 | 
			
		||||
 | 
			
		||||
        while (colCnt)
 | 
			
		||||
        {
 | 
			
		||||
            q15_t     inA1 = *pA++;
 | 
			
		||||
            q15_t     inA2 = *pA++;
 | 
			
		||||
 | 
			
		||||
            q15_t     inB1 = *pB++;
 | 
			
		||||
            q15_t     inB2 = *pB++;
 | 
			
		||||
            sum += inA1 * inB1 + inA2 * inB2;
 | 
			
		||||
 | 
			
		||||
            inB1 = *pB++;
 | 
			
		||||
            inB2 = *pB++;
 | 
			
		||||
            sum2 += inA1 * inB1 + inA2 * inB2;
 | 
			
		||||
 | 
			
		||||
            inB1 = *pB++;
 | 
			
		||||
            inB2 = *pB++;
 | 
			
		||||
            sum3 += inA1 * inB1 + inA2 * inB2;
 | 
			
		||||
 | 
			
		||||
            inB1 = *pB++;
 | 
			
		||||
            inB2 = *pB++;
 | 
			
		||||
            sum4 += inA1 * inB1 + inA2 * inB2;
 | 
			
		||||
 | 
			
		||||
            colCnt--;
 | 
			
		||||
        }
 | 
			
		||||
        colCnt = dim_vec & 0x1;
 | 
			
		||||
        while (colCnt)
 | 
			
		||||
        {
 | 
			
		||||
            q15_t     inA = *pA++;
 | 
			
		||||
            q15_t     inB = *pB++;
 | 
			
		||||
            sum += inA * inB;
 | 
			
		||||
            inB = *pB++;
 | 
			
		||||
            sum2 += inA * inB;
 | 
			
		||||
            inB = *pB++;
 | 
			
		||||
            sum3 += inA * inB;
 | 
			
		||||
            inB = *pB++;
 | 
			
		||||
            sum4 += inA * inB;
 | 
			
		||||
            colCnt--;
 | 
			
		||||
        }
 | 
			
		||||
        *pO++ = (q15_t) __SSAT((sum >> out_shift), 16);
 | 
			
		||||
        *pO++ = (q15_t) __SSAT((sum2 >> out_shift), 16);
 | 
			
		||||
        *pO++ = (q15_t) __SSAT((sum3 >> out_shift), 16);
 | 
			
		||||
        *pO++ = (q15_t) __SSAT((sum4 >> out_shift), 16);
 | 
			
		||||
 | 
			
		||||
        rowCnt--;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    rowCnt = num_of_rows & 0x3;
 | 
			
		||||
 | 
			
		||||
    while (rowCnt)
 | 
			
		||||
    {
 | 
			
		||||
        pA = pV;
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
        int       ip_out = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
        int       ip_out = *pBias++ << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
        for (int j = 0; j < dim_vec; j++)
 | 
			
		||||
        {
 | 
			
		||||
            q15_t     inA = *pA++;
 | 
			
		||||
            q15_t     inB = *pB++;
 | 
			
		||||
            ip_out += inA * inB;
 | 
			
		||||
        }
 | 
			
		||||
        *pO++ = (q15_t) __SSAT((ip_out >> out_shift), 16);
 | 
			
		||||
 | 
			
		||||
        rowCnt--;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,43 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_fully_connected_q15_ref(const q15_t * pV,  // pointer to vector
 | 
			
		||||
                                 const q15_t * pM,  // pointer to matrix
 | 
			
		||||
                                 const uint16_t dim_vec,    // length of the vector
 | 
			
		||||
                                 const uint16_t num_of_rows,    // numCol of A
 | 
			
		||||
                                 const uint16_t bias_shift, // amount of left-shift for bias
 | 
			
		||||
                                 const uint16_t out_shift,  // amount of right-shift for output
 | 
			
		||||
                                 const q15_t * bias, q15_t * pOut,  // output operand
 | 
			
		||||
                                 q15_t * vec_buffer)
 | 
			
		||||
{
 | 
			
		||||
    for (int i = 0; i < num_of_rows; i++)
 | 
			
		||||
    {
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
        int       ip_out = (bias[i] << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
        int       ip_out = bias[i] << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
        for (int j = 0; j < dim_vec; j++)
 | 
			
		||||
        {
 | 
			
		||||
            ip_out += pV[j] * pM[i * dim_vec + j];
 | 
			
		||||
        }
 | 
			
		||||
        pOut[i] = (q15_t) __SSAT((ip_out >> out_shift), 16);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,138 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_fully_connected_q7_opt_ref(const q7_t * pV,    // pointer to vector
 | 
			
		||||
                                    const q7_t * pM,    // pointer to matrix
 | 
			
		||||
                                    const uint16_t dim_vec, // length of the vector
 | 
			
		||||
                                    const uint16_t num_of_rows, // numCol of A
 | 
			
		||||
                                    const uint16_t bias_shift,  // amount of left-shift for bias
 | 
			
		||||
                                    const uint16_t out_shift,   // amount of right-shift for output
 | 
			
		||||
                                    const q7_t * bias, q7_t * pOut, // output operand
 | 
			
		||||
                                    q15_t * vec_buffer)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    uint16_t  rowCnt = num_of_rows >> 2;
 | 
			
		||||
    const q7_t *pB = pM;
 | 
			
		||||
    const q7_t *pA;
 | 
			
		||||
    q7_t     *pO = pOut;
 | 
			
		||||
    const q7_t *pBias = bias;
 | 
			
		||||
 | 
			
		||||
    while (rowCnt)
 | 
			
		||||
    {
 | 
			
		||||
        pA = pV;
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
        q31_t     sum = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
        q31_t     sum2 = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
        q31_t     sum3 = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
        q31_t     sum4 = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
        q31_t     sum = *pBias++ << bias_shift;
 | 
			
		||||
        q31_t     sum2 = *pBias++ << bias_shift;
 | 
			
		||||
        q31_t     sum3 = *pBias++ << bias_shift;
 | 
			
		||||
        q31_t     sum4 = *pBias++ << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        uint16_t  colCnt = dim_vec >> 2;
 | 
			
		||||
 | 
			
		||||
        while (colCnt)
 | 
			
		||||
        {
 | 
			
		||||
            q7_t      inA1 = *pA++;
 | 
			
		||||
            q7_t      inA3 = *pA++;
 | 
			
		||||
            q7_t      inA2 = *pA++;
 | 
			
		||||
            q7_t      inA4 = *pA++;
 | 
			
		||||
 | 
			
		||||
            q7_t      inB1 = *pB++;
 | 
			
		||||
            q7_t      inB3 = *pB++;
 | 
			
		||||
            q7_t      inB2 = *pB++;
 | 
			
		||||
            q7_t      inB4 = *pB++;
 | 
			
		||||
 | 
			
		||||
            sum += inA1 * inB1 + inA2 * inB2;
 | 
			
		||||
            sum2 += inA1 * inB3 + inA2 * inB4;
 | 
			
		||||
 | 
			
		||||
            inB1 = *pB++;
 | 
			
		||||
            inB3 = *pB++;
 | 
			
		||||
            inB2 = *pB++;
 | 
			
		||||
            inB4 = *pB++;
 | 
			
		||||
 | 
			
		||||
            sum3 += inA1 * inB1 + inA2 * inB2;
 | 
			
		||||
            sum4 += inA1 * inB3 + inA2 * inB4;
 | 
			
		||||
 | 
			
		||||
            inB1 = *pB++;
 | 
			
		||||
            inB3 = *pB++;
 | 
			
		||||
            inB2 = *pB++;
 | 
			
		||||
            inB4 = *pB++;
 | 
			
		||||
 | 
			
		||||
            sum += inA3 * inB1 + inA4 * inB2;
 | 
			
		||||
            sum2 += inA3 * inB3 + inA4 * inB4;
 | 
			
		||||
 | 
			
		||||
            inB1 = *pB++;
 | 
			
		||||
            inB3 = *pB++;
 | 
			
		||||
            inB2 = *pB++;
 | 
			
		||||
            inB4 = *pB++;
 | 
			
		||||
 | 
			
		||||
            sum3 += inA3 * inB1 + inA4 * inB2;
 | 
			
		||||
            sum4 += inA3 * inB3 + inA4 * inB4;
 | 
			
		||||
 | 
			
		||||
            colCnt--;
 | 
			
		||||
        }
 | 
			
		||||
        colCnt = dim_vec & 0x3;
 | 
			
		||||
        while (colCnt)
 | 
			
		||||
        {
 | 
			
		||||
            q7_t      inA = *pA++;
 | 
			
		||||
            q7_t      inB = *pB++;
 | 
			
		||||
            sum += inA * inB;
 | 
			
		||||
            inB = *pB++;
 | 
			
		||||
            sum2 += inA * inB;
 | 
			
		||||
            inB = *pB++;
 | 
			
		||||
            sum3 += inA * inB;
 | 
			
		||||
            inB = *pB++;
 | 
			
		||||
            sum4 += inA * inB;
 | 
			
		||||
 | 
			
		||||
            colCnt--;
 | 
			
		||||
        }
 | 
			
		||||
        *pO++ = (q7_t) __SSAT((sum >> out_shift), 8);
 | 
			
		||||
        *pO++ = (q7_t) __SSAT((sum2 >> out_shift), 8);
 | 
			
		||||
        *pO++ = (q7_t) __SSAT((sum3 >> out_shift), 8);
 | 
			
		||||
        *pO++ = (q7_t) __SSAT((sum4 >> out_shift), 8);
 | 
			
		||||
 | 
			
		||||
        rowCnt--;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    rowCnt = num_of_rows & 0x3;
 | 
			
		||||
 | 
			
		||||
    while (rowCnt)
 | 
			
		||||
    {
 | 
			
		||||
        pA = pV;
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
        int       ip_out = (*pBias++ << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
        int       ip_out = *pBias++ << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
        for (int j = 0; j < dim_vec; j++)
 | 
			
		||||
        {
 | 
			
		||||
            q7_t      inA = *pA++;
 | 
			
		||||
            q7_t      inB = *pB++;
 | 
			
		||||
            ip_out += inA * inB;
 | 
			
		||||
        }
 | 
			
		||||
        *pO++ = (q7_t) __SSAT((ip_out >> out_shift), 8);
 | 
			
		||||
 | 
			
		||||
        rowCnt--;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,43 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_fully_connected_q7_ref(const q7_t * pV,    // pointer to vector
 | 
			
		||||
                                const q7_t * pM,    // pointer to matrix
 | 
			
		||||
                                const uint16_t dim_vec, // length of the vector
 | 
			
		||||
                                const uint16_t num_of_rows, // numCol of A
 | 
			
		||||
                                const uint16_t bias_shift,  // amount of left-shift for bias
 | 
			
		||||
                                const uint16_t out_shift,   // amount of right-shift for output
 | 
			
		||||
                                const q7_t * bias, q7_t * pOut, // output operand
 | 
			
		||||
                                q15_t * vec_buffer)
 | 
			
		||||
{
 | 
			
		||||
    for (int i = 0; i < num_of_rows; i++)
 | 
			
		||||
    {
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
        int       ip_out = (bias[i] << bias_shift) + (0x1 << (out_shift - 1));
 | 
			
		||||
#else
 | 
			
		||||
        int       ip_out = bias[i] << bias_shift;
 | 
			
		||||
#endif
 | 
			
		||||
        for (int j = 0; j < dim_vec; j++)
 | 
			
		||||
        {
 | 
			
		||||
            ip_out += pV[j] * pM[i * dim_vec + j];
 | 
			
		||||
        }
 | 
			
		||||
        pOut[i] = (q7_t) __SSAT((ip_out >> out_shift), 8);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,58 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
#include "arm_nnfunctions.h"
 | 
			
		||||
 | 
			
		||||
void      arm_nn_mult_q7_ref(q7_t * pSrcA, 
 | 
			
		||||
                             q7_t * pSrcB, 
 | 
			
		||||
                             q7_t * pDst, 
 | 
			
		||||
                             const uint16_t out_shift, 
 | 
			
		||||
                             uint32_t blockSize) {
 | 
			
		||||
    uint16_t  i;
 | 
			
		||||
 | 
			
		||||
for (i = 0; i < blockSize; i++)
 | 
			
		||||
    {
 | 
			
		||||
		q31_t product = pSrcA[i] * pSrcB[i];
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
        pDst[i] = (q7_t)__SSAT((product + (0x1 << (out_shift - 1)))>>out_shift, 8);
 | 
			
		||||
#else
 | 
			
		||||
        pDst[i] = (q7_t)__SSAT(product >> out_shift, 8);
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void     arm_nn_mult_q15_ref(q15_t * pSrcA, 
 | 
			
		||||
                             q15_t * pSrcB, 
 | 
			
		||||
                             q15_t * pDst, 
 | 
			
		||||
                             const uint16_t out_shift, 
 | 
			
		||||
                             uint32_t blockSize) {
 | 
			
		||||
    uint16_t  i;
 | 
			
		||||
 | 
			
		||||
for (i = 0; i < blockSize; i++)
 | 
			
		||||
    {
 | 
			
		||||
		q31_t product = pSrcA[i] * pSrcB[i];
 | 
			
		||||
#ifndef ARM_NN_TRUNCATE
 | 
			
		||||
        pDst[i] = (q15_t)__SSAT((product + (0x1 << (out_shift - 1)))>>out_shift, 16);
 | 
			
		||||
#else
 | 
			
		||||
        pDst[i] = (q15_t)__SSAT(product >> out_shift, 16);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,96 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
void arm_avepool_q7_HWC_ref(const q7_t * Im_in, // input image
 | 
			
		||||
                            const uint16_t dim_im_in,   // input image dimension
 | 
			
		||||
                            const uint16_t ch_im_in,    // number of input image channels
 | 
			
		||||
                            const uint16_t dim_kernel,  // window kernel size
 | 
			
		||||
                            const uint16_t padding, // padding sizes
 | 
			
		||||
                            const uint16_t stride,  // stride
 | 
			
		||||
                            const uint16_t dim_im_out,  // output image dimension
 | 
			
		||||
                            q7_t * bufferA, // a buffer for local storage
 | 
			
		||||
                            q7_t * Im_out)
 | 
			
		||||
{
 | 
			
		||||
    int16_t   i_ch_in, i_x, i_y;
 | 
			
		||||
    int16_t   k_x, k_y;
 | 
			
		||||
 | 
			
		||||
    for (i_ch_in = 0; i_ch_in < ch_im_in; i_ch_in++)
 | 
			
		||||
    {
 | 
			
		||||
        for (i_y = 0; i_y < dim_im_out; i_y++)
 | 
			
		||||
        {
 | 
			
		||||
            for (i_x = 0; i_x < dim_im_out; i_x++)
 | 
			
		||||
            {
 | 
			
		||||
                int       sum = 0;
 | 
			
		||||
                int       count = 0;
 | 
			
		||||
                for (k_y = i_y * stride - padding; k_y < i_y * stride - padding + dim_kernel; k_y++)
 | 
			
		||||
                {
 | 
			
		||||
                    for (k_x = i_x * stride - padding; k_x < i_x * stride - padding + dim_kernel; k_x++)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (k_y >= 0 && k_x >= 0 && k_y < dim_im_in && k_x < dim_im_in)
 | 
			
		||||
                        {
 | 
			
		||||
                            sum += Im_in[i_ch_in + ch_im_in * (k_x + k_y * dim_im_in)];
 | 
			
		||||
                            count++;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Im_out[i_ch_in + ch_im_in * (i_x + i_y * dim_im_out)] = sum / count;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void arm_maxpool_q7_HWC_ref(const q7_t * Im_in, // input image
 | 
			
		||||
                            const uint16_t dim_im_in,   // input image dimension
 | 
			
		||||
                            const uint16_t ch_im_in,    // number of input image channels
 | 
			
		||||
                            const uint16_t dim_kernel,  // window kernel size
 | 
			
		||||
                            const uint16_t padding, // padding sizes
 | 
			
		||||
                            const uint16_t stride,  // stride
 | 
			
		||||
                            const uint16_t dim_im_out,  // output image dimension
 | 
			
		||||
                            q7_t * bufferA, // a buffer for local storage
 | 
			
		||||
                            q7_t * Im_out)
 | 
			
		||||
{
 | 
			
		||||
    int16_t   i_ch_in, i_x, i_y;
 | 
			
		||||
    int16_t   k_x, k_y;
 | 
			
		||||
 | 
			
		||||
    for (i_ch_in = 0; i_ch_in < ch_im_in; i_ch_in++)
 | 
			
		||||
    {
 | 
			
		||||
        for (i_y = 0; i_y < dim_im_out; i_y++)
 | 
			
		||||
        {
 | 
			
		||||
            for (i_x = 0; i_x < dim_im_out; i_x++)
 | 
			
		||||
            {
 | 
			
		||||
                int       max = -129;
 | 
			
		||||
                for (k_y = i_y * stride - padding; k_y < i_y * stride - padding + dim_kernel; k_y++)
 | 
			
		||||
                {
 | 
			
		||||
                    for (k_x = i_x * stride - padding; k_x < i_x * stride - padding + dim_kernel; k_x++)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (k_y >= 0 && k_x >= 0 && k_y < dim_im_in && k_x < dim_im_in)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (Im_in[i_ch_in + ch_im_in * (k_x + k_y * dim_im_in)] > max)
 | 
			
		||||
                            {
 | 
			
		||||
                                max = Im_in[i_ch_in + ch_im_in * (k_x + k_y * dim_im_in)];
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                Im_out[i_ch_in + ch_im_in * (i_x + i_y * dim_im_out)] = max;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,42 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
#include "arm_nnfunctions.h"
 | 
			
		||||
 | 
			
		||||
void arm_relu_q7_ref(q7_t * data, uint16_t size)
 | 
			
		||||
{
 | 
			
		||||
    uint16_t  i;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < size; i++)
 | 
			
		||||
    {
 | 
			
		||||
        if (data[i] < 0)
 | 
			
		||||
            data[i] = 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void arm_relu_q15_ref(q15_t * data, uint16_t size)
 | 
			
		||||
{
 | 
			
		||||
    uint16_t  i;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < size; i++)
 | 
			
		||||
    {
 | 
			
		||||
        if (data[i] < 0)
 | 
			
		||||
            data[i] = 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -0,0 +1,250 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _REF_FUNCTIONS_H_
 | 
			
		||||
#define _REF_FUNCTIONS_H_
 | 
			
		||||
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
#include "arm_nnfunctions.h"
 | 
			
		||||
//#include "arm_nnsupportfunctions.h"
 | 
			
		||||
#include "fully_connected_testing_weights.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern    "C"
 | 
			
		||||
{
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Convolution reference implemenation
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
    void      arm_convolve_HWC_q7_ref(const q7_t * Im_in,   // input image
 | 
			
		||||
                                      const uint16_t dim_im_in, // input image dimention
 | 
			
		||||
                                      const uint16_t ch_im_in,  // number of input image channels
 | 
			
		||||
                                      const q7_t * wt,  // kernel weights 
 | 
			
		||||
                                      const uint16_t ch_im_out, // number of filters, i.e., output image channels
 | 
			
		||||
                                      const uint16_t dim_kernel,    // filter kernel size
 | 
			
		||||
                                      const uint16_t padding,   // padding sizes
 | 
			
		||||
                                      const uint16_t stride,    // stride
 | 
			
		||||
                                      const q7_t * bias,    // bias
 | 
			
		||||
                                      const uint16_t bias_shift, const uint16_t out_shift, q7_t * Im_out,   // output image
 | 
			
		||||
                                      const uint16_t dim_im_out,    // output image dimension
 | 
			
		||||
                                      q15_t * bufferA,  //buffer space for input
 | 
			
		||||
                                      q7_t * bufferB    //buffer space for output
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    void      arm_convolve_HWC_q7_ref_nonsquare(const q7_t * Im_in, // input image
 | 
			
		||||
                                                const uint16_t dim_im_in_x, // input image dimention x
 | 
			
		||||
                                                const uint16_t dim_im_in_y, // input image dimention y
 | 
			
		||||
                                                const uint16_t ch_im_in,    // number of input image channels
 | 
			
		||||
                                                const q7_t * wt,    // kernel weights 
 | 
			
		||||
                                                const uint16_t ch_im_out,   // number of filters, i.e., output image channels
 | 
			
		||||
                                                const uint16_t dim_kernel_x,    // filter kernel size x
 | 
			
		||||
                                                const uint16_t dim_kernel_y,    // filter kernel size y
 | 
			
		||||
                                                const uint16_t padding_x,   // padding sizes x
 | 
			
		||||
                                                const uint16_t padding_y,   // padding sizes y
 | 
			
		||||
                                                const uint16_t stride_x,    // stride x
 | 
			
		||||
                                                const uint16_t stride_y,    // stride y
 | 
			
		||||
                                                const q7_t * bias,  // bias
 | 
			
		||||
                                                const uint16_t bias_shift, const uint16_t out_shift, q7_t * Im_out, // output image
 | 
			
		||||
                                                const uint16_t dim_im_out_x,    // output image dimension x
 | 
			
		||||
                                                const uint16_t dim_im_out_y,    // output image dimension y
 | 
			
		||||
                                                q15_t * bufferA,    //buffer space for input
 | 
			
		||||
                                                q7_t * bufferB  //buffer space for output
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    void      arm_convolve_HWC_q15_ref(const q15_t * Im_in, // input image
 | 
			
		||||
                                       const uint16_t dim_im_in,    // input image dimention
 | 
			
		||||
                                       const uint16_t ch_im_in, // number of input image channels
 | 
			
		||||
                                       const q15_t * wt,    // kernel weights 
 | 
			
		||||
                                       const uint16_t ch_im_out,    // number of filters, i.e., output image channels
 | 
			
		||||
                                       const uint16_t dim_kernel,   // filter kernel size
 | 
			
		||||
                                       const uint16_t padding,  // padding sizes
 | 
			
		||||
                                       const uint16_t stride,   // stride
 | 
			
		||||
                                       const q15_t * bias,  // bias
 | 
			
		||||
                                       const uint16_t bias_shift, const uint16_t out_shift, q15_t * Im_out, // output image
 | 
			
		||||
                                       const uint16_t dim_im_out,   // output image dimension
 | 
			
		||||
                                       q15_t * bufferA, //buffer space for input
 | 
			
		||||
                                       q7_t * bufferB   //buffer space for output
 | 
			
		||||
        );
 | 
			
		||||
    void      arm_convolve_HWC_q15_nonsquare_ref(const q15_t * Im_in,
 | 
			
		||||
                                                      const uint16_t dim_im_in_x,
 | 
			
		||||
                                                      const uint16_t dim_im_in_y,
 | 
			
		||||
                                                      const uint16_t ch_im_in,
 | 
			
		||||
                                                      const q15_t * wt,
 | 
			
		||||
                                                      const uint16_t ch_im_out,
 | 
			
		||||
                                                      const uint16_t dim_kernel_x,
 | 
			
		||||
                                                      const uint16_t dim_kernel_y,
 | 
			
		||||
                                                      const uint16_t padding_x,
 | 
			
		||||
                                                      const uint16_t padding_y,
 | 
			
		||||
                                                      const uint16_t stride_x,
 | 
			
		||||
                                                      const uint16_t stride_y,
 | 
			
		||||
                                                      const q15_t * bias,
 | 
			
		||||
                                                      const uint16_t bias_shift,
 | 
			
		||||
                                                      const uint16_t out_shift,
 | 
			
		||||
                                                      q15_t * Im_out,
 | 
			
		||||
                                                      const uint16_t dim_im_out_x,
 | 
			
		||||
                                                      const uint16_t dim_im_out_y, 
 | 
			
		||||
                                                      q15_t * bufferA, 
 | 
			
		||||
                                                      q7_t * bufferB);
 | 
			
		||||
													  
 | 
			
		||||
    void      arm_depthwise_separable_conv_HWC_q7_ref(const q7_t * Im_in,   // input image
 | 
			
		||||
                                                      const uint16_t dim_im_in, // input image dimention
 | 
			
		||||
                                                      const uint16_t ch_im_in,  // number of input image channels
 | 
			
		||||
                                                      const q7_t * wt,  // kernel weights 
 | 
			
		||||
                                                      const uint16_t ch_im_out, // number of filters, i.e., output image channels
 | 
			
		||||
                                                      const uint16_t dim_kernel,    // filter kernel size
 | 
			
		||||
                                                      const uint16_t padding,   // padding sizes
 | 
			
		||||
                                                      const uint16_t stride,    // stride
 | 
			
		||||
                                                      const q7_t * bias,    // bias
 | 
			
		||||
                                                      const uint16_t bias_shift,    // amount of left-shift for bias
 | 
			
		||||
                                                      const uint16_t out_shift, // amount of right-shift for output
 | 
			
		||||
                                                      q7_t * Im_out,    // output image
 | 
			
		||||
                                                      const uint16_t dim_im_out,    // output image dimension
 | 
			
		||||
                                                      q15_t * bufferA,  //buffer space for input
 | 
			
		||||
                                                      q7_t * bufferB    //buffer space for output
 | 
			
		||||
        );
 | 
			
		||||
    void      arm_depthwise_separable_conv_HWC_q7_ref_nonsquare(const q7_t * Im_in, // input image
 | 
			
		||||
                                                                const uint16_t dim_im_in_x, // input image dimention x
 | 
			
		||||
                                                                const uint16_t dim_im_in_y, // input image dimention y
 | 
			
		||||
                                                                const uint16_t ch_im_in,    // number of input image channels
 | 
			
		||||
                                                                const q7_t * wt,    // kernel weights 
 | 
			
		||||
                                                                const uint16_t ch_im_out,   // number of filters, i.e., output image channels
 | 
			
		||||
                                                                const uint16_t dim_kernel_x,    // filter kernel size x
 | 
			
		||||
                                                                const uint16_t dim_kernel_y,    // filter kernel size y
 | 
			
		||||
                                                                const uint16_t padding_x,   // padding sizes x
 | 
			
		||||
                                                                const uint16_t padding_y,   // padding sizes y
 | 
			
		||||
                                                                const uint16_t stride_x,    // stride x
 | 
			
		||||
                                                                const uint16_t stride_y,    // stride y
 | 
			
		||||
                                                                const q7_t * bias,  // bias
 | 
			
		||||
                                                                const uint16_t bias_shift,  // amount of left-shift for bias
 | 
			
		||||
                                                                const uint16_t out_shift,   // amount of right-shift for output
 | 
			
		||||
                                                                q7_t * Im_out,  // output image
 | 
			
		||||
                                                                const uint16_t dim_im_out_x,    // output image dimension x
 | 
			
		||||
                                                                const uint16_t dim_im_out_y,    // output image dimension y
 | 
			
		||||
                                                                q15_t * bufferA,    //buffer space for input
 | 
			
		||||
                                                                q7_t * bufferB  //buffer space for output
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Fully-connected reference implemenation
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
    void      arm_fully_connected_q7_ref(const q7_t * pV,   // pointer to vector
 | 
			
		||||
                                         const q7_t * pM,   // pointer to matrix
 | 
			
		||||
                                         const uint16_t dim_vec,    // length of the vector
 | 
			
		||||
                                         const uint16_t num_of_rows,    // numCol of A
 | 
			
		||||
                                         const uint16_t bias_shift, // amount of left-shift for bias
 | 
			
		||||
                                         const uint16_t out_shift,  // amount of right-shift for output
 | 
			
		||||
                                         const q7_t * bias, q7_t * pOut,    // output operand
 | 
			
		||||
                                         q15_t * vec_buffer);
 | 
			
		||||
 | 
			
		||||
    void      arm_fully_connected_q15_ref(const q15_t * pV, // pointer to vector
 | 
			
		||||
                                          const q15_t * pM, // pointer to matrix
 | 
			
		||||
                                          const uint16_t dim_vec,   // length of the vector
 | 
			
		||||
                                          const uint16_t num_of_rows,   // numCol of A
 | 
			
		||||
                                          const uint16_t bias_shift,    // amount of left-shift for bias
 | 
			
		||||
                                          const uint16_t out_shift, // amount of right-shift for output
 | 
			
		||||
                                          const q15_t * bias, q15_t * pOut, // output operand
 | 
			
		||||
                                          q15_t * vec_buffer);
 | 
			
		||||
 | 
			
		||||
    void      arm_fully_connected_mat_q7_vec_q15_ref(const q15_t * pV,  // pointer to vector
 | 
			
		||||
                                                     const q7_t * pM,   // pointer to matrix
 | 
			
		||||
                                                     const uint16_t dim_vec,    // length of the vector
 | 
			
		||||
                                                     const uint16_t num_of_rows,    // numCol of A
 | 
			
		||||
                                                     const uint16_t bias_shift, // amount of left-shift for bias
 | 
			
		||||
                                                     const uint16_t out_shift,  // amount of right-shift for output
 | 
			
		||||
                                                     const q7_t * bias, q15_t * pOut,   // output operand
 | 
			
		||||
                                                     q15_t * vec_buffer);
 | 
			
		||||
 | 
			
		||||
    void      arm_fully_connected_q7_opt_ref(const q7_t * pV,   // pointer to vector
 | 
			
		||||
                                             const q7_t * pM,   // pointer to matrix
 | 
			
		||||
                                             const uint16_t dim_vec,    // length of the vector
 | 
			
		||||
                                             const uint16_t num_of_rows,    // numCol of A
 | 
			
		||||
                                             const uint16_t bias_shift, // amount of left-shift for bias
 | 
			
		||||
                                             const uint16_t out_shift,  // amount of right-shift for output
 | 
			
		||||
                                             const q7_t * bias, q7_t * pOut,    // output operand
 | 
			
		||||
                                             q15_t * vec_buffer);
 | 
			
		||||
 | 
			
		||||
    void      arm_fully_connected_q15_opt_ref(const q15_t * pV, // pointer to vector
 | 
			
		||||
                                              const q15_t * pM, // pointer to matrix
 | 
			
		||||
                                              const uint16_t dim_vec,   // length of the vector
 | 
			
		||||
                                              const uint16_t num_of_rows,   // numCol of A
 | 
			
		||||
                                              const uint16_t bias_shift,    // amount of left-shift for bias
 | 
			
		||||
                                              const uint16_t out_shift, // amount of right-shift for output
 | 
			
		||||
                                              const q15_t * bias, q15_t * pOut, // output operand
 | 
			
		||||
                                              q15_t * vec_buffer);
 | 
			
		||||
 | 
			
		||||
    void      arm_fully_connected_mat_q7_vec_q15_opt_ref(const q15_t * pV,  // pointer to vector
 | 
			
		||||
                                                         const q7_t * pM,   // pointer to matrix
 | 
			
		||||
                                                         const uint16_t dim_vec,    // length of the vector
 | 
			
		||||
                                                         const uint16_t num_of_rows,    // numCol of A
 | 
			
		||||
                                                         const uint16_t bias_shift, // amount of left-shift for bias
 | 
			
		||||
                                                         const uint16_t out_shift,  // amount of right-shift for output
 | 
			
		||||
                                                         const q7_t * bias, q15_t * pOut,   // output operand
 | 
			
		||||
                                                         q15_t * vec_buffer);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Pooling reference implemenation
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
    void      arm_avepool_q7_HWC_ref(const q7_t * Im_in,    // input image
 | 
			
		||||
                                     const uint16_t dim_im_in,  // input image dimension
 | 
			
		||||
                                     const uint16_t ch_im_in,   // number of input image channels
 | 
			
		||||
                                     const uint16_t dim_kernel, // window kernel size
 | 
			
		||||
                                     const uint16_t padding,    // padding sizes
 | 
			
		||||
                                     const uint16_t stride, // stride
 | 
			
		||||
                                     const uint16_t dim_im_out, // output image dimension
 | 
			
		||||
                                     q7_t * bufferA,    // a buffer for local storage
 | 
			
		||||
                                     q7_t * Im_out);
 | 
			
		||||
 | 
			
		||||
    void      arm_maxpool_q7_HWC_ref(const q7_t * Im_in,    // input image
 | 
			
		||||
                                     const uint16_t dim_im_in,  // input image dimension
 | 
			
		||||
                                     const uint16_t ch_im_in,   // number of input image channels
 | 
			
		||||
                                     const uint16_t dim_kernel, // window kernel size
 | 
			
		||||
                                     const uint16_t padding,    // padding sizes
 | 
			
		||||
                                     const uint16_t stride, // stride
 | 
			
		||||
                                     const uint16_t dim_im_out, // output image dimension
 | 
			
		||||
                                     q7_t * bufferA,    // a buffer for local storage
 | 
			
		||||
                                     q7_t * Im_out);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Other reference implemenation
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
    void      arm_relu_q7_ref(q7_t * data, uint16_t size);
 | 
			
		||||
 | 
			
		||||
    void      arm_relu_q15_ref(q15_t * data, uint16_t size);
 | 
			
		||||
 | 
			
		||||
    void      arm_nn_mult_q7_ref(q7_t * pSrcA, q7_t * pSrcB, q7_t * pDst, const uint16_t out_shift, uint32_t blockSize);
 | 
			
		||||
 | 
			
		||||
    void      arm_nn_mult_q15_ref(q15_t * pSrcA, q15_t * pSrcB, q15_t * pDst, const uint16_t out_shift, uint32_t blockSize);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										801
									
								
								Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/arm_nnexamples_nn_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										801
									
								
								Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/arm_nnexamples_nn_test.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,801 @@
 | 
			
		||||
/* ----------------------------------------------------------------------
 | 
			
		||||
* Copyright (C) 2010-2018 Arm Limited. All rights reserved.
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
* Project:       CMSIS NN Library
 | 
			
		||||
* Title:         arm_nnexamples_nn_test.cpp
 | 
			
		||||
*
 | 
			
		||||
* Description:   Example code for NN kernel testing.
 | 
			
		||||
*
 | 
			
		||||
* Target Processor: Cortex-M cores
 | 
			
		||||
*
 | 
			
		||||
* Redistribution and use in source and binary forms, with or without
 | 
			
		||||
* modification, are permitted provided that the following conditions
 | 
			
		||||
* are met:
 | 
			
		||||
*   - Redistributions of source code must retain the above copyright
 | 
			
		||||
*     notice, this list of conditions and the following disclaimer.
 | 
			
		||||
*   - Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
*     notice, this list of conditions and the following disclaimer in
 | 
			
		||||
*     the documentation and/or other materials provided with the
 | 
			
		||||
*     distribution.
 | 
			
		||||
*   - Neither the name of ARM LIMITED nor the names of its contributors
 | 
			
		||||
*     may be used to endorse or promote products derived from this
 | 
			
		||||
*     software without specific prior written permission.
 | 
			
		||||
*
 | 
			
		||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 | 
			
		||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 | 
			
		||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
			
		||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | 
			
		||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
			
		||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
			
		||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 | 
			
		||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
			
		||||
* POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
* -------------------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
#include "arm_nnexamples_nn_test.h"
 | 
			
		||||
 | 
			
		||||
//#define TEST_SIGMOID
 | 
			
		||||
//#define TEST_TANH
 | 
			
		||||
#define TEST_POOL
 | 
			
		||||
#define TEST_RELU
 | 
			
		||||
#define TEST_IP
 | 
			
		||||
#define TEST_CONV
 | 
			
		||||
#define TEST_NONSQUARE
 | 
			
		||||
#define TEST_NNMULT
 | 
			
		||||
 | 
			
		||||
int test_index = 0;
 | 
			
		||||
q7_t test_flags[50];
 | 
			
		||||
bool test_pass;
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    printf("start tests\n");
 | 
			
		||||
 | 
			
		||||
    srand(1);
 | 
			
		||||
 | 
			
		||||
    // common pointers for testing data
 | 
			
		||||
    q7_t     *test1;
 | 
			
		||||
    q15_t    *test2;
 | 
			
		||||
    q7_t     *test3;
 | 
			
		||||
    q15_t    *test4;
 | 
			
		||||
 | 
			
		||||
    for (test_index = 0; test_index<50; test_index++) {
 | 
			
		||||
        test_flags[test_index] = -1;
 | 
			
		||||
    }
 | 
			
		||||
    test_index = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef TEST_NNMULT
 | 
			
		||||
#define NNMULT_DIM 128
 | 
			
		||||
    test1 = new q7_t[NNMULT_DIM*2];
 | 
			
		||||
    test2 = new q15_t[NNMULT_DIM*2];
 | 
			
		||||
    test3 = new q7_t[NNMULT_DIM*2];
 | 
			
		||||
    test4 = new q15_t[NNMULT_DIM*2];
 | 
			
		||||
 | 
			
		||||
    q7_t * mult_out_q7 = test3;
 | 
			
		||||
    q7_t * mult_ref_q7 = test3 + NNMULT_DIM;
 | 
			
		||||
    q15_t * mult_out_q15 = test4;
 | 
			
		||||
    q15_t * mult_ref_q15 = test4 + NNMULT_DIM;
 | 
			
		||||
 | 
			
		||||
    for (int i=0;i<NNMULT_DIM*2;i++) {
 | 
			
		||||
        test1[i] = (rand() % 256 - 128);
 | 
			
		||||
        test2[i] = (rand() % 65536 - 32768);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Test q7
 | 
			
		||||
    arm_nn_mult_q7(test1, test1+NNMULT_DIM, mult_out_q7, 5, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
    arm_nn_mult_q7_ref(test1, test1+NNMULT_DIM, mult_ref_q7, 5, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(mult_out_q7, mult_ref_q7, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
    arm_nn_mult_q7(test1, test1+NNMULT_DIM, mult_out_q7, 9, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
    arm_nn_mult_q7_ref(test1, test1+NNMULT_DIM, mult_ref_q7, 9, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(mult_out_q7, mult_ref_q7, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
    // Test q15
 | 
			
		||||
    arm_nn_mult_q15(test2, test2+NNMULT_DIM, mult_out_q15, 13, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
    arm_nn_mult_q15_ref(test2, test2+NNMULT_DIM, mult_ref_q15, 13, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(mult_out_q15, mult_ref_q15, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
    arm_nn_mult_q15(test2, test2+NNMULT_DIM, mult_out_q15, 18, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
    arm_nn_mult_q15_ref(test2, test2+NNMULT_DIM, mult_ref_q15, 18, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(mult_out_q15, mult_ref_q15, NNMULT_DIM);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef TEST_SIGMOID
 | 
			
		||||
 | 
			
		||||
#define SIGMOID_DIM 128
 | 
			
		||||
 | 
			
		||||
    /* This part tests the running of sigmoid functions */
 | 
			
		||||
 | 
			
		||||
    test1 = new q7_t[SIGMOID_DIM];
 | 
			
		||||
    test2 = new q15_t[SIGMOID_DIM];
 | 
			
		||||
    test3 = new q7_t[SIGMOID_DIM];
 | 
			
		||||
    test4 = new q15_t[SIGMOID_DIM];
 | 
			
		||||
 | 
			
		||||
    srand(1);
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < SIGMOID_DIM; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test1[i] = (rand() % 256 - 128);
 | 
			
		||||
        test2[i] = (rand() % 65536 - 32768);
 | 
			
		||||
        test3[i] = test1[i];
 | 
			
		||||
        test4[i] = test2[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    arm_nn_activations_direct_q7(test3, SIGMOID_DIM, 3, ARM_SIGMOID);
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < SIGMOID_DIM; i++)
 | 
			
		||||
    {
 | 
			
		||||
        printf("in: %d  out: %d\n", test1[i], test3[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf("start testing q15_t sigmoid\n\n");
 | 
			
		||||
 | 
			
		||||
    arm_nn_activations_direct_q15(test4, SIGMOID_DIM, 3, ARM_SIGMOID);
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < SIGMOID_DIM; i++)
 | 
			
		||||
    {
 | 
			
		||||
        printf("in: %d  out: %d\n", test2[i], test4[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    delete[]test1;
 | 
			
		||||
    delete[]test2;
 | 
			
		||||
    delete[]test3;
 | 
			
		||||
    delete[]test4;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef TEST_TANH
 | 
			
		||||
 | 
			
		||||
#define TANH_DIM 128
 | 
			
		||||
 | 
			
		||||
    /* This part tests the running of sigmoid functions */
 | 
			
		||||
 | 
			
		||||
    test1 = new q7_t[TANH_DIM];
 | 
			
		||||
    test2 = new q15_t[TANH_DIM];
 | 
			
		||||
    test3 = new q7_t[TANH_DIM];
 | 
			
		||||
    test4 = new q15_t[TANH_DIM];
 | 
			
		||||
 | 
			
		||||
    srand(1);
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < TANH_DIM; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test1[i] = (rand() % 256 - 128);
 | 
			
		||||
        test2[i] = (rand() % 65536 - 32768);
 | 
			
		||||
        test3[i] = test1[i];
 | 
			
		||||
        test4[i] = test2[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    arm_nn_activations_direct_q7(test3, TANH_DIM, 3, ARM_TANH);
 | 
			
		||||
 | 
			
		||||
    printf("start testing q7_t tanh\n\n");
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < TANH_DIM; i++)
 | 
			
		||||
    {
 | 
			
		||||
        printf("in: %d  out: %d\n", test1[i], test3[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf("start testing q15_t tanh\n\n");
 | 
			
		||||
 | 
			
		||||
    arm_nn_activations_direct_q15(test4, TANH_DIM, 3, ARM_TANH);
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < TANH_DIM; i++)
 | 
			
		||||
    {
 | 
			
		||||
        printf("in: %d  out: %d\n", test2[i], test4[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    delete[]test1;
 | 
			
		||||
    delete[]test2;
 | 
			
		||||
    delete[]test3;
 | 
			
		||||
    delete[]test4;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef TEST_POOL
 | 
			
		||||
 | 
			
		||||
#define POOL_IM_DIM 32
 | 
			
		||||
#define POOL_IM_CH 8
 | 
			
		||||
 | 
			
		||||
    test1 = new q7_t[POOL_IM_DIM * POOL_IM_DIM * POOL_IM_CH * 2];
 | 
			
		||||
    test2 = new q15_t[POOL_IM_DIM * POOL_IM_CH];
 | 
			
		||||
    test3 = new q7_t[POOL_IM_DIM * POOL_IM_DIM * POOL_IM_CH];
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < POOL_IM_DIM * POOL_IM_DIM * POOL_IM_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test1[i] = (rand() % 256 - 128);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    q7_t     *img_in = test1 + POOL_IM_DIM * POOL_IM_DIM * POOL_IM_CH;
 | 
			
		||||
    q7_t     *pool_out_ref = test3;
 | 
			
		||||
    q7_t     *pool_out_opt = test3 + POOL_IM_DIM * POOL_IM_DIM * POOL_IM_CH / 2;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < POOL_IM_DIM * POOL_IM_DIM * POOL_IM_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test3[i] = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // copy over the img input
 | 
			
		||||
    for (int i = 0; i < POOL_IM_DIM * POOL_IM_DIM * POOL_IM_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        img_in[i] = test1[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    initialize_results_q7(pool_out_ref, pool_out_opt, POOL_IM_DIM / 2 * POOL_IM_DIM / 2 * POOL_IM_CH);
 | 
			
		||||
 | 
			
		||||
    printf("Start maxpool reference implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_maxpool_q7_HWC_ref(img_in, POOL_IM_DIM, POOL_IM_CH, 3, 0, 2, POOL_IM_DIM / 2, (q7_t *) test2, pool_out_ref);
 | 
			
		||||
 | 
			
		||||
    // copy over the img input
 | 
			
		||||
    for (int i = 0; i < POOL_IM_DIM * POOL_IM_DIM * POOL_IM_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        img_in[i] = test1[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf("Start maxpool opt implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_maxpool_q7_HWC(img_in, POOL_IM_DIM, POOL_IM_CH, 3, 0, 2, POOL_IM_DIM / 2, (q7_t *) test2, pool_out_opt);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(pool_out_ref, pool_out_opt, POOL_IM_DIM / 2 * POOL_IM_DIM / 2 * POOL_IM_CH);
 | 
			
		||||
 | 
			
		||||
    // copy over the img input
 | 
			
		||||
    for (int i = 0; i < POOL_IM_DIM * POOL_IM_DIM * POOL_IM_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        img_in[i] = test1[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // copy over the img input
 | 
			
		||||
    for (int i = 0; i < POOL_IM_DIM * POOL_IM_DIM * POOL_IM_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        img_in[i] = test1[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf("Start avepool ref implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_avepool_q7_HWC_ref(img_in, POOL_IM_DIM, POOL_IM_CH, 3, 0, 2, POOL_IM_DIM / 2, (q7_t *) test2, pool_out_ref);
 | 
			
		||||
 | 
			
		||||
    // copy over the img input
 | 
			
		||||
    for (int i = 0; i < POOL_IM_DIM * POOL_IM_DIM * POOL_IM_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        img_in[i] = test1[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf("Start avepool opt implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_avepool_q7_HWC(img_in, POOL_IM_DIM, POOL_IM_CH, 3, 0, 2, POOL_IM_DIM / 2, (q7_t *) test2, pool_out_opt);
 | 
			
		||||
 | 
			
		||||
    // special check here
 | 
			
		||||
    bool      if_ave_pool_match = true;
 | 
			
		||||
    for (int i = 0; i < POOL_IM_DIM / 2 * POOL_IM_DIM / 2 * POOL_IM_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        // we tolerate at most difference of 1 here because of rounding errors
 | 
			
		||||
        if (pool_out_ref[i] - pool_out_opt[i] >= 2 || pool_out_opt[i] - pool_out_ref[i] >= 2)
 | 
			
		||||
        {
 | 
			
		||||
            printf("Output mismatch at %d, expected %d, actual %d\n", i, pool_out_ref[i], pool_out_opt[i]);
 | 
			
		||||
            if_ave_pool_match = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (if_ave_pool_match == true)
 | 
			
		||||
    {
 | 
			
		||||
        printf("Outputs match.\n");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    delete[]test1;
 | 
			
		||||
    delete[]test2;
 | 
			
		||||
    delete[]test3;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef TEST_RELU
 | 
			
		||||
 | 
			
		||||
#define RELU_DIM 127
 | 
			
		||||
 | 
			
		||||
    test1 = new q7_t[RELU_DIM];
 | 
			
		||||
    test2 = new q15_t[RELU_DIM];
 | 
			
		||||
    test3 = new q7_t[RELU_DIM];
 | 
			
		||||
    test4 = new q15_t[RELU_DIM];
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < RELU_DIM; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test1[i] = (rand() % 256 - 128);
 | 
			
		||||
        test2[i] = (rand() % 65536 - 32768);
 | 
			
		||||
        test3[i] = test1[i];
 | 
			
		||||
        test4[i] = test2[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    q7_t     *relu_ref_data_q7 = test1;
 | 
			
		||||
    q7_t     *relu_opt_data_q7 = test3;
 | 
			
		||||
    q15_t    *relu_ref_data_q15 = test2;
 | 
			
		||||
    q15_t    *relu_opt_data_q15 = test4;
 | 
			
		||||
 | 
			
		||||
    printf("Start ref relu q7 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_relu_q7_ref(relu_ref_data_q7, RELU_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start opt relu q7 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_relu_q7(relu_opt_data_q7, RELU_DIM);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(relu_ref_data_q7, relu_opt_data_q7, RELU_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start ref relu q15 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_relu_q15_ref(relu_ref_data_q15, RELU_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start opt relu q15 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_relu_q15(relu_opt_data_q15, RELU_DIM);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(relu_ref_data_q15, relu_opt_data_q15, RELU_DIM);
 | 
			
		||||
 | 
			
		||||
    delete[]test1;
 | 
			
		||||
    delete[]test2;
 | 
			
		||||
    delete[]test3;
 | 
			
		||||
    delete[]test4;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef TEST_IP
 | 
			
		||||
 | 
			
		||||
#define IP_ROW_DIM 127
 | 
			
		||||
#define IP_COL_DIM 127
 | 
			
		||||
 | 
			
		||||
    q7_t      ip_weights[IP_ROW_DIM * IP_COL_DIM] = IP2_WEIGHT;
 | 
			
		||||
    q7_t      ip_q7_opt_weights[IP_ROW_DIM * IP_COL_DIM] = IP4_WEIGHT;
 | 
			
		||||
    q7_t      ip_q7_q15_opt_weights[IP_ROW_DIM * IP_COL_DIM] = IP4_q7_q15_WEIGHT;
 | 
			
		||||
    q15_t     ip_q15_weights[IP_ROW_DIM * IP_COL_DIM] = IP2_WEIGHT;
 | 
			
		||||
    q15_t     ip_q15_opt_weights[IP_ROW_DIM * IP_COL_DIM] = IP4_WEIGHT_Q15;
 | 
			
		||||
 | 
			
		||||
    test1 = new q7_t[IP_COL_DIM + IP_ROW_DIM];
 | 
			
		||||
    test2 = new q15_t[IP_COL_DIM];
 | 
			
		||||
    test3 = new q7_t[IP_ROW_DIM * 3];
 | 
			
		||||
    test4 = new q15_t[IP_COL_DIM + IP_ROW_DIM * 2];
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < IP_ROW_DIM + IP_COL_DIM; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test1[i] = rand() % 256 - 100;
 | 
			
		||||
    }
 | 
			
		||||
    for (int i = 0; i < IP_ROW_DIM * 3; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test3[i] = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    q7_t     *ip_bias_q7 = test1 + IP_COL_DIM;
 | 
			
		||||
 | 
			
		||||
    q7_t     *ip_out_q7_ref = test3;
 | 
			
		||||
    q7_t     *ip_out_q7_opt = test3 + IP_ROW_DIM;
 | 
			
		||||
    q7_t     *ip_out_q7_opt_fast = test3 + 2 * IP_ROW_DIM;
 | 
			
		||||
    q15_t    *ip_out_q15_ref = test4 + IP_COL_DIM;
 | 
			
		||||
    q15_t    *ip_out_q15_opt = test4 + IP_COL_DIM + IP_ROW_DIM;
 | 
			
		||||
 | 
			
		||||
    initialize_results_q7(ip_out_q7_ref, ip_out_q7_opt, IP_ROW_DIM);
 | 
			
		||||
    initialize_results_q7(ip_out_q7_ref, ip_out_q7_opt_fast, IP_ROW_DIM);
 | 
			
		||||
    initialize_results_q7(ip_out_q7_ref, ip_out_q7_opt_fast, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start ref q7 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_q7_ref(test1, ip_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, ip_bias_q7, ip_out_q7_ref, test2);
 | 
			
		||||
 | 
			
		||||
    printf("Start q7 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_q7(test1, ip_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, ip_bias_q7, ip_out_q7_opt, test2);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(ip_out_q7_ref, ip_out_q7_opt, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start q7 ref opt implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_q7_opt_ref(test1, ip_q7_opt_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, ip_bias_q7,
 | 
			
		||||
                                   ip_out_q7_opt_fast, test2);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(ip_out_q7_ref, ip_out_q7_opt_fast, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start q7 opt implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_q7_opt(test1, ip_q7_opt_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, ip_bias_q7, ip_out_q7_opt_fast,
 | 
			
		||||
                               test2);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(ip_out_q7_ref, ip_out_q7_opt_fast, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < IP_ROW_DIM + IP_COL_DIM; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test4[i] = (rand() % 65536 - 32768);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    initialize_results_q15(ip_out_q15_ref, ip_out_q15_opt, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start ref q15 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_q15_ref(test4, ip_q15_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, test2, ip_out_q15_ref, NULL);
 | 
			
		||||
 | 
			
		||||
    printf("Start q15 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_q15(test4, ip_q15_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, test2, ip_out_q15_opt, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(ip_out_q15_ref, ip_out_q15_opt, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start ref opt q15 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_q15_opt_ref(test4, ip_q15_opt_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, test2, ip_out_q15_opt,
 | 
			
		||||
                                    NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(ip_out_q15_ref, ip_out_q15_opt, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start opt q15 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_q15_opt(test4, ip_q15_opt_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, test2, ip_out_q15_opt, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(ip_out_q15_ref, ip_out_q15_opt, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    initialize_results_q15(ip_out_q15_ref, ip_out_q15_opt, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start ref q7_q15 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_mat_q7_vec_q15_ref(test4, ip_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, ip_bias_q7, ip_out_q15_ref,
 | 
			
		||||
                                           test2);
 | 
			
		||||
 | 
			
		||||
    printf("Start q7_q15 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_mat_q7_vec_q15(test4, ip_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, ip_bias_q7, ip_out_q15_opt,
 | 
			
		||||
                                       test2);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(ip_out_q15_ref, ip_out_q15_opt, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start ref opt q7_q15 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_mat_q7_vec_q15_opt_ref(test4, ip_q7_q15_opt_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, ip_bias_q7,
 | 
			
		||||
                                               ip_out_q15_opt, test2);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(ip_out_q15_ref, ip_out_q15_opt, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    printf("Start opt q7_q15 implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_fully_connected_mat_q7_vec_q15_opt(test4, ip_q7_q15_opt_weights, IP_COL_DIM, IP_ROW_DIM, 1, 7, ip_bias_q7,
 | 
			
		||||
                                           ip_out_q15_opt, test2);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(ip_out_q15_ref, ip_out_q15_opt, IP_ROW_DIM);
 | 
			
		||||
 | 
			
		||||
    delete[]test1;
 | 
			
		||||
    delete[]test2;
 | 
			
		||||
    delete[]test3;
 | 
			
		||||
    delete[]test4;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef TEST_NONSQUARE
 | 
			
		||||
 | 
			
		||||
/* Use RCONV to differential with square CONV */
 | 
			
		||||
 | 
			
		||||
#define RCONV_IM_DIM_X 10
 | 
			
		||||
#define RCONV_IM_DIM_Y 8
 | 
			
		||||
#define RCONV_IM_CH 4
 | 
			
		||||
#define RCONV_KER_DIM_X 5
 | 
			
		||||
#define RCONV_KER_DIM_Y 3
 | 
			
		||||
#define RCONV_STRIDE_X 1
 | 
			
		||||
#define RCONV_STRIDE_Y 1
 | 
			
		||||
#define RCONV_PADDING_X 2
 | 
			
		||||
#define RCONV_PADDING_Y 1
 | 
			
		||||
#define RCONV_OUT_CH 4
 | 
			
		||||
#define RCONV_OUT_DIM_X 10
 | 
			
		||||
#define RCONV_OUT_DIM_Y 8
 | 
			
		||||
 | 
			
		||||
    test1 = new q7_t[RCONV_KER_DIM_Y * RCONV_KER_DIM_X * RCONV_IM_CH * RCONV_OUT_CH + RCONV_OUT_CH];
 | 
			
		||||
    test2 = new q15_t[2 * RCONV_KER_DIM_Y * RCONV_KER_DIM_X * RCONV_IM_CH];
 | 
			
		||||
    test3 =
 | 
			
		||||
        new q7_t[RCONV_IM_DIM_Y * RCONV_IM_DIM_X * RCONV_IM_CH + 2 * RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH];
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < RCONV_KER_DIM_Y * RCONV_KER_DIM_X * RCONV_IM_CH * RCONV_OUT_CH + RCONV_OUT_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test1[i] = rand() % 256 - 100;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (int i = 0;
 | 
			
		||||
         i < RCONV_IM_DIM_Y * RCONV_IM_DIM_X * RCONV_IM_CH + 2 * RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test3[i] = rand() % 256 - 100;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    q7_t     *rconv_weight_q7 = test1;
 | 
			
		||||
    q7_t     *rconv_bias_q7 = test1 + RCONV_KER_DIM_Y * RCONV_KER_DIM_X * RCONV_IM_CH * RCONV_OUT_CH;
 | 
			
		||||
 | 
			
		||||
    q15_t    *rconv_buf = test2;
 | 
			
		||||
 | 
			
		||||
    q7_t     *rconv_im_in_q7 = test3;
 | 
			
		||||
    q7_t     *rconv_im_out_ref_q7 = test3 + RCONV_IM_DIM_Y * RCONV_IM_DIM_X * RCONV_IM_CH;
 | 
			
		||||
    q7_t     *rconv_im_out_opt_q7 =
 | 
			
		||||
        test3 + RCONV_IM_DIM_Y * RCONV_IM_DIM_X * RCONV_IM_CH + RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH;
 | 
			
		||||
 | 
			
		||||
    initialize_results_q7(rconv_im_out_ref_q7, rconv_im_out_opt_q7, RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    printf("start conv q7 nonsquare ref implementation\n");
 | 
			
		||||
    arm_convolve_HWC_q7_ref_nonsquare(rconv_im_in_q7, RCONV_IM_DIM_X, RCONV_IM_DIM_Y, RCONV_IM_CH, rconv_weight_q7,
 | 
			
		||||
                                      RCONV_OUT_CH, RCONV_KER_DIM_X, RCONV_KER_DIM_Y, RCONV_PADDING_X, RCONV_PADDING_Y,
 | 
			
		||||
                                      RCONV_STRIDE_X, RCONV_STRIDE_Y, rconv_bias_q7, 1, 7, rconv_im_out_ref_q7,
 | 
			
		||||
                                      RCONV_OUT_DIM_X, RCONV_OUT_DIM_Y, rconv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    printf("start conv q7 nonsquare opt implementation\n");
 | 
			
		||||
    arm_convolve_HWC_q7_fast_nonsquare(rconv_im_in_q7, RCONV_IM_DIM_X, RCONV_IM_DIM_Y, RCONV_IM_CH, rconv_weight_q7,
 | 
			
		||||
                                       RCONV_OUT_CH, RCONV_KER_DIM_X, RCONV_KER_DIM_Y, RCONV_PADDING_X, RCONV_PADDING_Y,
 | 
			
		||||
                                       RCONV_STRIDE_X, RCONV_STRIDE_Y, rconv_bias_q7, 1, 7, rconv_im_out_opt_q7,
 | 
			
		||||
                                       RCONV_OUT_DIM_X, RCONV_OUT_DIM_Y, rconv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(rconv_im_out_ref_q7, rconv_im_out_opt_q7, RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    initialize_results_q7(rconv_im_out_ref_q7, rconv_im_out_opt_q7, RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    printf("start conv q7 nonsquare ref implementation\n");
 | 
			
		||||
    arm_convolve_HWC_q7_ref_nonsquare(rconv_im_in_q7, RCONV_IM_DIM_X, RCONV_IM_DIM_Y, RCONV_IM_CH, rconv_weight_q7,
 | 
			
		||||
                                      RCONV_OUT_CH, RCONV_KER_DIM_X, RCONV_KER_DIM_Y, RCONV_PADDING_X, RCONV_PADDING_Y,
 | 
			
		||||
                                      RCONV_STRIDE_X, RCONV_STRIDE_Y, rconv_bias_q7, 1, 7, rconv_im_out_ref_q7,
 | 
			
		||||
                                      RCONV_OUT_DIM_X, RCONV_OUT_DIM_Y, rconv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    printf("start conv q7 nonsquare basic implementation\n");
 | 
			
		||||
    arm_convolve_HWC_q7_basic_nonsquare(rconv_im_in_q7, RCONV_IM_DIM_X, RCONV_IM_DIM_Y, RCONV_IM_CH, rconv_weight_q7,
 | 
			
		||||
                                       RCONV_OUT_CH, RCONV_KER_DIM_X, RCONV_KER_DIM_Y, RCONV_PADDING_X, RCONV_PADDING_Y,
 | 
			
		||||
                                       RCONV_STRIDE_X, RCONV_STRIDE_Y, rconv_bias_q7, 1, 7, rconv_im_out_opt_q7,
 | 
			
		||||
                                       RCONV_OUT_DIM_X, RCONV_OUT_DIM_Y, rconv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(rconv_im_out_ref_q7, rconv_im_out_opt_q7, RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    initialize_results_q7(rconv_im_out_ref_q7, rconv_im_out_opt_q7, RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    printf("start 1x1 conv q7 nonsquare fast implementation\n");
 | 
			
		||||
    arm_convolve_HWC_q7_fast_nonsquare(rconv_im_in_q7, RCONV_IM_DIM_X, RCONV_IM_DIM_Y, RCONV_IM_CH, rconv_weight_q7,
 | 
			
		||||
                                       RCONV_OUT_CH, 1, 1, 0, 0, RCONV_STRIDE_X,
 | 
			
		||||
                                       RCONV_STRIDE_Y, rconv_bias_q7, 1, 7, rconv_im_out_ref_q7, RCONV_OUT_DIM_X,
 | 
			
		||||
                                       RCONV_OUT_DIM_Y, rconv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    printf("start 1x1 conv q7 nonsquare dedicated function implementation\n");
 | 
			
		||||
    arm_convolve_1x1_HWC_q7_fast_nonsquare(rconv_im_in_q7, RCONV_IM_DIM_X, RCONV_IM_DIM_Y, RCONV_IM_CH, rconv_weight_q7,
 | 
			
		||||
                                           RCONV_OUT_CH, 1, 1, 0, 0, RCONV_STRIDE_X,
 | 
			
		||||
                                           RCONV_STRIDE_Y, rconv_bias_q7, 1, 7, rconv_im_out_opt_q7, RCONV_OUT_DIM_X,
 | 
			
		||||
                                           RCONV_OUT_DIM_Y, rconv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(rconv_im_out_ref_q7, rconv_im_out_opt_q7, RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    printf("start depthwise separable conv q7 nonsquare ref implementation\n");
 | 
			
		||||
    arm_depthwise_separable_conv_HWC_q7_ref_nonsquare(rconv_im_in_q7, RCONV_IM_DIM_X, RCONV_IM_DIM_Y, RCONV_IM_CH,
 | 
			
		||||
                                                      rconv_weight_q7, RCONV_OUT_CH, RCONV_KER_DIM_X, RCONV_KER_DIM_Y,
 | 
			
		||||
                                                      RCONV_PADDING_X, RCONV_PADDING_Y, RCONV_STRIDE_X, RCONV_STRIDE_Y,
 | 
			
		||||
                                                      rconv_bias_q7, 1, 7, rconv_im_out_ref_q7, RCONV_OUT_DIM_X,
 | 
			
		||||
                                                      RCONV_OUT_DIM_Y, rconv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    printf("start depthwise separable conv q7 nonsquare opt implementation\n");
 | 
			
		||||
    arm_depthwise_separable_conv_HWC_q7_nonsquare(rconv_im_in_q7, RCONV_IM_DIM_X, RCONV_IM_DIM_Y, RCONV_IM_CH,
 | 
			
		||||
                                                  rconv_weight_q7, RCONV_OUT_CH, RCONV_KER_DIM_X, RCONV_KER_DIM_Y,
 | 
			
		||||
                                                  RCONV_PADDING_X, RCONV_PADDING_Y, RCONV_STRIDE_X, RCONV_STRIDE_Y,
 | 
			
		||||
                                                  rconv_bias_q7, 1, 7, rconv_im_out_opt_q7, RCONV_OUT_DIM_X,
 | 
			
		||||
                                                  RCONV_OUT_DIM_Y, rconv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(rconv_im_out_ref_q7, rconv_im_out_opt_q7, RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    delete[]test1;
 | 
			
		||||
    delete[]test2;
 | 
			
		||||
    delete[]test3;
 | 
			
		||||
	
 | 
			
		||||
	test2 = new q15_t[RCONV_KER_DIM_Y * RCONV_KER_DIM_X * RCONV_IM_CH * RCONV_OUT_CH + RCONV_OUT_CH]; // weights + bias
 | 
			
		||||
	test4 = new q15_t[2 * RCONV_KER_DIM_Y * RCONV_KER_DIM_X * RCONV_IM_CH   //buffer
 | 
			
		||||
	         + RCONV_IM_DIM_Y * RCONV_IM_DIM_X * RCONV_IM_CH + 2 * RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH]; // i/o
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < RCONV_KER_DIM_Y * RCONV_KER_DIM_X * RCONV_IM_CH * RCONV_OUT_CH + RCONV_OUT_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test2[i] = rand() % 256 - 100;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (int i = 0;
 | 
			
		||||
         i < 2 * RCONV_KER_DIM_Y * RCONV_KER_DIM_X * RCONV_IM_CH
 | 
			
		||||
         + RCONV_IM_DIM_Y * RCONV_IM_DIM_X * RCONV_IM_CH + 2 * RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH;
 | 
			
		||||
        i++)
 | 
			
		||||
    {
 | 
			
		||||
        test4[i] = rand() % 256 - 100;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    q15_t     *rconv_weight_q15 = test2;
 | 
			
		||||
    q15_t     *rconv_bias_q15 = test2 + RCONV_KER_DIM_Y * RCONV_KER_DIM_X * RCONV_IM_CH * RCONV_OUT_CH;
 | 
			
		||||
 | 
			
		||||
    rconv_buf = test4;
 | 
			
		||||
 | 
			
		||||
    q15_t     *rconv_im_in_q15 = test4 + 2 * RCONV_KER_DIM_Y * RCONV_KER_DIM_X * RCONV_IM_CH;
 | 
			
		||||
    q15_t     *rconv_im_out_ref_q15 = rconv_im_in_q15 + RCONV_IM_DIM_Y * RCONV_IM_DIM_X * RCONV_IM_CH;
 | 
			
		||||
    q15_t     *rconv_im_out_opt_q15 = rconv_im_out_ref_q15 + RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH;
 | 
			
		||||
 | 
			
		||||
    initialize_results_q15(rconv_im_out_ref_q15, rconv_im_out_opt_q15, RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    printf("start conv q15 nonsquare ref implementation\n");
 | 
			
		||||
    arm_convolve_HWC_q15_nonsquare_ref(rconv_im_in_q15, RCONV_IM_DIM_X, RCONV_IM_DIM_Y, RCONV_IM_CH, rconv_weight_q15,
 | 
			
		||||
                                      RCONV_OUT_CH, RCONV_KER_DIM_X, RCONV_KER_DIM_Y, RCONV_PADDING_X, RCONV_PADDING_Y,
 | 
			
		||||
                                      RCONV_STRIDE_X, RCONV_STRIDE_Y, rconv_bias_q15, 1, 7, rconv_im_out_ref_q15,
 | 
			
		||||
                                      RCONV_OUT_DIM_X, RCONV_OUT_DIM_Y, rconv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    printf("start conv q5 nonsquare opt implementation\n");
 | 
			
		||||
    arm_convolve_HWC_q15_fast_nonsquare(rconv_im_in_q15, RCONV_IM_DIM_X, RCONV_IM_DIM_Y, RCONV_IM_CH, rconv_weight_q15,
 | 
			
		||||
                                       RCONV_OUT_CH, RCONV_KER_DIM_X, RCONV_KER_DIM_Y, RCONV_PADDING_X, RCONV_PADDING_Y,
 | 
			
		||||
                                       RCONV_STRIDE_X, RCONV_STRIDE_Y, rconv_bias_q15, 1, 7, rconv_im_out_opt_q15,
 | 
			
		||||
                                       RCONV_OUT_DIM_X, RCONV_OUT_DIM_Y, rconv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(rconv_im_out_ref_q15, rconv_im_out_opt_q15, RCONV_OUT_DIM_Y * RCONV_OUT_DIM_X * RCONV_OUT_CH);
 | 
			
		||||
	
 | 
			
		||||
    delete [] test2;
 | 
			
		||||
    delete [] test4;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef TEST_CONV
 | 
			
		||||
 | 
			
		||||
#define CONV_IM_DIM 16
 | 
			
		||||
#define CONV_IM_CH 16
 | 
			
		||||
#define CONV_KER_DIM 5
 | 
			
		||||
#define CONV_OUT_CH 16
 | 
			
		||||
#define CONV_OUT_DIM 16
 | 
			
		||||
 | 
			
		||||
    test1 = new q7_t[CONV_KER_DIM * CONV_KER_DIM * CONV_IM_CH * CONV_OUT_CH + CONV_OUT_CH];
 | 
			
		||||
    test2 =
 | 
			
		||||
        new q15_t[CONV_KER_DIM * CONV_KER_DIM * CONV_IM_CH * CONV_OUT_CH +
 | 
			
		||||
                  2 * CONV_KER_DIM * CONV_KER_DIM * CONV_IM_CH * CONV_OUT_CH + CONV_OUT_CH];
 | 
			
		||||
    test3 = new q7_t[CONV_IM_DIM * CONV_IM_DIM * CONV_IM_CH + 2 * CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH];
 | 
			
		||||
    test4 = new q15_t[CONV_IM_DIM * CONV_IM_DIM * CONV_IM_CH + 2 * CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH];
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < CONV_KER_DIM * CONV_KER_DIM * CONV_IM_CH * CONV_OUT_CH + CONV_OUT_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test1[i] = rand() % 256 - 100;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (int i = 0;
 | 
			
		||||
         i <
 | 
			
		||||
         CONV_KER_DIM * CONV_KER_DIM * CONV_IM_CH * CONV_OUT_CH +
 | 
			
		||||
         2 * CONV_KER_DIM * CONV_KER_DIM * CONV_IM_CH * CONV_OUT_CH + CONV_OUT_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test2[i] = (rand() % 65536 - 32768);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < CONV_IM_DIM * CONV_IM_DIM * CONV_IM_CH + 2 * CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test3[i] = rand() % 256 - 100;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < CONV_IM_DIM * CONV_IM_DIM * CONV_IM_CH + 2 * CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH; i++)
 | 
			
		||||
    {
 | 
			
		||||
        test4[i] = (rand() % 65536 - 32768);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    q7_t     *conv_weight_q7 = test1;
 | 
			
		||||
    q7_t     *conv_bias_q7 = test1 + CONV_KER_DIM * CONV_KER_DIM * CONV_IM_CH * CONV_OUT_CH;
 | 
			
		||||
 | 
			
		||||
    q15_t    *conv_weight_q15 = test2;
 | 
			
		||||
    q15_t    *conv_buf = test2 + CONV_KER_DIM * CONV_KER_DIM * CONV_IM_CH * CONV_OUT_CH;
 | 
			
		||||
    q15_t    *conv_bias_q15 =
 | 
			
		||||
        test2 + CONV_KER_DIM * CONV_KER_DIM * CONV_IM_CH * CONV_OUT_CH +
 | 
			
		||||
        2 * CONV_KER_DIM * CONV_KER_DIM * CONV_IM_CH * CONV_OUT_CH;
 | 
			
		||||
 | 
			
		||||
    q7_t     *conv_im_in_q7 = test3;
 | 
			
		||||
    q7_t     *conv_im_out_ref_q7 = test3 + CONV_IM_DIM * CONV_IM_DIM * CONV_IM_CH;
 | 
			
		||||
    q7_t     *conv_im_out_opt_q7 =
 | 
			
		||||
        test3 + CONV_IM_DIM * CONV_IM_DIM * CONV_IM_CH + CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH;
 | 
			
		||||
 | 
			
		||||
    q15_t    *conv_im_in_q15 = test4;
 | 
			
		||||
    q15_t    *conv_im_out_ref_q15 = test4 + CONV_IM_DIM * CONV_IM_DIM * CONV_IM_CH;
 | 
			
		||||
    q15_t    *conv_im_out_opt_q15 =
 | 
			
		||||
        test4 + CONV_IM_DIM * CONV_IM_DIM * CONV_IM_CH + CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH;
 | 
			
		||||
 | 
			
		||||
    initialize_results_q7(conv_im_out_ref_q7, conv_im_out_opt_q7, CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    printf("start q7 ref implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_convolve_HWC_q7_ref(conv_im_in_q7, CONV_IM_DIM, CONV_IM_CH, conv_weight_q7,
 | 
			
		||||
                            CONV_OUT_CH, CONV_KER_DIM, 2, 1, conv_bias_q7, 1, 7, conv_im_out_ref_q7,
 | 
			
		||||
                            CONV_OUT_DIM, conv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    printf("start q7 basic implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_convolve_HWC_q7_basic(conv_im_in_q7, CONV_IM_DIM, CONV_IM_CH, conv_weight_q7,
 | 
			
		||||
                              CONV_OUT_CH, CONV_KER_DIM, 2, 1, conv_bias_q7, 1, 7, conv_im_out_opt_q7,
 | 
			
		||||
                              CONV_OUT_DIM, conv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(conv_im_out_ref_q7, conv_im_out_opt_q7, CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    printf("start q7 fast implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_convolve_HWC_q7_fast(conv_im_in_q7, CONV_IM_DIM, CONV_IM_CH, conv_weight_q7,
 | 
			
		||||
                             CONV_OUT_CH, CONV_KER_DIM, 2, 1, conv_bias_q7, 1, 7, conv_im_out_opt_q7,
 | 
			
		||||
                             CONV_OUT_DIM, conv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(conv_im_out_ref_q7, conv_im_out_opt_q7, CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    // testing with RGB
 | 
			
		||||
    printf("start q7 ref implementation for RGB\n");
 | 
			
		||||
 | 
			
		||||
    arm_convolve_HWC_q7_ref(conv_im_in_q7, CONV_IM_DIM, 3, conv_weight_q7,
 | 
			
		||||
                            CONV_OUT_CH, CONV_KER_DIM, 2, 1, conv_bias_q7, 1, 7, conv_im_out_ref_q7,
 | 
			
		||||
                            CONV_OUT_DIM, conv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    printf("start q7 basic implementation for RGB\n");
 | 
			
		||||
 | 
			
		||||
    arm_convolve_HWC_q7_basic(conv_im_in_q7, CONV_IM_DIM, 3, conv_weight_q7,
 | 
			
		||||
                              CONV_OUT_CH, CONV_KER_DIM, 2, 1, conv_bias_q7, 1, 7, conv_im_out_opt_q7,
 | 
			
		||||
                              CONV_OUT_DIM, conv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(conv_im_out_ref_q7, conv_im_out_opt_q7, CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    printf("start q7 RGB implementation for RGB\n");
 | 
			
		||||
 | 
			
		||||
    arm_convolve_HWC_q7_RGB(conv_im_in_q7, CONV_IM_DIM, 3, conv_weight_q7,
 | 
			
		||||
                            CONV_OUT_CH, CONV_KER_DIM, 2, 1, conv_bias_q7, 1, 7, conv_im_out_opt_q7,
 | 
			
		||||
                            CONV_OUT_DIM, conv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(conv_im_out_ref_q7, conv_im_out_opt_q7, CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    // testing q15
 | 
			
		||||
    initialize_results_q15(conv_im_out_ref_q15, conv_im_out_opt_q15, CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    printf("start q15 ref implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_convolve_HWC_q15_ref(conv_im_in_q15, CONV_IM_DIM, CONV_IM_CH, conv_weight_q15,
 | 
			
		||||
                             CONV_OUT_CH, CONV_KER_DIM, 2, 1, conv_bias_q15, 0, 15, conv_im_out_ref_q15,
 | 
			
		||||
                             CONV_OUT_DIM, conv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    printf("start q15 basic implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_convolve_HWC_q15_basic(conv_im_in_q15, CONV_IM_DIM, CONV_IM_CH, conv_weight_q15,
 | 
			
		||||
                               CONV_OUT_CH, CONV_KER_DIM, 2, 1, conv_bias_q15, 0, 15, conv_im_out_opt_q15,
 | 
			
		||||
                               CONV_OUT_DIM, conv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(conv_im_out_ref_q15, conv_im_out_opt_q15, CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    printf("start q15 fast implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_convolve_HWC_q15_fast(conv_im_in_q15, CONV_IM_DIM, CONV_IM_CH, conv_weight_q15,
 | 
			
		||||
                              CONV_OUT_CH, CONV_KER_DIM, 2, 1, conv_bias_q15, 0, 15, conv_im_out_opt_q15,
 | 
			
		||||
                              CONV_OUT_DIM, conv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q15(conv_im_out_ref_q15, conv_im_out_opt_q15, CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    // depthwise separable conv
 | 
			
		||||
    initialize_results_q7(conv_im_out_ref_q7, conv_im_out_opt_q7, CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    printf("start q7 depthwise_separable_conv ref implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_depthwise_separable_conv_HWC_q7_ref(conv_im_in_q7, CONV_IM_DIM, CONV_IM_CH, conv_weight_q7,
 | 
			
		||||
                                            CONV_OUT_CH, CONV_KER_DIM, 2, 1, conv_bias_q7, 1, 7, conv_im_out_ref_q7,
 | 
			
		||||
                                            CONV_OUT_DIM, conv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    printf("start q7 depthwise_separable_conv implementation\n");
 | 
			
		||||
 | 
			
		||||
    arm_depthwise_separable_conv_HWC_q7(conv_im_in_q7, CONV_IM_DIM, CONV_IM_CH, conv_weight_q7,
 | 
			
		||||
                                        CONV_OUT_CH, CONV_KER_DIM, 2, 1, conv_bias_q7, 1, 7, conv_im_out_opt_q7,
 | 
			
		||||
                                        CONV_OUT_DIM, conv_buf, NULL);
 | 
			
		||||
 | 
			
		||||
    verify_results_q7(conv_im_out_ref_q7, conv_im_out_opt_q7, CONV_OUT_DIM * CONV_OUT_DIM * CONV_OUT_CH);
 | 
			
		||||
 | 
			
		||||
    delete[]test1;
 | 
			
		||||
    delete[]test2;
 | 
			
		||||
    delete[]test3;
 | 
			
		||||
    delete[]test4;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    test_pass = true;
 | 
			
		||||
    test_index = 0;
 | 
			
		||||
    while (test_flags[test_index] != -1) {
 | 
			
		||||
        if (test_flags[test_index]) {
 | 
			
		||||
             test_pass = false;
 | 
			
		||||
        }
 | 
			
		||||
        test_index ++;
 | 
			
		||||
    }
 | 
			
		||||
    if (test_pass) {
 | 
			
		||||
        printf("All tests passed\n");
 | 
			
		||||
    } else {
 | 
			
		||||
        printf("Test failed passed\n");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,78 @@
 | 
			
		||||
#ifndef _MAIN_H_
 | 
			
		||||
#define _MAIN_H_
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
#include "arm_math.h"
 | 
			
		||||
 | 
			
		||||
#include "arm_nnfunctions.h"
 | 
			
		||||
#include "ref_functions.h"
 | 
			
		||||
 | 
			
		||||
extern int test_index;
 | 
			
		||||
extern q7_t test_flags[50];
 | 
			
		||||
 | 
			
		||||
void initialize_results_q7(q7_t * ref, q7_t * opt, int length)
 | 
			
		||||
{
 | 
			
		||||
    arm_fill_q7(0, ref, length);
 | 
			
		||||
    arm_fill_q7(37, opt, length);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void initialize_results_q15(q15_t * ref, q15_t * opt, int length)
 | 
			
		||||
{
 | 
			
		||||
    arm_fill_q15(0, ref, length);
 | 
			
		||||
    arm_fill_q15(0x5F5, opt, length);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void verify_results_q7(q7_t * ref, q7_t * opt, int length)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    bool      if_match = true;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < length; i++)
 | 
			
		||||
    {
 | 
			
		||||
        if (ref[i] != opt[i])
 | 
			
		||||
        {
 | 
			
		||||
            printf("Output mismatch at %d, expected %d, actual %d\r\n", i, ref[i], opt[i]);
 | 
			
		||||
 | 
			
		||||
            if_match = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (if_match == true)
 | 
			
		||||
    {
 | 
			
		||||
        printf("Outputs match.\r\n\r\n");
 | 
			
		||||
        test_flags[test_index++] = 0;
 | 
			
		||||
    } else {
 | 
			
		||||
        test_flags[test_index++] = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void verify_results_q15(q15_t * ref, q15_t * opt, int length)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    bool      if_match = true;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < length; i++)
 | 
			
		||||
    {
 | 
			
		||||
        if (ref[i] != opt[i])
 | 
			
		||||
        {
 | 
			
		||||
            printf("Output mismatch at %d, expected %d, actual %d\r\n", i, ref[i], opt[i]);
 | 
			
		||||
 | 
			
		||||
            if_match = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (if_match == true)
 | 
			
		||||
    {
 | 
			
		||||
        printf("Outputs match.\r\n\r\n");
 | 
			
		||||
        test_flags[test_index++] = 0;
 | 
			
		||||
    } else {
 | 
			
		||||
        test_flags[test_index++] = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										4
									
								
								Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/readme.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/readme.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
			
		||||
CMSIS DSP_Lib example arm_nnexample_nn_test for
 | 
			
		||||
  Cortex-M3, Cortex-M4 and Cortex-M7.
 | 
			
		||||
 | 
			
		||||
The example is configured for uVision Simulator.
 | 
			
		||||
		Reference in New Issue
	
	Block a user