diff --git a/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.lock b/Demo/ARM7_AT91SAM7X256_Eclipse/.metadata/.lock
deleted file mode 100644
index e69de29bb..000000000
diff --git a/Demo/ARM7_LPC2368_Eclipse/.metadata/.lock b/Demo/ARM7_LPC2368_Eclipse/.metadata/.lock
deleted file mode 100644
index e69de29bb..000000000
diff --git a/Demo/CORTEX_LM3Sxxxx_Eclipse/.metadata/.lock b/Demo/CORTEX_LM3Sxxxx_Eclipse/.metadata/.lock
deleted file mode 100644
index e69de29bb..000000000
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/FreeRTOSConfig.h b/Demo/CORTEX_STM32F103_Primer_GCC/FreeRTOSConfig.h
new file mode 100644
index 000000000..1f708f011
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/FreeRTOSConfig.h
@@ -0,0 +1,93 @@
+/*
+ FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry.
+
+ This file is part of the FreeRTOS.org distribution.
+
+ FreeRTOS.org is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ FreeRTOS.org is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with FreeRTOS.org; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ A special exception to the GPL can be applied should you wish to distribute
+ a combined work that includes FreeRTOS.org, without being obliged to provide
+ the source code for any proprietary components. See the licensing section
+ of http://www.FreeRTOS.org for full details of how and when the exception
+ can be applied.
+
+ ***************************************************************************
+ See http://www.FreeRTOS.org for documentation, latest information, license
+ and contact details. Please ensure to read the configuration and relevant
+ port sections of the online documentation.
+
+ Also see http://www.SafeRTOS.com a version that has been certified for use
+ in safety critical systems, plus commercial licensing, development and
+ support options.
+ ***************************************************************************
+*/
+
+#ifndef FREERTOS_CONFIG_H
+#define FREERTOS_CONFIG_H
+
+/* Library includes. */
+#include "stm32f10x_lib.h"
+
+/*-----------------------------------------------------------
+ * Application specific definitions.
+ *
+ * These definitions should be adjusted for your particular hardware and
+ * application requirements.
+ *
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
+ *----------------------------------------------------------*/
+
+#define configUSE_PREEMPTION 1
+#define configUSE_IDLE_HOOK 0
+#define configUSE_TICK_HOOK 1
+#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 72000000 )
+#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
+#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
+#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 128 )
+#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )
+#define configMAX_TASK_NAME_LEN ( 16 )
+#define configUSE_TRACE_FACILITY 0
+#define configUSE_16_BIT_TICKS 0
+#define configIDLE_SHOULD_YIELD 1
+#define configUSE_MUTEXES 1
+
+/* Co-routine definitions. */
+#define configUSE_CO_ROUTINES 0
+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
+
+/* Set the following definitions to 1 to include the API function, or zero
+to exclude the API function. */
+
+#define INCLUDE_vTaskPrioritySet 1
+#define INCLUDE_uxTaskPriorityGet 1
+#define INCLUDE_vTaskDelete 1
+#define INCLUDE_vTaskCleanUpResources 0
+#define INCLUDE_vTaskSuspend 1
+#define INCLUDE_vTaskDelayUntil 1
+#define INCLUDE_vTaskDelay 1
+
+/* This is the raw value as per the Cortex-M3 NVIC. Values can be 255
+(lowest) to 0 (1?) (highest). */
+#define configKERNEL_INTERRUPT_PRIORITY 255
+
+/* This is the value being used as per the ST library which permits 16
+priority values, 0 to 15. This must correspond to the
+configKERNEL_INTERRUPT_PRIORITY setting. Here 15 corresponds to the lowest
+NVIC value of 255. */
+#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15
+
+#endif /* FREERTOS_CONFIG_H */
+
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ParTest/ParTest.c b/Demo/CORTEX_STM32F103_Primer_GCC/ParTest/ParTest.c
new file mode 100644
index 000000000..33cf1c279
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ParTest/ParTest.c
@@ -0,0 +1,121 @@
+/*
+ FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry.
+
+ This file is part of the FreeRTOS.org distribution.
+
+ FreeRTOS.org is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ FreeRTOS.org is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with FreeRTOS.org; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ A special exception to the GPL can be applied should you wish to distribute
+ a combined work that includes FreeRTOS.org, without being obliged to provide
+ the source code for any proprietary components. See the licensing section
+ of http://www.FreeRTOS.org for full details of how and when the exception
+ can be applied.
+
+ ***************************************************************************
+ See http://www.FreeRTOS.org for documentation, latest information, license
+ and contact details. Please ensure to read the configuration and relevant
+ port sections of the online documentation.
+
+ Also see http://www.SafeRTOS.com a version that has been certified for use
+ in safety critical systems, plus commercial licensing, development and
+ support options.
+ ***************************************************************************
+*/
+
+/*-----------------------------------------------------------
+ * Simple parallel port IO routines.
+ *-----------------------------------------------------------*/
+
+/* FreeRTOS.org includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "partest.h"
+
+#define partstMAX_OUTPUT_LED ( 2 )
+#define partstFIRST_LED GPIO_Pin_8
+
+static unsigned portSHORT usOutputValue = 0;
+
+/*-----------------------------------------------------------*/
+
+void vParTestInitialise( void )
+{
+GPIO_InitTypeDef GPIO_InitStructure;
+
+ /* Enable LED GPIO clock. */
+ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
+
+ /* Configure LED pins as output push-pull. */
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 ;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+
+ GPIO_Init( GPIOB, &GPIO_InitStructure );
+}
+/*-----------------------------------------------------------*/
+
+void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
+{
+unsigned portSHORT usBit;
+
+ vTaskSuspendAll();
+ {
+ if( uxLED < partstMAX_OUTPUT_LED )
+ {
+ usBit = partstFIRST_LED << uxLED;
+
+ if( xValue == pdFALSE )
+ {
+ usBit ^= ( unsigned portSHORT ) 0xffff;
+ usOutputValue &= usBit;
+ }
+ else
+ {
+ usOutputValue |= usBit;
+ }
+
+ GPIO_Write( GPIOB, usOutputValue );
+ }
+ }
+ xTaskResumeAll();
+}
+/*-----------------------------------------------------------*/
+
+void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
+{
+unsigned portSHORT usBit;
+
+ vTaskSuspendAll();
+ {
+ if( uxLED < partstMAX_OUTPUT_LED )
+ {
+ usBit = partstFIRST_LED << uxLED;
+
+ if( usOutputValue & usBit )
+ {
+ usOutputValue &= ~usBit;
+ }
+ else
+ {
+ usOutputValue |= usBit;
+ }
+
+ GPIO_Write( GPIOB, usOutputValue );
+ }
+ }
+ xTaskResumeAll();
+}
+/*-----------------------------------------------------------*/
+
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo-globals.Standard.xml b/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo-globals.Standard.xml
new file mode 100644
index 000000000..1156f6f04
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo-globals.Standard.xml
@@ -0,0 +1,577 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo.Standard.xml b/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo.Standard.xml
new file mode 100644
index 000000000..e4bb7e670
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo.Standard.xml
@@ -0,0 +1,2278 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo.rapp b/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo.rapp
new file mode 100644
index 000000000..1d85f43d5
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo.rapp
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo.rprj b/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo.rprj
new file mode 100644
index 000000000..3eb5276de
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/RTOSDemo.rprj
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/Util.c b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/Util.c
new file mode 100644
index 000000000..b331df730
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/Util.c
@@ -0,0 +1,528 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
+/**
+*
+* @file Util.c
+* @brief Various utilities for STM32 CircleOS.
+* @author RT
+* @date 07/2007
+*
+**/
+/******************************************************************************/
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "circle.h"
+#include "adc.h"
+
+/// @cond Internal
+
+/* Private defines -----------------------------------------------------------*/
+#define GPIO_USB_PIN GPIO_Pin_1
+#define GPIOx_USB GPIOA
+#define OsVersion "V 1.7" /*!< CircleOS version string. */
+
+/* Private typedef -----------------------------------------------------------*/
+enum eSpeed CurrentSpeed;
+
+/* Private variables ---------------------------------------------------------*/
+RCC_ClocksTypeDef RCC_ClockFreq;
+int dummycounter = 0;
+u8 fTemperatureInFahrenheit = 0; /*!< 1 : Fahrenheit, 0 : Celcius (default). */
+
+/* Private function prototypes -----------------------------------------------*/
+static void _int2str( char* ptr, s32 X, u16 digit, int flagunsigned, int fillwithzero );
+
+/* Private functions ---------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* _int2str
+*
+*******************************************************************************/
+/**
+*
+* Translate a 32 bit word into a string.
+*
+* @param[in,out] ptr A pointer to a string large enough to contain
+* the translated 32 bit word.
+* @param[in] X The 32 bit word to translate.
+* @param[in] digit The amount of digits wanted in the result string.
+* @param[in] flagunsigned Is the input word unsigned?
+* @param[in] fillwithzero Fill with zeros or spaces.
+*
+**/
+/******************************************************************************/
+static void _int2str( char* ptr, s32 X, u16 digit, int flagunsigned, int fillwithzero )
+ {
+ u8 c;
+ u8 fFirst = 0;
+ u8 fNeg = 0;
+ u32 DIG = 1;
+ int i;
+
+ for( i = 1; i < digit; i++ )
+ {
+ DIG *= 10;
+ }
+
+ if( !flagunsigned && ( X < 0 ) )
+ {
+ fNeg = 1;
+ X = -X;
+ }
+
+ u32 r = X;
+
+ for( i = 0; i < digit; i++, DIG /= 10 )
+ {
+ c = (r/DIG);
+ r -= (c*DIG);
+
+ if( fillwithzero || fFirst || c || ( i == ( digit - 1 ) ) )
+ {
+ if( ( fFirst == 0 ) && !flagunsigned )
+ {
+ *ptr++ = fNeg ? '-' : ' ';
+ }
+
+ *ptr++ = c + 0x30;
+ fFirst = 1;
+ }
+ else
+ {
+ *ptr++ = ' ';
+ }
+ }
+
+ *ptr++ = 0;
+ }
+
+/* Public functions for CircleOS ---------------------------------------------*/
+
+/*******************************************************************************
+*
+* delay_unit
+*
+*******************************************************************************/
+/**
+*
+* Called by starting_delay().
+*
+* @note Not in main.c to avoid inlining.
+*
+**/
+/******************************************************************************/
+void delay_unit( void )
+ {
+ dummycounter++;
+ }
+
+/// @endcond
+
+/* Public functions ----------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* UTIL_GetBat
+*
+*******************************************************************************/
+/**
+*
+* Return the batterie tension in mV.
+*
+* @return Batterie tension in mV.
+*
+**/
+/******************************************************************************/
+u16 UTIL_GetBat( void )
+ {
+#ifdef _ADC
+ u16 vbat;
+
+ // Measure VBAT
+ vbat = ADC_ConvertedValue[0]; //*( (u16*)ADC1_DR_Address ); // <=== note changed
+ vbat = vbat & 0xFFF;
+ vbat = ( vbat * VDD_VOLTAGE_MV ) / 0x1000;
+
+ return vbat;
+#else
+ return 0;
+#endif
+ }
+
+/*******************************************************************************
+*
+* UTIL_GetTemp
+*
+*******************************************************************************/
+/**
+*
+* Return the Temperature: degrees / 10, Celcius or Fahrenheit.
+*
+* @return The temperature (C or F) (averaging of several channels).
+*
+**/
+/******************************************************************************/
+u16 UTIL_GetTemp( void )
+ {
+ s32 temp;
+ s16 *p=&ADC_ConvertedValue[1]; //intent; point to first of 8 results from same source - use a short name for it!
+
+ // Measure temp
+ //temp = ADC_ConvertedValue[1];//*( (u16*)ADC1_DR_Address );
+ temp = (p[0]+p[1]+p[2]+p[3]+p[4]+p[5]+p[6]+p[7])/8; //take avg of burst of 8 temp reads. may only help reject hi freq noise a bit
+ //will not help reduce mains ripple because conversions are SO FAST!!
+ temp = temp & 0xFFF;
+ temp = ( temp * VDD_VOLTAGE_MV ) / 0x1000; //finds mV
+ temp = (((1400-temp)*100000)/448)+25000; //gives approx temp x 1000 degrees C
+
+ //Fahrenheit = 32 + 9 / 5 * Celsius
+ if ( fTemperatureInFahrenheit )
+ {
+ temp = 32000 + (9 * temp) / 5 ;
+ }
+
+ return temp / 100;
+ }
+
+/*******************************************************************************
+*
+* UTIL_SetTempMode
+*
+*******************************************************************************/
+/**
+*
+* Set the temperature mode (F/C)
+*
+* @param[in] mode 0: Celcius, 1: Fahrenheit
+*
+**/
+/******************************************************************************/
+void UTIL_SetTempMode ( int mode )
+ {
+ fTemperatureInFahrenheit = mode;
+
+ return;
+ }
+
+
+/*******************************************************************************
+*
+* UTIL_GetUsb
+*
+*******************************************************************************/
+/**
+*
+* Return the USB connexion state.
+*
+* @return The USB connexion state.
+*
+**/
+/******************************************************************************/
+u8 UTIL_GetUsb( void )
+ {
+ GPIO_InitStructure.GPIO_Pin = GPIO_USB_PIN;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+
+ GPIO_Init( GPIOx_USB, &GPIO_InitStructure );
+
+ return ( GPIO_ReadInputDataBit( GPIOx_USB, GPIO_USB_PIN ) == Bit_SET );
+ }
+
+/*******************************************************************************
+*
+* UTIL_uint2str
+*
+*******************************************************************************/
+/**
+*
+* Convert an unsigned integer into a string.
+*
+* @param [out] ptr The output string.
+* @param [in] X The unsigned value to convert.
+* @param [in] digit The number of digits in the output string.
+* @param [in] fillwithzero \li 0 fill with blanks.
+* \li 1 fill with zeros.
+*
+**/
+/********************************************************************************/
+void UTIL_uint2str( char* ptr, u32 X, u16 digit, int fillwithzero )
+ {
+ _int2str( ptr, X, digit, 1, fillwithzero);
+ }
+
+/*******************************************************************************
+*
+* UTIL_int2str
+*
+*******************************************************************************/
+/**
+*
+* Convert a signed integer into a string.
+*
+* @param [out] ptr The output string.
+* @param [in] X The unsigned value to convert.
+* @param [in] digit The number of digits in the output string.
+* @param [in] fillwithzero \li 0 fill with blanks.
+* \li 1 fill with zeros.
+*
+**/
+/******************************************************************************/
+void UTIL_int2str( char* ptr, s32 X, u16 digit, int fillwithzero )
+ {
+ _int2str( ptr, X, digit, 0, fillwithzero);
+ }
+
+/*******************************************************************************
+*
+* UTIL_SetPll
+*
+*******************************************************************************/
+/**
+*
+* Set clock frequency (lower to save energy)
+*
+* @param [in] speed New clock speed from very low to very fast.
+*
+**/
+/******************************************************************************/
+void UTIL_SetPll( enum eSpeed speed )
+ {
+ /* Select PLL as system clock source */
+ RCC_SYSCLKConfig( RCC_SYSCLKSource_HSI );
+
+ /* Enable PLL */
+ RCC_PLLCmd( DISABLE );
+
+ if( ( speed < SPEED_VERY_LOW ) || ( speed > SPEED_VERY_HIGH ) )
+ {
+ speed = SPEED_MEDIUM;
+ }
+
+ CurrentSpeed = speed;
+
+ switch( speed )
+ {
+ // 18 MHz
+ case SPEED_VERY_LOW :
+ /* PLLCLK = 6MHz * 3 = 18 MHz */
+ RCC_PLLConfig( RCC_PLLSource_HSE_Div2, RCC_PLLMul_3 );
+ break;
+
+ // 24MHz
+ case SPEED_LOW :
+ /* PLLCLK = 12MHz * 2 = 24 MHz */
+ RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_2 );
+ break;
+
+ // 36MHz
+ case SPEED_MEDIUM :
+ default :
+ /* PLLCLK = 12MHz * 3 = 36 MHz */
+ RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_3 );
+ break;
+
+ // 48MHz
+ case SPEED_HIGH :
+ /* PLLCLK = 12MHz * 4 = 48 MHz */
+ RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_4 );
+ break;
+
+ // 72MHz
+ case SPEED_VERY_HIGH :
+ /* PLLCLK = 12MHz * 6 = 72 MHz */
+ RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_6 );
+ break;
+ }
+
+ /* Enable PLL */
+ RCC_PLLCmd( ENABLE );
+
+ /* Wait till PLL is ready */
+ while( RCC_GetFlagStatus( RCC_FLAG_PLLRDY ) == RESET )
+ { ; }
+
+ /* Select PLL as system clock source */
+ RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK );
+
+ /* Wait till PLL is used as system clock source */
+ while( RCC_GetSYSCLKSource() != 0x08 )
+ { ; }
+
+ /* This function fills a RCC_ClocksTypeDef structure with the current frequencies
+ of different on chip clocks (for debug purpose) */
+ RCC_GetClocksFreq( &RCC_ClockFreq );
+ }
+
+/*******************************************************************************
+*
+* UTIL_GetPll
+*
+*******************************************************************************/
+/**
+*
+* Get clock frequency
+*
+* @return Current clock speed from very low to very fast.
+*
+**/
+/******************************************************************************/
+enum eSpeed UTIL_GetPll( void )
+ {
+ return CurrentSpeed;
+ }
+
+/*******************************************************************************
+*
+* UTIL_GetVersion
+*
+*******************************************************************************/
+/**
+*
+* Get CircleOS version.
+*
+* @return A pointer to a string containing the CircleOS version.
+*
+**/
+/******************************************************************************/
+const char* UTIL_GetVersion( void )
+ {
+ return OsVersion;
+ }
+
+/*******************************************************************************
+*
+* UTIL_ReadBackupRegister
+*
+*******************************************************************************/
+/**
+*
+* Reads data from the specified Data Backup Register.
+*
+* @param[in] BKP_DR Specifies the Data Backup Register. This parameter can be BKP_DRx where x:[1, 10]
+*
+* @return The content of the specified Data Backup Register.
+*
+**/
+/******************************************************************************/
+u16 UTIL_ReadBackupRegister( u16 BKP_DR )
+ {
+ return (*(vu16 *)( BKP_BASE + 4 * BKP_DR ) );
+ }
+
+/*******************************************************************************
+*
+* UTIL_WriteBackupRegister
+*
+*******************************************************************************/
+/**
+*
+* Writes data to the specified Data Backup Register.
+*
+* @param[in] BKP_DR Specifies the Data Backup Register. This parameter can be BKP_DRx where x:[1, 10]
+* @param[in] Data The data to write.
+*
+**/
+/********************************************************************************/
+void UTIL_WriteBackupRegister( u16 BKP_DR, u16 Data )
+ {
+ *(vu16 *)( BKP_BASE + 4 * BKP_DR ) = Data;
+ }
+
+
+/*******************************************************************************
+*
+* UTIL_SetIrqHandler
+*
+*******************************************************************************/
+/**
+*
+* Redirect an IRQ handler.
+*
+* @param[in] Offs Address in the NVIC table
+* @param[in] pHDL Pointer to the handler.
+*
+**/
+/********************************************************************************/
+void UTIL_SetIrqHandler( int Offs, tHandler pHDL )
+ {
+ if ( (Offs >= 8) && (Offs<0x100) )
+ *(tHandler *)( CIRCLEOS_RAM_BASE + Offs ) = pHDL;
+ }
+
+/*******************************************************************************
+*
+* UTIL_GetIrqHandler
+*
+*******************************************************************************/
+/**
+*
+* Get the current IRQ handler.
+* Since (V1.6) the vector table is relocated in RAM, the vectors can be easily modified
+* by the applications.
+*
+* @param[in] Offs Address in the NVIC table
+* @return A pointer to the current handler.
+*
+**/
+/********************************************************************************/
+tHandler UTIL_GetIrqHandler( int Offs )
+ {
+ if ( (Offs >= 8) && (Offs<0x100) )
+ return *(tHandler *)( CIRCLEOS_RAM_BASE + Offs );
+ }
+
+
+
+/*******************************************************************************
+*
+* UTIL_SetSchHandler
+*
+*******************************************************************************/
+/**
+*
+* Redirect a SCHEDULER handler.
+* Set the current SCHEDULER handler. With UTIL_GetSchHandler(), these functions
+* allow to take the control of the different handler. You can:
+* - replace them (get-Set)by your own handler
+* - disable a handler: UTIL_SetSchHandler(Ix,0);
+* - create a new handler (using the unused handlers).
+* See scheduler.c to understand further...
+*
+* @param[in] Ix ID if the SCH Handler
+* @param[in] pHDL Pointer to the handler.
+*
+**/
+/********************************************************************************/
+void UTIL_SetSchHandler( enum eSchHandler Ix, tHandler pHDL )
+ {
+ if (Ix '0') && (*CurrentMelody < '9') )
+ {
+ duration = *CurrentMelody++ - '0';
+
+ if ( (*CurrentMelody > '0') && (*CurrentMelody < '9') )
+ {
+ duration *= 10;
+ duration += (*CurrentMelody++ - '0');
+ }
+ }
+
+ Buzzer_Counter = ( (32/duration) * 256L * 32L) / DefaultBeats;
+ Buzzer_Counter*= (RCC_ClockFreq.SYSCLK_Frequency / 12000000L); //Adapt to HCLK1
+
+ //read the note
+ c = *CurrentMelody++;
+
+ if ( (c >= 'a') && (c <= 'z') )
+ {
+ c+=('A'-'a');
+ }
+
+ if ( c == 'P' )
+ {
+ note = NOTE_PAUSE;
+ }
+ else if ( (c >= 'A') && (c <= 'G') )
+ {
+ note = (c - 'A') + NOTE_LA;
+
+ if ( *CurrentMelody == '#' )
+ {
+ note|=0x8;
+ CurrentMelody++;
+ }
+ }
+
+ octave = DefaultOctave;
+ c = *CurrentMelody;
+
+ if ( (c>= '5') && (c<= '8') )
+ {
+ octave = OCT_440 + (c-'5');
+ CurrentMelody++;
+ }
+
+ BUZZER_SetFrequency ( (Note_Freq [ note ] * (1<NOT be called by the user.
+*
+**/
+/******************************************************************************/
+void BUZZER_Init( void )
+ {
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ /* Enable GPIOB clock */
+ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
+
+ /* GPIOB Configuration: TIM3 3in Output */
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+
+ GPIO_Init( GPIOB, &GPIO_InitStructure );
+
+ /* TIM3 Configuration ------------------------------------------------------*/
+ /* TIM3CLK = 18 MHz, Prescaler = 0x0, TIM3 counter clock = 18 MHz */
+ /* CC update rate = TIM3 counter clock / (2* CCR_Val) ~= 750 Hz */
+
+ /* Enable TIM3 clock */
+ RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );
+ TIM_DeInit( TIM3 );
+ TIM_TimeBaseStructInit( &TIM_TimeBaseStructure );
+ TIM_OCStructInit( &TIM_OCInitStructure );
+
+ /* Time base configuration */
+ TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
+ TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
+ TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
+ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+
+ TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure );
+
+ /* Output Compare Toggle Mode configuration: Channel3 */
+ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
+ TIM_OCInitStructure.TIM_Channel = TIM_Channel_3;
+ TIM_OCInitStructure.TIM_Pulse = CCR_Val;
+
+ TIM_OCInit( TIM3, &TIM_OCInitStructure );
+ TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Disable );
+ BUZZER_SetFrequency( 440 );
+
+ /* Enable TIM3 IT */
+ TIM_ITConfig( TIM3, TIM_IT_CC3, ENABLE );
+
+ Buzzer_Mode = BUZZER_OFF;
+ }
+
+/*******************************************************************************
+*
+* BUZZER_Handler
+*
+*******************************************************************************/
+/**
+*
+* Called by the CircleOS scheduler to manage Buzzer tasks.
+*
+* @attention This function must NOT be called by the user.
+*
+**/
+/******************************************************************************/
+void BUZZER_Handler( void )
+ {
+ int fSetOFF = 0;
+
+ if ( Buzzer_Mode == BUZZER_PLAYMUSIC )
+ {
+ if ( Buzzer_Counter == 0 )
+ {
+ PlayMusic();
+ }
+ else
+ {
+ Buzzer_Counter--;
+ }
+
+ return;
+ }
+ else if ( Buzzer_Mode == BUZZER_SHORTBEEP )
+ {
+ if ( Buzzer_Counter++ == (BUZZER_SHORTBEEP_DURATION) )
+ {
+ Buzzer_Mode = BUZZER_OFF;
+
+ return;
+ }
+ if ( Buzzer_Counter == (BUZZER_SHORTBEEP_DURATION/2) )
+ {
+ fSetOFF = 1;
+ }
+ }
+ else if ( Buzzer_Mode == BUZZER_LONGBEEP )
+ {
+ if ( Buzzer_Counter++ == (BUZZER_LONGBEEP_DURATION) )
+ {
+ Buzzer_Mode = BUZZER_OFF;
+
+ return;
+ }
+ if ( Buzzer_Counter > (BUZZER_LONGBEEP_DURATION/2) )
+ {
+ fSetOFF = 1;
+ }
+ }
+
+ if ( fSetOFF == 1 )
+ {
+ TIM_Cmd(TIM3, DISABLE);
+ }
+ }
+
+/// @endcond
+
+/* Public functions ----------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* BUZZER_GetMode
+*
+*******************************************************************************/
+/**
+*
+* Get the current buzzer mode.
+*
+* @return Current buzzer mode.
+*
+**/
+/******************************************************************************/
+enum BUZZER_mode BUZZER_GetMode( void )
+ {
+ return Buzzer_Mode;
+ }
+
+/*******************************************************************************
+*
+* BUZZER_SetMode
+*
+*******************************************************************************/
+/**
+*
+* Set new buzzer mode
+*
+* @param[in] mode New buzzer mode.
+*
+**/
+/******************************************************************************/
+void BUZZER_SetMode( enum BUZZER_mode mode )
+ {
+ Buzzer_Mode = mode;
+ Buzzer_Counter = 0;
+
+ switch ( mode )
+ {
+ case BUZZER_PLAYMUSIC :
+ PlayMusic(); //start melody
+ /* no break */
+
+ case BUZZER_LONGBEEP :
+ case BUZZER_SHORTBEEP :
+ case BUZZER_ON :
+ TIM_Cmd( TIM3, ENABLE );
+ break;
+
+ case BUZZER_OFF :
+ TIM_Cmd( TIM3, DISABLE );
+ break;
+ }
+ }
+
+/*******************************************************************************
+*
+* BUZZER_PlayMusic
+*
+*******************************************************************************/
+/**
+*
+* Plays the provided melody that follows the RTTTL Format.
+*
+* Official Specification
+* @verbatim
+ :=
+ [] +
+ := + ; maximum name length 10 characters
+ := ":"
+ :=
+ |
+ |
+
+ := "d="
+ := "o="
+ := "b="
+ := 25,28,...,900 ; decimal value
+; If not specified, defaults are
+ ;
+ ; 4 = duration
+ ; 6 = scale
+ ; 63 = beats-per-minute
+ :=
+ [] [] []
+ :=
+ "1" | ; Full 1/1 note
+ "2" | ; 1/2 note
+ "4" | ; 1/4 note
+ "8" | ; 1/8 note
+ "16" | ; 1/16 note
+ "32" | ; 1/32 note
+ :=
+ "P" | ; pause
+ "C" |
+ "C#" |
+ "D" |
+ "D#" |
+ "E" |
+ "F" |
+ "F#" |
+ "G" |
+ "G#" |
+ "A" |
+ "A#" |
+ "B"
+ :=
+ "5" | ; Note A is 440Hz
+ "6" | ; Note A is 880Hz
+ "7" | ; Note A is 1.76 kHz
+ "8" ; Note A is 3.52 kHz
+ :=
+ "." ; Dotted note
+ := ","
+@endverbatim
+*
+* @param[in] melody New melody to play on buzzer.
+*
+**/
+/******************************************************************************/
+void BUZZER_PlayMusic (const u8 *melody )
+ {
+ u8 c;
+ u8 default_id = 0;
+ u16 default_val = 0;
+
+ DefaultOctave = OCT_880; // Default for the default Octave.
+ DefaultDuration = 4; // Default for the default Duration.
+ DefaultBeats = 63;
+ CurrentMelody = melody;
+ CurrentMelodySTART = melody;
+
+ while( *CurrentMelody != RTTTL_SEP )
+ {
+ if( *CurrentMelody == 0 )
+ {
+ return;
+ }
+
+ // Discard the melody name.
+ CurrentMelody++;
+ }
+
+ // Now read the defaults if any.
+ for( ++CurrentMelody; *CurrentMelody != RTTTL_SEP; CurrentMelody++ )
+ {
+ if( *CurrentMelody == 0 )
+ {
+ return;
+ }
+
+ // Discard any blank.
+ while ( *CurrentMelody == ' ' )
+ {
+ CurrentMelody++;
+ }
+
+ c = *CurrentMelody;
+
+ if ( c == RTTTL_SEP )
+ {
+ break;
+ }
+
+ if ( (c >= 'a') && (c <= 'z') )
+ {
+ c+=('A'-'a');
+ }
+
+ if ( (c >= 'A') && (c <= 'Z') )
+ {
+ default_id = c;
+ continue;
+ }
+
+ if ( (c >= '0') && (c <= '9') )
+ {
+ default_val *= 10;
+ default_val += (c-'0');
+ c = * (CurrentMelody + 1 );
+
+ if ( (c >= '0') && (c <= '9') )
+ {
+ continue;
+ }
+
+ if ( default_id == 'D' )
+ {
+ DefaultDuration = default_val;
+ }
+ else if ( default_id == 'O' )
+ {
+ DefaultOctave = default_val - 5;
+
+ if ( DefaultOctave > OCT_7040 )
+ DefaultOctave = OCT_440;
+ }
+ else if ( default_id == 'B' )
+ {
+ DefaultBeats = default_val;
+
+ if ( ( DefaultBeats == 0 ) || ( DefaultBeats > 500 ) )
+ DefaultBeats = 63;
+ }
+
+ default_val = 0;
+ default_id = 0;
+ }
+ }
+
+ BUZZER_SetMode( BUZZER_PLAYMUSIC );
+ }
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/circle.h b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/circle.h
new file mode 100644
index 000000000..0a7c02177
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/circle.h
@@ -0,0 +1,431 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
+/**
+*
+* @file circle.h
+* @brief General header for the CircleOS project.
+* @author FL
+* @date 07/2007
+* @version 1.5
+*
+* It contains the list of the utilities functions organized by sections
+* (MEMS, LCD, POINTER, ...)
+*
+* @date 10/2007
+* @version 1.5 types of OutX_F64 and OutX_F256 changed to u32 (same for Y and Z)
+**/
+/******************************************************************************/
+
+#include "scheduler.h"
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __CIRCLE_H
+#define __CIRCLE_H
+
+//-------------------------------- General -------------------------------------
+/* Defines ------------------------------------------------------------------*/
+#define VDD_VOLTAGE_MV 3300 //Voltage (mV) of the STM32
+#define FA_TABLE 0x8006000
+#define TIM2 ((TIM_TypeDef *) TIM2_BASE)
+#define CIRCLEOS_RAM_BASE 0x20004000
+
+/* Variables ----------------------------------------------------------------*/
+extern GPIO_InitTypeDef GPIO_InitStructure;
+
+/* Utilities -----------------------------------------------------------------*/
+void UTIL_uint2str( char *ptr , u32 X, u16 digit, int fillwithzero );
+void UTIL_int2str( char *ptr , s32 X, u16 digit, int fillwithzero );
+u16 UTIL_ReadBackupRegister( u16 BKP_DR );
+void UTIL_WriteBackupRegister( u16 BKP_DR, u16 Data );
+u16 UTIL_GetBat( void );
+u8 UTIL_GetUsb( void );
+u16 UTIL_GetTemp ( void ) ;
+void UTIL_SetTempMode ( int mode );
+//typedef void (*tHandler) ( void );
+void UTIL_SetIrqHandler ( int , tHandler );
+tHandler UTIL_GetIrqHandler ( int );
+extern u16 ADC_ConvertedValue[17];
+
+
+extern enum eSpeed
+ {
+ SPEED_VERY_LOW = 1,
+ SPEED_LOW = 2,
+ SPEED_MEDIUM = 3,
+ SPEED_HIGH = 4,
+ SPEED_VERY_HIGH = 5
+ } CurrentSpeed;
+
+enum eSchHandler
+ {
+ LED_SCHHDL_ID = 0,
+ BUTTON_SCHHDL_ID = 1,
+ BUZZER_SCHHDL_ID = 2,
+ MENU_SCHHDL_ID = 3,
+ POINTER_SCHHDL_ID = 4,
+ LCD_SCHHDL_ID = 5,
+ DRAW_SCHHDL_ID = 6,
+ RTC_SCHHDL_ID = 7,
+
+ UNUSED0_SCHHDL_ID = 8,
+ UNUSED1_SCHHDL_ID = 9,
+ UNUSED2_SCHHDL_ID = 10,
+ UNUSED3_SCHHDL_ID = 11,
+ UNUSED4_SCHHDL_ID = 12,
+ UNUSED5_SCHHDL_ID = 13,
+ UNUSED6_SCHHDL_ID = 14,
+ UNUSED7_SCHHDL_ID = 15
+ } dummy_var ; //for doxygen
+
+void UTIL_SetSchHandler ( enum eSchHandler , tHandler );
+tHandler UTIL_GetSchHandler ( enum eSchHandler );
+#define NULL_SCHHDL (0)
+#define LAST_SCHHDL ((tHandler)(-1))
+
+
+void UTIL_SetPll( enum eSpeed speed );
+const char* UTIL_GetVersion( void );
+enum eSpeed UTIL_GetPll( void );
+extern RCC_ClocksTypeDef RCC_ClockFreq;
+extern u8 fTemperatureInFahrenheit; /*!< 1 : Fahrenheit, 0 : Celcius (default). */
+
+
+//--------------------------------- MEMS ------------------------------------
+
+/* Exported types ------------------------------------------------------------*/
+typedef enum
+ {
+ V12=0,
+ V3=1,
+ V6=2,
+ V9=3
+} Rotate_H12_V_Match_TypeDef;
+
+typedef struct
+ {
+ s16 OutX ;
+ s16 OutX_F4 ;
+ s16 OutX_F16 ;
+ s32 OutX_F64 ;
+ s32 OutX_F256 ;
+ s16 OutY ;
+ s16 OutY_F4 ;
+ s16 OutY_F16 ;
+ s32 OutY_F64 ;
+ s32 OutY_F256 ;
+ s16 OutZ ;
+ s16 OutZ_F4 ;
+ s16 OutZ_F16 ;
+ s32 OutZ_F64 ;
+ s32 OutZ_F256 ;
+ s16 Shocked ;
+ s16 RELATIVE_X ;
+ s16 RELATIVE_Y ;
+ s16 DoubleClick ;
+ } tMEMS_Info;
+
+extern tMEMS_Info MEMS_Info;
+
+/* Exported functions --------------------------------------------------------*/
+void MEMS_Init(void);
+void MEMS_Handler(void);
+void MEMS_GetPosition(s16 * pX, s16* pY);
+void MEMS_SetNeutral( void );
+void MEMS_GetRotation(Rotate_H12_V_Match_TypeDef * H12);
+tMEMS_Info* MEMS_GetInfo (void);
+u8 MEMS_ReadID(void);
+
+//---------------------------------- LED -------------------------------------
+
+/* Exported types ------------------------------------------------------------*/
+enum LED_mode { LED_UNDEF = -1, LED_OFF = 0, LED_ON = 1, LED_BLINKING_LF = 2, LED_BLINKING_HF = 3 };
+enum LED_id { LED_GREEN = 0, LED_RED = 1};
+
+/* Exported functions --------------------------------------------------------*/
+void LED_Init (void);
+void LED_Handler_hw ( enum LED_id id );
+void LED_Handler ( void );
+void LED_Set ( enum LED_id id, enum LED_mode mode );
+
+//-------------------------------- ADC --------------------------------------
+
+/* Exported functions --------------------------------------------------------*/
+void ADConverter_Init (void);
+
+
+//==============================================================================
+//-------------------------------- SHUTDOWN ---------------------------------
+/* Exported functions --------------------------------------------------------*/
+void SHUTDOWN_Action (void);
+
+//-------------------------------- BUTTON -----------------------------------
+/* Exported types ------------------------------------------------------------*/
+enum BUTTON_mode { BUTTON_DISABLED = -1, BUTTON_ONOFF = 0,
+ BUTTON_ONOFF_FORMAIN = 1, BUTTON_WITHCLICK = 2 };
+enum BUTTON_state { BUTTON_UNDEF = -1, BUTTON_RELEASED = 0, BUTTON_PUSHED = 1,
+ BUTTON_PUSHED_FORMAIN = 2 , BUTTON_CLICK = 3, BUTTON_DBLCLICK = 4 };
+
+/* Exported functions -------------------------------------------------------*/
+void BUTTON_Init (void);
+void BUTTON_Handler(void);
+enum BUTTON_state BUTTON_GetState();
+void BUTTON_SetMode( enum BUTTON_mode mode);
+enum BUTTON_mode BUTTON_GetMode ( void ) ;
+void BUTTON_WaitForRelease();
+
+//-------------------------------- POINTER ----------------------------------
+
+/* Exported types ------------------------------------------------------------*/
+enum POINTER_mode { POINTER_UNDEF = -1, POINTER_OFF = 0, POINTER_ON = 1, POINTER_MENU = 2, POINTER_APPLICATION = 3, POINTER_RESTORE_LESS = 4 };
+enum POINTER_state { POINTER_S_UNDEF = -1, POINTER_S_DISABLED = 0, POINTER_S_ENABLED = 1 };
+
+/* Exported defines ----------------------------------------------------------*/
+#define POINTER_WIDTH 7
+
+typedef struct
+ {
+ s16 xPos ;
+ s16 yPos ;
+ s16 shift_PosX ;
+ s16 shift_PosY ;
+ s16 X_PosMin ;
+ s16 Y_PosMin ;
+ s16 X_PosMax ;
+ s16 Y_PosMax ;
+ } tPointer_Info;
+
+extern tPointer_Info POINTER_Info ;
+
+/* Exported vars -------------------------------------------------------------*/
+extern unsigned char *BallPointerBmpSize;
+extern unsigned char BallPointerBmp [POINTER_WIDTH], *CurrentPointerBmp,*CurrentPointerSize;
+extern u16 CurrentPointerColor;
+extern u16 BallColor;
+extern s16 POINTER_X_PosMin;
+extern s16 POINTER_Y_PosMin;
+extern s16 POINTER_X_PosMax;
+extern s16 POINTER_Y_PosMax;
+extern unsigned char PointerAreaStore [2*POINTER_WIDTH*POINTER_WIDTH];
+
+/* Exported functions --------------------------------------------------------*/
+extern void POINTER_Init ( void ) ;
+void POINTER_Handler(void);
+u16 POINTER_GetCurrentAngleStart ( void );
+void POINTER_SetCurrentAngleStart ( u16 );
+u16 POINTER_GetCurrentSpeedOnAngle ( void );
+void POINTER_SetCurrentSpeedOnAngle ( u16 newspeed );
+void POINTER_SetMode( enum POINTER_mode mode);
+void POINTER_SetCurrentPointer( unsigned char width, unsigned char height, unsigned char *bmp);
+enum POINTER_state POINTER_GetState(void);
+void POINTER_Draw (u8 Line, u8 Column, u8 Width, u8 Height, u8 *Bmp);
+void POINTER_SetRect ( s16 x, s16 y, s16 width, s16 height ); //Restrict the move of the pointer to a rectangle
+void POINTER_SetRectScreen ( void ); //Remove any space restriction for the pointer moves.
+void POINTER_Save (u8 Line, u8 Column, u8 Width, u8 Height);
+void POINTER_Restore (u8 Line, u8 Column, u8 Width, u8 Height);
+u16 POINTER_GetPos(void); //Return the poistion of the cursor (x=lower byte, y = upperbyte)
+void POINTER_SetPos ( u16 x, u16 y );
+typedef void (*tAppPtrMgr) ( int , int );
+void POINTER_SetApplication_Pointer_Mgr( tAppPtrMgr mgr );
+tPointer_Info* POINTER_GetInfo ( void );
+u16 POINTER_GetColor ( void ) ;
+void POINTER_SetColor ( u16 color );
+enum POINTER_mode POINTER_GetMode( void );
+void POINTER_SetCurrentAreaStore ( u8 *ptr );
+void LCD_SetRotateScreen ( u8 RotateScreen);
+u8 LCD_GetRotateScreen ();
+void LCD_SetScreenOrientation (Rotate_H12_V_Match_TypeDef ScreenOrientation);
+Rotate_H12_V_Match_TypeDef LCD_GetScreenOrientation ();
+
+//---------------------------------- LCD -----------------------------------
+
+/* Exported defines ----------------------------------------------------------*/
+//RGB is 16-bit coded as G2G1G0B4 B3B2B1B0 R4R3R2R1 R0G5G4G3
+#define RGB_MAKE(xR,xG,xB) ( ( (xG&0x07)<<13 ) + ( (xG)>>5 ) + \
+ ( ((xB)>>3) << 8 ) + \
+ ( ((xR)>>3) << 3 ) )
+#define RGB_RED 0x00F8
+#define RGB_BLACK 0x0000
+#define RGB_WHITE 0xffff
+#define RGB_BLUE 0x1F00
+#define RGB_GREEN 0xE007
+#define RGB_YELLOW (RGB_GREEN|RGB_RED)
+#define RGB_MAGENTA (RGB_BLUE|RGB_RED)
+#define RGB_LIGHTBLUE (RGB_BLUE|RGB_GREEN)
+#define RGB_ORANGE (RGB_RED | 0xE001) //green/2 + red
+#define RGB_PINK (RGB_MAGENTA | 0xE001) //green/2 + magenta
+
+// SCREEN Infos
+#define SCREEN_WIDTH 128
+#define SCREEN_HEIGHT 128
+#define CHIP_SCREEN_WIDTH 132
+#define CHIP_SCREEN_HEIGHT 132
+
+// Characters Infos
+#define CHAR_WIDTH 7
+#define CHAR_HEIGHT 14
+
+// PWM rates.
+#define BACKLIGHTMIN 0x1000 /*!< Minimal PWM rate. */
+#define DEFAULT_CCR_BACKLIGHTSTART 0x8000 /*!< Default PWM rate. */
+
+/* Exported vars -------------------------------------------------------------*/
+extern Rotate_H12_V_Match_TypeDef Screen_Orientation;
+extern int rotate_screen;
+
+/* Exported functions --------------------------------------------------------*/
+void LCD_Init(void);
+void LCD_Handler(void);
+void LCD_SetRect_For_Cmd( s16 x, s16 y, s16 width, s16 height );
+u16 LCD_GetPixel( u8 x, u8 y );
+void LCD_DrawPixel( u8 x, u8 y, u16 Pixel );
+void LCD_SendLCDCmd( u8 Cmd );
+void LCD_SendLCDData( u8 Data );
+u32 LCD_ReadLCDData( void );
+void LCD_FillRect( u16 x, u16 y, u16 width, u16 height, u16 color );
+void LCD_DrawRect( u16 x, u16 y, u16 width, u16 height, u16 color );
+void LCD_DisplayChar( u8 x, u8 y, u8 Ascii, u16 TextColor, u16 BGndColor, u16 CharMagniCoeff );
+void LCD_RectRead( u16 x, u16 y, u16 width, u16 height, u8* bmp );
+void LCD_SetBackLight (u32 newBacklightStart);
+u32 LCD_GetBackLight ( void );
+void LCD_SetBackLightOff( void );
+void LCD_SetBackLightOn( void );
+
+#include "lcd.h"
+
+//---------------------------------- DRAW ----------------------------------
+
+/* Exported functions --------------------------------------------------------*/
+void DRAW_Init(void);
+void DRAW_Clear(void);
+void DRAW_Handler(void);
+void DRAW_SetDefaultColor (void);
+void DRAW_SetImage(const u16 *imageptr, u8 x, u8 y, u8 width, u8 height);
+void DRAW_SetImageBW(const u8 *imageptr, u8 x, u8 y, u8 width, u8 height);
+void DRAW_SetLogoBW(void);
+void DRAW_DisplayVbat(u8 x, u8 y);
+void DRAW_DisplayTime(u8 x, u8 y);
+void DRAW_DisplayTemp(u8 x, u8 y);
+void DRAW_DisplayString( u8 x, u8 y, const u8 *ptr, u8 len );
+void DRAW_DisplayStringInverted( u8 x, u8 y, const u8 *ptr, u8 len );
+u16 DRAW_GetCharMagniCoeff(void);
+void DRAW_SetCharMagniCoeff(u16 Coeff);
+u16 DRAW_GetTextColor(void);
+void DRAW_SetTextColor(u16 Color);
+u16 DRAW_GetBGndColor(void);
+void DRAW_SetBGndColor(u16 Color);
+void DRAW_Batt( void );
+void DRAW_Line (s16 x1, s16 y1, s16 x2, s16 y2, u16 color );
+
+/* Exported vars -------------------------------------------------------------*/
+extern int fDisplayTime;
+
+
+//-------------------------------- BUZZER -----------------------------------
+
+/* Exported defines ----------------------------------------------------------*/
+#define BUZZER_BEEP BUZZER_SHORTBEEP
+
+/* Exported type def ---------------------------------------------------------*/
+enum BUZZER_mode { BUZZER_UNDEF = -1, BUZZER_OFF = 0, BUZZER_ON = 1,
+ BUZZER_SHORTBEEP = 2, BUZZER_LONGBEEP = 3, BUZZER_PLAYMUSIC = 4 };
+
+/* Exported type functions ---------------------------------------------------*/
+void BUZZER_Init(void);
+void BUZZER_Handler(void);
+void BUZZER_SetMode( enum BUZZER_mode mode);
+enum BUZZER_mode BUZZER_GetMode( void );
+void BUZZER_PlayMusic (const u8 *melody );
+
+//--------------------------------- MENU -----------------------------------
+
+/* Exported defines ----------------------------------------------------------*/
+#define MENU_MAXITEM 6
+#define APP_VOID ((tMenuItem *)(-1))
+#define MAX_APP_MENU_SIZE 10
+#define MAXAPP 64
+#define MAX_MENUAPP_SIZE 3
+#define REMOVE_MENU 0x01
+#define APP_MENU 0x02
+
+enum MENU_code { MENU_LEAVE = 0, MENU_CONTINUE = 1, MENU_REFRESH = 2,
+ MENU_CHANGE = 3, MENU_CONTINUE_COMMAND = 4};
+
+/* Exported type def ---------------------------------------------------------*/
+typedef struct
+ {
+ const char *Text;
+ enum MENU_code (*Fct_Init) ( void );
+ enum MENU_code (*Fct_Manage)( void );
+ int fMenuFlag;
+ } tMenuItem;
+
+typedef struct
+ {
+ unsigned fdispTitle : 1;
+ const char *Title;
+ int NbItems;
+ int LgMax;
+ int XPos, YPos;
+ int XSize, YSize;
+ unsigned int SelectedItem;
+ tMenuItem Items[MENU_MAXITEM];
+ } tMenu;
+
+/* Exported vars -------------------------------------------------------------*/
+extern tMenu MainMenu, *CurrentMenu;
+extern tMenuItem *CurrentCommand;
+extern int BGndColor_Menu;
+extern int TextColor_Menu;
+
+/* Exported type functions ---------------------------------------------------*/
+enum MENU_code fColor ( void ) ;
+void MENU_Set ( tMenu *mptr );
+void MENU_Handler ( void ) ;
+extern enum MENU_code MENU_Quit ( void );
+void MENU_Remove ( void ) ;
+void MENU_Question ( char *str, int *answer );
+void MENU_Print ( char *str );
+enum MENU_code MENU_SetLevel_Ini( void );
+enum MENU_code MENU_SetLevel_Mgr( u32 *value, u32 value_range [] ) ;
+void MENU_ClearCurrentCommand( void );
+void MENU_SetLevelTitle(u8* title);
+void MENU_SetTextColor ( int TextColor );
+int MENU_GetTextColor ( void );
+void MENU_SetBGndColor ( int BGndColor );
+int MENU_GetBGndColor ( void );
+extern enum MENU_code fQuit ( void ) ;
+void MENU_ClearCurrentMenu(void);
+
+//-------------------------------- BACKLIGHT --------------------------------
+
+/* Exported type functions ---------------------------------------------------*/
+void BackLight_Configuration (void);
+void ManageBackLight (void);
+void BackLight_Change (void);
+
+//-------------------------------- RTC --------------------------------------
+
+/* Exported type functions ---------------------------------------------------*/
+void RTC_Init(void);
+void RTC_SetTime (u32 THH, u32 TMM, u32 TSS);
+void RTC_GetTime (u32 * THH, u32 * TMM, u32 * TSS);
+void RTC_DisplayTime ( void );
+
+//Backup registers
+#define BKP_SYS1 1
+#define BKP_SYS2 2
+#define BKP_SYS3 3
+#define BKP_SYS4 4
+#define BKP_SYS5 5
+#define BKP_SYS6 6
+#define BKP_USER1 7
+#define BKP_USER2 8
+#define BKP_USER3 9
+#define BKP_USER4 10
+
+#define BKP_PLL (BKP_SYS2)
+#define BKP_BKLIGHT (BKP_SYS3)
+
+//--------------------------------- Application --------------------------------
+void (*Application_Pointer_Mgr) ( int sposX, int sposY);
+
+#endif /*__CIRCLE_H */
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/circle_api.h b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/circle_api.h
new file mode 100644
index 000000000..f3cdb8f77
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/circle_api.h
@@ -0,0 +1,679 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
+/**
+*
+* @file circle_api.h
+* @brief General header for the STM32-circle projects.
+* @author FL
+* @date 07/2007
+* @version 1.2
+* @date 10/2007
+* @version 1.5 types of OutX_F64 and OutX_F256 changed to u32 (same for Y and Z)
+* @date 10/2007
+* @version 1.6 Add the IRQ handler replacement
+*
+* It contains the list of the utilities functions organized by sections
+* (MEMS, LCD, POINTER, ...)
+*
+**/
+/*******************************************************************************
+*
+* Use this header with version 1.5 or later of the OS.
+*
+* For a complete documentation on the CircleOS, please go to:
+* http://www.stm32circle.com
+*
+*******************************************************************************/
+
+#include "stm32f10x_lib.h"
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __CIRCLE_API_H
+#define __CIRCLE_API_H
+
+//-------------------------------- General -------------------------------------
+
+/**
+* @enum eSpeed
+* @brief Clock speeds.
+*
+* Available clock speeds.
+**/
+extern enum eSpeed
+ {
+ SPEED_VERY_LOW = 1,
+ SPEED_LOW = 2,
+ SPEED_MEDIUM = 3,
+ SPEED_HIGH = 4,
+ SPEED_VERY_HIGH = 5
+ } CurrentSpeed;
+enum eSchHandler
+ {
+ LED_SCHHDL_ID = 0,
+ BUTTON_SCHHDL_ID = 1,
+ BUZZER_SCHHDL_ID = 2,
+ MENU_SCHHDL_ID = 3,
+ POINTER_SCHHDL_ID = 4,
+ LCD_SCHHDL_ID = 5,
+ DRAW_SCHHDL_ID = 6,
+ RTC_SCHHDL_ID = 7,
+
+ UNUSED0_SCHHDL_ID = 8,
+ UNUSED1_SCHHDL_ID = 9,
+ UNUSED2_SCHHDL_ID = 10,
+ UNUSED3_SCHHDL_ID = 11,
+ UNUSED4_SCHHDL_ID = 12,
+ UNUSED5_SCHHDL_ID = 13,
+ UNUSED6_SCHHDL_ID = 14,
+ UNUSED7_SCHHDL_ID = 15
+ };
+
+
+/// @cond Internal
+
+extern RCC_ClocksTypeDef RCC_ClockFreq;
+
+/* Typedefs ------------------------------------------------------------------*/
+typedef u32 (*tCircleFunc0 ) (void);
+typedef u32 (*tCircleFunc1 ) (u32 param1);
+typedef u32 (*tCircleFunc2 ) (u32 param1, u32 param2);
+typedef u32 (*tCircleFunc3 ) (u32 param1, u32 param2, u32 param3);
+typedef u32 (*tCircleFunc4 ) (u32 param1, u32 param2, u32 param3, u32 param4);
+typedef u32 (*tCircleFunc5 ) (u32 param1, u32 param2, u32 param3, u32 param4, u32 param5);
+typedef u32 (*tCircleFunc6 ) (u32 param1, u32 param2, u32 param3, u32 param4, u32 param5, u32 param6);
+
+extern tCircleFunc0 (*ptrCircle_API) [];
+
+/* Defines -------------------------------------------------------------------*/
+#define Circle_API (*ptrCircle_API)
+
+#define POINTER_ID 0x00
+#define DRAW_ID 0x20
+#define LCD_ID 0x40
+#define LED_ID 0x60
+#define MEMS_ID 0x70
+#define BUTTON_ID 0x80
+#define BUZZER_ID 0x90
+#define MENU_ID 0xA0
+#define UTIL_ID 0xB0
+#define RTC_ID 0xC0
+
+// UTIL functions definition.
+#define UTIL_SET_PLL_ID (UTIL_ID + 0) // Set clock frequency.
+#define UTIL_GET_PLL_ID (UTIL_ID + 1) // Get clock frequency.
+#define UTIL_UINT2STR_ID (UTIL_ID + 2) // Convert an unsigned integer into a string.
+#define UTIL_INT2STR_ID (UTIL_ID + 3) // Convert a signed integer into a string.
+#define UTIL_GET_VERSION_ID (UTIL_ID + 4) // Get CircleOS version.
+#define UTIL_READ_BACKUPREGISTER_ID (UTIL_ID + 5) // Reads data from the specified Data Backup Register.
+#define UTIL_WRITE_BACKUPREGISTER_ID (UTIL_ID + 6) // Writes data to the specified Data Backup Register.
+#define UTIL_GET_BAT_ID (UTIL_ID + 7) // Return the batterie tension in mV.
+#define UTIL_GET_USB_ID (UTIL_ID + 8) // Return the USB connexion state.
+#define UTIL_SET_IRQ_HANDLER_ID (UTIL_ID + 9) // Replace an irq handler
+#define UTIL_GET_IRQ_HANDLER_ID (UTIL_ID + 10) // Get the current irq handler
+#define UTIL_SET_SCH_HANDLER_ID (UTIL_ID + 11) // Replace an irq handler
+#define UTIL_GET_SCH_HANDLER_ID (UTIL_ID + 12) // Get the current irq handler
+#define UTIL_GET_TEMP_ID (UTIL_ID + 13) // Return the temperature (1/100 C)
+#define UTIL_SET_TEMPMODE_ID (UTIL_ID + 14) // Set the temperature mode (0: mCelcius, 1: mFahrenheit
+typedef void (*tHandler) (void);
+
+// Prototypes.
+#define UTIL_SetPll(a) ((tCircleFunc1)(Circle_API [UTIL_SET_PLL_ID])) ((u32)(a)) // void UTIL_SetPll( enum eSpeed speed );
+#define UTIL_GetPll() (u32) (((tCircleFunc0)(Circle_API [UTIL_GET_PLL_ID])) ()) // enum eSpeed UTIL_GetPll( void );
+#define UTIL_uint2str(a,b,c,d) ((tCircleFunc4)(Circle_API [UTIL_UINT2STR_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d)) // void uint2str( char* ptr , u32 X, u16 digit, int fillwithzero );
+#define UTIL_int2str(a,b,c,d) ((tCircleFunc4)(Circle_API [UTIL_INT2STR_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d)) // void int2str( char* ptr , s32 X, u16 digit, int fillwithzero );
+#define UTIL_GetVersion() (u32) (((tCircleFunc0)(Circle_API [UTIL_GET_VERSION_ID])) ()) // char* UTIL_GetVersion( void );
+#define UTIL_ReadBackupRegister(a) (u32) (((tCircleFunc1)(Circle_API [UTIL_READ_BACKUPREGISTER_ID])) ((u32)(a))) // u16 UTIL_ReadBackupRegister( u16 BKP_DR );
+#define UTIL_WriteBackupRegister(a,b) ((tCircleFunc2)(Circle_API [UTIL_WRITE_BACKUPREGISTER_ID])) ((u32)(a),(u32)(b)) // void UTIL_WriteBackupRegister( u16 BKP_DR, u16 Data );
+#define UTIL_GetBat() (u32) (((tCircleFunc0)(Circle_API [UTIL_GET_BAT_ID])) ()) // u16 UTIL_GetBat( void );
+#define UTIL_GetUsb() (u32) (((tCircleFunc0)(Circle_API [UTIL_GET_USB_ID])) ()) // u8 UTIL_GetUsb( void );
+#define UTIL_SetIrqHandler(a,b) (((tCircleFunc2)(Circle_API [UTIL_SET_IRQ_HANDLER_ID])) ((int)a,(tHandler)b)) // void UTIL_SetIrqHandler ( int , tHandler );
+#define UTIL_GetIrqHandler(a) (u32) (((tCircleFunc1)(Circle_API [UTIL_GET_IRQ_HANDLER_ID])) ((int)a)) // tHandler* UTIL_GetIrqHandler ( int );
+#define UTIL_SetSchHandler(a,b) (((tCircleFunc2)(Circle_API [UTIL_SET_SCH_HANDLER_ID])) ((int)a,(tHandler)b)) // void UTIL_SetSchHandler ( int , tHandler );
+#define UTIL_GetSchHandler(a) (u32) (((tCircleFunc1)(Circle_API [UTIL_GET_SCH_HANDLER_ID])) ((int)a)) // tHandler* UTIL_GetSchHandler ( int );
+#define UTIL_GetTemp() (u32) (((tCircleFunc0)(Circle_API [UTIL_GET_TEMP_ID])) ()) // u16 UTIL_GetTemp( void );
+#define UTIL_SetTempMode(a) (((tCircleFunc1)(Circle_API [UTIL_SET_TEMPMODE_ID])) ((int)a)) // void UTIL_SetTempMode( int mode );
+
+/// @endcond
+
+//--------------------------------- MEMS ------------------------------------
+
+/* Exported types ------------------------------------------------------------*/
+
+/**
+* @enum Rotate_H12_V_Match_TypeDef
+* @brief The 4 possible rotations.
+*
+* The 4 possible MEM rotations.
+**/
+typedef enum
+ {
+ V12 = 0, /*!< No rotation. */
+ V3 = 1, /*!< Rotation to the right.*/
+ V6 = 2, /*!< Rotation to the left. */
+ V9 = 3 /*!< Half a rotation. */
+ } Rotate_H12_V_Match_TypeDef;
+
+/**
+* @struct tMEMS_Info
+* @brief MEMS state description.
+**/
+typedef struct
+ {
+ s16 OutX; /*!< MEMS X position. */
+ s16 OutX_F4; /*!< MEMS X position filtered on 4 values. */
+ s16 OutX_F16; /*!< MEMS X position filtered on 16 values. */
+ s32 OutX_F64; /*!< MEMS X position filtered on 64 values. */
+ s32 OutX_F256; /*!< MEMS X position filtered on 256 values. */
+ s16 OutY; /*!< MEMS Y position. */
+ s16 OutY_F4; /*!< MEMS Y position filtered on 4 values. */
+ s16 OutY_F16; /*!< MEMS Y position filtered on 16 values. */
+ s32 OutY_F64; /*!< MEMS Y position filtered on 64 values. */
+ s32 OutY_F256; /*!< MEMS Y position filtered on 256 values. */
+ s16 OutZ; /*!< MEMS Z position. */
+ s16 OutZ_F4; /*!< MEMS Z position filtered on 4 values. */
+ s16 OutZ_F16; /*!< MEMS Z position filtered on 16 values. */
+ s32 OutZ_F64; /*!< MEMS Z position filtered on 64 values. */
+ s32 OutZ_F256; /*!< MEMS Z position filtered on 256 values. */
+ s16 Shocked; /*!< MEMS shock counter (incremented...) */
+ s16 RELATIVE_X; /*!< MEMS relative X position. */
+ s16 RELATIVE_Y; /*!< MEMS relative Y position. */
+ s16 DoubleClick; /*!< MEMS DoubleClick counter(incremented...)*/
+ } tMEMS_Info;
+
+/// @cond Internal
+
+/* Exported defines ----------------------------------------------------------*/
+
+// MEMS functions definition
+#define MEMS_GET_POSITION_ID (MEMS_ID + 0) // Return the current (relative) Mems information
+#define MEMS_GET_ROTATION_ID (MEMS_ID + 1) // Return the current screen orientation of the circle
+#define MEMS_SET_NEUTRAL_ID (MEMS_ID + 2) // Set the current position as "neutral position"
+#define MEMS_GET_INFO_ID (MEMS_ID + 3) // Return Mems informations
+
+// Prototypes
+#define MEMS_GetPosition(a,b) ((tCircleFunc2)(Circle_API [MEMS_GET_POSITION_ID])) ((u32)(a),(u32)(b)) // void MEMS_GetPosition(s16 * pX, s16* pY);
+#define MEMS_GetRotation(a) ((tCircleFunc1)(Circle_API [MEMS_GET_ROTATION_ID])) ((u32)(a)) // void MEMS_GetRotation(Rotate_H12_V_Match_TypeDef * H12);
+#define MEMS_SetNeutral() ((tCircleFunc0)(Circle_API [MEMS_GET_ROTATION_ID])) () // void MEMS_SetNeutral( void );
+#define MEMS_GetInfo() ( (tMEMS_Info*) (((tCircleFunc0)(Circle_API [MEMS_GET_INFO_ID])) ())) // tMEMS_Info* MEMS_GetInfo (void)
+
+/// @endcond
+
+//-------------------------------- POINTER ----------------------------------
+
+/* Exported types ------------------------------------------------------------*/
+
+/**
+* @enum POINTER_mode
+* @brief Available pointer modes.
+*
+* Description of all the available pointer modes in CircleOS.
+**/
+enum POINTER_mode
+ {
+ POINTER_UNDEF = -1, /*!< Pointer's mode is unknown! */
+ POINTER_OFF = 0, /*!< Pointer isn't managed and displayed. */
+ POINTER_ON = 1, /*!< Pointer mode used in main screen. */
+ POINTER_MENU = 2, /*!< Pointer management is used to select item menu (but pointer isn't displayed). */
+ POINTER_APPLICATION = 3, /*!< The managment of pointer depend of extern application. */
+ POINTER_RESTORE_LESS = 4 /*!< The background isn't restored (to go faster). */
+ };
+
+/**
+* @enum POINTER_state
+* @brief The different pointer modes.
+*
+* Despite beeing in a undefined state, the pointer can be disabled or enable.
+**/
+enum POINTER_state
+ {
+ POINTER_S_UNDEF = -1, /*!< Pointer state is unknown! */
+ POINTER_S_DISABLED = 0, /*!< Pointer is disabled. */
+ POINTER_S_ENABLED = 1 /*!< Pointer is enabled. */
+ };
+
+/**
+* @struct tPointer_Info
+* @brief Pointer position description.
+**/
+typedef struct
+ {
+ s16 xPos; /*!< X position of pointer. */
+ s16 yPos; /*!< Y position of pointer. */
+ s16 shift_PosX; /*!< Pointer speed on X axis. */
+ s16 shift_PosY; /*!< Pointer speed on Y axis */
+ s16 X_PosMin; /*!< Minimum position on X axis. */
+ s16 Y_PosMin; /*!< Minimum position on Y axis. */
+ s16 X_PosMax; /*!< Maximum position on X axis. */
+ s16 Y_PosMax; /*!< Maximum position on Y axis. */
+ } tPointer_Info;
+
+/// @cond Internal
+
+/* Exported defines ---------------------------------------------------------*/
+#define POINTER_WIDTH 7
+
+// POINTER functions definition
+#define POINTER_SET_RECT_ID (POINTER_ID + 0) // Set new limits for the move of the pointer
+#define POINTER_SETRECTSCREEN_ID (POINTER_ID + 1) // Remove any space restriction for the pointer moves.
+#define POINTER_GETCURRENTANGLESTART_ID (POINTER_ID + 2) // Return the current minimum angle to move pointer
+#define POINTER_SETCURRENTANGLESTART_ID (POINTER_ID + 3) // Set the current minimum angle to move pointer
+#define POINTER_GETCURRENTSPEEDONANGLE_ID (POINTER_ID + 4) // Return the ratio speed / angle
+#define POINTER_SETCURRENTSPEEDONANGLE_ID (POINTER_ID + 5) // Set the ratio speed / angle
+#define POINTER_SETMODE_ID (POINTER_ID + 6) // Change the current mode of the pointer management
+#define POINTER_GETMODE_ID (POINTER_ID + 7) // Return the current mode of the pointer management
+#define POINTER_SETCURRENTPOINTER_ID (POINTER_ID + 8) // Set the dimention and bitmap of pointer
+#define POINTER_GETSTATE_ID (POINTER_ID + 9) // Return the current state
+#define POINTER_DRAW_ID (POINTER_ID + 10) // Draw a pointer
+#define POINTER_SAVE_ID (POINTER_ID + 11) // Save the background of the pointer
+#define POINTER_RESTORE_ID (POINTER_ID + 12) // Restore the background of the pointer
+#define POINTER_GETPOSITION_ID (POINTER_ID + 13) // Return the poistion of the cursor (x=lower byte, y = upperbyte)
+#define POINTER_SETPOSITION_ID (POINTER_ID + 14) // Force the position of the pointer in the screen
+#define POINTER_SETAPPLICATION_POINTER_MGR_ID (POINTER_ID + 15) // Set the application pointer manager
+#define POINTER_SETCOLOR_ID (POINTER_ID + 16) // Set pointer color
+#define POINTER_GETCOLOR_ID (POINTER_ID + 17) // Return pointer color
+#define POINTER_GETINFO_ID (POINTER_ID + 18) // Return pointer informations
+#define POINTER_SET_CURRENT_AREASTORE_ID (POINTER_ID + 19) // Change the current storage area
+
+// Prototypes
+#define POINTER_SetRect(a,b,c,d) ((tCircleFunc4)(Circle_API [POINTER_SET_RECT_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d)) //void POINTER_SetRect ( s16 x, s16 y, s16 width, s16 height ); //Restrict the move of the pointer to a rectangle
+#define POINTER_SetRectScreen() ((tCircleFunc0)(Circle_API [POINTER_SETRECTSCREEN_ID])) () //void POINTER_SetRectScreen ( void );
+#define POINTER_GetCurrentAngleStart() (u16) (((tCircleFunc0)(Circle_API [POINTER_GETCURRENTANGLESTART_ID])) ()) //u16 POINTER_GetCurrentAngleStart ( void );
+#define POINTER_SetCurrentAngleStart(a) ((tCircleFunc1)(Circle_API [POINTER_SETCURRENTANGLESTART_ID])) ((u32)(a)) //void POINTER_SetCurrentAngleStart ( u16 );
+#define POINTER_GetCurrentSpeedOnAngle() (u16) (((tCircleFunc0)(Circle_API [POINTER_GETCURRENTSPEEDONANGLE_ID])) ()) //u16 POINTER_GetCurrentSpeedOnAngle ( void );
+#define POINTER_SetCurrentSpeedOnAngle(a) ((tCircleFunc1)(Circle_API [POINTER_SETCURRENTSPEEDONANGLE_ID])) ((u32)(a)) //void POINTER_SetCurrentSpeedOnAngle ( u16 newspeed );
+#define POINTER_SetMode(a) ((tCircleFunc1)(Circle_API [POINTER_SETMODE_ID])) ((u32)(a)) //void POINTER_SetMode( enum POINTER_mode mode);
+#define POINTER_GetMode() (enum POINTER_mode) (((tCircleFunc0)(Circle_API [POINTER_GETMODE_ID])) ()) //enum POINTER_mode POINTER_GetMode( void );
+#define POINTER_SetCurrentPointer(a,b,c) ((tCircleFunc3)(Circle_API [POINTER_SETCURRENTPOINTER_ID])) ((u32)(a),(u32)(b),(u32)(c)) //void POINTER_SetCurrentPointer( unsigned char width, unsigned char height, unsigned char *bmp);
+#define POINTER_GetState() (enum POINTER_state) (((tCircleFunc0)(Circle_API [POINTER_GETSTATE_ID])) ()) //enum POINTER_state POINTER_GetState(void);
+#define POINTER_Draw(a,b,c,d,e) ((tCircleFunc5)(Circle_API [POINTER_DRAW_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d),(u32)(e)) //void POINTER_Draw (u8 Line, u8 Column, u8 Width, u8 Height, u8 *Bmp);
+#define POINTER_Save(a,b,c,d) ((tCircleFunc4)(Circle_API [POINTER_SAVE_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d)) //void POINTER_Save (u8 Line, u8 Column, u8 Width, u8 Height);
+#define POINTER_Restore(a,b,c,d) ((tCircleFunc4)(Circle_API [POINTER_RESTORE_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d)) //void POINTER_Restore (u8 Line, u8 Column, u8 Width, u8 Height);
+#define POINTER_GetPos() (u16) (((tCircleFunc0)(Circle_API [POINTER_GETPOSITION_ID])) ()) //u16 POINTER_GetPos(void);
+#define POINTER_SetPos(a,b) ((tCircleFunc2)(Circle_API [POINTER_SETPOSITION_ID])) ((u32)(a),(u32)(b)) //void POINTER_SetPos ( u16 x, u16 y );
+#define POINTER_SetApplication_Pointer_Mgr(a) ((tCircleFunc1)(Circle_API [POINTER_SETAPPLICATION_POINTER_MGR_ID])) ((u32)(a)) //void POINTER_SetApplication_Pointer_Mgr( tAppPtrMgr mgr );
+#define POINTER_SetColor(a) ((tCircleFunc1)(Circle_API [POINTER_SETCOLOR_ID])) ((u32)(a)) //void POINTER_SetColor ( u16 color )
+#define POINTER_GetColor() (u16) (((tCircleFunc0)(Circle_API [POINTER_GETCOLOR_ID])) ()) //u16 POINTER_GetColor ( void )
+#define POINTER_GetInfo() (tPointer_Info*) (((tCircleFunc0)(Circle_API [POINTER_GETINFO_ID])) ()) //tPointer_Info* POINTER_GetInfo ( void )
+#define POINTER_SetCurrentAreaStore(a) ((tCircleFunc1)(Circle_API [POINTER_SET_CURRENT_AREASTORE_ID])) ((u32)(a)) //void POINTER_SetCurrentAreaStore ( u8 *ptr )
+
+/// @endcond
+
+//-------------------------------- BUTTON -----------------------------------
+
+/* Exported types ------------------------------------------------------------*/
+
+/**
+* @enum BUTTON_mode
+* @brief Available button modes.
+*
+* List of all the available button mode in the CircleOS.
+**/
+enum BUTTON_mode
+ {
+ BUTTON_DISABLED = -1, /*!< No action on the button is detected. */
+ BUTTON_ONOFF = 0, /*!< Detect ON/OFF pression type. */
+ BUTTON_ONOFF_FORMAIN = 1, /*!< Special mode for main screen. */
+ BUTTON_WITHCLICK = 2 /*!< Currently unused. */
+ };
+
+/**
+* @enum BUTTON_state
+* @brief CircleOS button states.
+*
+* Description of the button states provided by CircleOS.
+**/
+enum BUTTON_state
+ {
+ BUTTON_UNDEF = -1, /*!< Undefined state. */
+ BUTTON_RELEASED = 0, /*!< Button is released. */
+ BUTTON_PUSHED = 1, /*!< Button was just pushed. */
+ BUTTON_PUSHED_FORMAIN = 2, /*!< Same as BUTTON_PUSHED when button mode is BUTTON_ONOFF_FORMAIN. */
+ BUTTON_CLICK = 3, /*!< Currently unused. */
+ BUTTON_DBLCLICK = 4 /*!< Currently unused. */
+ };
+
+/// @cond Internal
+
+/* Exported defines ----------------------------------------------------------*/
+
+// BUTTON functions definition
+#define BUTTON_GETSTATE_ID (BUTTON_ID + 0) // Return state of button
+#define BUTTON_SETMODE_ID (BUTTON_ID + 1) // Set button mode
+#define BUTTON_GETMODE_ID (BUTTON_ID + 2) // Return button mode
+#define BUTTON_WAITFORRELEASE_ID (BUTTON_ID + 3) // Disable temporarily any new button event
+
+// Prototypes
+#define BUTTON_GetState() (enum BUTTON_state) (((tCircleFunc0)(Circle_API [BUTTON_GETSTATE_ID])) ()) // enum BUTTON_state BUTTON_GetState(void);
+#define BUTTON_SetMode(a); ((tCircleFunc1)(Circle_API [BUTTON_SETMODE_ID])) ((u32)(a)) // void BUTTON_SetMode( enum BUTTON_mode mode);
+#define BUTTON_GetMode(); (enum BUTTON_mode) (((tCircleFunc0)(Circle_API [BUTTON_GETMODE_ID])) ()) // enum BUTTON_mode BUTTON_GetMode ( void ) ;
+#define BUTTON_WaitForRelease() ((tCircleFunc0)(Circle_API [BUTTON_WAITFORRELEASE_ID])) () // void BUTTON_WaitForRelease(void);
+
+/// @endcond
+
+//---------------------------------- LCD -----------------------------------
+
+/* Exported defines ----------------------------------------------------------*/
+
+// RGB is 16-bit coded as G2G1G0B4 B3B2B1B0 R4R3R2R1 R0G5G4G3
+#define RGB_MAKE(xR,xG,xB) ( ( (xG&0x07)<<13 ) + ( (xG)>>5 ) + \
+ ( ((xB)>>3) << 8 ) + \
+ ( ((xR)>>3) << 3 ) ) /*!< Macro to make a LCD compatible color format from RGB. */
+
+#define RGB_RED 0x00F8 /*!< Predefined color. */
+#define RGB_BLACK 0x0000 /*!< Predefined color. */
+#define RGB_WHITE 0xffff /*!< Predefined color. */
+#define RGB_BLUE 0x1F00 /*!< Predefined color. */
+#define RGB_GREEN 0xE007 /*!< Predefined color. */
+#define RGB_YELLOW (RGB_GREEN|RGB_RED) /*!< Predefined color. */
+#define RGB_MAGENTA (RGB_BLUE|RGB_RED) /*!< Predefined color. */
+#define RGB_LIGHTBLUE (RGB_BLUE|RGB_GREEN) /*!< Predefined color. */
+#define RGB_ORANGE (RGB_RED | 0xE001) /*!< Predefined color ( Green/2 + red ). */
+#define RGB_PINK (RGB_MAGENTA | 0xE001) /*!< Predefined color ( Green/2 + magenta ). */
+
+// PWM rates.
+#define BACKLIGHTMIN 0x1000 /*!< Minimal PWM rate. */
+#define DEFAULT_CCR_BACKLIGHTSTART 0x8000 /*!< Default PWM rate. */
+
+// SCREEN Infos
+#define SCREEN_WIDTH 128 /*!< Width of visible screen in pixels. */
+#define SCREEN_HEIGHT 128 /*!< Height of visible screen in pixels. */
+#define CHIP_SCREEN_WIDTH 132 /*!< Width of screen driven by LCD controller in pixels. */
+#define CHIP_SCREEN_HEIGHT 132 /*!< Height of screen driven by LCD controller in pixels. */
+
+// Characters Infos
+#define CHAR_WIDTH 7 /*!< Width of a character. */
+#define CHAR_HEIGHT 14 /*!< Height of a character. */
+
+/// @cond Internal
+
+// LCD functions definition
+#define LCD_SETRECTFORCMD_ID (LCD_ID + 0) // Define the rectangle (for the next command to be applied)
+#define LCD_GETPIXEL_ID (LCD_ID + 1) // Read the value of one pixel
+#define LCD_DRAWPIXEL_ID (LCD_ID + 2) // Draw a Graphic image on slave LCD.
+#define LCD_SENDLCDCMD_ID (LCD_ID + 3) // Send one byte command to LCD LCD.
+#define LCD_SENDLCDDATA_ID (LCD_ID + 4) // Display one byte data to LCD LCD.
+#define LCD_READLCDDATA_ID (LCD_ID + 5) // Read LCD byte data displayed on LCD LCD.
+#define LCD_FILLRECT_ID (LCD_ID + 6) // Fill a rectangle with one color
+#define LCD_DRAWRECT_ID (LCD_ID + 7) // Draw a rectangle with one color
+#define LCD_DISPLAYCHAR_ID (LCD_ID + 8) // Display one character
+#define LCD_RECTREAD_ID (LCD_ID + 9) // Save a rectangle of the monitor RAM
+#define LCD_SETBACKLIGHT_ID (LCD_ID + 10) // Modify the PWM rate
+#define LCD_GETBACKLIGHT_ID (LCD_ID + 11) // Return the PWM rate
+#define LCD_SETROTATESCREEN_ID (LCD_ID + 12) // Enable/Disable screen rotation
+#define LCD_GETROTATESCREEN_ID (LCD_ID + 13) // Return screen rotation mode
+#define LCD_SETSCREENORIENTATION_ID (LCD_ID + 14) // Set screen orientation
+#define LCD_GETSCREENORIENTATION_ID (LCD_ID + 15) // Return screen orientation
+#define LCD_SETBACKLIGHT_OFF_ID (LCD_ID + 16) // Switch the LCD back light off.
+#define LCD_SETBACKLIGHT_ON_ID (LCD_ID + 17) // Switch the LCD back light on.
+
+// Prototypes
+#define LCD_SetRect_For_Cmd(a,b,c,d) ((tCircleFunc4)(Circle_API [LCD_SETRECTFORCMD_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d)) //void LCD_SetRect_For_Cmd ( s16 x, s16 y, s16 width, s16 height)
+#define LCD_GetPixel(a,b) (u16) (((tCircleFunc2)(Circle_API [LCD_GETPIXEL_ID])) ((u32)(a),(u32)(b))) //u16 LCD_GetPixel (u8 x, u8 y)
+#define LCD_DrawPixel(a,b,c) ((tCircleFunc3)(Circle_API [LCD_DRAWPIXEL_ID])) ((u32)(a),(u32)(b),(u32)(c)) //void LCD_SetPixel (u8 x, u8 y, u16 Pixel) ;
+#define LCD_SendLCDCmd(a) ((tCircleFunc1)(Circle_API [LCD_SENDLCDCMD_ID])) ((u32)(a)) //void LCD_SendLCDCmd(u8 Cmd);
+#define LCD_SendLCDData(a) ((tCircleFunc1)(Circle_API [LCD_SENDLCDDATA_ID])) ((u32)(a)) //void LCD_SendLCDData(u8 Data);
+#define LCD_ReadLCDData() (u32) (((tCircleFunc0)(Circle_API [LCD_READLCDDATA_ID])) ()) //u32 LCD_ReadLCDData(void);
+#define LCD_FillRect(a,b,c,d,e) ((tCircleFunc5)(Circle_API [LCD_FILLRECT_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d),(u32)(e)) //void LCD_FillRect ( u16 x, u16 y, u16 width, u16 height, u16 color );
+#define LCD_DrawRect(a,b,c,d,e) ((tCircleFunc5)(Circle_API [LCD_DRAWRECT_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d),(u32)(e)) //void LCD_DrawRect ( u16 x, u16 y, u16 width, u16 height, u16 color );
+#define LCD_DisplayChar(a,b,c,d,e,f) ((tCircleFunc6)(Circle_API [LCD_DISPLAYCHAR_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d),(u32)(e),(u32)(f)) //void LCD_DisplayChar(u8 x, u8 y, u8 Ascii, u16 TextColor, u16 BGndColor, u16 CharMagniCoeff);
+#define LCD_RectRead(a,b,c,d,e) ((tCircleFunc5)(Circle_API [LCD_RECTREAD_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d),(u32)(e)) //void LCD_RectRead ( u16 x, u16 y, u16 width, u16 height, u8* bmp );
+#define LCD_SetBackLight(a) ((tCircleFunc1)(Circle_API [LCD_SETBACKLIGHT_ID])) ((u32)(a)) //void LCD_SetBackLight(u32 newBaclightStart);
+#define LCD_GetBackLight() (u32) (((tCircleFunc0)(Circle_API [LCD_GETBACKLIGHT_ID])) ()) //u32 LCD_GetBackLight(void);
+#define LCD_SetRotateScreen(a) ((tCircleFunc1)(Circle_API [LCD_SETROTATESCREEN_ID])) ((u32)(a)) //void LCD_SetRotateScreen ( u8 RotateScreen)
+#define LCD_GetRotateScreen() (u32) (((tCircleFunc0)(Circle_API [LCD_GETROTATESCREEN_ID])) ()) //u8 LCD_GetRotateScreen (void)
+#define LCD_SetScreenOrientation(a) ((tCircleFunc1)(Circle_API [LCD_SETSCREENORIENTATION_ID])) ((u32)(a)) //void LCD_SetScreenOrientation (Rotate_H12_V_Match_TypeDef ScreenOrientation)
+#define LCD_GetScreenOrientation() (u32) (((tCircleFunc0)(Circle_API [LCD_GETSCREENORIENTATION_ID])) ()) //Rotate_H12_V_Match_TypeDef LCD_GetScreenOrientation (void)
+#define LCD_SetBackLightOff() ((tCircleFunc0)(Circle_API [LCD_SETBACKLIGHT_OFF_ID])) ()
+#define LCD_SetBackLightOn() ((tCircleFunc0)(Circle_API [LCD_SETBACKLIGHT_ON_ID])) ()
+
+/// @endcond
+
+//---------------------------------- DRAW ----------------------------------
+
+/// @cond Internal
+
+/* Exported defines ----------------------------------------------------------*/
+
+// DRAW functions definition
+#define DRAW_SETDEFAULTCOLOR_ID (DRAW_ID + 0) // Reset colors (bgnd + text)
+#define DRAW_CLEAR_ID (DRAW_ID + 1) // Clear the LCD display
+#define DRAW_SETIMAGE_ID (DRAW_ID + 2) // Draw a colored image
+#define DRAW_SETIMAGEBW_ID (DRAW_ID + 3) // Draw a black and white image
+#define DRAW_SETLOGOBW_ID (DRAW_ID + 4) // Draw logo
+#define DRAW_DISPLAYVBAT_ID (DRAW_ID + 5) // Display the voltage of battery in ascii
+#define DRAW_DISPLAYTIME_ID (DRAW_ID + 6) // Display time in ascii
+#define DRAW_DISPLAYSTRING_ID (DRAW_ID + 7) // Display a 17char max string of characters
+#define DRAW_DISPLAYSTRINGINVERTED_ID (DRAW_ID + 8) // Display a 17char max string of characters with inverted colors
+#define DRAW_GETCHARMAGNICOEFF_ID (DRAW_ID + 9) // Return the magnifying value for the characters
+#define DRAW_SETCHARMAGNICOEFF_ID (DRAW_ID + 10) // Set the magnifying value for the characters
+#define DRAW_GETTEXTCOLOR_ID (DRAW_ID + 11) // Return the current text color
+#define DRAW_SETTEXTCOLOR_ID (DRAW_ID + 12) // Set the current text color
+#define DRAW_GETBGNDCOLOR_ID (DRAW_ID + 13) // Return the current background color
+#define DRAW_SETBGNDCOLOR_ID (DRAW_ID + 14) // Set the current background color
+#define DRAW_LINE_ID (DRAW_ID + 15) // Draw a Line between (using Bresenham algorithm)
+
+//Prototypes
+#define DRAW_SetDefaultColor() ((tCircleFunc0)(Circle_API [DRAW_SETDEFAULTCOLOR_ID])) () //void DRAW_SetDefaultColor (void);
+#define DRAW_Clear() ((tCircleFunc0)(Circle_API [DRAW_CLEAR_ID])) () //void DRAW_Clear(void);
+#define DRAW_SetImage(a,b,c,d,e) ((tCircleFunc5)(Circle_API [DRAW_SETIMAGE_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d),(u32)(e)) //void DRAW_SetImage(const u16 *imageptr, u8 x, u8 y, u8 width, u8 height);
+#define DRAW_SetImageBW(a,b,c,d,e) ((tCircleFunc5)(Circle_API [DRAW_SETIMAGEBW_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d),(u32)(e)) //void DRAW_SetImageBW(const u8 *imageptr, u8 x, u8 y, u8 width, u8 height);
+#define DRAW_SetLogoBW() ((tCircleFunc0)(Circle_API [DRAW_SETLOGOBW_ID])) () //void DRAW_SetLogoBW(void);
+#define DRAW_DisplayVbat(a,b) ((tCircleFunc2)(Circle_API [DRAW_DISPLAYVBAT_ID])) ((u32)(a),(u32)(b)) //void DRAW_DisplayVbat(u8 x, u8 y);
+#define DRAW_DisplayTime(a,b) ((tCircleFunc2)(Circle_API [DRAW_DISPLAYTIME_ID])) ((u32)(a),(u32)(b)) //void DRAW_DisplayTime(u8 x, u8 y);
+#define DRAW_DisplayString(a,b,c,d) ((tCircleFunc4)(Circle_API [DRAW_DISPLAYSTRING_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d)) //void DRAW_DisplayString( u8 x, u8 y, u8 *ptr, u8 len );
+#define DRAW_DisplayStringInverted(a,b,c,d) ((tCircleFunc4)(Circle_API [DRAW_DISPLAYSTRINGINVERTED_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d)) //void DRAW_DisplayStringInverted( u8 x, u8 y, u8 *ptr, u8 len );
+#define DRAW_GetCharMagniCoeff() (u16) (((tCircleFunc0)(Circle_API [DRAW_GETCHARMAGNICOEFF_ID])) ()) //u16 DRAW_GetCharMagniCoeff(void);
+#define DRAW_SetCharMagniCoeff(a) ((tCircleFunc1)(Circle_API [DRAW_SETCHARMAGNICOEFF_ID])) ((u32)(a)) //void DRAW_SetCharMagniCoeff(u16 Coeff);
+#define DRAW_GetTextColor() (u16) (((tCircleFunc0)(Circle_API [DRAW_GETTEXTCOLOR_ID])) ()) //u16 DRAW_GetTextColor(void);
+#define DRAW_SetTextColor(a) ((tCircleFunc1)(Circle_API [DRAW_SETTEXTCOLOR_ID])) ((u32)(a)) //void DRAW_SetTextColor(u16 Color);
+#define DRAW_GetBGndColor() (u16) (((tCircleFunc0)(Circle_API [DRAW_GETBGNDCOLOR_ID])) ()) //u16 DRAW_GetBGndColor(void);
+#define DRAW_SetBGndColor(a) ((tCircleFunc1)(Circle_API [DRAW_SETBGNDCOLOR_ID])) ((u32)(a)) //void DRAW_SetBGndColor(u16 Color);
+#define DRAW_Line(a,b,c,d,e) ((tCircleFunc5)(Circle_API [DRAW_LINE_ID])) ((u32)(a),(u32)(b),(u32)(c),(u32)(d),(u32)(e)) //void DRAW_Line(s16 x1, s16 y1, s16 x2, s16 y2, u16 color );
+/// @endcond
+
+//-------------------------------- BUZZER -----------------------------------
+
+/* Exported type def ---------------------------------------------------------*/
+
+/**
+* @enum BUZZER_mode
+* @brief CircleOS buzzer modes.
+*
+* Without the undefined mode, the CircleOS provides 5 modes for its buzzer.
+**/
+enum BUZZER_mode
+ {
+ BUZZER_UNDEF = -1, /*!< undefined mode for buzzer */
+ BUZZER_OFF = 0, /*!< The buzzer is put off. */
+ BUZZER_ON = 1, /*!< The buzzer is put on. */
+ BUZZER_SHORTBEEP = 2, /*!< Make buzzer to bip for a short time */
+ BUZZER_LONGBEEP = 3, /*!< Make buzzer to bip for a long time */
+ BUZZER_PLAYMUSIC = 4 /*!< Make buzzer to play a music */
+ };
+
+/// @cond Internal
+
+/* Exported defines ----------------------------------------------------------*/
+#define BUZZER_BEEP BUZZER_SHORTBEEP
+
+// BUZZER functions definition
+#define BUZZER_SETMODE_ID (BUZZER_ID + 0) // Set new buzzer mode
+#define BUZZER_GETMODE_ID (BUZZER_ID + 1) // Get the current buzzer mode.
+#define BUZZER_PLAY_MUSIC_ID (BUZZER_ID + 2) // Plays the provided melody that follows the RTTTL Format.
+
+// Prototypes
+#define BUZZER_SetMode(a) ((tCircleFunc1)(Circle_API [BUZZER_SETMODE_ID])) ((u32)(a)) //void BUZZER_SetMode( enum BUZZER_mode mode);
+#define BUZZER_GetMode() (enum BUZZER_mode) (((tCircleFunc0)(Circle_API [BUZZER_GETMODE_ID])) ()) //enum BUZZER_mode BUZZER_GetMode( void );
+#define BUZZER_PlayMusic(a) ((tCircleFunc1)(Circle_API [BUZZER_PLAY_MUSIC_ID])) ((u32)(a)) //void BUZZER_PlayMusic (const u8 *melody );
+
+/// @endcond
+
+//--------------------------------- MENU -----------------------------------
+
+/* Exported defines ----------------------------------------------------------*/
+#define REMOVE_MENU 0x01 /*!< Menu flag: remove menu when item selected. */
+#define APP_MENU 0x02 /*!< Menu flag: item is an application. */
+#define MENU_MAXITEM 8 /*!< Maximum number of item in a menu. */
+
+/* Exported type def ---------------------------------------------------------*/
+
+/**
+* @struct tMenuItem
+* @brief Menu item description.
+**/
+typedef struct
+ {
+ const char* Text; /*!< Name of Item displayed in menu */
+ enum MENU_code (*Fct_Init) ( void ); /*!< First function launched if item is selected. */
+ enum MENU_code (*Fct_Manage)( void ); /*!< Second function launched after a "return MENU_CONTINU_COMMAND" in the first function */
+ int fRemoveMenu; /*!< Flag to know if remove menu at end */
+ } tMenuItem;
+
+/**
+* @struct tMenu
+* @brief Menu description.
+**/
+typedef struct
+ {
+ unsigned fdispTitle: 1; /*!< Display title is set. */
+ const char* Title; /*!< Menu title. */
+ int NbItems; /*!< Number of items in the menu ( must be <= MENU_MAXITEM ) */
+ int LgMax; /*!< Unused. */
+ int XPos; /*!< X position of menu bottom-left corner. */
+ int YPos; /*!< Y position of menu bottom-left corner. */
+ int XSize; /*!< Unused. */
+ int YSize; /*!< Unused. */
+ unsigned int SelectedItem; /*!< ID of selected item (0 for first item, 1 for second item, ...) */
+ tMenuItem Items[MENU_MAXITEM]; /*!< Items of menu. */
+ } tMenu;
+
+/**
+* @enum MENU_code
+* @brief Application return values.
+*
+* List of all the codes available for CircleOS application return values.
+**/
+enum MENU_code
+ {
+ MENU_LEAVE = 0, /*!< Leave application. */
+ MENU_CONTINUE = 1, /*!< Continue application. */
+ MENU_REFRESH = 2, /*!< Refresh current menu. */
+ MENU_CHANGE = 3, /*!< Change current menu. */
+ MENU_CONTINUE_COMMAND = 4 /*!< Sent by Ini functions.*/
+ };
+
+/// @cond Internal
+
+/* Exported defines ----------------------------------------------------------*/
+
+// MENU functions definition
+#define MENU_SET_ID (MENU_ID + 0) // Display a menu
+#define MENU_REMOVE_ID (MENU_ID + 1) // Remove the current menu, DRAW_Clear and set pointer mode to "POINTER_ON".
+#define MENU_QUESTION_ID (MENU_ID + 2) // Dedicated menu for ask question and yes/no responses
+#define MENU_PRINT_ID (MENU_ID + 3) // Display a popup menu with a string.
+#define MENU_CLEAR_CURRENT_COMMAND_ID (MENU_ID + 4) // Set CurrentCommand to 0
+#define MENU_SET_LEVELTITLE_ID (MENU_ID + 5) // Set the title of level menu managed by MENU_SetLevel_Mgr.
+#define MENU_SET_TEXTCOLOR_ID (MENU_ID + 6) // Set the color used for text menu.
+#define MENU_GET_TEXTCOLOR_ID (MENU_ID + 7) // Return the color used for text menu.
+#define MENU_SET_BGNDCOLOR_ID (MENU_ID + 8) // Set the background color used for menu.
+#define MENU_GET_BGNDCOLOR_ID (MENU_ID + 9) // Return the background color used for menu.
+#define MENU_QUIT_ID (MENU_ID + 10) // Leave the current menu (stand for "cancel" and do a DRAW_Clear)
+#define MENU_SET_LEVELINI_ID (MENU_ID + 11) // Initialise a generic function to set a avalue in the range of [0,4]
+#define MENU_CLEAR_CURRENT_MENU_ID (MENU_ID + 12) // Set CurrentMenu to 0
+#define MENU_SET_LEVEL_MGR_ID (MENU_ID + 13) // Generic function to set a avalue in the range of [0,4] (handling of the control)
+
+// Prototypes
+#define MENU_Set(a) ((tCircleFunc1)(Circle_API [MENU_SET_ID])) ((u32)(a)) //void MENU_Set ( tMenu *mptr );
+#define MENU_Remove() ((tCircleFunc0)(Circle_API [MENU_REMOVE_ID])) () //void MENU_Remove ( void ) ;
+#define MENU_Question(a,b) ((tCircleFunc2)(Circle_API [MENU_QUESTION_ID])) ((u32)(a),(u32)(b)) //void MENU_Question ( char *str, int *answer );
+#define MENU_Print(a) ((tCircleFunc1)(Circle_API [MENU_PRINT_ID])) ((u32)(a)) //void MENU_Print ( char *str );
+#define MENU_ClearCurrentCommand() ((tCircleFunc0)(Circle_API [MENU_CLEAR_CURRENT_COMMAND_ID])) () //void MENU_ClearCurrentCommand(void)
+#define MENU_SetLevelTitle(a) ((tCircleFunc1)(Circle_API [MENU_SET_LEVELTITLE_ID])) ((u32)(a)) //void MENU_SetLevelTitle(u8* title)
+#define MENU_SetTextColor(a) ((tCircleFunc1)(Circle_API [MENU_SET_TEXTCOLOR_ID])) ((u32)(a)) //void MENU_SetTextColor ( int TextColor )
+#define MENU_GetTextColor() (u32) (((tCircleFunc0)(Circle_API [MENU_GET_TEXTCOLOR_ID])) ()) //int MENU_GetTextColor ( void )
+#define MENU_SetBGndColor(a) ((tCircleFunc1)(Circle_API [MENU_SET_BGNDCOLOR_ID])) ((u32)(a)) //void MENU_SetBGndColor ( int BGndColor )
+#define MENU_GetBGndColor() (u32) (((tCircleFunc0)(Circle_API [MENU_GET_BGNDCOLOR_ID])) ()) //int MENU_GetBGndColor ( void )
+#define MENU_Quit() (enum MENU_code) (((tCircleFunc0)(Circle_API [MENU_QUIT_ID])) ()) //enum MENU_code MENU_Quit ( void )
+#define MENU_SetLevel_Ini() (enum MENU_code) (((tCircleFunc0)(Circle_API [MENU_SET_LEVELINI_ID])) ()) //enum MENU_code MENU_SetLevel_Ini ( void )
+#define MENU_ClearCurrentMenu() ((tCircleFunc0)(Circle_API [MENU_CLEAR_CURRENT_MENU_ID])) () //void MENU_ClearCurrentMenu(void)
+#define MENU_SetLevel_Mgr(a,b) (enum MENU_code) ((tCircleFunc2)(Circle_API [MENU_SET_LEVEL_MGR_ID])) ((u32)(a),(u32)(b)) //enum MENU_code MENU_SetLevel_Mgr ( u32 *value, u32 value_range [] )
+
+/// @endcond
+
+//---------------------------------- LED -------------------------------------
+
+/* Exported types ------------------------------------------------------------*/
+
+/**
+* @enum LED_mode
+* @brief LED modes.
+*
+* LEDs may be on, off or blinking slowly or fastly!
+**/
+enum LED_mode
+ {
+ LED_UNDEF = -1, /*!< Undefined led mode. */
+ LED_OFF = 0, /*!< Put off the led. */
+ LED_ON = 1, /*!< Put on the led. */
+ LED_BLINKING_LF = 2, /*!< Slow blinking led mode. */
+ LED_BLINKING_HF = 3 /*!< Fast blinking led mode. */
+ };
+
+/**
+* @enum LED_id
+* @brief Available LEDs.
+*
+* List of all the available LEDs.
+**/
+enum LED_id
+ {
+ LED_GREEN = 0, /*!< Green led id. */
+ LED_RED = 1 /*!< Red led id. */
+ };
+
+/// @cond Internal
+
+/* Exported defines ----------------------------------------------------------*/
+
+// LED functions definition
+#define LED_SET_ID (LED_ID + 0) // Set a specified LED in a specified mode.
+
+// Prototypes
+#define LED_Set(a,b) ((tCircleFunc2)(Circle_API [LED_SET_ID])) ((u32)(a),(u32)(b)) //void LED_Set ( enum LED_id id, enum LED_mode mode ) //void LED_Set ( enum LED_id id, enum LED_mode mode );
+
+/// @endcond
+
+//-------------------------------- RTC --------------------------------------
+
+/* Exported defines ----------------------------------------------------------*/
+
+// Backup registers
+#define BKP_SYS1 1 /*!< Backup register reserved for OS */
+#define BKP_SYS2 2 /*!< Backup register reserved for OS */
+#define BKP_SYS3 3 /*!< Backup register reserved for OS */
+#define BKP_SYS4 4 /*!< Backup register reserved for OS */
+#define BKP_SYS5 5 /*!< Backup register reserved for OS */
+#define BKP_SYS6 6 /*!< Backup register reserved for OS */
+
+#define BKP_USER1 7 /*!< Backup available for users application */
+#define BKP_USER2 8 /*!< Backup available for users application */
+#define BKP_USER3 9 /*!< Backup available for users application */
+#define BKP_USER4 10 /*!< Backup available for users application */
+
+/// @cond Internal
+
+//RTC functions definition
+#define RTC_SET_TIME_ID (RTC_ID + 0) // Set current time.
+#define RTC_GET_TIME_ID (RTC_ID + 1) // Return current time.
+#define RTC_DISPLAY_TIME_ID (RTC_ID + 2) // Display current time on the 6th line at column 0.
+
+// Prototypes
+#define RTC_SetTime(a,b,c) ((tCircleFunc3)(Circle_API [RTC_SET_TIME_ID])) ((u32)(a),(u32)(b),(u32)(c)) //void RTC_SetTime (u32 THH, u32 TMM, u32 TSS);
+#define RTC_GetTime(a,b,c) ((tCircleFunc3)(Circle_API [RTC_GET_TIME_ID])) ((u32)(a),(u32)(b),(u32)(c)) //void RTC_GetTime (u32 * THH, u32 * TMM, u32 * TSS);
+#define RTC_DisplayTime() ((tCircleFunc0)(Circle_API [RTC_DISPLAY_TIME_ID])) () //void RTC_DisplayTime ( void );
+
+/// @endcond
+
+//--------------------------------- Application -------------------------------
+typedef void (*tAppPtrMgr) ( int , int );
+
+#endif /*__CIRCLE_API_H */
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/crt0_STM32x.c b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/crt0_STM32x.c
new file mode 100644
index 000000000..6dfbb2de1
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/crt0_STM32x.c
@@ -0,0 +1,217 @@
+/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
+* File Name : stm32f10x_vector.c
+* Author : MCD Tools Team
+* Date First Issued : 05/14/2007
+* Description : This file contains the vector table for STM32F10x.
+* After Reset the Cortex-M3 processor is in Thread mode,
+* priority is Privileged, and the Stack is set to Main.
+********************************************************************************
+* History:
+* 05/14/2007: V0.2
+*
+********************************************************************************
+* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
+* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
+* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
+* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
+* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+*******************************************************************************/
+
+/* Includes ----------------------------------------------------------------------*/
+
+void NMIException(void);
+void HardFaultException(void);
+void MemManageException(void);
+void BusFaultException(void);
+void UsageFaultException(void);
+void DebugMonitor(void);
+void SVCHandler(void);
+void PendSVC(void);
+void SysTickHandler(void);
+void WWDG_IRQHandler(void);
+void PVD_IRQHandler(void);
+void TAMPER_IRQHandler(void);
+void RTC_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void EXTI0_IRQHandler(void);
+void EXTI1_IRQHandler(void);
+void EXTI2_IRQHandler(void);
+void EXTI3_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void DMAChannel1_IRQHandler(void);
+void DMAChannel2_IRQHandler(void);
+void DMAChannel3_IRQHandler(void);
+void DMAChannel4_IRQHandler(void);
+void DMAChannel5_IRQHandler(void);
+void DMAChannel6_IRQHandler(void);
+void DMAChannel7_IRQHandler(void);
+void ADC_IRQHandler(void);
+void USB_HP_CAN_TX_IRQHandler(void);
+void USB_LP_CAN_RX0_IRQHandler(void);
+void CAN_RX1_IRQHandler(void);
+void CAN_SCE_IRQHandler(void);
+void EXTI9_5_IRQHandler(void);
+void TIM1_BRK_IRQHandler(void);
+void TIM1_UP_IRQHandler(void);
+void TIM1_TRG_COM_IRQHandler(void);
+void TIM1_CC_IRQHandler(void);
+void TIM2_IRQHandler(void);
+void TIM3_IRQHandler(void);
+void TIM4_IRQHandler(void);
+void I2C1_EV_IRQHandler(void);
+void I2C1_ER_IRQHandler(void);
+void I2C2_EV_IRQHandler(void);
+void I2C2_ER_IRQHandler(void);
+void SPI1_IRQHandler(void);
+void SPI2_IRQHandler(void);
+void USART1_IRQHandler(void);
+void USART2_IRQHandler(void);
+void USART3_IRQHandler(void);
+void EXTI15_10_IRQHandler(void);
+void RTCAlarm_IRQHandler(void);
+void USBWakeUp_IRQHandler(void);
+
+
+/* Exported types --------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+extern unsigned long _etext;
+extern unsigned long _sidata; /* start address for the initialization values of the .data section. defined in linker script */
+extern unsigned long _sdata; /* start address for the .data section. defined in linker script */
+extern unsigned long _edata; /* end address for the .data section. defined in linker script */
+
+extern unsigned long _sbss; /* start address for the .bss section. defined in linker script */
+extern unsigned long _ebss; /* end address for the .bss section. defined in linker script */
+
+extern void _estack; /* init value for the stack pointer. defined in linker script */
+
+
+
+/* Private typedef -----------------------------------------------------------*/
+/* function prototypes ------------------------------------------------------*/
+void Reset_Handler(void) __attribute__((__interrupt__));
+extern int main(void);
+extern void xPortPendSVHandler(void);
+extern void xPortSysTickHandler(void);
+extern void vTimer2IntHandler( void );
+
+
+/******************************************************************************
+*
+* The minimal vector table for a Cortex M3. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+******************************************************************************/
+
+
+__attribute__ ((section(".isr_vector")))
+void (* const g_pfnVectors[])(void) =
+{
+ &_estack, // The initial stack pointer
+ Reset_Handler, // The reset handler
+ NMIException,
+ HardFaultException,
+ MemManageException,
+ BusFaultException,
+ UsageFaultException,
+ 0, 0, 0, 0, /* Reserved */
+ SVCHandler,
+ DebugMonitor,
+ 0, /* Reserved */
+ xPortPendSVHandler,
+ xPortSysTickHandler,
+ WWDG_IRQHandler,
+ PVD_IRQHandler,
+ TAMPER_IRQHandler,
+ RTC_IRQHandler,
+ FLASH_IRQHandler,
+ RCC_IRQHandler,
+ EXTI0_IRQHandler,
+ EXTI1_IRQHandler,
+ EXTI2_IRQHandler,
+ EXTI3_IRQHandler,
+ EXTI4_IRQHandler,
+ DMAChannel1_IRQHandler,
+ DMAChannel2_IRQHandler,
+ DMAChannel3_IRQHandler,
+ DMAChannel4_IRQHandler,
+ DMAChannel5_IRQHandler,
+ DMAChannel6_IRQHandler,
+ DMAChannel7_IRQHandler,
+ ADC_IRQHandler,
+ USB_HP_CAN_TX_IRQHandler,
+ USB_LP_CAN_RX0_IRQHandler,
+ CAN_RX1_IRQHandler,
+ CAN_SCE_IRQHandler,
+ EXTI9_5_IRQHandler,
+ TIM1_BRK_IRQHandler,
+ TIM1_UP_IRQHandler,
+ TIM1_TRG_COM_IRQHandler,
+ TIM1_CC_IRQHandler,
+ vTimer2IntHandler,
+ TIM3_IRQHandler,
+ TIM4_IRQHandler,
+ I2C1_EV_IRQHandler,
+ I2C1_ER_IRQHandler,
+ I2C2_EV_IRQHandler,
+ I2C2_ER_IRQHandler,
+ SPI1_IRQHandler,
+ SPI2_IRQHandler,
+ USART1_IRQHandler,
+ USART2_IRQHandler,
+ USART3_IRQHandler,
+ EXTI15_10_IRQHandler,
+ RTCAlarm_IRQHandler,
+ USBWakeUp_IRQHandler,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ (unsigned long)0xF108F85F //this is a workaround for boot in RAM mode.
+};
+
+/*******************************************************************************
+* Function Name : Reset_Handler
+* Description : This is the code that gets called when the processor first starts execution
+* following a reset event. Only the absolutely necessary set is performed,
+* after which the application supplied main() routine is called.
+* Input :
+* Output :
+* Return :
+*******************************************************************************/
+void Reset_Handler(void)
+{
+ unsigned long *pulSrc, *pulDest;
+
+ //
+ // Copy the data segment initializers from flash to SRAM.
+ //
+ pulSrc = &_sidata;
+ for(pulDest = &_sdata; pulDest < &_edata; )
+ {
+ *(pulDest++) = *(pulSrc++);
+ }
+
+ //
+ // Zero fill the bss segment.
+ //
+ for(pulDest = &_sbss; pulDest < &_ebss; )
+ {
+ *(pulDest++) = 0;
+ }
+
+ //
+ // Call the application's entry point.
+ //
+ main();
+}
+
+
+/********************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
+
+
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/draw.c b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/draw.c
new file mode 100644
index 000000000..17b5f51aa
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/draw.c
@@ -0,0 +1,545 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
+/**
+*
+* @file draw.c
+* @brief Various utilities for drawings (characters, ..)
+* @author FL
+* @author IB
+* @date 07/2007
+*
+**/
+/******************************************************************************/
+
+/* Includes ------------------------------------------------------------------*/
+#include "circle.h"
+
+/// @cond Internal
+
+/* Private define ------------------------------------------------------------*/
+#define V9_MADCTRVAL 0x90
+#define V12_MADCTRVAL 0x30
+#define V3_MADCTRVAL 0x50
+#define V6_MADCTRVAL 0xF0
+
+#define ROTATE_DIVISER 500
+
+/* Private variables ---------------------------------------------------------*/
+
+static u16 CharMagniCoeff = 1; /*!< Current character magnify coefficient. */
+static u16 BGndColor; /*!< Current background color. */
+static u16 TextColor; /*!< Current text color. */
+
+int fDisplayTime = 0;
+u16 BatState;
+u16 OldBatState;
+u32 OldTHH;
+u32 OldTMM;
+u32 OldTSS;
+u32 OldTemp; //FL071107
+u16 xBat;
+u16 yBat;
+u16 widthBat;
+u16 heightBat;
+u8 UsbState,OldUsbState;
+static int divider_coord = 0;
+
+// Screen orientation management
+int rotate_counter = 0;
+Rotate_H12_V_Match_TypeDef previous_H12 = V9;
+Rotate_H12_V_Match_TypeDef previous_previous_H12 = V9;
+Rotate_H12_V_Match_TypeDef H12;
+Rotate_H12_V_Match_TypeDef CurrentScreenOrientation;
+int CurrentRotateScreen = 1;
+
+extern s16 XInit;
+extern s16 YInit;
+
+/* Private functions ---------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* vbattoa
+*
+*******************************************************************************/
+/**
+*
+* This function convert an u16 in ascii radix 10
+*
+* @param[out] ptr A pointer to a string where the converted value will be put.
+* @param[in] X The value to convert.
+*
+* @see DRAW_DisplayVbat
+*
+**/
+/******************************************************************************/
+static void vbattoa( char* ptr, u16 X )
+ {
+ u8 c;
+ u16 r = 0;
+
+ // 1 000 digit
+ c = ((X-r)/1000);
+ r = r + (c*1000);
+ *ptr++ = c + 0x30;
+
+ // dot
+ *ptr++ = '.';
+
+ // 100 digit
+ c = ((X-r)/100);
+ r = r + (c*100);
+ *ptr++ = c + 0x30;
+
+ // 10 digit
+ c = ((X-r)/10);
+ r = r + (c*10);
+ *ptr++ = c + 0x30;
+
+ // Volt
+ *ptr++ = 'V';
+ *ptr++ = 0;
+ }
+
+/*******************************************************************************
+*
+* DRAW_DisplayStringWithMode
+*
+*******************************************************************************/
+/**
+*
+* This function is used to display a 17char max string of
+* characters on the LCD display on the selected line.
+* Note:
+* this function is the user interface to use the LCD driver.
+*
+* @param[in] x The horizontal screen coordinate where to draw the string.
+* @param[in] y The vertical screen coordinate where to draw the string.
+* @param[in] ptr Pointer to string to display.
+* @param[in] len String size.
+* @param[in] mode Display mode: 0 normal, 1 inverted colors.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+* @see DRAW_DisplayString
+* @see DRAW_DisplayStringInverted
+*
+**/
+/******************************************************************************/
+static void DRAW_DisplayStringWithMode( u8 x, u8 y, const u8* ptr, u8 len, int mode )
+ {
+ u8 ref_x = x, i = 0;
+
+ /* Send the string character by character on LCD */
+ while ((*ptr!=0)&&(i<18))
+ {
+ /* Display one character on LCD */
+ LCD_DisplayChar( ref_x, y, *ptr, mode ? BGndColor : TextColor, mode ? TextColor : BGndColor, CharMagniCoeff );
+
+ /* Increment the column position by 7 */
+ ref_x+= (7*CharMagniCoeff);
+
+ /* Point on the next character */
+ ptr++;
+
+ /* Increment the character counter */
+ i++;
+ /* If we reach the maximum Line character */
+ }
+
+ while ( i < len )
+ {
+ /* Display one character on LCD */
+ LCD_DisplayChar( ref_x, y, ' ', mode ? BGndColor : TextColor, mode ? TextColor : BGndColor, CharMagniCoeff );
+
+ /* Increment the column position by 7 */
+ ref_x += ( 7 * CharMagniCoeff );
+
+ /* Increment the character counter */
+ i++;
+ }
+ }
+
+/* Public functions for CircleOS ---------------------------------------------*/
+
+/*******************************************************************************
+*
+* DRAW_Init
+*
+*******************************************************************************/
+/**
+*
+* Initialize GUI drawing. Called at CircleOS startup.
+*
+* @attention This function must NOT be called by the user.
+*
+**/
+/******************************************************************************/
+void DRAW_Init( void )
+ {
+ LCD_Init();
+#ifdef _MEMS
+ MEMS_GetRotation( &CurrentScreenOrientation );
+#endif
+ LCD_SetScreenOrientation( CurrentScreenOrientation );
+
+ xBat = 98;
+ yBat = 3;
+ OldBatState = 10;
+ OldTSS = 100;
+ OldTMM = 100;
+ OldTHH = 100;
+ OldTemp = -1;
+
+ // Clear LCD and draw black and white logo
+ DRAW_SetDefaultColor();
+ LCD_FillRect( 0, 0, CHIP_SCREEN_WIDTH, CHIP_SCREEN_HEIGHT, BGndColor );
+// POINTER_Init();
+ }
+
+
+
+
+/* Public functions ----------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* DRAW_SetCharMagniCoeff
+*
+*******************************************************************************/
+/**
+*
+* Set the magnifying value for the characters (should be 1 or 2)
+*
+* @param[in] Coeff The new magnifying coefficent.
+*
+**/
+/******************************************************************************/
+void DRAW_SetCharMagniCoeff( u16 Coeff )
+ {
+ CharMagniCoeff = Coeff;
+ }
+
+ /******************************************************************************
+*
+* DRAW_GetCharMagniCoeff
+*
+*******************************************************************************/
+/**
+*
+* Return the current magnifying value for the characters
+*
+* @return Current magnifying value.
+*
+**/
+/******************************************************************************/
+u16 DRAW_GetCharMagniCoeff( void )
+ {
+ return CharMagniCoeff;
+ }
+
+ /******************************************************************************
+*
+* DRAW_GetTextColor
+*
+*******************************************************************************/
+/**
+*
+* Return current text color.
+*
+* @return The current RGB color used to draw text.
+*
+**/
+/******************************************************************************/
+u16 DRAW_GetTextColor( void )
+ {
+ return TextColor;
+ }
+
+/*******************************************************************************
+*
+* DRAW_SetTextColor
+*
+*******************************************************************************/
+/**
+*
+* Set current text color.
+*
+* @param[in] Color The new RGB color used when drawing text.
+*
+**/
+/******************************************************************************/
+void DRAW_SetTextColor( u16 Color )
+ {
+ TextColor = Color ;
+ }
+
+/*******************************************************************************
+*
+* DRAW_GetBGndColor
+*
+*******************************************************************************/
+/**
+*
+* Return current background color.
+*
+* @return The current RGB color used for the background.
+*
+**/
+/******************************************************************************/
+u16 DRAW_GetBGndColor( void )
+ {
+ return BGndColor;
+ }
+
+/*******************************************************************************
+*
+* DRAW_SetBGndColor
+*
+*******************************************************************************/
+/**
+*
+* Set current background color
+*
+* @param[in] Color The new RGB color for background.
+*
+**/
+/******************************************************************************/
+void DRAW_SetBGndColor(u16 Color)
+ {
+ BGndColor = Color;
+ }
+
+
+/*******************************************************************************
+*
+* DRAW_SetImage
+*
+*******************************************************************************/
+/**
+*
+* The provided bitmap is made width * height 2 byte words. Each 2 byte word contains
+* the RGB color of a pixel.
+*
+* @brief Draw a color bitmap at the provided coordinates.
+* @param[in] imageptr A pointer to an array of width * height 2 byte words.
+* @param[in] x The horizontal coordinate of the low left corner of the bitmap.
+* @param[in] y The vertical coordinate of the low left corner of the bitmap.
+* @param[in] width The bitmap width.
+* @param[in] height The bitmap height.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void DRAW_SetImage( const u16* imageptr, u8 x, u8 y, u8 width, u8 height )
+ {
+ int i;
+
+ // Select screen area to access.
+ LCD_SetRect_For_Cmd( x, y, width, height );
+
+ // Send command to write data on the LCD screen.
+ LCD_SendLCDCmd(ST7637_RAMWR);
+
+ for( i = 0; i < ( width * height ); i++ )
+ {
+ LCD_SendLCDData( imageptr[ i ] & 0xff );
+ LCD_SendLCDData( ( imageptr[ i ] >> 8 ) & 0xff );
+ }
+ }
+
+
+
+/*******************************************************************************
+*
+* DRAW_DisplayString
+*
+*******************************************************************************/
+/**
+*
+* This function is used to display a 17 character max string of
+* characters on the LCD display at the provided coordinates.
+*
+* @param[in] x The horizontal coordinate of the displayed string.
+* @param[in] y The vertical coordinate of the display string.
+* @param[in] *ptr Pointer to the string to display on LCD.
+* @param[in] len String length.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void DRAW_DisplayString( u8 x, u8 y, const u8* ptr, u8 len )
+ {
+ DRAW_DisplayStringWithMode( x, y, ptr, len, 0 );
+ }
+
+/*******************************************************************************
+*
+* DRAW_DisplayStringInverted
+*
+*******************************************************************************/
+/**
+*
+* This function is used to display a 17 character max string of
+* characters on the LCD display at the provided coordinates with inverted colors.
+*
+* @param[in] x The horizontal coordinate of the displayed string.
+* @param[in] y The vertical coordinate of the display string.
+* @param[in] *ptr Pointer to the string to display on LCD.
+* @param[in] len String length.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void DRAW_DisplayStringInverted( u8 x, u8 y, const u8* ptr, u8 len )
+ {
+ //BackGround and Text Colors are inverted
+ DRAW_DisplayStringWithMode( x, y, ptr, len, 1 );
+ }
+
+/*******************************************************************************
+*
+* DRAW_SetDefaultColor
+*
+*******************************************************************************/
+/**
+*
+* Reset text and background colors to their default values.
+*
+**/
+/******************************************************************************/
+void DRAW_SetDefaultColor (void)
+ {
+ BGndColor = RGB_WHITE;
+ TextColor = RGB_BLACK;
+ }
+
+/*******************************************************************************
+*
+* DRAW_DisplayTemp
+*
+*******************************************************************************/
+/**
+*
+* This function is used to display the current temperature in ascii.
+* The choice between Celcius and Fahrenheit is fixed by UTIL_SetModeTemp()
+*
+* @param[in] x The horizontal coordinate of the displayed string.
+* @param[in] y The vertical coordinate of the display string.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void DRAW_DisplayTemp( u8 x, u8 y )
+ {
+ u32 Temp = 0;
+ u8 TextBuffer[5] = { 0,0,0,0,0};
+
+ // Get Time
+ Temp = UTIL_GetTemp() ;
+
+ if( Temp != OldTemp )
+ {
+ // Display C (if modified).
+ UTIL_uint2str( TextBuffer, Temp/10, 2, 1 );
+ TextBuffer[ 2 ] = '.';
+ DRAW_DisplayString( x + ( 0 * CharMagniCoeff * 7 ), y, TextBuffer, 3 );
+
+ // Display C/10 (if modified).
+ UTIL_uint2str( TextBuffer, Temp%10, 1, 1 );
+ TextBuffer[ 1 ] = fTemperatureInFahrenheit ? 'F' : 'C'; TextBuffer[ 2 ] = 0;
+ DRAW_DisplayString( x + ( 3 * CharMagniCoeff * 7 ), y, TextBuffer, 2 );
+ }
+ OldTemp = Temp;
+ }
+
+/*******************************************************************************
+*
+* DRAW_Line
+*
+*******************************************************************************/
+/**
+* Draw a line on the LCD screen. Optimized for horizontal/vertical lines,
+* and use the Bresenham algorithm for other cases.
+*
+* @param[in] x1 The x-coordinate of the first line endpoint.
+* @param[in] x2 The x-coordinate of the second line endpoint.
+* @param[in] y1 The y-coordinate of the first line endpoint.
+* @param[in] y2 The y-coordinate of the second line endpoint.
+* @param[in] color The line color.
+*
+**/
+void DRAW_Line (s16 x1, s16 y1, s16 x2, s16 y2, u16 color )
+ {
+ int i,dx,dy,sdx,sdy,dxabs,dyabs,x,y,px,py;
+
+ #define abs(X) ( ( (X) < 0 ) ? -(X) : (X) )
+ #define sgn(X) ( ( (X) < 0 ) ? -1 : 1 )
+
+ if ( x1==x2 ) //Vertical Line
+ {
+ if ( y1 > y2 ) //We assume y2>y1 and invert if not
+ {
+ i = y2;
+ y2 = y1;
+ y1 = i;
+ }
+ LCD_FillRect( x1, y1, 1, y2-y1+1, color );
+ return;
+ }
+ else if ( y1==y2 ) //Horizontal Line
+ {
+ if ( x1 > x2 ) //We assume x2>x1 and we swap them if not
+ {
+ i = x2;
+ x2 = x1;
+ x1 = i;
+ }
+ LCD_FillRect( x1, y1, x2-x1+1, 1, color );
+ return;
+ }
+
+ dx=x2-x1; /* the horizontal distance of the line */
+ dy=y2-y1; /* the vertical distance of the line */
+ dxabs=abs(dx);
+ dyabs=abs(dy);
+ sdx=sgn(dx);
+ sdy=sgn(dy);
+ x=dyabs>>1;
+ y=dxabs>>1;
+ px=x1;
+ py=y1;
+
+ if (dxabs>=dyabs) /* the line is more horizontal than vertical */
+ {
+ for(i=0;i=dxabs)
+ {
+ y-=dxabs;
+ py+=sdy;
+ }
+ px+=sdx;
+ LCD_DrawPixel(px,py,color);
+ }
+ }
+ else /* the line is more vertical than horizontal */
+ {
+ for(i=0;i=dyabs)
+ {
+ x-=dyabs;
+ px+=sdx;
+ }
+ py+=sdy;
+ LCD_DrawPixel(px,py,color);
+ }
+ }
+ }
+
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/lcd.c b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/lcd.c
new file mode 100644
index 000000000..0f39b47cf
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/lcd.c
@@ -0,0 +1,1189 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
+/**
+*
+* @file lcd.c
+* @brief The LCD driver for the ST7637.
+* @author FL
+* @date 07/2007
+*
+**/
+/******************************************************************************/
+
+/* Includes ------------------------------------------------------------------*/
+#include "lcd.h"
+#include "circle.h"
+
+/// @cond Internal
+
+/* Private define ------------------------------------------------------------*/
+#define V9_MADCTRVAL 0x90 /*!< Left orientation value. */
+#define V12_MADCTRVAL 0x30 /*!< Up orientation value. */
+#define V3_MADCTRVAL 0x50 /*!< Right orientation value. */
+#define V6_MADCTRVAL 0xF0 /*!< Bottom orientation value. */
+#define BACKLIGHT_DIVIDER 500 /*!< LCD handler step. */
+
+/* Private variables ---------------------------------------------------------*/
+
+// vars for timer dedicated for lcd backlight
+static TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
+static TIM_OCInitTypeDef TIM_OCInitStructure;
+static int HandlerDivider = 0;
+
+int Current_CCR_BackLightStart = DEFAULT_CCR_BACKLIGHTSTART;
+
+/* External variable ---------------------------------------------------------*/
+extern GPIO_InitTypeDef GPIO_InitStructure;
+extern u16 CCR_BackLight_Tab[5];
+extern int CurrentRotateScreen;
+extern Rotate_H12_V_Match_TypeDef CurrentScreenOrientation;
+
+/*! ASCII Table. Each character is 7 column (7dots large) on two pages (16dots high)
+ 7 column character: Two 8 bit data to display one column*/
+static const u8 AsciiDotsTable[95 * 14 ] = {
+ /* ASCII 32 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /* ASCII 33 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x13,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,
+ /* ASCII 34 */ 0x00,0x00,0x00,0xe0,0x00,0x20,0x00,0x00,0x00,0xe0,0x00,0x20,0x00,0x00,
+ /* ASCII 35 */ 0x00,0x00,0x35,0x00,0x0f,0x80,0x35,0x60,0x0f,0x80,0x05,0x60,0x00,0x00,
+ /* ASCII 36 */ 0x00,0x00,0x0d,0x80,0x0a,0x40,0x3a,0x60,0x06,0x40,0x00,0x00,0x00,0x00,
+ /* ASCII 37 */ 0x00,0x00,0x02,0x40,0x02,0xa0,0x0a,0x40,0x15,0x00,0x09,0x00,0x00,0x00,
+ /* ASCII 38 */ 0x00,0x00,0x0c,0x00,0x13,0x00,0x14,0x80,0x08,0x80,0x14,0x00,0x00,0x00,
+ /* ASCII 39 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,
+ /* ASCII 40 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x80,0x60,0x60,0x00,0x00,0x00,0x00,
+ /* ASCII 41 */ 0x00,0x00,0x00,0x00,0x60,0x60,0x1f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ /* ASCII 42 */ 0x00,0x00,0x00,0x40,0x03,0x40,0x00,0xe0,0x03,0x40,0x00,0x40,0x00,0x00,
+ /* ASCII 43 */ 0x02,0x00,0x02,0x00,0x02,0x00,0x1f,0xc0,0x02,0x00,0x02,0x00,0x02,0x00,
+ /* ASCII 44 */ 0x00,0x00,0x00,0x00,0x60,0x00,0x38,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+ /* ASCII 45 */ 0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,
+ /* ASCII 46 */ 0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /* ASCII 47 */ 0x00,0x00,0x20,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x60,0x00,0x00,
+ /* ASCII 48 */ 0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x10,0x20,0x0f,0xc0,0x00,0x00,
+ /* ASCII 49 */ 0x00,0x00,0x10,0x00,0x10,0x20,0x1f,0xe0,0x10,0x00,0x10,0x00,0x00,0x00,
+ /* ASCII 50 */ 0x00,0x00,0x18,0x40,0x14,0x20,0x12,0x20,0x11,0x20,0x18,0xc0,0x00,0x00,
+ /* ASCII 51 */ 0x00,0x00,0x08,0x40,0x10,0x20,0x11,0x20,0x11,0x20,0x0e,0xc0,0x00,0x00,
+ /* ASCII 52 */ 0x00,0x00,0x06,0x00,0x05,0x00,0x04,0xc0,0x14,0x20,0x1f,0xe0,0x14,0x00,
+ /* ASCII 53 */ 0x00,0x00,0x08,0x00,0x11,0xe0,0x11,0x20,0x11,0x20,0x0e,0x20,0x00,0x00,
+ /* ASCII 54 */ 0x00,0x00,0x0f,0x80,0x11,0x40,0x11,0x20,0x11,0x20,0x0e,0x20,0x00,0x00,
+ /* ASCII 55 */ 0x00,0x00,0x00,0x60,0x00,0x20,0x18,0x20,0x07,0x20,0x00,0xe0,0x00,0x00,
+ /* ASCII 56 */ 0x00,0x00,0x0e,0xc0,0x11,0x20,0x11,0x20,0x11,0x20,0x0e,0xc0,0x00,0x00,
+ /* ASCII 57 */ 0x00,0x00,0x11,0xc0,0x12,0x20,0x12,0x20,0x0a,0x20,0x07,0xc0,0x00,0x00,
+ /* ASCII 58 */ 0x00,0x00,0x00,0x00,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ /* ASCII 59 */ 0x00,0x00,0x00,0x00,0x30,0x00,0x19,0x80,0x09,0x80,0x00,0x00,0x00,0x00,
+ /* ASCII 60 */ 0x02,0x00,0x05,0x00,0x05,0x00,0x08,0x80,0x10,0x40,0x10,0x40,0x00,0x00,
+ /* ASCII 61 */ 0x00,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x00,0x00,
+ /* ASCII 62 */ 0x10,0x40,0x10,0x40,0x08,0x80,0x05,0x00,0x05,0x00,0x02,0x00,0x00,0x00,
+ /* ASCII 63 */ 0x00,0x00,0x00,0x00,0x10,0x80,0x14,0x40,0x02,0x40,0x01,0x80,0x00,0x00,
+ /* ASCII 64 */ 0x00,0x00,0x1f,0xe0,0x20,0x10,0x23,0x10,0x24,0x90,0x17,0xe0,0x00,0x00,
+ /* ASCII 65 */ 0x10,0x00,0x1c,0x00,0x17,0xa0,0x04,0x60,0x17,0x80,0x1c,0x00,0x10,0x00,
+ /* ASCII 66 */ 0x10,0x20,0x1f,0xe0,0x11,0x20,0x11,0x20,0x11,0x20,0x0e,0xc0,0x00,0x00,
+ /* ASCII 67 */ 0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x10,0x20,0x08,0x60,0x00,0x00,
+ /* ASCII 68 */ 0x10,0x20,0x1f,0xe0,0x10,0x20,0x10,0x20,0x08,0x40,0x07,0x80,0x00,0x00,
+ /* ASCII 69 */ 0x10,0x20,0x1f,0xe0,0x11,0x20,0x13,0xa0,0x10,0x20,0x18,0x60,0x00,0x00,
+ /* ASCII 70 */ 0x00,0x00,0x10,0x20,0x1f,0xe0,0x11,0x20,0x03,0xa0,0x00,0x20,0x00,0x60,
+ /* ASCII 71 */ 0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x12,0x20,0x0e,0x60,0x02,0x00,
+ /* ASCII 72 */ 0x10,0x20,0x1f,0xe0,0x11,0x20,0x01,0x00,0x11,0x20,0x1f,0xe0,0x10,0x20,
+ /* ASCII 73 */ 0x00,0x00,0x10,0x20,0x10,0x20,0x1f,0xe0,0x10,0x20,0x10,0x20,0x00,0x00,
+ /* ASCII 74 */ 0x00,0x00,0x0e,0x00,0x10,0x20,0x10,0x20,0x0f,0xe0,0x00,0x20,0x00,0x00,
+ /* ASCII 75 */ 0x10,0x20,0x1f,0xe0,0x12,0x20,0x03,0x00,0x04,0xa0,0x18,0x60,0x10,0x20,
+ /* ASCII 76 */ 0x00,0x00,0x10,0x20,0x1f,0xe0,0x10,0x20,0x10,0x00,0x1c,0x00,0x00,0x00,
+ /* ASCII 77 */ 0x10,0x20,0x1f,0xe0,0x10,0xe0,0x03,0x00,0x10,0xe0,0x1f,0xe0,0x10,0x20,
+ /* ASCII 78 */ 0x10,0x20,0x1f,0xe0,0x10,0xe0,0x07,0x00,0x18,0x20,0x1f,0xe0,0x00,0x20,
+ /* ASCII 79 */ 0x00,0x00,0x0f,0xc0,0x10,0x20,0x10,0x20,0x10,0x20,0x0f,0xc0,0x00,0x00,
+ /* ASCII 80 */ 0x00,0x00,0x10,0x20,0x1f,0xe0,0x12,0x20,0x02,0x20,0x01,0xc0,0x00,0x00,
+ /* ASCII 81 */ 0x00,0x00,0x0f,0xc0,0x10,0x20,0x30,0x20,0x30,0x20,0x2f,0xc0,0x00,0x00,
+ /* ASCII 82 */ 0x10,0x20,0x1f,0xe0,0x12,0x20,0x02,0x20,0x06,0x20,0x09,0xc0,0x10,0x00,
+ /* ASCII 83 */ 0x00,0x00,0x18,0xc0,0x09,0x20,0x11,0x20,0x11,0x40,0x0e,0x60,0x00,0x00,
+ /* ASCII 84 */ 0x00,0x60,0x00,0x20,0x10,0x20,0x1f,0xe0,0x10,0x20,0x00,0x20,0x00,0x60,
+ /* ASCII 85 */ 0x00,0x20,0x0f,0xe0,0x10,0x20,0x10,0x00,0x10,0x20,0x0f,0xe0,0x00,0x20,
+ /* ASCII 86 */ 0x00,0x20,0x00,0xe0,0x07,0x20,0x18,0x00,0x07,0x20,0x00,0xe0,0x00,0x20,
+ /* ASCII 87 */ 0x00,0x20,0x0f,0xe0,0x10,0x20,0x0f,0x00,0x10,0x20,0x0f,0xe0,0x00,0x20,
+ /* ASCII 88 */ 0x10,0x20,0x18,0x60,0x04,0x80,0x03,0x00,0x04,0x80,0x18,0x60,0x10,0x20,
+ /* ASCII 89 */ 0x00,0x20,0x00,0x60,0x11,0xa0,0x1e,0x00,0x11,0xa0,0x00,0x60,0x00,0x20,
+ /* ASCII 90 */ 0x00,0x00,0x18,0x60,0x14,0x20,0x13,0x20,0x10,0xa0,0x18,0x60,0x00,0x00,
+ /* ASCII 91 */ 0x00,0x00,0x00,0x00,0x7f,0xe0,0x40,0x20,0x40,0x20,0x00,0x00,0x00,0x00,
+ /* ASCII 92 */ 0x00,0x00,0x00,0x20,0x01,0xc0,0x06,0x00,0x38,0x00,0x00,0x00,0x00,0x00,
+ /* ASCII 93 */ 0x00,0x00,0x00,0x00,0x40,0x20,0x40,0x20,0x7f,0xe0,0x00,0x00,0x00,0x00,
+ /* ASCII 94 */ 0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x60,0x00,0x80,0x01,0x00,0x00,0x00,
+ /* ASCII 95 */ 0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
+ /* ASCII 96 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x00,0x00,0x00,
+ /* ASCII 97 */ 0x00,0x00,0x0d,0x00,0x12,0x80,0x12,0x80,0x12,0x80,0x1f,0x00,0x10,0x00,
+ /* ASCII 98 */ 0x10,0x20,0x1f,0xe0,0x11,0x00,0x10,0x80,0x10,0x80,0x0f,0x00,0x00,0x00,
+ /* ASCII 99 */ 0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x10,0x80,0x09,0x80,0x00,0x00,
+ /* ASCII 100 */ 0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x11,0x20,0x1f,0xe0,0x10,0x00,
+ /* ASCII 101 */ 0x00,0x00,0x0f,0x00,0x12,0x80,0x12,0x80,0x12,0x80,0x13,0x00,0x00,0x00,
+ /* ASCII 102 */ 0x00,0x00,0x10,0x80,0x1f,0xc0,0x10,0xa0,0x10,0xa0,0x10,0xa0,0x00,0x00,
+ /* ASCII 103 */ 0x00,0x00,0x0f,0x00,0x50,0x80,0x50,0x80,0x51,0x00,0x3f,0x80,0x00,0x80,
+ /* ASCII 104 */ 0x10,0x20,0x1f,0xe0,0x11,0x00,0x00,0x80,0x10,0x80,0x1f,0x00,0x10,0x00,
+ /* ASCII 105 */ 0x00,0x00,0x10,0x80,0x10,0x80,0x1f,0xa0,0x10,0x00,0x10,0x00,0x00,0x00,
+ /* ASCII 106 */ 0x00,0x00,0x40,0x80,0x40,0x80,0x40,0xa0,0x3f,0x80,0x00,0x00,0x00,0x00,
+ /* ASCII 107 */ 0x10,0x20,0x1f,0xe0,0x02,0x00,0x16,0x80,0x19,0x80,0x10,0x80,0x00,0x00,
+ /* ASCII 108 */ 0x00,0x00,0x10,0x00,0x10,0x20,0x1f,0xe0,0x10,0x00,0x10,0x00,0x00,0x00,
+ /* ASCII 109 */ 0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x00,0x10,0x80,0x1f,0x00,0x10,0x00,
+ /* ASCII 110 */ 0x10,0x80,0x1f,0x80,0x11,0x00,0x00,0x80,0x10,0x80,0x1f,0x00,0x10,0x00,
+ /* ASCII 111 */ 0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x10,0x80,0x0f,0x00,0x00,0x00,
+ /* ASCII 112 */ 0x40,0x80,0x7f,0x80,0x51,0x00,0x10,0x80,0x10,0x80,0x0f,0x00,0x00,0x00,
+ /* ASCII 113 */ 0x00,0x00,0x0f,0x00,0x10,0x80,0x10,0x80,0x51,0x00,0x7f,0x80,0x40,0x80,
+ /* ASCII 114 */ 0x00,0x00,0x10,0x80,0x1f,0x80,0x11,0x00,0x10,0x80,0x10,0x80,0x00,0x00,
+ /* ASCII 115 */ 0x00,0x00,0x19,0x00,0x12,0x80,0x12,0x80,0x12,0x80,0x0d,0x80,0x00,0x00,
+ /* ASCII 116 */ 0x00,0x00,0x00,0x80,0x0f,0xc0,0x10,0x80,0x10,0x80,0x10,0x80,0x08,0x00,
+ /* ASCII 117 */ 0x00,0x80,0x0f,0x80,0x10,0x00,0x10,0x00,0x08,0x80,0x1f,0x80,0x10,0x00,
+ /* ASCII 118 */ 0x00,0x80,0x03,0x80,0x0c,0x80,0x10,0x00,0x0c,0x80,0x03,0x80,0x00,0x80,
+ /* ASCII 119 */ 0x00,0x80,0x0f,0x80,0x10,0x80,0x0e,0x00,0x10,0x80,0x0f,0x80,0x00,0x80,
+ /* ASCII 120 */ 0x10,0x80,0x19,0x80,0x06,0x00,0x06,0x00,0x19,0x80,0x10,0x80,0x00,0x00,
+ /* ASCII 121 */ 0x00,0x80,0x41,0x80,0x46,0x80,0x78,0x00,0x4c,0x80,0x03,0x80,0x00,0x80,
+ /* ASCII 122 */ 0x00,0x00,0x19,0x80,0x14,0x80,0x12,0x80,0x11,0x80,0x18,0x80,0x00,0x00,
+ /* ASCII 123 */ 0x00,0x00,0x00,0x00,0x04,0x00,0x3b,0xc0,0x40,0x20,0x00,0x00,0x00,0x00,
+ /* ASCII 124 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,
+ /* ASCII 125 */ 0x00,0x00,0x00,0x00,0x40,0x20,0x3b,0xc0,0x04,0x00,0x00,0x00,0x00,0x00,
+ /* ASCII 126 */ 0x00,0x00,0x04,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x00,0x00};
+
+int OrientationOffsetX [] = { 0 /* V12*/,0 /* V3*/,+4 /* V6*/,+4 /* V9*/ };
+int OrientationOffsetY [] = { +4 /* V12*/,0 /* V3*/,0 /* V6*/,+4 /* V9*/ };
+
+/* Private function prototypes -----------------------------------------------*/
+static void LCD_7637_Controller( void );
+static void LCD_DrawChar( u8 x, u8 y, u8 width, const u8 *bmp, u16 textColor, u16 bGndColor, u16 charMagniCoeff );
+static void LCD_BackLightChange( void );
+static void LCD_BackLightConfig( void );
+static void LCD_CtrlLinesWrite( GPIO_TypeDef* GPIOx, u32 CtrlPins, BitAction BitVal );
+
+/* Private functions ---------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* LCD_DataLinesConfig
+*
+*******************************************************************************/
+/**
+* Configure data lines D0~D7 in Input Floating mode for read from LCD or in
+* Output Push-Pull mode for write on LCD
+*
+* @param[in] Mode Specifies the configuration mode for data lines D0~D7.
+* @n @c Input: configure in Input Floating mode
+* @n @c Output: configure in Output Push-Pul mode
+*
+**/
+/******************************************************************************/
+static void LCD_DataLinesConfig( DataConfigMode_TypeDef Mode )
+ {
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ GPIO_InitStructure.GPIO_Pin = LCD_DATA_PINS;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+
+ if( Mode == Input )
+ {
+ /* Configure D0~D7 lines as Input */
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+ }
+ else
+ {
+ /* Configure D0~D7 lines in Output Push-Pull mode */
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ }
+
+ GPIO_Init( GPIOx_D_LCD, &GPIO_InitStructure );
+ }
+
+/*******************************************************************************
+*
+* LCD_DataLinesWrite
+*
+*******************************************************************************/
+/**
+* Write a value on D0~D7
+*
+* @param[in] GPIOx GPIO port to write on.
+* @param[in] PortVal The value to write. Only the lowest 8 bits are taken into
+* account.
+*
+**/
+/******************************************************************************/
+static void LCD_DataLinesWrite( GPIO_TypeDef* GPIOx, u32 PortVal )
+ {
+ // Write only the lowest 8 bits!
+ GPIOx->ODR = ( (GPIOx->ODR) & 0xFF00 ) | (u8)PortVal;
+ }
+
+/*******************************************************************************
+*
+* LCD_CtrlLinesConfig
+*
+*******************************************************************************/
+/**
+* Configure control lines in Output Push-Pull mode.
+*
+**/
+/******************************************************************************/
+static void LCD_CtrlLinesConfig( void )
+ {
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ GPIO_InitStructure.GPIO_Pin = LCD_CTRL_PINS;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+
+ GPIO_Init( GPIOx_CTRL_LCD, &GPIO_InitStructure );
+
+ GPIO_InitStructure.GPIO_Pin = CtrlPin_CS;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+
+ GPIO_Init( GPIOx_CS_LCD, &GPIO_InitStructure );
+
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
+ LCD_CtrlLinesWrite( GPIOx_CS_LCD, CtrlPin_CS, Bit_SET ); /* CS = 1 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_RESET ); /* RST = 0 */
+ }
+
+/*******************************************************************************
+*
+* LCD_CtrlLinesWrite
+*
+*******************************************************************************/
+/**
+* Set or reset control lines.
+*
+* @param[in] GPIOx Where x can be 0, 1 or 2 to select the GPIO peripheral.
+* @param[in] CtrlPins The Control line.
+* @param[in] BitVal
+*
+**/
+/******************************************************************************/
+static void LCD_CtrlLinesWrite( GPIO_TypeDef* GPIOx, u32 CtrlPins, BitAction BitVal )
+ {
+ /* Set or Reset the control line */
+ GPIO_WriteBit( GPIOx, CtrlPins, BitVal );
+ }
+
+/*******************************************************************************
+*
+* LCD_CheckLCDStatus
+*
+*******************************************************************************/
+/**
+* Check whether LCD LCD is busy or not.
+*
+**/
+/******************************************************************************/
+static void LCD_CheckLCDStatus( void )
+ {
+ unsigned char ID1;
+ unsigned char ID2;
+ unsigned char ID3;
+
+ LCD_SendLCDCmd( ST7637_RDDID );
+
+ /* Configure Data lines as Input */
+ LCD_DataLinesConfig (Input );
+
+ /* Start the LCD send data sequence */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RS, Bit_RESET ); /* RS = 0 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
+ LCD_CtrlLinesWrite( GPIOx_CS_LCD, CtrlPin_CS, Bit_RESET ); /* CS = 0 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
+
+ /* Read data to the LCD */
+ GPIO_ReadInputData( GPIOx_D_LCD );
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
+
+ ID1 = GPIO_ReadInputData( GPIOx_D_LCD );
+
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
+
+ ID2 = GPIO_ReadInputData( GPIOx_D_LCD );
+
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
+
+ ID3 = GPIO_ReadInputData( GPIOx_D_LCD );
+
+ LCD_DataLinesConfig( Output );
+ }
+
+/*******************************************************************************
+*
+* LCD_DrawChar
+*
+*******************************************************************************/
+/**
+* Draw a character on the LCD screen.
+*
+* @param[in] x The line where to display the character shape.
+* @param[in] y The column start address.
+* @param[in] width The number of columns (dots) in a character width.
+* @param[in] bmp The character (monochrome) bitmap. A pointer of the dot matrix data.
+* @param[in] textColor The character color.
+* @param[in] bGndColor The character background color.
+* @param[in] charMagniCoeff The character magnifying coefficient.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+static void LCD_DrawChar( u8 x, u8 y, u8 width, const u8* bmp, u16 textColor, u16 bGndColor, u16 charMagniCoeff )
+ {
+ int i;
+ int j;
+ int k1;
+ int k2;
+
+ // Select the area for LCD output.
+ LCD_SetRect_For_Cmd( x, y, 7 * charMagniCoeff, 14 * charMagniCoeff );
+
+ // Select LCD output mode.
+ LCD_SendLCDCmd( ST7637_RAMWR );
+
+ for( i = 0; i < 7; i++ )
+ {
+ for( k1 = 0; k1 < charMagniCoeff; k1++ )
+ {
+ for( j = 0x80; j; j >>= 1 ) // 8
+ {
+ for( k2 = 0; k2 < charMagniCoeff; k2++ )
+ {
+ LCD_SendLCDData( ( bmp[2*i] & j ) ? ( textColor & 255 ) : ( bGndColor & 255 ) );
+ LCD_SendLCDData( ( bmp[2*i] & j ) ? ( textColor >> 8 ) : ( bGndColor >> 8 ) );
+ }
+ }
+
+ for( j = 0x80; j > 2; j >>= 1 ) // 8
+ {
+ for( k2 = 0; k2 < charMagniCoeff; k2++ )
+ {
+ LCD_SendLCDData( ( bmp[2*i+1] & j ) ? ( textColor & 255 ) : ( bGndColor & 255 ) );
+ LCD_SendLCDData( ( bmp[2*i+1] & j ) ? ( textColor >> 8 ) : ( bGndColor >> 8 ) );
+ }
+ }
+ }
+ }
+ }
+
+/*******************************************************************************
+*
+* LCD_DisplayRotate
+*
+*******************************************************************************/
+/**
+* Configure the LCD controller for a given orientation.
+*
+* @param[in] H12 The new screen orientation.
+*
+**/
+/******************************************************************************/
+static void LCD_DisplayRotate( Rotate_H12_V_Match_TypeDef H12 )
+ {
+ // Memory Access Control 0x36
+ LCD_SendLCDCmd( ST7637_MADCTR );
+
+ switch( H12 )
+ {
+ case V3 :
+ LCD_SendLCDData( V3_MADCTRVAL );
+ break;
+
+ case V6 :
+ LCD_SendLCDData( V6_MADCTRVAL );
+ break;
+
+ case V9 :
+ LCD_SendLCDData( V9_MADCTRVAL );
+ break;
+
+ case V12 :
+ default :
+ LCD_SendLCDData( V12_MADCTRVAL );
+ break;
+ }
+ }
+
+/*******************************************************************************
+*
+* LCD_7637_Controller
+*
+*******************************************************************************/
+/**
+* Initialization of the controller registers.
+*
+* @note See ST7637.PDF for more information.
+*
+**/
+/******************************************************************************/
+static void LCD_7637_Controller( void )
+ {
+ extern void starting_delay ( long unsigned );
+
+ /** Apply hardware reset **/
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_SET ); /* RST = 1 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_RESET ); /* RST = 0 */
+ starting_delay( 0x500 );
+
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_SET ); /* RST = 1 */
+ starting_delay( 0x500 );
+
+ //default mode is output
+ LCD_DataLinesConfig( Output );
+
+ LCD_CheckLCDStatus();
+
+ LCD_SendLCDCmd( ST7637_SWRESET );
+
+ //-----------disable autoread + Manual read once ----------------------------
+ LCD_SendLCDCmd( ST7637_AUTOLOADSET ); // Auto Load Set 0xD7
+ LCD_SendLCDData( 0xBF ); // Auto Load Disable
+
+ LCD_SendLCDCmd( ST7637_EPCTIN ); // EE Read/write mode 0xE0
+ LCD_SendLCDData( 0x00 ); // Set read mode
+
+ LCD_SendLCDCmd( ST7637_EPMRD ); // Read active 0xE3
+ LCD_SendLCDCmd( ST7637_EPCTOUT ); // Cancel control 0xE1
+
+ //---------------------------------- Sleep OUT ------------------------------
+ LCD_SendLCDCmd( ST7637_DISPOFF ); // display off 0x28
+ LCD_SendLCDCmd( ST7637_SLPOUT ); // Sleep Out 0x11
+
+ //--------------------------------Vop setting--------------------------------
+ LCD_SendLCDCmd( ST7637_VOPSET ); // Set Vop by initial Module 0xC0
+ LCD_SendLCDData( 0xFB ); // Vop = 13.64
+ LCD_SendLCDData( 0x00 ); // base on Module
+
+ //----------------------------Set Register-----------------------------------
+ LCD_SendLCDCmd( ST7637_BIASSEL ); // Bias select 0xC3
+ LCD_SendLCDData( 0x00 ); // 1/12 Bias, base on Module
+
+ LCD_SendLCDCmd( ST7637_BSTBMPXSEL ); // Setting Booster times 0xC4
+ LCD_SendLCDData( 0x05 ); // Booster X 8
+
+ LCD_SendLCDCmd( ST7637_BSTEFFSEL ); // Booster eff 0xC5
+ LCD_SendLCDData( 0x11 ); // BE = 0x01 (Level 2)
+
+ LCD_SendLCDCmd( ST7637_VGSORCSEL ); // Vg with booster x2 control 0xcb
+ LCD_SendLCDData( 0x01 ); // Vg from Vdd2
+
+ LCD_SendLCDCmd( ST7637_ID1SET ); // ID1 = 00 0xcc
+ LCD_SendLCDData( 0x00 ); //
+
+ LCD_SendLCDCmd( ST7637_ID3SET ); // ID3 = 00 0xce
+ LCD_SendLCDData( 0x00 ); //
+
+ LCD_SendLCDCmd( 0xB7 ); // Glass direction
+ LCD_SendLCDData( 0xC0 ); //
+
+ LCD_SendLCDCmd( ST7637_ANASET ); // Analog circuit setting 0xd0
+ LCD_SendLCDData( 0x1D ); //
+
+ LCD_SendLCDCmd( 0xB4 ); // PTL mode set
+ LCD_SendLCDData( 0x18 ); // power normal mode
+ LCD_SendLCDCmd( ST7637_INVOFF ); // Display Inversion OFF 0x20
+
+ LCD_SendLCDCmd( 0x2A ); // column range
+ LCD_SendLCDData( 0x04 ); //
+ LCD_SendLCDData( 0x83 ); //
+
+ LCD_SendLCDCmd( 0x2B ); // raw range
+ LCD_SendLCDData( 0x04 ); //
+ LCD_SendLCDData( 0x83 ); //
+
+
+ LCD_SendLCDCmd( ST7637_COLMOD ); // Color mode = 65k 0x3A
+ LCD_SendLCDData( 0x05 ); //
+
+ LCD_SendLCDCmd( ST7637_MADCTR ); // Memory Access Control 0x36
+ LCD_SendLCDData( V9_MADCTRVAL );
+
+ LCD_SendLCDCmd( ST7637_DUTYSET ); // Duty = 132 duty 0xb0
+ LCD_SendLCDData( 0x7F );
+
+ LCD_SendLCDCmd( 0x29 ); // Display ON
+ LCD_SendLCDCmd( 0xF9 ); // Gamma
+ LCD_SendLCDData( 0x00 ); //
+ LCD_SendLCDData( 0x03 ); //
+ LCD_SendLCDData( 0x05 ); //
+ LCD_SendLCDData( 0x07 ); //
+ LCD_SendLCDData( 0x09 ); //
+ LCD_SendLCDData( 0x0B ); //
+ LCD_SendLCDData( 0x0D ); //
+ LCD_SendLCDData( 0x0F ); //
+ LCD_SendLCDData( 0x11 ); //
+ LCD_SendLCDData( 0x13 ); //
+ LCD_SendLCDData( 0x15 ); //
+ LCD_SendLCDData( 0x17 ); //
+ LCD_SendLCDData( 0x19 ); //
+ LCD_SendLCDData( 0x1B ); //
+ LCD_SendLCDData( 0x1D ); //
+ LCD_SendLCDData( 0x1F ); //
+ }
+
+/*******************************************************************************
+*
+* LCD_BackLightConfig
+*
+*******************************************************************************/
+/**
+* Setting of the PWM that drives the backlight intensity.
+*
+**/
+/******************************************************************************/
+static void LCD_BackLightConfig( void )
+ {
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ /* Enable GPIOB clock */
+ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
+
+ /* GPIOB Configuration:TIM4 2 in Output */
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+
+ GPIO_Init( GPIOB, &GPIO_InitStructure );
+
+ /* TIM4 Configuration -----------------------------------------------------*/
+ /* TIM4CLK = 12 MHz, Prescaler = 0x0 */
+
+ /* Enable TIM4 clock */
+ RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM4, ENABLE );
+
+ TIM_DeInit( TIM4 );
+ TIM_TimeBaseStructInit( &TIM_TimeBaseStructure );
+ TIM_OCStructInit( &TIM_OCInitStructure );
+
+ /* Time base configuration */
+ TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
+ TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
+ TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
+ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+
+ TIM_TimeBaseInit( TIM4, &TIM_TimeBaseStructure );
+
+ /* Output Compare Toggle Mode configuration: Channel2 */
+ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
+ TIM_OCInitStructure.TIM_Channel = TIM_Channel_2;
+ TIM_OCInitStructure.TIM_Pulse = Current_CCR_BackLightStart;
+
+ TIM_OCInit( TIM4, &TIM_OCInitStructure );
+ TIM_OC4PreloadConfig( TIM4, TIM_OCPreload_Disable );
+
+ TIM_ARRPreloadConfig( TIM4, ENABLE );
+
+ /* Enable TIM4 IT */
+ TIM_ITConfig( TIM4, TIM_IT_CC2, ENABLE );
+
+ // Go !!!
+ TIM_Cmd( TIM4, ENABLE );
+ }
+
+/*******************************************************************************
+*
+* LCD_BackLightChange
+*
+*******************************************************************************/
+/**
+* Modify the PWM rate.
+*
+**/
+/******************************************************************************/
+static void LCD_BackLightChange( void )
+ {
+ /* Output Compare Toggle Mode configuration: Channel2 */
+ TIM_OCInitStructure.TIM_Pulse = Current_CCR_BackLightStart;
+
+ TIM_OCInit( TIM4, &TIM_OCInitStructure );
+ }
+
+/* Public functions for CircleOS ---------------------------------------------*/
+
+/*******************************************************************************
+*
+* LCD_Init
+*
+*******************************************************************************/
+/**
+*
+* Initialize LCD. Called at CircleOS startup.
+*
+* @attention This function must NOT be called by the user.
+*
+**/
+/******************************************************************************/
+void LCD_Init( void )
+ {
+ LCD_SetBackLight( UTIL_ReadBackupRegister( BKP_BKLIGHT ) );
+
+ /* Do some gpio configs*/
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ /* Enable GPIO clock for LCD */
+ RCC_APB2PeriphClockCmd( GPIO_LCD_CTRL_PERIPH, ENABLE );
+ RCC_APB2PeriphClockCmd( GPIO_LCD_D_PERIPH, ENABLE );
+ RCC_APB2PeriphClockCmd( GPIO_LCD_CS_PERIPH, ENABLE );
+
+ /* Enable GPIOC clock */
+ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
+
+ /* Init BackLight*/
+ LCD_BackLightConfig();
+
+ /* Configure control lines signals as output mode */
+ LCD_CtrlLinesConfig();
+
+ /* LCD LCD Init */
+ LCD_7637_Controller();
+ }
+
+/*******************************************************************************
+*
+* LCD_Handler
+*
+*******************************************************************************/
+/**
+*
+* Called by the CircleOS scheduler to manage LCD tasks.
+*
+* @attention This function must NOT be called by the user.
+*
+**/
+/******************************************************************************/
+void LCD_Handler( void )
+ {
+ if( ++HandlerDivider % BACKLIGHT_DIVIDER )
+ {
+ return;
+ }
+
+ LCD_BackLightChange();
+ }
+
+
+/// @endcond
+
+/* Public functions ----------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* LCD_SendLCDCmd
+*
+*******************************************************************************/
+/**
+*
+* Send on command byte to the LCD.
+*
+* @param[in] Cmd An unsigned char containing the user command to send to the LCD.
+*
+**/
+/******************************************************************************/
+void LCD_SendLCDCmd( u8 Cmd )
+ {
+ /* Start the LCD send data sequence */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RS, Bit_RESET ); /* RS = 0 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
+ LCD_CtrlLinesWrite( GPIOx_CS_LCD, CtrlPin_CS, Bit_RESET ); /* CS = 0 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_RESET ); /* WR = 0 */
+
+ /* Write data to the LCD */
+ LCD_DataLinesWrite( GPIOx_D_LCD, (u32)Cmd );
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
+ }
+
+/*******************************************************************************
+*
+* LCD_SendLCDData
+*
+*******************************************************************************/
+/**
+*
+* Send one data byte to the LCD.
+*
+* @param[in] Data An unsigned character containing the data to send to the LCD.
+* @pre An LCD_SendLCDCmd was done with a command waiting for data.
+*
+*
+**/
+/******************************************************************************/
+void LCD_SendLCDData( u8 Data )
+ {
+ /* Configure Data lines as Output */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RS, Bit_SET );
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RD, Bit_SET );
+ LCD_CtrlLinesWrite( GPIOx_CS_LCD, CtrlPin_CS, Bit_RESET );
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_RESET );
+
+ /* Write data to the LCD */
+ LCD_DataLinesWrite( GPIOx_D_LCD,(u32)Data );
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_WR, Bit_SET );
+ }
+
+/***********************************************************************************
+*
+* LCD_ReadLCDData
+*
+************************************************************************************/
+/**
+*
+* Read one data byte from the LCD.
+*
+* @return An unsigned 32 bit word containing the data returned by a LCD command.
+* @pre An LCD_SendLCDCmd was done with a command returning data.
+*
+**/
+/********************************************************************************/
+u32 LCD_ReadLCDData( void )
+ {
+ u32 LCDData = 0;
+
+ /* Configure Data lines as Input */
+ LCD_DataLinesConfig(Input);
+
+ /* Start the LCD send data sequence */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
+ LCD_CtrlLinesWrite( GPIOx_CS_LCD, CtrlPin_CS, Bit_RESET ); /* CS = 0 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
+
+ /* Read data from the LCD */
+ LCDData = (GPIO_ReadInputData( GPIOx_D_LCD ) & LCD_DATA_PINS );
+
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
+
+ /* Read the LCD returned data */
+ LCD_DataLinesConfig( Output );
+
+ return LCDData;
+ }
+
+/*******************************************************************************
+*
+* LCD_FillRect
+*
+*******************************************************************************/
+/**
+*
+* Fill a rectangle with a provided color.
+*
+* @param[in] x The horizontal coordinate of the rectangle low left corner.
+* @param[in] y The vertical coordinate of the rectangle low left corner.
+* @param[in] width The rectangle width in pixels.
+* @param[in] height The rectangle height in pixels.
+* @param[in] color The RGB color to fill the rectangle with.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void LCD_FillRect( u16 x, u16 y, u16 width, u16 height, u16 color )
+ {
+ u8 Line;
+ u8 Column;
+
+ /* Select LCD screen area. */
+ LCD_SetRect_For_Cmd( x, y, width, height );
+
+ /* Send LCD RAM write command. */
+ LCD_SendLCDCmd( ST7637_RAMWR );
+
+ /* Fill selected LCD screen area with provided color. */
+ for( Line = 0; Line < width; Line++ )
+ {
+ for( Column = 0; Column < height; Column++ )
+ {
+ LCD_SendLCDData( color & 0xff );
+ LCD_SendLCDData( ( color >> 8 ) & 0xff );
+ }
+ }
+
+ #ifdef TESTLCD
+ /* Configure Data lines as Input */
+ LCD_DataLinesConfig( Input );
+
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_SET ); /* RST = 1 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_RESET ); /* RST = 0 */
+ LCD_CtrlLinesWrite( GPIOx_CTRL_LCD, CtrlPin_RST, Bit_SET ); /* RST = 1 */
+
+ /* Start the LCD send data sequence */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_RESET ); /* RS = 0 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
+
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_RESET ); /* RS = 0 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RS, Bit_SET ); /* RS = 1 */
+
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_WR, Bit_RESET ); /* WR = 1 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_WR, Bit_SET ); /* WR = 1 */
+
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
+
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_RESET ); /* RD = 0 */
+ LCD_CtrlLinesWrite( GPIOx_D_LCD, CtrlPin_RD, Bit_SET ); /* RD = 1 */
+
+ /* Configure Data lines as Input */
+ LCD_DataLinesConfig( Output );
+
+ LCD_DataLinesWrite( GPIOx_D_LCD, ~0 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, 0 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, ~1 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, 1 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, ~2 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, 2 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, ~4 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, 4 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, ~8 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, 8 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, ~0x10 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, 0x10 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, ~0x20 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, 0x20 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, ~0x40 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, 0x40 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, ~0x80 );
+ LCD_DataLinesWrite( GPIOx_D_LCD, 0x80 );
+
+ LCD_DataLinesConfig( Input );
+
+ #endif
+ }
+
+/*******************************************************************************
+*
+* LCD_DrawRect
+*
+*******************************************************************************/
+/**
+*
+* Draw a rectangle with a provided color.
+*
+* @param[in] x The horizontal coordinate of the rectangle low left corner.
+* @param[in] y The vertical coordinate of the rectangle low left corner.
+* @param[in] width The rectangle width in pixels.
+* @param[in] height The rectangle height in pixels.
+* @param[in] color The RGB color to draw the rectangle with.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void LCD_DrawRect( u16 x, u16 y, u16 width, u16 height, u16 color )
+ {
+ // Draw horizontal sides.
+ LCD_FillRect( x, y, width, 1, color );
+ LCD_FillRect( x, y + height - 1, width, 1, color );
+
+ // Draw vertical sides.
+ LCD_FillRect( x, y, 1, height, color );
+ LCD_FillRect( x + width - 1, y, 1, height, color );
+ }
+
+/*******************************************************************************
+*
+* LCD_DrawPixel
+*
+*******************************************************************************/
+/**
+*
+* Draw a pixel on the LCD with the provided color.
+*
+* @param[in] XPos The horizontal coordinate of the pixel.
+* @param[in] YPos The vertical coordinate of the pixel.
+* @param[in] Color The RGB color to draw the pixel with.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void LCD_DrawPixel( u8 XPos, u8 YPos, u16 Color )
+ {
+ /* Select LCD screen area. */
+ LCD_SetRect_For_Cmd( XPos, YPos, 1, 1 );
+
+ /* Send LCD RAM write command. */
+ LCD_SendLCDCmd( ST7637_RAMWR );
+
+ // Draw pixel.
+ LCD_SendLCDData( Color );
+ LCD_SendLCDData( Color >> 8 );
+ }
+
+/*******************************************************************************
+*
+* LCD_RectRead
+*
+*******************************************************************************/
+/**
+*
+* Save the pixels of a rectangle part of the LCD into a RAM variable.
+*
+* @param[in] x The horizontal coordinate of the rectangle low left corner.
+* @param[in] y The vertical coordinate of the rectangle low left corner.
+* @param[in] width The rectangle width in pixels.
+* @param[in] height The rectangle height in pixels.
+* @param[out] bmp The variable to store the read data into.
+*
+* @warning One pixel weights 2 bytes.
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void LCD_RectRead( u16 x, u16 y, u16 width, u16 height, u8* bmp )
+ {
+ int i;
+ int bytesize = (width * height) *2; // 2 bytes per pixel.
+
+ /* Select LCD screen area. */
+ LCD_SetRect_For_Cmd( x, y, width, height );
+
+ /* Send LCD RAM write command. */
+ LCD_SendLCDCmd(ST7637_RAMRD);
+
+ // First read byte is dummy!
+ LCD_ReadLCDData();
+
+ // Read pixels from LCD screen.
+ for( i = 0; i < bytesize; i++ )
+ {
+ *bmp++ = LCD_ReadLCDData();
+ }
+ }
+
+/*******************************************************************************
+*
+* LCD_GetPixel
+*
+*******************************************************************************/
+/**
+*
+* Read the RGB color of the pixel the coordinate are provided in parameter.
+*
+* @param[in] x The horizontal coordinate of the pixel.
+* @param[in] y The vertical coordinate of the pixel.
+* @return An unsigned 16 bit word containing the RGB color of the pixel.
+*
+* @warning The (0x0) point in on the low left corner.
+* @see LCD_RectRead
+*
+**/
+/******************************************************************************/
+u16 LCD_GetPixel( u8 x, u8 y )
+ {
+ u16 val;
+
+ LCD_RectRead( x, y, 1, 1, (u8*)&val );
+
+ return val;
+ }
+
+/*******************************************************************************
+*
+* LCD_DisplayChar
+*
+*******************************************************************************/
+/**
+*
+* Display at provided coordinates the provided ASCII character with the provided
+* text and background colors and with the provided magnify coefficient.
+*
+* @param[in] x The horizontal coordinate of the character.
+* @param[in] y The vertical coordinate of the character.
+* @param[in] Ascii The ASCII code of the character to display.
+* @n Ascii must be higher than 31 and lower than 127.
+* @param[in] TextColor The color used to draw the character.
+* @param[in] BGndColor The background color of the drawn character.
+* @param[in] CharMagniCoeff The magnify coefficient used to draw the character.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void LCD_DisplayChar( u8 x, u8 y, u8 Ascii, u16 TextColor, u16 BGndColor, u16 CharMagniCoeff)
+ {
+ // Display the selected bitmap according to the provided ASCII character.
+ LCD_DrawChar( x, y, 7, (u8*)&AsciiDotsTable[ (Ascii-32) * 14 ], TextColor, BGndColor, CharMagniCoeff );
+ }
+
+/*******************************************************************************
+*
+* LCD_SetRect_For_Cmd
+*
+*******************************************************************************/
+/**
+*
+* Define the rectangle for the next command to be applied.
+*
+* @param[in] x The horizontal coordinate of the rectangle low left corner.
+* @param[in] y The vertical coordinate of the rectangle low left corner.
+* @param[in] width The rectangle width in pixels.
+* @param[in] height The rectangle height in pixels.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void LCD_SetRect_For_Cmd( s16 x, s16 y, s16 width, s16 height )
+ {
+ LCD_SendLCDCmd( ST7637_CASET );
+ LCD_SendLCDData( y + OrientationOffsetX[ CurrentScreenOrientation ] );
+ LCD_SendLCDData( y + OrientationOffsetX[ CurrentScreenOrientation ] + height - 1 );
+
+ LCD_SendLCDCmd( ST7637_RASET );
+ LCD_SendLCDData( x + OrientationOffsetY[ CurrentScreenOrientation ] );
+ LCD_SendLCDData( x + OrientationOffsetY[ CurrentScreenOrientation ] + width - 1 );
+ }
+
+/*******************************************************************************
+*
+* LCD_SetBackLight
+*
+*******************************************************************************/
+/**
+*
+* Modify the PWM rate. Any value below BACKLIGHTMIN reset the value to the
+* default value (DEFAULT_CCR_BACKLIGHTSTART).
+*
+* @param[in] newBacklightStart The new PWM rate.
+*
+**/
+/******************************************************************************/
+void LCD_SetBackLight( u32 newBacklightStart )
+ {
+ if( newBacklightStart >= BACKLIGHTMIN )
+ {
+ Current_CCR_BackLightStart = newBacklightStart;
+ }
+ else
+ {
+ Current_CCR_BackLightStart = DEFAULT_CCR_BACKLIGHTSTART;
+ }
+ }
+
+/*******************************************************************************
+*
+* LCD_SetBackLightOff
+*
+*******************************************************************************/
+/**
+*
+* Switch the LCD back light off.
+*
+**/
+/******************************************************************************/
+void LCD_SetBackLightOff( void )
+ {
+ Current_CCR_BackLightStart = 0;
+ }
+
+/*******************************************************************************
+*
+* LCD_SetBackLightOn
+*
+*******************************************************************************/
+/**
+*
+* Switch the LCD back light on.
+*
+**/
+/******************************************************************************/
+void LCD_SetBackLightOn( void )
+ {
+ Current_CCR_BackLightStart = DEFAULT_CCR_BACKLIGHTSTART;
+ }
+
+/*******************************************************************************
+*
+* LCD_GetBackLight
+*
+*******************************************************************************/
+/**
+*
+* Returns le LCD PWM rate.
+*
+* @return The current LCD PWM rate.
+*
+**/
+/******************************************************************************/
+u32 LCD_GetBackLight( void )
+ {
+ return Current_CCR_BackLightStart;
+ }
+
+/*******************************************************************************
+*
+* LCD_SetRotateScreen
+*
+*******************************************************************************/
+/**
+*
+* Enable or disable the ability of the screen display to rotate according to
+* the MEMs information.
+*
+* @param[in] RotateScreen 0 to disable screen rotation and 1 to enable.
+*
+**/
+/******************************************************************************/
+void LCD_SetRotateScreen( u8 RotateScreen)
+ {
+ CurrentRotateScreen = RotateScreen;
+ }
+
+/*******************************************************************************
+*
+* LCD_GetRotateScreen
+*
+*******************************************************************************/
+/**
+*
+* Return the screen rotation mode.
+*
+* @retval 0 screen rotation is disabled.
+* @retval 1 screen rotation is enabled.
+*
+**/
+/******************************************************************************/
+u8 LCD_GetRotateScreen( void )
+ {
+ return CurrentRotateScreen;
+ }
+
+/*******************************************************************************
+*
+* LCD_SetScreenOrientation
+*
+*******************************************************************************/
+/**
+*
+* Set the screen orientation.
+*
+* @param[in] ScreenOrientation The new screen orientation.
+*
+**/
+/******************************************************************************/
+void LCD_SetScreenOrientation( Rotate_H12_V_Match_TypeDef ScreenOrientation )
+ {
+ CurrentScreenOrientation = ScreenOrientation;
+
+ LCD_DisplayRotate( CurrentScreenOrientation );
+ }
+
+/*******************************************************************************
+*
+* LCD_GetScreenOrientation
+*
+*******************************************************************************/
+/**
+*
+* Return current screen orientation.
+*
+* @return A Rotate_H12_V_Match_TypeDef telling the current screen orientation.
+*
+**/
+/******************************************************************************/
+Rotate_H12_V_Match_TypeDef LCD_GetScreenOrientation( void )
+ {
+ return CurrentScreenOrientation;
+ }
+
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/lcd.h b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/lcd.h
new file mode 100644
index 000000000..478f43824
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/lcd.h
@@ -0,0 +1,154 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
+/**
+*
+* @file lcd.h
+* @brief The header file for ST7637 driver.
+* @author IB
+* @date 07/2007
+*
+**/
+/******************************************************************************/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __LCD_H
+#define __LCD_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f10x_lib.h"
+
+/* Type def -----------------------------------------------------------------*/
+
+/* Data lines configuration mode */
+typedef enum
+ {
+ Input,
+ Output
+ } DataConfigMode_TypeDef;
+
+/* Constants -----------------------------------------------------------------*/
+
+/* LCD Control pins */
+#define CtrlPin_RS GPIO_Pin_8
+#define CtrlPin_RD GPIO_Pin_9
+#define CtrlPin_WR GPIO_Pin_10
+#define CtrlPin_RST GPIO_Pin_12
+#define LCD_CTRL_PINS (CtrlPin_RS|CtrlPin_RD|CtrlPin_WR|CtrlPin_RST)
+#define GPIOx_CTRL_LCD GPIOC
+#define GPIO_LCD_CTRL_PERIPH RCC_APB2Periph_GPIOC
+
+#define CtrlPin_CS GPIO_Pin_2
+#define GPIOx_CS_LCD GPIOD
+#define GPIO_LCD_CS_PERIPH RCC_APB2Periph_GPIOD
+
+#define LCD_D0 GPIO_Pin_0
+#define LCD_D1 GPIO_Pin_1
+#define LCD_D2 GPIO_Pin_2
+#define LCD_D3 GPIO_Pin_3
+#define LCD_D4 GPIO_Pin_4
+#define LCD_D5 GPIO_Pin_5
+#define LCD_D6 GPIO_Pin_6
+#define LCD_D7 GPIO_Pin_7
+#define LCD_DATA_PINS (LCD_D0|LCD_D1|LCD_D2|LCD_D3|LCD_D4|LCD_D5|LCD_D6|LCD_D7)
+#define GPIOx_D_LCD GPIOC
+#define GPIO_LCD_D_PERIPH RCC_APB2Periph_GPIOC
+
+/* LCD Commands */
+#define DISPLAY_ON 0xAF
+#define DISPLAY_OFF 0xAE
+#define START_LINE 0xC0
+#define START_COLUMN 0x00
+#define CLOCKWISE_OUTPUT 0xA0
+#define DYNAMIC_DRIVE 0xA4
+#define DUTY_CYCLE 0xA9
+#define READ_MODIFY_WRITE_OFF 0xEE
+#define SOFTWARE_RESET 0xE2
+
+#define ST7637_NOP 0x00
+#define ST7637_SWRESET 0x01
+#define ST7637_RDDID 0x04
+#define ST7637_RDDST 0x09
+#define ST7637_RDDPM 0x0A
+#define ST7637_RDDMADCTR 0x0B
+#define ST7637_RDDCOLMOD 0x0C
+#define ST7637_RDDIM 0x0D
+#define ST7637_RDDSM 0x0E
+#define ST7637_RDDSDR 0x0F
+
+#define ST7637_SLPIN 0x10
+#define ST7637_SLPOUT 0x11
+#define ST7637_PTLON 0x12
+#define ST7637_NORON 0x13
+
+#define ST7637_INVOFF 0x20
+#define ST7637_INVON 0x21
+#define ST7637_APOFF 0x22
+#define ST7637_APON 0x23
+#define ST7637_WRCNTR 0x25
+#define ST7637_DISPOFF 0x28
+#define ST7637_DISPON 0x29
+#define ST7637_CASET 0x2A
+#define ST7637_RASET 0x2B
+#define ST7637_RAMWR 0x2C
+#define ST7637_RGBSET 0x2D
+#define ST7637_RAMRD 0x2E
+
+#define ST7637_PTLAR 0x30
+#define ST7637_SCRLAR 0x33
+#define ST7637_TEOFF 0x34
+#define ST7637_TEON 0x35
+#define ST7637_MADCTR 0x36
+#define ST7637_VSCSAD 0x37
+#define ST7637_IDMOFF 0x38
+#define ST7637_IDMON 0x39
+#define ST7637_COLMOD 0x3A
+
+#define ST7637_RDID1 0xDA
+#define ST7637_RDID2 0xDB
+#define ST7637_RDID3 0xDC
+
+#define ST7637_DUTYSET 0xB0
+#define ST7637_FIRSTCOM 0xB1
+#define ST7637_OSCDIV 0xB3
+#define ST7637_PTLMOD 0xB4
+#define ST7637_NLINVSET 0xB5
+#define ST7637_COMSCANDIR 0xB7
+#define ST7637_RMWIN 0xB8
+#define ST7637_RMWOUT 0xB9
+
+#define ST7637_VOPSET 0xC0
+#define ST7637_VOPOFSETINC 0xC1
+#define ST7637_VOPOFSETDEC 0xC2
+#define ST7637_BIASSEL 0xC3
+#define ST7637_BSTBMPXSEL 0xC4
+#define ST7637_BSTEFFSEL 0xC5
+#define ST7637_VOPOFFSET 0xC7
+#define ST7637_VGSORCSEL 0xCB
+
+#define ST7637_ID1SET 0xCC
+#define ST7637_ID2SET 0xCD
+#define ST7637_ID3SET 0xCE
+
+#define ST7637_ANASET 0xD0
+#define ST7637_AUTOLOADSET 0xD7
+#define ST7637_RDTSTSTATUS 0xDE
+
+#define ST7637_EPCTIN 0xE0
+#define ST7637_EPCTOUT 0xE1
+#define ST7637_EPMWR 0xE2
+#define ST7637_EPMRD 0xE3
+#define ST7637_MTPSEL 0xE4
+#define ST7637_ROMSET 0xE5
+#define ST7637_HPMSET 0xEB
+
+#define ST7637_FRMSEL 0xF0
+#define ST7637_FRM8SEL 0xF1
+#define ST7637_TMPRNG 0xF2
+#define ST7637_TMPHYS 0xF3
+#define ST7637_TEMPSEL 0xF4
+#define ST7637_THYS 0xF7
+#define ST7637_FRAMESET 0xF9
+
+#define ST7637_MAXCOL 0x83
+#define ST7637_MAXPAG 0x83
+
+#endif /*__LCD_H */
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/led.c b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/led.c
new file mode 100644
index 000000000..107ac66c4
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/led.c
@@ -0,0 +1,210 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
+/**
+*
+* @file led.c
+* @brief LED management.
+* @author IB
+* @date 07/2007
+*
+**/
+/******************************************************************************/
+
+/* Includes ------------------------------------------------------------------*/
+#include "circle.h"
+
+/// @cond Internal
+
+/* Private variables ---------------------------------------------------------*/
+
+int GreenLED_Counter = 0;
+int RedLED_Counter = 0;
+enum LED_mode GreenLED_mode = LED_UNDEF;
+enum LED_mode RedLED_mode = LED_UNDEF;
+enum LED_mode GreenLED_newmode = LED_OFF;
+enum LED_mode RedLED_newmode = LED_OFF;
+const int HalfPeriod_LF = 200;
+const int HalfPeriod_HF = 50;
+const int Period_LF = 200 * 2;
+const int Period_HF = 50 * 2;
+
+/* Public functions for CircleOS ---------------------------------------------*/
+
+/*******************************************************************************
+*
+* LED_Init
+*
+*******************************************************************************/
+/**
+*
+* Initialization of the GPIOs for the LEDs
+*
+* @note Is called by CircleOS startup.
+*
+**/
+/******************************************************************************/
+void LED_Init( void )
+ {
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ /* Enable LED GPIO clock */
+ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
+
+ /* Configure LED pins as output push-pull */
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 ;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+
+ GPIO_Init( GPIOB, &GPIO_InitStructure );
+ }
+
+/*******************************************************************************
+*
+* LED_Handler
+*
+*******************************************************************************/
+/**
+*
+* Called by the CircleOS scheduler to manage the states of the LEDs.
+* LEDs may be on, off or blinking according to their state.
+*
+**/
+/******************************************************************************/
+void LED_Handler( void )
+ {
+ LED_Handler_hw(LED_GREEN);
+ LED_Handler_hw(LED_RED);
+ }
+
+/*******************************************************************************
+*
+* LED_Handler
+*
+*******************************************************************************/
+/**
+*
+* Called by the CircleOS scheduler to manage the states of the LEDs.
+* LEDs may be on, off or blinking according to their state.
+*
+* @param[in] id A LED_id indicating the LED to take care of.
+*
+**/
+/******************************************************************************/
+void LED_Handler_hw( enum LED_id id )
+ {
+ int counter;
+ enum LED_mode mode;
+
+ // Choose the right LED parameters.
+ if( id == LED_GREEN )
+ {
+ counter = GreenLED_Counter;
+ mode = GreenLED_newmode;
+ }
+ else
+ {
+ counter = RedLED_Counter;
+ mode = RedLED_newmode;
+ }
+
+ switch( mode )
+ {
+ case LED_OFF :
+ case LED_ON :
+ if( ( ( id == LED_GREEN ) && ( GreenLED_mode == mode ) ) ||
+ ( ( id == LED_RED ) && ( RedLED_mode == mode ) ) )
+ {
+ return;
+ }
+
+ if( id == LED_GREEN )
+ {
+ GPIO_WriteBit( GPIOB, GPIO_Pin_8, ( mode == LED_OFF ) ? Bit_RESET : Bit_SET );
+
+ GreenLED_mode = mode;
+ }
+ else if( id == LED_RED )
+ {
+ GPIO_WriteBit( GPIOB, GPIO_Pin_9, ( mode == LED_OFF ) ? Bit_RESET : Bit_SET );
+
+ RedLED_mode = mode;
+ }
+
+ counter = -1;
+ break;
+
+ case LED_BLINKING_HF :
+ counter++;
+
+ if( counter == HalfPeriod_HF )
+ {
+ GPIO_WriteBit( GPIOB, ( id == LED_RED ) ? GPIO_Pin_9 : GPIO_Pin_8, Bit_SET );
+ }
+ else if( ( counter < 0 ) || ( counter >= Period_HF ) )
+ {
+ GPIO_WriteBit( GPIOB, ( id == LED_RED ) ? GPIO_Pin_9 : GPIO_Pin_8, Bit_RESET );
+
+ counter = 0;
+ }
+ break;
+
+ case LED_BLINKING_LF :
+ counter++;
+
+ if( counter == HalfPeriod_LF )
+ {
+ GPIO_WriteBit( GPIOB, ( id == LED_RED ) ? GPIO_Pin_9 : GPIO_Pin_8, Bit_SET );
+ }
+
+ else if( ( counter < 0 ) || ( counter >= Period_LF ) )
+ {
+ GPIO_WriteBit( GPIOB, ( id == LED_RED ) ? GPIO_Pin_9 : GPIO_Pin_8, Bit_RESET );
+
+ counter = 0;
+ }
+ break;
+
+ default :
+ break;
+ }
+
+ if( id == LED_GREEN )
+ {
+ GreenLED_Counter = counter;
+ GreenLED_mode = mode;
+ }
+ else
+ {
+ RedLED_Counter = counter;
+ RedLED_mode = mode;
+ }
+ }
+
+/// @endcond
+
+/* Public functions ----------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* LED_Set
+*
+*******************************************************************************/
+/**
+*
+* Set a specified LED in a specified mode.
+*
+* @param[in] id A LED_id specifying the LED to change the mode.
+* @param[in] mode A LED_mode describing the new LED mode.
+*
+**/
+/******************************************************************************/
+void LED_Set( enum LED_id id, enum LED_mode mode )
+ {
+ if( id == LED_GREEN )
+ {
+ GreenLED_newmode = mode;
+ }
+ else if( id == LED_RED )
+ {
+ RedLED_newmode = mode;
+ }
+ }
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/mems.c b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/mems.c
new file mode 100644
index 000000000..e226cd9fa
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/mems.c
@@ -0,0 +1,605 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
+/**
+*
+* @file mems.c
+* @brief Mems Initialization and management
+* @author FL
+* @date 07/2007
+* @version 1.1
+* @date 10/2007
+* @version 1.5 various corrections reported by Ron Miller
+*
+**/
+/******************************************************************************/
+
+/* Includes ------------------------------------------------------------------*/
+#include "circle.h"
+
+/// @cond Internal
+
+/* Private define ------------------------------------------------------------*/
+#define RDOUTXL 0xE8 /*!< Multiple Read from OUTXL */
+#define WRCTRL_REG1 0x20 /*!< Single Write CTRL_REG */
+#define RDCTRL_REG1 0xA0 /*!< Single Read CTRL_REG */
+#define RDID 0x8F /*!< Single Read WHO_AM_I */
+#define LOW 0x00 /*!< ChipSelect line low */
+#define HIGH 0x01 /*!< ChipSelect line high */
+#define DUMMY_BYTE 0xA5
+#define MEMS_DIVIDER 1
+#define MEMS_TESTING_DIVIDER 101
+#define MARGIN 500
+#define DELAY_REACT 20
+#define MIN_REACT 15
+#define DIV_REACT 10
+#define GRAD_SHOCK 200000
+
+/* Private variables ---------------------------------------------------------*/
+tMEMS_Info MEMS_Info = {0}; // structure definition in circle.h
+int TestingActive = 0;
+int StartingFromResetOrShockCounter = 1000;
+int TimeCounterForDoubleClick = 0;
+int TimeLastShock = 0;
+static int divider = 0;
+static Rotate_H12_V_Match_TypeDef previous_Screen_Orientation;
+u32 Gradient2;
+
+//Filtering
+unsigned N_filtering = 0;
+
+//Gradient
+s16 GradX = 0;
+s16 GradY = 0;
+s16 GradZ = 0;
+
+// Pointer move:
+// each coordinate (X, Y and Z) is described by 3 variables where suffix means:
+// f = flag to indicate that a move has been done. Cleared by the Ptr Manager when acknowledged.
+// i = amplitude of the move (Grad / 10)
+// t = delay to accept the counter reaction
+int fMovePtrX;
+int iMovePtrX;
+int tMovePtrX;
+int fMovePtrY;
+int iMovePtrY;
+int tMovePtrY;
+int fMovePtrZ;
+int iMovePtrZ;
+int tMovePtrZ;
+
+s16 XInit = 0;
+s16 YInit = 0;
+s16 ZInit = 0;
+
+/* Private function prototypes -----------------------------------------------*/
+static void MEMS_ChipSelect( u8 State );
+static u8 MEMS_SendByte( u8 byte );
+static void MEMS_WriteEnable( void );
+static u32 MEMS_ReadOutXY( void );
+static void MEMS_WakeUp( void );
+
+/* Private functions ---------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* MEMS_WakeUp
+*
+*******************************************************************************/
+/**
+* Wake Up Mems.
+*
+**/
+/******************************************************************************/
+static void MEMS_WakeUp( void )
+ {
+ u8 reg_val;
+
+ /* read RDCTRL_REG1 */
+
+ /* Chip Select low */
+ MEMS_ChipSelect( LOW );
+
+ /* Send "RDCTRL_REG1" instruction */
+ MEMS_SendByte( RDCTRL_REG1 );
+
+ reg_val = MEMS_SendByte( DUMMY_BYTE );
+
+ /* Chip Select high */
+ MEMS_ChipSelect( HIGH );
+
+ /* SET P0:P1 to '11' */
+ /* 0xC0 to wake up and 0x30 for full speed frequency (640 Hz). */
+ reg_val = reg_val | 0xC0 | 0x30;
+
+ /* Chip Select low */
+ MEMS_ChipSelect( LOW );
+
+ /* Send "WRCTRL_REG1" instruction */
+ MEMS_SendByte( WRCTRL_REG1 );
+ MEMS_SendByte( reg_val );
+
+ /* Chip Select high */
+ MEMS_ChipSelect( HIGH );
+ }
+
+/*******************************************************************************
+*
+* MEMS_ReadOutXY
+*
+*******************************************************************************/
+/**
+* Reads X and Y Out.
+*
+* @return An unsigned 32 bit word with the highest 16 bits containing the Y
+* and the lowest 16 bits the X.
+*
+**/
+/******************************************************************************/
+static u32 MEMS_ReadOutXY( void )
+ {
+ u8 OutXL;
+ u8 OutXH;
+ u8 OutYL;
+ u8 OutYH;
+ u8 OutZL;
+ u8 OutZH;
+
+ /* Chip Select low */
+ MEMS_ChipSelect( LOW );
+
+ /* Send "RDOUTXL" instruction */
+ MEMS_SendByte( RDOUTXL );
+
+ /* Read a byte */
+ OutXL = MEMS_SendByte( DUMMY_BYTE );
+
+ /* Read a byte */
+ OutXH = MEMS_SendByte( DUMMY_BYTE );
+
+ /* Read a byte */
+ OutYL = MEMS_SendByte( DUMMY_BYTE );
+
+ /* Read a byte */
+ OutYH = MEMS_SendByte( DUMMY_BYTE );
+
+ /* Read a byte */
+ OutZL = MEMS_SendByte( DUMMY_BYTE );
+
+ /* Read a byte */
+ OutZH = MEMS_SendByte( DUMMY_BYTE );
+
+ MEMS_Info.OutX = OutXL + ( OutXH << 8 );
+ MEMS_Info.OutY = OutYL + ( OutYH << 8 );
+ MEMS_Info.OutZ = OutZL + ( OutZH << 8 );
+
+ /* Chip Select high */
+ MEMS_ChipSelect( HIGH );
+
+ MEMS_Info.OutX_F4 += ( MEMS_Info.OutX - ( MEMS_Info.OutX_F4 >> 2 ) ); // Filter on 4 values.
+ MEMS_Info.OutY_F4 += ( MEMS_Info.OutY - ( MEMS_Info.OutY_F4 >> 2 ) ); // Filter on 4 values.
+ MEMS_Info.OutZ_F4 += ( MEMS_Info.OutZ - ( MEMS_Info.OutZ_F4 >> 2 ) ); // Filter on 4 values.
+
+ MEMS_Info.OutX_F16 += ( MEMS_Info.OutX - ( MEMS_Info.OutX_F16 >> 4 ) ); // Filter on 16 values.
+ MEMS_Info.OutY_F16 += ( MEMS_Info.OutY - ( MEMS_Info.OutY_F16 >> 4 ) ); // Filter on 16 values.
+ MEMS_Info.OutZ_F16 += ( MEMS_Info.OutZ - ( MEMS_Info.OutZ_F16 >> 4 ) ); // Filter on 16 values.
+
+ MEMS_Info.OutX_F64 += ( MEMS_Info.OutX - ( MEMS_Info.OutX_F64 >> 6 ) ); // Filter on 64 values.
+ MEMS_Info.OutY_F64 += ( MEMS_Info.OutY - ( MEMS_Info.OutY_F64 >> 6 ) ); // Filter on 64 values.
+ MEMS_Info.OutZ_F64 += ( MEMS_Info.OutZ - ( MEMS_Info.OutZ_F64 >> 6 ) ); // Filter on 64 values.
+
+ MEMS_Info.OutX_F256 += ( MEMS_Info.OutX - ( MEMS_Info.OutX_F256 >> 8) ); // Filter on 256 values.
+ MEMS_Info.OutY_F256 += ( MEMS_Info.OutY - ( MEMS_Info.OutY_F256 >> 8) ); // Filter on 256 values.
+ MEMS_Info.OutZ_F256 += ( MEMS_Info.OutZ - ( MEMS_Info.OutZ_F256 >> 8) ); // Filter on 256 values.
+
+ if( N_filtering < 256 )
+ {
+ // Just to validate the calculated average values.
+ N_filtering++;
+ }
+
+ return ( MEMS_Info.OutX + ( MEMS_Info.OutY << 16 ) );
+ }
+
+/*******************************************************************************
+*
+* MEMS_ChipSelect
+*
+*******************************************************************************/
+/**
+* Selects or deselects the MEMS device.
+*
+* @param[in] State Level to be applied on ChipSelect pin.
+*
+**/
+/******************************************************************************/
+static void MEMS_ChipSelect( u8 State )
+ {
+ /* Set High or low the chip select line on PA.4 pin */
+ GPIO_WriteBit( GPIOD, GPIO_Pin_2, (BitAction)State );
+ }
+
+/*******************************************************************************
+*
+* MEMS_SendByte
+*
+*******************************************************************************/
+/**
+* Sends a byte through the SPI interface and return the byte received from
+* the SPI bus.
+*
+* @param[in] byte The byte to send to the SPI interface.
+*
+* @return The byte returned by the SPI bus.
+*
+**/
+/******************************************************************************/
+static u8 MEMS_SendByte( u8 byte )
+ {
+ /* Loop while DR register in not emplty */
+ while( SPI_GetFlagStatus( SPI2, SPI_FLAG_TXE ) == RESET );
+
+ /* Send byte through the SPI2 peripheral */
+ SPI_SendData( SPI2, byte );
+
+ /* Wait to receive a byte */
+ while( SPI_GetFlagStatus( SPI2, SPI_FLAG_RXNE ) == RESET );
+
+ /* Return the byte read from the SPI bus */
+ return SPI_ReceiveData( SPI2 );
+ }
+
+/* Public functions for CircleOS ---------------------------------------------*/
+
+/*******************************************************************************
+*
+* MEMS_Init
+*
+*******************************************************************************/
+/**
+*
+* Initializes the peripherals used by the SPI MEMS driver.
+*
+* @attention This function must NOT be called by the user.
+*
+**/
+/******************************************************************************/
+void MEMS_Init(void)
+{
+ SPI_InitTypeDef SPI_InitStructure;
+ GPIO_InitTypeDef GPIO_InitStructure;
+
+ /* Configure PC6 and PC7 as Output push-pull For MEMS*/
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+
+ GPIO_Init( GPIOC, &GPIO_InitStructure );
+
+ /* Enable SPI2 and GPIOA clocks */
+ RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );
+ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
+ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE );
+
+ /* Configure SPI2 pins: SCK, MISO and MOSI */
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+
+ GPIO_Init( GPIOB, &GPIO_InitStructure );
+
+ /* Configure PD2 as Output push-pull, used as MEMS Chip select */
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+
+ GPIO_Init( GPIOD, &GPIO_InitStructure );
+
+ /* SPI2 configuration */
+ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
+ SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
+ SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
+ SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
+ SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
+ SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
+ SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
+ SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
+ SPI_InitStructure.SPI_CRCPolynomial = 7;
+
+ SPI_Init( SPI2, &SPI_InitStructure );
+
+ /* Enable SPI2 */
+ SPI_Cmd( SPI2, ENABLE );
+
+ if( MEMS_ReadID() != 0x3A )
+ {
+ int i;
+
+ // Try to resynchronize
+ for( i = 0 ; i < 17 ; i++ )
+ {
+ /* Configure SPI2 pins: SCK, MISO and MOSI */
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+
+ GPIO_Init( GPIOB, &GPIO_InitStructure );
+ GPIO_WriteBit( GPIOB, GPIO_Pin_15, HIGH );
+ MEMS_ChipSelect( LOW );
+
+ GPIO_WriteBit( GPIOB, GPIO_Pin_13, LOW );
+ GPIO_WriteBit( GPIOB, GPIO_Pin_13, HIGH );
+ MEMS_ChipSelect( HIGH );
+
+ /* Configure again PB. SCK as SPI2 pin */
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+
+ GPIO_Init( GPIOB, &GPIO_InitStructure );
+ if ( MEMS_ReadID() == 0x3A )
+ {
+ break;
+ }
+ }
+
+ if( i == 17 )
+ {
+ DRAW_DisplayString( 1, 50, "Test MEM ID Failed", 17 );
+ }
+ }
+
+ /* Read for the first time */
+ N_filtering = 0;
+
+ MEMS_ReadOutXY();
+
+ MEMS_Info.OutX_F4 = MEMS_Info.OutX_F16 = MEMS_Info.OutX_F64 = MEMS_Info.OutX_F256 = MEMS_Info.OutX;
+ MEMS_Info.OutY_F4 = MEMS_Info.OutY_F16 = MEMS_Info.OutY_F64 = MEMS_Info.OutY_F256 = MEMS_Info.OutY;
+ MEMS_Info.OutZ_F4 = MEMS_Info.OutZ_F16 = MEMS_Info.OutZ_F64 = MEMS_Info.OutZ_F256 = MEMS_Info.OutZ;
+
+ /* Init X and Y*/
+ MEMS_GetPosition( &XInit, &YInit );
+
+ /* Wake Up Mems*/
+ MEMS_WakeUp();
+}
+
+/*******************************************************************************
+*
+* MEMS_Handler
+*
+*******************************************************************************/
+/**
+*
+* Called by the CircleOS scheduler to manage the MEMS. The Circle beeps if the
+* MEMS is shocked.
+*
+* @attention This function must NOT be called by the user.
+*
+**/
+/******************************************************************************/
+void MEMS_Handler( void )
+ {
+ char buffer [20];
+ int i;
+ int ofs_disp = 0;
+
+ if( StartingFromResetOrShockCounter )
+ {
+ StartingFromResetOrShockCounter--;
+ }
+ TimeCounterForDoubleClick++;
+
+ MEMS_ReadOutXY();
+
+ // Evaluate gradients
+ GradX = ( MEMS_Info.OutX_F4 >> 2 ) - MEMS_Info.OutX;
+ GradY = ( MEMS_Info.OutY_F4 >> 2 ) - MEMS_Info.OutY;
+ GradZ = ( MEMS_Info.OutZ_F4 >> 2 ) - MEMS_Info.OutZ;
+
+ // Decide whether a direction is selected
+ if( tMovePtrX == 0 )
+ {
+ if( ( GradX > MIN_REACT ) || ( GradX < -MIN_REACT ) )
+ {
+ iMovePtrX = GradX / DIV_REACT;
+ tMovePtrX = DELAY_REACT;
+ fMovePtrX = 1;
+ }
+ }
+ else
+ {
+ tMovePtrX--;
+ }
+
+ if( tMovePtrY == 0 )
+ {
+ if( ( GradY > MIN_REACT ) || ( GradY < -MIN_REACT ) )
+ {
+ iMovePtrY = GradY / DIV_REACT; //FL071012 rrm fix
+ tMovePtrY = DELAY_REACT;
+ fMovePtrY = 1;
+ }
+ }
+ else
+ {
+ tMovePtrY--;
+ }
+
+ if( tMovePtrZ==0 )
+ {
+ if( ( GradZ > MIN_REACT ) || ( GradY < -MIN_REACT ) )
+ {
+ iMovePtrZ = GradZ / DIV_REACT;
+ tMovePtrZ = DELAY_REACT;
+ fMovePtrZ = 1;
+ }
+ }
+ else
+ {
+ tMovePtrZ--;
+ }
+
+ Gradient2 = (s32)GradX * (s32)GradX + (s32)GradY * (s32)GradY + (s32)GradZ * (s32)GradZ;
+
+ // MEMS is shocked, let's beep!
+ if( ( Gradient2 > GRAD_SHOCK ) && ( BUZZER_GetMode() == BUZZER_OFF ) && ( StartingFromResetOrShockCounter == 0 ) )
+ {
+ MEMS_Info.Shocked++;
+/*FL071007 = 1;
+ Suggested by Bob Seabrook: a further posiblity is to increment Shocked rather than just setting it
+ So it can still be tested for non zero as before but one can get more
+ info from the int without extra cost. */
+
+#define DELAY_BETWEEN_TWO_SHOCK 20
+#define MAX_DELAY_FOR_DOUBLECLICK 150
+ StartingFromResetOrShockCounter = DELAY_BETWEEN_TWO_SHOCK; //< filter: short delay before detecting the next shock
+ if ( (TimeCounterForDoubleClick - TimeLastShock) < MAX_DELAY_FOR_DOUBLECLICK )
+ {
+ MEMS_Info.DoubleClick++;
+ TimeLastShock = 0;
+ }
+ else
+ {
+ TimeLastShock = TimeCounterForDoubleClick;
+ }
+ BUZZER_SetMode( BUZZER_SHORTBEEP );
+ }
+ }
+
+/*******************************************************************************
+*
+* MEMS_ReadID
+*
+*******************************************************************************/
+/**
+* Reads SPI chip identification.
+*
+* @return The SPI chip identification.
+*
+**/
+/******************************************************************************/
+u8 MEMS_ReadID( void )
+ {
+ u8 Temp = 0;
+
+ /* Chip Select low */
+ MEMS_ChipSelect( LOW );
+
+ /* Send "RDID" instruction */
+ MEMS_SendByte( RDID );
+
+ /* Read a byte from the MEMS */
+ Temp = MEMS_SendByte( DUMMY_BYTE );
+
+ /* Chip Select low */
+ MEMS_ChipSelect( HIGH );
+
+ return Temp;
+ }
+
+/// @endcond
+
+/* Public functions ----------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* MEMS_GetPosition
+*
+*******************************************************************************/
+/**
+*
+* Returns the current (relative) position of the Primer.
+* Only X-Y axis are considered here.
+*
+* @param[out] pX Current horizontal coordinate.
+* @param[out] pY Current vertical coordinate.
+*
+* @warning The (0x0) point in on the low left corner.
+* @note For absolute position information use MEMS_GetInfo()
+*
+**/
+/******************************************************************************/
+void MEMS_GetPosition( s16* pX, s16* pY )
+ {
+ *pX = MEMS_Info.OutX - XInit;
+ *pY = MEMS_Info.OutY - YInit;
+ }
+
+/*******************************************************************************
+*
+* MEMS_GetRotation
+*
+*******************************************************************************/
+/**
+*
+* Returns current screen orientation.
+*
+* @param[out] pH12 Current screen orientation.
+*
+**/
+/******************************************************************************/
+void MEMS_GetRotation( Rotate_H12_V_Match_TypeDef* pH12 )
+ {
+ s16 sX = MEMS_Info.OutX;
+ s16 sY = MEMS_Info.OutY;
+
+ if( ( ( sX <= -MARGIN ) && ( sY <= 0 ) && (sX<=sY ) ) ||
+ ( ( sX <=- MARGIN ) && ( sY > 0) && (sX <= (-sY ) ) ) )
+ {
+ // 1st case: x<0, |x|>y => H12 = V9
+ *pH12 = V9;
+ }
+ else if( ( ( sY <= -MARGIN ) && ( sX <= 0 ) && ( sY <= sX ) ) ||
+ ( ( sY <= -MARGIN ) && ( sX > 0 ) && ( sY <= (-sX ) ) ) )
+ {
+ // 2nd case: y<0, |y|>x => H12 = V12
+ *pH12 = V12;
+ }
+ else if( ( ( sX >= MARGIN ) && ( sY <= 0 ) && ( sX >= (-sY) ) ) ||
+ ( ( sX >= MARGIN ) && ( sY > 0 ) && ( sX >= sY ) ) )
+ {
+ // 3rd case: x>0, |x|>y => H12=V3
+ *pH12 = V3;
+ }
+ else if( ( ( sY >= MARGIN ) && ( sX <= 0 ) && ( sY >= (-sX ) ) ) ||
+ ( ( sY >= MARGIN ) && ( sX > 0 ) && ( sY >= sX ) ) )
+ {
+ // 4th case: y>0, |y|>x => H12=V6
+ *pH12 = V6;
+ }
+ }
+
+/*******************************************************************************
+*
+* MEMS_SetNeutral
+*
+*******************************************************************************/
+/**
+*
+* Set current position as "neutral position".
+*
+**/
+/******************************************************************************/
+void MEMS_SetNeutral( void )
+ {
+ // Set Neutral position.
+ MEMS_GetPosition( &XInit, &YInit );
+ }
+
+/*******************************************************************************
+*
+* MEMS_GetInfo
+*
+*******************************************************************************/
+/**
+*
+* Return the current MEMS information (state, absolute position...).
+*
+* @return a pointer to tMEMS_Info
+*
+**/
+/******************************************************************************/
+tMEMS_Info* MEMS_GetInfo( void )
+ {
+ return &MEMS_Info;
+ }
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/pointer.c b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/pointer.c
new file mode 100644
index 000000000..02fe9834b
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/pointer.c
@@ -0,0 +1,901 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
+/**
+*
+* @file pointer.c
+* @brief Various utilities for the pointer management for STM32-primer.
+* @author FL
+* @date 07/2007
+* @version 1.1
+* @date 10/2007
+* @version 1.5 various corrections reported by Ron Miller to suppress jittery
+*
+*
+**/
+/******************************************************************************/
+
+/* Includes ------------------------------------------------------------------*/
+#include "circle.h"
+
+/// @cond Internal
+
+/* Private define ------------------------------------------------------------*/
+#define POS_MIN 0
+#define POS_MAX (SCREEN_WIDTH - POINTER_WIDTH - 1)
+#define POINTER_DIVIDER 50
+#define POINTER_DEFAULT_COLOR RGB_BLUE
+
+// defines for pointer move
+#define ANGLEPAUSE 500
+#define DEFAULT_ANGLESTART 25
+#define MIN_ANGLE_FOR_SHIFT_UP (ANGLEPAUSE+CurrentAngleStart)
+#define MIN_ANGLE_FOR_SHIFT_DOWN (ANGLEPAUSE-CurrentAngleStart)
+#define MIN_ANGLE_FOR_SHIFT_RIGHT (signed)(0+CurrentAngleStart)
+#define MIN_ANGLE_FOR_SHIFT_LEFT (signed)(0-CurrentAngleStart)
+#define DEFAULT_SPEED_ON_ANGLE 60
+
+/* Private variables ---------------------------------------------------------*/
+static int divider = 0;
+
+unsigned char BallPointerBmp[ POINTER_WIDTH ] = { 0x38, 0x7C, 0xFF, 0xFF, 0xFF, 0x7C, 0x38 } ;
+unsigned char locbuf[ POINTER_WIDTH ];
+unsigned char DefaultAreaStore[ 2 * POINTER_WIDTH * POINTER_WIDTH ];
+
+// Variables for pointer.
+u8* CurrentPointerBmp = 0;
+u8 CurrentPointerWidth = 0;
+u8 CurrentPointerHeight = 0;
+u16 CurrentSpeedOnAngle = DEFAULT_SPEED_ON_ANGLE;
+u32 CurrentAngleStart = DEFAULT_ANGLESTART ;
+unsigned char* ptrAreaStore = DefaultAreaStore;
+u16 CurrentPointerColor = POINTER_DEFAULT_COLOR;
+enum POINTER_mode Pointer_Mode = POINTER_UNDEF;
+enum POINTER_state Pointer_State = POINTER_S_UNDEF;
+
+s16 OUT_X;
+s16 OUT_Y;
+
+// Init pointer Info Structure (structure definition in circle.h)
+tPointer_Info POINTER_Info = {
+ SCREEN_WIDTH - POINTER_WIDTH / 2,
+ SCREEN_WIDTH - POINTER_WIDTH / 2,
+ 0,
+ 0} ;
+
+/* Private function prototypes -----------------------------------------------*/
+static int POINTER_Move ( void );
+
+/* Private functions ---------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* Pointer_Move
+*
+*******************************************************************************/
+/**
+* Moves LCD pointer according to Mems indications.
+*
+* @retval 0 The pointer resides in the screen
+* @retval -1 The pointer touche the screen edges.
+*
+**/
+/******************************************************************************/
+static int POINTER_Move( void )
+ {
+ int res = 0;
+ s16 oldPointer_xPos = POINTER_Info.xPos;
+ s16 oldPointer_yPos = POINTER_Info.yPos;
+ s16 unmodied_shift_PosX;
+ s16 unmodied_shift_PosY;
+ signed outx = MEMS_Info.OutX_F16 >> 4;
+ signed outy = MEMS_Info.OutY_F16 >> 4;
+
+ POINTER_Info.shift_PosX = POINTER_Info.shift_PosY = 0;
+
+ // The move depends on the screen orientation
+ switch( LCD_GetScreenOrientation() )
+ {
+ // north
+ case V12 :
+ MEMS_Info.RELATIVE_X = outx;
+ MEMS_Info.RELATIVE_Y = outy;
+
+ if( outx > MIN_ANGLE_FOR_SHIFT_RIGHT )
+ {
+ POINTER_Info.shift_PosX = ( outx - MIN_ANGLE_FOR_SHIFT_RIGHT );
+ }
+ else if( outx < MIN_ANGLE_FOR_SHIFT_LEFT )
+ {
+ POINTER_Info.shift_PosX = ( outx - MIN_ANGLE_FOR_SHIFT_LEFT );
+ }
+
+ if( outy < -MIN_ANGLE_FOR_SHIFT_UP )
+ {
+ POINTER_Info.shift_PosY = ( outy + MIN_ANGLE_FOR_SHIFT_UP );
+ }
+ else if( outy > -MIN_ANGLE_FOR_SHIFT_DOWN )
+ {
+ POINTER_Info.shift_PosY = ( outy + MIN_ANGLE_FOR_SHIFT_DOWN );
+ }
+ break;
+
+ // West
+ case V9 :
+ MEMS_Info.RELATIVE_X = -( outy );
+ MEMS_Info.RELATIVE_Y = outx;
+
+ if( outy > MIN_ANGLE_FOR_SHIFT_RIGHT )
+ {
+ POINTER_Info.shift_PosX = -( outy - MIN_ANGLE_FOR_SHIFT_RIGHT );
+ }
+ else if( outy < MIN_ANGLE_FOR_SHIFT_LEFT )
+ {
+ POINTER_Info.shift_PosX = -( outy - MIN_ANGLE_FOR_SHIFT_LEFT );
+ }
+
+ if( outx < -MIN_ANGLE_FOR_SHIFT_UP )
+ {
+ POINTER_Info.shift_PosY = ( outx + MIN_ANGLE_FOR_SHIFT_UP );
+ }
+ else if( outx > -MIN_ANGLE_FOR_SHIFT_DOWN )
+ {
+ POINTER_Info.shift_PosY = ( outx + MIN_ANGLE_FOR_SHIFT_DOWN );
+ }
+ break;
+
+ // South
+ case V6 :
+ MEMS_Info.RELATIVE_X = -( outx );
+ MEMS_Info.RELATIVE_Y = -( outy );
+
+ if( outx > MIN_ANGLE_FOR_SHIFT_RIGHT )
+ {
+ POINTER_Info.shift_PosX = ( MIN_ANGLE_FOR_SHIFT_RIGHT - outx );
+ }
+ else if( outx < MIN_ANGLE_FOR_SHIFT_LEFT )
+ {
+ POINTER_Info.shift_PosX = ( MIN_ANGLE_FOR_SHIFT_LEFT - outx );
+ }
+
+ if( outy > MIN_ANGLE_FOR_SHIFT_UP )
+ {
+ POINTER_Info.shift_PosY = -( outy - MIN_ANGLE_FOR_SHIFT_UP );
+ }
+ else if( outy < MIN_ANGLE_FOR_SHIFT_DOWN )
+ {
+ POINTER_Info.shift_PosY = +( MIN_ANGLE_FOR_SHIFT_DOWN - outy );
+ }
+ break;
+
+ // East
+ case V3 :
+ MEMS_Info.RELATIVE_X = outy;
+ MEMS_Info.RELATIVE_Y = -( outx );
+
+ if( outy > MIN_ANGLE_FOR_SHIFT_RIGHT )
+ {
+ POINTER_Info.shift_PosX = ( outy - MIN_ANGLE_FOR_SHIFT_RIGHT );
+ }
+ else if( outy < MIN_ANGLE_FOR_SHIFT_LEFT )
+ {
+ POINTER_Info.shift_PosX = ( outy - MIN_ANGLE_FOR_SHIFT_LEFT );
+ }
+
+ if( outx > MIN_ANGLE_FOR_SHIFT_UP )
+ {
+ POINTER_Info.shift_PosY = ( MIN_ANGLE_FOR_SHIFT_UP - outx);
+ }
+ else if( outx < MIN_ANGLE_FOR_SHIFT_DOWN )
+ {
+ POINTER_Info.shift_PosY = ( MIN_ANGLE_FOR_SHIFT_DOWN - outx );
+ }
+
+ default :
+ break;
+ }
+
+ unmodied_shift_PosX = POINTER_Info.shift_PosX;
+ unmodied_shift_PosY = POINTER_Info.shift_PosY;
+
+ POINTER_Info.shift_PosX /= CurrentSpeedOnAngle;
+ POINTER_Info.shift_PosY /= CurrentSpeedOnAngle;
+
+ if( Pointer_Mode == POINTER_APPLICATION )
+ {
+ if ( Application_Pointer_Mgr )
+ {
+ Application_Pointer_Mgr( POINTER_Info.shift_PosX, POINTER_Info.shift_PosY );
+ }
+
+ return 0;
+ }
+
+ POINTER_Info.xPos += POINTER_Info.shift_PosX;
+ POINTER_Info.yPos += POINTER_Info.shift_PosY;
+
+ if( POINTER_Info.xPos < POINTER_Info.X_PosMin )
+ {
+ POINTER_Info.xPos = POINTER_Info.X_PosMin;
+ }
+
+ if( POINTER_Info.xPos > POINTER_Info.X_PosMax )
+ {
+ POINTER_Info.xPos = POINTER_Info.X_PosMax;
+ }
+
+ if( POINTER_Info.yPos < POINTER_Info.Y_PosMin )
+ {
+ POINTER_Info.yPos = POINTER_Info.Y_PosMin;
+ }
+
+ if( POINTER_Info.yPos > POINTER_Info.Y_PosMax )
+ {
+ POINTER_Info.yPos = POINTER_Info.Y_PosMax;
+ }
+
+ if( ( Pointer_Mode != POINTER_MENU ) && ( Pointer_Mode != POINTER_RESTORE_LESS ) &&
+ ( ( oldPointer_xPos != POINTER_Info.xPos ) || ( oldPointer_yPos != POINTER_Info.yPos ) ) )
+ {
+ // Use default area.
+ POINTER_SetCurrentAreaStore( 0 );
+
+ // Restore previously drawn area.
+ POINTER_Restore( oldPointer_xPos, oldPointer_yPos, POINTER_WIDTH, POINTER_WIDTH );
+
+ // Save new area and draw pointer
+ POINTER_Save( POINTER_Info.xPos, POINTER_Info.yPos, POINTER_WIDTH, POINTER_WIDTH );
+ POINTER_Draw( POINTER_Info.xPos, POINTER_Info.yPos, POINTER_WIDTH, POINTER_WIDTH, CurrentPointerBmp );
+ }
+
+ if( ( Pointer_Mode == POINTER_RESTORE_LESS ) &&
+ ( ( oldPointer_xPos != POINTER_Info.xPos ) || ( oldPointer_yPos != POINTER_Info.yPos ) ) )
+ {
+ // Use default area.
+ POINTER_SetCurrentAreaStore( 0 );
+
+ // Restore previously drawn area.
+ POINTER_Restore( oldPointer_xPos, oldPointer_yPos, CurrentPointerWidth, CurrentPointerHeight );
+
+ // Save new area and draw pointer
+ POINTER_Save( POINTER_Info.xPos, POINTER_Info.yPos, CurrentPointerWidth, CurrentPointerHeight );
+ POINTER_Draw( POINTER_Info.xPos, POINTER_Info.yPos, CurrentPointerWidth, CurrentPointerHeight, CurrentPointerBmp );
+ }
+
+ // Is the pointer touching one edge of the screen ?
+ if( ( POINTER_Info.xPos == POS_MIN ) || ( POINTER_Info.yPos == POS_MIN ) ||
+ ( POINTER_Info.xPos == POS_MAX ) || ( POINTER_Info.yPos == POS_MAX ) )
+ {
+ res = -1;
+ }
+
+ return res;
+ }
+
+/* Public functions for CircleOS ---------------------------------------------*/
+
+/*******************************************************************************
+*
+* POINTER_Init
+*
+*******************************************************************************/
+/**
+* Initialize pointer. Called at CircleOS startup. Set default pointer at the
+* middle of the screen and allows it to move into the whole screen.
+*
+* @attention This function must NOT be called by the user.
+*
+**/
+/******************************************************************************/
+void POINTER_Init( void )
+ {
+ // Increase pointer sensibility.
+ POINTER_SetCurrentSpeedOnAngle( DEFAULT_SPEED_ON_ANGLE );
+ POINTER_SetCurrentAngleStart( DEFAULT_ANGLESTART );
+ POINTER_SetCurrentPointer( POINTER_WIDTH, POINTER_WIDTH, BallPointerBmp );
+ POINTER_SetMode( POINTER_ON );
+ POINTER_SetPos( 56, 56 );
+ POINTER_SetRectScreen();
+
+ CurrentPointerColor = POINTER_DEFAULT_COLOR;
+ }
+
+/*******************************************************************************
+*
+* POINTER_Handler
+*
+*******************************************************************************/
+/**
+*
+* Called by the CircleOS scheduler to manage the pointer.
+*
+* @attention This function must NOT be called by the user.
+*
+**/
+/******************************************************************************/
+void POINTER_Handler( void )
+ {
+ switch( Pointer_Mode )
+ {
+ // Nothing to do!
+ case POINTER_OFF :
+ case POINTER_UNDEF:
+ return;
+ }
+
+ // Where is the MEMS ?
+ MEMS_GetPosition( &OUT_X, &OUT_Y );
+
+ POINTER_Move();
+ }
+
+/// @endcond
+
+/* Public functions ----------------------------------------------------------*/
+
+/*******************************************************************************
+*
+* POINTER_SetCurrentPointer
+*
+*******************************************************************************/
+/**
+*
+* Set the dimension and the bitmap of the pointer.
+* @note The bitmap is a monochrome one!
+*
+* @param[in] width width of the pointer (u8)
+* @param[in] height height of the pointer (u8)
+* @param[in] bmp pointer to an array of width * height bits.
+*
+**/
+/********************************************************************************/
+void POINTER_SetCurrentPointer( u8 width, u8 height, u8* bmp )
+ {
+ if( !bmp )
+ {
+ bmp = BallPointerBmp;
+ }
+
+ CurrentPointerWidth = width;
+ CurrentPointerHeight = height;
+ CurrentPointerBmp = bmp;
+ }
+
+/*******************************************************************************
+*
+* POINTER_GetCurrentAngleStart
+*
+*******************************************************************************/
+/**
+*
+* Get the current minimal angle to move pointer
+*
+* @return current minimal angle.
+*
+**/
+/******************************************************************************/
+u16 POINTER_GetCurrentAngleStart( void )
+ {
+ return CurrentAngleStart;
+ }
+
+/*******************************************************************************
+*
+* POINTER_SetCurrentAngleStart
+*
+*******************************************************************************/
+/**
+*
+* Set the current minimal angle to move pointer
+*
+* @param[in] newangle The new minimal angle to move pointer.
+*
+**/
+/******************************************************************************/
+void POINTER_SetCurrentAngleStart( u16 newangle )
+ {
+ CurrentAngleStart = newangle;
+ }
+
+/*******************************************************************************
+*
+* POINTER_GetCurrentSpeedOnAngle
+*
+*******************************************************************************/
+/**
+*
+* Return the current speed/angle ratio.
+*
+* @return current ratio.
+*
+**/
+/******************************************************************************/
+u16 POINTER_GetCurrentSpeedOnAngle( void )
+ {
+ return CurrentSpeedOnAngle;
+ }
+
+/*******************************************************************************
+*
+* POINTER_SetCurrentSpeedOnAngle
+*
+*******************************************************************************/
+/**
+*
+* Set the current speed/angle ratio.
+*
+* @param[in] newspeed New speed/angle ratio.
+*
+**/
+/******************************************************************************/
+void POINTER_SetCurrentSpeedOnAngle( u16 newspeed )
+ {
+ CurrentSpeedOnAngle = newspeed;
+ }
+
+/*******************************************************************************
+*
+* POINTER_SetCurrentAreaStore
+*
+*******************************************************************************/
+/**
+*
+* Change the current storage area. If the provided value is NULL, the default
+* storage area will be used.
+*
+* @param[in] ptr New storage area (may be null).
+*
+* @warning Memory space pointed by the provided pointer must be large enough
+* to store a color bitmap corresponding to the pointer area.
+* In other words, space must be width * height * 2 large.
+*
+**/
+/******************************************************************************/
+void POINTER_SetCurrentAreaStore( u8* ptr )
+ {
+ ptrAreaStore = ( ptr == 0 ) ? DefaultAreaStore : ptr;
+ }
+
+/*******************************************************************************
+*
+* POINTER_SetMode
+*
+*******************************************************************************/
+/**
+*
+* Change the current mode of the pointer management.
+*
+* @note Must be called only ONCE!!
+*
+* @param[in] mode New pointer management mode.
+*
+**/
+/******************************************************************************/
+void POINTER_SetMode( enum POINTER_mode mode )
+ {
+ u16* ptr;
+ u16 i;
+ u16 color;
+
+ switch( mode )
+ {
+ case POINTER_APPLICATION:
+ ptr = (u16*)DefaultAreaStore;
+ color = DRAW_GetBGndColor();
+
+ for ( i = 0; i < (CurrentPointerWidth*CurrentPointerHeight) ; i++ )
+ {
+ *ptr++ = color;
+ }
+
+ POINTER_Draw( POINTER_Info.xPos, POINTER_Info.yPos, CurrentPointerWidth, CurrentPointerHeight, CurrentPointerBmp );
+ break;
+
+ case POINTER_RESTORE_LESS:
+ POINTER_Draw( POINTER_Info.xPos, POINTER_Info.yPos, CurrentPointerWidth, CurrentPointerHeight, CurrentPointerBmp );
+ break;
+
+ case POINTER_ON:
+ POINTER_SetCurrentAreaStore( 0 );
+ POINTER_Save( POINTER_Info.xPos, POINTER_Info.yPos, POINTER_WIDTH, POINTER_WIDTH );
+ POINTER_Draw( POINTER_Info.xPos, POINTER_Info.yPos, CurrentPointerWidth, CurrentPointerHeight,CurrentPointerBmp );
+ break;
+
+ case POINTER_OFF:
+ POINTER_Info.xPos = ( SCREEN_WIDTH - POINTER_WIDTH ) / 2;
+ POINTER_Info.yPos = ( SCREEN_WIDTH - POINTER_WIDTH ) / 2;
+
+ case POINTER_MENU:
+ if( Pointer_Mode == POINTER_ON )
+ {
+ POINTER_SetCurrentAreaStore( 0 );
+ POINTER_Restore( POINTER_Info.xPos, POINTER_Info.yPos, POINTER_WIDTH, POINTER_WIDTH );
+ }
+ break;
+ }
+
+ Pointer_Mode = mode;
+ }
+
+/*******************************************************************************
+*
+* POINTER_GetMode
+*
+*******************************************************************************/
+/**
+*
+* Return the current mode of the pointer management
+*
+* @return Current pointer management mode.
+*
+**/
+/******************************************************************************/
+enum POINTER_mode POINTER_GetMode( void )
+ {
+ return Pointer_Mode;
+ }
+
+/*******************************************************************************
+*
+* POINTER_GetState
+*
+*******************************************************************************/
+/**
+*
+* Return current pointer state.
+*
+* @return Current pointer state.
+*
+**/
+/******************************************************************************/
+enum POINTER_state POINTER_GetState( void )
+ {
+ return Pointer_State;
+ }
+
+/*******************************************************************************
+*
+* POINTER_SetRect
+*
+*******************************************************************************/
+/**
+*
+* Set new limits for the move of the pointer
+*
+* @param[in] x Horizontal coordinate of the bottom left corner of the new area.
+* @param[in] y Vertical coordinate of the bottom left corner of the new are.
+* @param[in] width New area width.
+* @param[in] height New area height.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void POINTER_SetRect( s16 x, s16 y, s16 width, s16 height )
+ {
+ POINTER_Info.X_PosMin = x;
+
+ if( POINTER_Info.xPos < POINTER_Info.X_PosMin )
+ {
+ POINTER_Info.xPos = POINTER_Info.X_PosMin;
+ }
+
+ POINTER_Info.X_PosMax = x + width - 1;
+
+ if( POINTER_Info.xPos > POINTER_Info.X_PosMax )
+ {
+ POINTER_Info.xPos = POINTER_Info.X_PosMax;
+ }
+
+ POINTER_Info.Y_PosMin = y;
+
+ if( POINTER_Info.yPos < POINTER_Info.Y_PosMin )
+ {
+ POINTER_Info.yPos = POINTER_Info.Y_PosMin;
+ }
+
+ POINTER_Info.Y_PosMax = y + height - 1;
+
+ if( POINTER_Info.yPos > POINTER_Info.Y_PosMax )
+ {
+ POINTER_Info.yPos = POINTER_Info.Y_PosMax;
+ }
+ }
+
+/*******************************************************************************
+*
+* POINTER_SetRectScreen
+*
+*******************************************************************************/
+/**
+*
+* Allow the pointer to move on the whole screen.
+*
+**/
+/******************************************************************************/
+void POINTER_SetRectScreen( void )
+ {
+ POINTER_SetRect( 0, 0, POS_MAX, POS_MAX );
+ }
+
+/*******************************************************************************
+*
+* POINTER_GetPos
+*
+*******************************************************************************/
+/**
+*
+* Return the current position of the pointer (on the screen).
+*
+* @return The current pointer screen position with X in the LSB and Y in the MSB.
+*
+* @warning The (0x0) point in on the low left corner.
+**/
+/******************************************************************************/
+u16 POINTER_GetPos( void )
+ {
+ return ( POINTER_Info.xPos | ( POINTER_Info.yPos << 8 ) );
+ }
+
+/*******************************************************************************
+*
+* POINTER_SetPos
+*
+*******************************************************************************/
+/**
+*
+* Force the screen position of the pointer.
+*
+* @param[in] x New horizontal coordinate.
+* @param[in] y New vertical coordinate.
+*
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void POINTER_SetPos( u16 x, u16 y )
+ {
+ POINTER_Info.xPos = x;
+ POINTER_Info.yPos = y;
+ }
+
+/*******************************************************************************
+*
+* POINTER_Draw
+*
+*******************************************************************************/
+/**
+*
+* Draw pointer.
+*
+* @param[in] x Horizontal coordinate of the bottom left corner of the pointer.
+* @param[in] y Vertical coordinate of the bottom left corner of the pointer.
+* @param[in] width Pointer bitmap width.
+* @param[in] height Pointer bitmap height.
+* @param[in] bmp Pointer to width * height bit array. If null used default
+* pointer bitmap.
+*
+* @note The provided bitmap is a monochrome one.
+* @warning The (0x0) point in on the low left corner.
+*
+**/
+/******************************************************************************/
+void POINTER_Draw( u8 x, u8 y, u8 width, u8 height, u8* bmp )
+ {
+ int i = 0;
+ int l = 0;
+ int n = 0;
+ char* ptr = ptrAreaStore;
+ char c;
+ u16 val;
+
+ // No bitmap provided, use the default one!
+ if( bmp == 0 )
+ {
+ bmp = BallPointerBmp;
+ }
+
+ // Select the screen area were going to take care about!
+ LCD_SetRect_For_Cmd( x, y, width, height );
+
+ // Let draw to the LCD screen.
+ LCD_SendLCDCmd( ST7637_RAMWR );
+
+ while( n < ( width * height ) )
+ {
+ if( Pointer_Mode != POINTER_RESTORE_LESS )
+ {
+ // Draw pixel using current storage area data for background pixels.
+ c = *ptr++;
+ LCD_SendLCDData( ( bmp[ l + ( i / 8 ) ] & ( 1 << ( 7 - ( i % 8 ) ) ) ) ? ( POINTER_GetColor() & 255 ) : c );
+
+ c = *ptr++;
+ LCD_SendLCDData( ( bmp[ l + ( i / 8 ) ] & ( 1 << ( 7 - ( i % 8 ) ) ) ) ? ( POINTER_GetColor() >> 8 ) : c );
+ }
+ else
+ {
+ // POINTER_RESTORE_LESS: use current background color for background color.
+ c = DRAW_GetBGndColor();
+ val = ( bmp[ l + ( i / 8 ) ] & ( 1 << ( 7 - ( i % 8 ) ) ) ) ? POINTER_GetColor() : c;
+
+ LCD_SendLCDData( val & 255 );
+ LCD_SendLCDData( val >> 8 );
+ }
+
+ n++;
+
+ i++;
+
+ // End of line ?
+ if( i == width )
+ {
+ // Next line!
+ l++;
+ i=0;
+ }
+ }
+ }
+
+/*******************************************************************************
+*
+* POINTER_Save
+*
+*******************************************************************************/
+/**
+*
+* Save the background of the pointer.
+*
+* @param[in] x Horizontal coordinate of the bottom left corner of the area to save.
+* @param[in] y Vertical coordinate of the bottom left corner of the area to save.
+* @param[in] width Width of the area to save.
+* @param[in] height Height of the area to save.
+*
+* @note The store area must be large enough to store all the pixels (16 bits).
+* @warning The (0x0) point in on the low left corner.
+* @see POINTER_Restore
+* @see POINTER_SetCurrentAreaStore
+*
+**/
+/******************************************************************************/
+void POINTER_Save( u8 x, u8 y, u8 width, u8 height )
+ {
+ int i;
+ char* ptr = ptrAreaStore;
+ int bytesize = ( width * height ) * 2; // 2 bytes per pixel.
+
+ // Is this pointer management mode, don't save pointer background!
+ if( Pointer_Mode == POINTER_RESTORE_LESS )
+ {
+ return;
+ }
+
+ // Select the LCD screen area to read.
+ LCD_SetRect_For_Cmd ( x, y, width, height );
+
+ // Send the memory read command to the LCD controller.
+ LCD_SendLCDCmd( ST7637_RAMRD );
+
+ // First returned byte is a dummy!
+ LCD_ReadLCDData();
+
+ for( i = 0; i < bytesize; i++ )
+ {
+ *ptr++ = LCD_ReadLCDData();
+ }
+ }
+
+/*******************************************************************************
+*
+* POINTER_Restore
+*
+*******************************************************************************/
+/**
+*
+* Restore the background of the pointer with data saved in the current store area.
+*
+* @param[in] x Horizontal coordinate of the bottom left corner of the area to restore.
+* @param[in] y Vertical coordinate of the bottom left corner of the area to restore.
+* @param[in] width Width of the area to restore.
+* @param[in] height Height of the area to restore.
+*
+* @warning The (0x0) point in on the low left corner.
+* @see POINTER_Save
+* @see POINTER_SetCurrentAreaStore
+*
+**/
+/******************************************************************************/
+void POINTER_Restore( u8 x, u8 y, u8 width, u8 height )
+ {
+ int i;
+ char* ptr = ptrAreaStore;
+ int bytesize = ( width * height ) * 2; // 2 bytes per pixel.
+
+ // Select the screen area to write.
+ LCD_SetRect_For_Cmd( x, y, width, height );
+
+ // Send the memory write command to the LCD controller.
+ LCD_SendLCDCmd( ST7637_RAMWR );
+
+ for( i = 0; i < bytesize; i++ )
+ {
+ // In this mode, use background color (no data was previously saved).
+ if ( Pointer_Mode == POINTER_RESTORE_LESS )
+ {
+ LCD_SendLCDData( DRAW_GetBGndColor() );
+ }
+ else
+ {
+ LCD_SendLCDData( *ptr++ );
+ }
+ }
+ }
+
+/*******************************************************************************
+*
+* POINTER_SetApplication_Pointer_Mgr
+*
+*******************************************************************************/
+/**
+*
+* Provides an user defined pointer manager.
+*
+* @param[in] mgr Pointer to the user defined pointer manager.
+*
+**/
+/******************************************************************************/
+void POINTER_SetApplication_Pointer_Mgr( tAppPtrMgr mgr )
+ {
+ Application_Pointer_Mgr = mgr;
+ }
+
+/*******************************************************************************
+*
+* POINTER_SetColor
+*
+*******************************************************************************/
+/**
+*
+* Set the pointer color.
+*
+* @param[in] color The new pointer color.
+*
+**/
+/******************************************************************************/
+void POINTER_SetColor( u16 color )
+ {
+ CurrentPointerColor = color;
+ }
+
+/*******************************************************************************
+*
+* POINTER_GetColor
+*
+*******************************************************************************/
+/**
+*
+* Return the current pointer color.
+*
+* @return Current pointer color.
+*
+**/
+/******************************************************************************/
+u16 POINTER_GetColor( void )
+ {
+ return CurrentPointerColor;
+ }
+
+/*******************************************************************************
+*
+* POINTER_GetInfo
+*
+*******************************************************************************/
+/**
+*
+* Get pointer informations.
+*
+* @return A pointer to a pointer information structure.
+*
+**/
+/******************************************************************************/
+tPointer_Info* POINTER_GetInfo( void )
+ {
+ return &POINTER_Info;
+ }
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/scheduler.h b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/scheduler.h
new file mode 100644
index 000000000..11c7e67fa
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/scheduler.h
@@ -0,0 +1,81 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
+/**
+*
+* @file scheduler.h
+* @brief Header file for the SysTick interrupt handler of the CircleOS project.
+* @author FL
+* @author IB
+* @date 07/2007
+*
+**/
+/******************************************************************************/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F10x_IT_H
+#define __STM32F10x_IT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f10x_lib.h"
+
+void NMIException( void );
+void HardFaultException( void );
+void MemManageException( void );
+void BusFaultException( void );
+void UsageFaultException( void );
+void DebugMonitor( void );
+void SVCHandler( void );
+void PendSVC( void );
+void SysTickHandler( void );
+void WWDG_IRQHandler( void );
+void PVD_IRQHandler( void );
+void TAMPER_IRQHandler( void );
+void RTC_IRQHandler( void );
+void FLASH_IRQHandler( void );
+void RCC_IRQHandler( void );
+void EXTI0_IRQHandler( void );
+void EXTI1_IRQHandler( void );
+void EXTI2_IRQHandler( void );
+void EXTI3_IRQHandler( void );
+void EXTI4_IRQHandler( void );
+void DMAChannel1_IRQHandler( void );
+void DMAChannel2_IRQHandler( void );
+void DMAChannel3_IRQHandler( void );
+void DMAChannel4_IRQHandler( void );
+void DMAChannel5_IRQHandler( void );
+void DMAChannel6_IRQHandler( void );
+void DMAChannel7_IRQHandler( void );
+void ADC_IRQHandler( void );
+void USB_HP_CAN_TX_IRQHandler( void );
+void USB_LP_CAN_RX0_IRQHandler( void );
+void CAN_RX1_IRQHandler( void );
+void CAN_SCE_IRQHandler( void );
+void EXTI9_5_IRQHandler( void );
+void TIM1_BRK_IRQHandler( void );
+void TIM1_UP_IRQHandler( void );
+void TIM1_TRG_CCUP_IRQHandler( void );
+void TIM1_CC_IRQHandler( void );
+void TIM2_IRQHandler( void );
+void TIM3_IRQHandler( void );
+void TIM4_IRQHandler( void );
+void I2C1_EV_IRQHandler( void );
+void I2C1_ER_IRQHandler( void );
+void I2C2_EV_IRQHandler( void );
+void I2C2_ER_IRQHandler( void );
+void SPI1_IRQHandler( void );
+void SPI2_IRQHandler( void );
+void USART1_IRQHandler( void );
+void USART2_IRQHandler( void );
+void USART3_IRQHandler( void );
+void EXTI15_10_IRQHandler( void );
+void RTCAlarm_IRQHandler( void );
+void USBWakeUp_IRQHandler( void );
+
+//FL071107 Make the scheduler configurable. The handler are inserted into a list that could
+//be modified by the applications.
+typedef void (*tHandler) ( void );
+extern tHandler SchHandler [16+1];
+#define SCH_HDL_MAX ( sizeof SchHandler / sizeof (tHandler) )
+
+
+
+#endif /* __STM32F10x_IT_H */
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_circle_it.c b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_circle_it.c
new file mode 100644
index 000000000..a656d685f
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_circle_it.c
@@ -0,0 +1,217 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
+/**
+*
+* @file stm32f10x_circle_it.c
+* @brief Interrupt handler for the CircleOS project.
+* @author FL
+* @author IB
+* @date 07/2007
+*
+**/
+/******************************************************************************/
+
+/* Includes ------------------------------------------------------------------*/
+#include "circle.h"
+
+/* External variables --------------------------------------------------------*/
+extern u16 CCR_Val;
+extern u16 Current_CCR_BackLightStart;
+
+/*******************************************************************************
+*
+* NMIException
+*
+*******************************************************************************/
+/**
+*
+* Handles the NMI exception.
+*
+**/
+/******************************************************************************/
+void NMIException( void ) {}
+
+/*******************************************************************************
+*
+* HardFaultException
+*
+*******************************************************************************/
+/**
+*
+* Handles the Hard Fault exception.
+*
+**/
+/******************************************************************************/
+void HardFaultException( void )
+ {
+ #ifdef TIMING_ANALYSIS //to debug with a scope
+ GPIO_WriteBit( GPIOA, GPIO_Pin_5, Bit_RESET );
+ GPIO_WriteBit( GPIOA, GPIO_Pin_5, Bit_SET );
+ #endif
+ }
+
+/*******************************************************************************
+*
+* MemManageException
+*
+*******************************************************************************/
+/**
+*
+* Handles the Memory Manage exception.
+*
+**/
+/******************************************************************************/
+void MemManageException( void ) {}
+
+/*******************************************************************************
+*
+* BusFaultException
+*
+*******************************************************************************/
+/**
+*
+* Handles the Bus Fault exception.
+*
+**/
+/******************************************************************************/
+void BusFaultException( void ) {}
+
+/*******************************************************************************
+*
+* UsageFaultException
+*
+*******************************************************************************/
+/**
+*
+* Handles the Usage Fault exception.
+*
+**/
+/******************************************************************************/
+void UsageFaultException( void ) {}
+
+/*******************************************************************************
+*
+* DebugMonitor
+*
+*******************************************************************************/
+/**
+*
+* Handles the Debug Monitor exception.
+*
+**/
+/******************************************************************************/
+void DebugMonitor( void ) {}
+
+/*******************************************************************************
+*
+* SVCHandler
+*
+*******************************************************************************/
+/**
+*
+* Handles the SVCall exception.
+*
+**/
+/******************************************************************************/
+void SVCHandler( void ) {}
+
+/*******************************************************************************
+*
+* PendSVC
+*
+*******************************************************************************/
+/**
+*
+* Handles the PendSVC exception.
+*
+**/
+/******************************************************************************/
+void PendSVC( void ) {}
+
+/*******************************************************************************
+*
+* DummyHandler
+*
+*******************************************************************************/
+/**
+*
+* Default handling for the IRQ-Exception
+*
+**/
+/******************************************************************************/
+void DummyHandler ( void ) {}
+
+/*******************************************************************************
+*
+* TIM2_IRQHandler
+*
+*******************************************************************************/
+/**
+*
+* Handles the TIM2 global interrupt request.
+*
+**/
+/******************************************************************************/
+void TIM2_IRQHandler( void )
+ {
+ #ifdef TIMING_ANALYSIS //to debug with a scope
+ GPIO_WriteBit( GPIOA, GPIO_Pin_7, Bit_RESET );
+ #endif
+
+ /* Clear TIM2 update interrupt */
+ TIM_ClearITPendingBit( TIM2, TIM_IT_Update );
+
+ MEMS_Handler();
+
+ #ifdef TIMING_ANALYSIS //to debug with a scope
+ GPIO_WriteBit( GPIOA, GPIO_Pin_7, Bit_SET );
+ #endif
+ }
+
+/*******************************************************************************
+*
+* TIM3_IRQHandler
+*
+*******************************************************************************/
+/**
+*
+* Handles the TIM3 global interrupt request.
+*
+**/
+/******************************************************************************/
+void TIM3_IRQHandler( void )
+{
+ u16 capture = 0;
+
+ if( TIM_GetITStatus( TIM3, TIM_IT_CC3 ) != RESET )
+ {
+ capture = TIM_GetCapture3( TIM3 );
+
+ TIM_SetCompare3( TIM3, capture + CCR_Val + 1 );
+ TIM_ClearITPendingBit( TIM3, TIM_IT_CC3 );
+ }
+}
+
+/*******************************************************************************
+*
+* TIM4_IRQHandler
+*
+*******************************************************************************/
+/**
+*
+* Handles the TIM4 global interrupt request.
+*
+**/
+/******************************************************************************/
+void TIM4_IRQHandler( void )
+{
+ u16 BackLight_capture = 0;
+
+ if( TIM_GetITStatus( TIM4, TIM_IT_CC2 ) != RESET )
+ {
+ BackLight_capture = TIM_GetCapture2( TIM4 );
+
+ TIM_SetCompare2( TIM4, BackLight_capture + Current_CCR_BackLightStart + 1 );
+ TIM_ClearITPendingBit( TIM4, TIM_IT_CC2 );
+ }
+}
+
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_conf.h b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_conf.h
new file mode 100644
index 000000000..27234fc73
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_conf.h
@@ -0,0 +1,119 @@
+/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
+* File Name : stm32f10x_conf.h
+* Author : MCD Application Team
+* Date First Issued : 09/29/2006
+* Description : Library configuration file.
+********************************************************************************
+* History:
+* 02/05/2007: V0.1
+* 09/29/2006: V0.01
+********************************************************************************
+* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
+* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
+* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
+* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
+* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+*******************************************************************************/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F10x_CONF_H
+#define __STM32F10x_CONF_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Comment the line below to compile the library in release mode */
+//#define DEBUG 0
+
+/* Comment the line below to disable the specific peripheral inclusion */
+/************************************* ADC ************************************/
+//#define _ADC
+#define _ADC1
+#define _ADC2
+
+/************************************* CAN ************************************/
+//#define _CAN
+
+/************************************* DMA ************************************/
+//#define _DMA
+#define _DMA_Channel1
+#define _DMA_Channel2
+#define _DMA_Channel3
+#define _DMA_Channel4
+#define _DMA_Channel5
+#define _DMA_Channel6
+#define _DMA_Channel7
+
+/************************************* EXTI ***********************************/
+//#define _EXTI
+
+/************************************* GPIO ***********************************/
+#define _GPIO
+#define _GPIOA
+#define _GPIOB
+#define _GPIOC
+#define _GPIOD
+//#define _GPIOE
+#define _AFIO
+
+/************************************* I2C ************************************/
+//#define _I2C
+//#define _I2C1
+//#define _I2C2
+
+/************************************* IWDG ***********************************/
+//#define _IWDG
+
+/************************************* NVIC ***********************************/
+#define _NVIC
+#define _SCB
+
+/************************************* BKP ************************************/
+//#define _BKP
+
+/************************************* PWR ************************************/
+//#define _PWR
+
+/************************************* RCC ************************************/
+#define _RCC
+
+/************************************* RTC ************************************/
+//#define _RTC
+
+/************************************* SPI ************************************/
+#define _SPI
+//#define _SPI1
+#define _SPI2
+
+/************************************* SysTick ********************************/
+#define _SysTick
+
+/************************************* TIM1 ***********************************/
+//#define _TIM1
+
+/************************************* TIM ************************************/
+#define _TIM
+#define _TIM2
+#define _TIM3
+#define _TIM4
+
+/************************************* USART **********************************/
+//#define _USART
+//#define _USART1
+//#define _USART2
+//#define _USART3
+
+/************************************* WWDG ***********************************/
+//#define _WWDG
+
+/* In the following line adjust the value of External High Speed oscillator (HSE)
+ used in your application */
+#define HSE_Value ((u32)12000000) /* Value of the External oscillator in Hz*/
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+#endif /* __STM32F10x_CONF_H */
+
+/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_it.h b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_it.h
new file mode 100644
index 000000000..9fa5322b4
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_it.h
@@ -0,0 +1,70 @@
+/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. ********************
+* File Name : stm32f10x_it.c
+* Author : IB/FL
+* Date First Issued : 07/2007
+* Description : Interrupt handler for the CircleOS project.
+* Revision :
+*******************************************************************************/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F10x_IT_H
+#define __STM32F10x_IT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f10x_lib.h"
+
+/* Exported functions ------------------------------------------------------- */
+void NMIException( void );
+void HardFaultException( void );
+void MemManageException( void );
+void BusFaultException( void );
+void UsageFaultException( void );
+void DebugMonitor( void );
+void SVCHandler( void );
+void PendSVC( void );
+void SysTickHandler( void );
+void WWDG_IRQHandler( void );
+void PVD_IRQHandler( void );
+void TAMPER_IRQHandler( void );
+void RTC_IRQHandler( void );
+void FLASH_IRQHandler( void );
+void RCC_IRQHandler( void );
+void EXTI0_IRQHandler( void );
+void EXTI1_IRQHandler( void );
+void EXTI2_IRQHandler( void );
+void EXTI3_IRQHandler( void );
+void EXTI4_IRQHandler( void );
+void DMAChannel1_IRQHandler( void );
+void DMAChannel2_IRQHandler( void );
+void DMAChannel3_IRQHandler( void );
+void DMAChannel4_IRQHandler( void );
+void DMAChannel5_IRQHandler( void );
+void DMAChannel6_IRQHandler( void );
+void DMAChannel7_IRQHandler( void );
+void ADC_IRQHandler( void );
+void USB_HP_CAN_TX_IRQHandler( void );
+void USB_LP_CAN_RX0_IRQHandler( void );
+void CAN_RX1_IRQHandler( void );
+void CAN_SCE_IRQHandler( void );
+void EXTI9_5_IRQHandler( void );
+void TIM1_BRK_IRQHandler( void );
+void TIM1_UP_IRQHandler( void );
+void TIM1_TRG_COM_IRQHandler( void );
+void TIM1_CC_IRQHandler( void );
+void TIM2_IRQHandler( void );
+void TIM3_IRQHandler( void );
+void TIM4_IRQHandler( void );
+void I2C1_EV_IRQHandler( void );
+void I2C1_ER_IRQHandler( void );
+void I2C2_EV_IRQHandler( void );
+void I2C2_ER_IRQHandler( void );
+void SPI1_IRQHandler( void );
+void SPI2_IRQHandler( void );
+void USART1_IRQHandler( void );
+void USART2_IRQHandler( void );
+void USART3_IRQHandler( void );
+void EXTI15_10_IRQHandler( void );
+void RTCAlarm_IRQHandler( void );
+void USBWakeUp_IRQHandler( void );
+
+#endif /* __STM32F10x_IT_H */
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_tim.c b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_tim.c
new file mode 100644
index 000000000..5fd374eb9
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/ST_Code/stm32f10x_tim.c
@@ -0,0 +1,2348 @@
+/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
+* File Name : stm32f10x_tim.c
+* Author : MCD Application Team
+* Date First Issued : 09/29/2006
+* Description : This file provides all the TIM firmware functions.
+********************************************************************************
+* History:
+* 04/02/2007: V0.2
+* 02/05/2007: V0.1
+* 09/29/2006: V0.01
+********************************************************************************
+* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
+* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
+* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
+* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
+* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+*******************************************************************************/
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f10x_tim.h"
+#include "stm32f10x_rcc.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* ---------------------- TIM registers bit mask ------------------------ */
+#define CR1_CEN_Set ((u16)0x0001)
+#define CR1_CEN_Reset ((u16)0x03FE)
+#define CR1_UDIS_Set ((u16)0x0002)
+#define CR1_UDIS_Reset ((u16)0x03FD)
+#define CR1_URS_Set ((u16)0x0004)
+#define CR1_URS_Reset ((u16)0x03FB)
+#define CR1_OPM_Mask ((u16)0x03F7)
+#define CR1_CounterMode_Mask ((u16)0x039F)
+#define CR1_ARPE_Set ((u16)0x0080)
+#define CR1_ARPE_Reset ((u16)0x037F)
+#define CR1_CKD_Mask ((u16)0x00FF)
+
+#define CR2_CCDS_Set ((u16)0x0008)
+#define CR2_CCDS_Reset ((u16)0x0007)
+#define CR2_MMS_Mask ((u16)0x0080)
+#define CR2_TI1S_Set ((u16)0x0080)
+#define CR2_TI1S_Reset ((u16)0xFF70)
+
+#define SMCR_SMS_Mask ((u16)0xFFF0)
+#define SMCR_ETR_Mask ((u16)0x00F7)
+#define SMCR_TS_Mask ((u16)0xFF87)
+#define SMCR_MSM_Mask ((u16)0xFF77)
+#define SMCR_ECE_Set ((u16)0x4000)
+
+#define CCMR_CC13S_Mask ((u16)0x7F7C)
+#define CCMR_CC24S_Mask ((u16)0x7C7F)
+#define CCMR_TI13Direct_Set ((u16)0x0001)
+#define CCMR_TI24Direct_Set ((u16)0x0100)
+#define CCMR_OC13FE_Mask ((u16)0x7F7B)
+#define CCMR_OC24FE_Mask ((u16)0x7B7F)
+#define CCMR_OC13PE_Mask ((u16)0x7F77)
+#define CCMR_OC24PE_Mask ((u16)0x777F)
+#define CCMR_OCM13_Mask ((u16)0x7F0F)
+#define CCMR_OCM24_Mask ((u16)0x0F7F)
+#define CCMR_IC13PSC_Mask ((u16)0xFFF3)
+#define CCMR_IC24PSC_Mask ((u16)0xF3FF)
+#define CCMR_IC13F_Mask ((u16)0xFF0F)
+#define CCMR_IC24F_Mask ((u16)0x0FFF)
+#define CCER_CC1P_Mask ((u16)0xFFFD)
+
+#define CCER_CC2P_Mask ((u16)0xFFDF)
+#define CCER_CC3P_Mask ((u16)0xFDFF)
+#define CCER_CC4P_Mask ((u16)0xDFFF)
+
+#define CCRE_CC1E_Set ((u16)0x0001)
+#define CCRE_CC1E_Reset ((u16)0xFFFE)
+#define CCRE_CC1E_Mask ((u16)0xFFFE)
+
+#define CCRE_CC2E_Set ((u16)0x0010)
+#define CCRE_CC2E_Reset ((u16)0xFFEF)
+#define CCRE_CC2E_Mask ((u16)0xFFEF)
+
+#define CCRE_CC3E_Set ((u16)0x0100)
+#define CCRE_CC3E_Reset ((u16)0xFEFF)
+
+#define CCRE_CC4E_Set ((u16)0x1000)
+#define CCRE_CC4E_Reset ((u16)0xEFFF)
+#define CCRE_CC4E_Mask ((u16)0xEFFF)
+
+#define DCR_DMA_Mask ((u16)0x0000)
+
+/* TIM private Masks */
+#define TIM_Period_Reset_Mask ((u16)0x0000)
+#define TIM_Prescaler_Reset_Mask ((u16)0x0000)
+#define TIM_Pulse_Reset_Mask ((u16)0x0000)
+#define TIM_ICFilter_Mask ((u8)0x00)
+
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static uc16 Tab_OCModeMask[4] = {0xFF00, 0x00FF, 0xFF00, 0x00FF};
+static uc16 Tab_PolarityMask[4] = {CCER_CC1P_Mask, CCER_CC2P_Mask, CCER_CC3P_Mask, CCER_CC4P_Mask};
+
+/* Private function prototypes -----------------------------------------------*/
+static void PWMI_Config(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
+static void TI1_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
+ u8 TIM_ICFilter);
+static void TI2_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
+ u8 TIM_ICFilter);
+static void TI3_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
+ u8 TIM_ICFilter);
+static void TI4_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
+ u8 TIM_ICFilter);
+static void ETR_Config(TIM_TypeDef* TIMx, u16 TIM_ExtTRGPrescaler,
+ u16 TIM_ExtTRGPolarity, u8 ExtTRGFilter);
+/* Private functions ---------------------------------------------------------*/
+
+/*******************************************************************************
+* Function Name : TIM_DeInit
+* Description : Deinitializes the TIMx peripheral registers to their default
+* reset values.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_DeInit(TIM_TypeDef* TIMx)
+{
+ switch (*(u32*)&TIMx)
+ {
+ case TIM2_BASE:
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE);
+ break;
+
+ case TIM3_BASE:
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE);
+ break;
+
+ case TIM4_BASE:
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE);
+ break;
+
+ default:
+ break;
+ }
+}
+
+/*******************************************************************************
+* Function Name : TIM_TimeBaseInit
+* Description : Initializes the TIMx Time Base Unit peripheral according to
+* the specified parameters in the TIM_TimeBaseInitStruct.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef
+* structure that contains the configuration information for
+* the specified TIM peripheral.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
+{
+ /* Check the parameters */
+ assert(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));
+ assert(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));
+
+ /* Set the Autoreload value */
+ TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
+
+ /* Set the Prescaler value */
+ TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;
+
+ /* Select the Counter Mode and set the clock division */
+ TIMx->CR1 &= CR1_CKD_Mask & CR1_CounterMode_Mask;
+ TIMx->CR1 |= (u32)TIM_TimeBaseInitStruct->TIM_ClockDivision |
+ TIM_TimeBaseInitStruct->TIM_CounterMode;
+}
+/*******************************************************************************
+* Function Name : TIM_OCInit
+* Description : Initializes the TIMx peripheral according to the specified
+* parameters in the TIM_OCInitStruct.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure
+* that contains the configuration information for the specified
+* TIM peripheral.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OCInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
+{
+ u32 tmpccmrx = 0, tmpccer = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));
+ assert(IS_TIM_CHANNEL(TIM_OCInitStruct->TIM_Channel));
+ assert(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));
+
+ tmpccer = TIMx->CCER;
+
+ if ((TIM_OCInitStruct->TIM_Channel == (u16)TIM_Channel_1) ||
+ (TIM_OCInitStruct->TIM_Channel == (u16)TIM_Channel_2))
+ {
+ tmpccmrx = TIMx->CCMR1;
+
+ /* Reset the Output Compare Bits */
+ tmpccmrx &= Tab_OCModeMask[TIM_OCInitStruct->TIM_Channel];
+
+ /* Set the Output Polarity level */
+ tmpccer &= Tab_PolarityMask[TIM_OCInitStruct->TIM_Channel];
+
+ if (TIM_OCInitStruct->TIM_Channel == TIM_Channel_1)
+ {
+ /* Disable the Channel 1: Reset the CCE Bit */
+ TIMx->CCER &= CCRE_CC1E_Reset;
+
+ /* Select the Output Compare Mode */
+ tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;
+
+ /* Set the Capture Compare Register value */
+ TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse;
+
+ /* Set the Capture Compare Enable Bit */
+ tmpccer |= CCRE_CC1E_Set;
+
+ /* Set the Capture Compare Polarity */
+ tmpccer |= TIM_OCInitStruct->TIM_OCPolarity;
+ }
+ else /* TIM_Channel_2 */
+ {
+ /* Disable the Channel 2: Reset the CCE Bit */
+ TIMx->CCER &= CCRE_CC2E_Reset;
+
+ /* Select the Output Compare Mode */
+ tmpccmrx |= (u32)TIM_OCInitStruct->TIM_OCMode << 8;
+
+ /* Set the Capture Compare Register value */
+ TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse;
+
+ /* Set the Capture Compare Enable Bit */
+ tmpccer |= CCRE_CC2E_Set;
+
+ /* Set the Capture Compare Polarity */
+ tmpccer |= (u32)TIM_OCInitStruct->TIM_OCPolarity << 4;
+ }
+
+ TIMx->CCMR1 = (u16)tmpccmrx;
+ }
+ else
+ {
+ if ((TIM_OCInitStruct->TIM_Channel == TIM_Channel_3) ||
+ (TIM_OCInitStruct->TIM_Channel == TIM_Channel_4))
+ {
+ tmpccmrx = TIMx->CCMR2;
+
+ /* Reset the Output Compare Bits */
+ tmpccmrx &= Tab_OCModeMask[TIM_OCInitStruct->TIM_Channel];
+
+ /* Set the Output Polarity level */
+ tmpccer &= Tab_PolarityMask[TIM_OCInitStruct->TIM_Channel];
+
+ if (TIM_OCInitStruct->TIM_Channel == TIM_Channel_3)
+ {
+ /* Disable the Channel 3: Reset the CCE Bit */
+ TIMx->CCER &= CCRE_CC3E_Reset;
+
+ /* Select the Output Compare Mode */
+ tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;
+
+ /* Set the Capture Compare Register value */
+ TIMx->CCR3 = TIM_OCInitStruct->TIM_Pulse;
+
+ /* Set the Capture Compare Enable Bit */
+ tmpccer |= CCRE_CC3E_Set;
+
+ /* Set the Capture Compare Polarity */
+ tmpccer |= (u32)TIM_OCInitStruct->TIM_OCPolarity << 8;
+ }
+ else /* TIM_Channel_4 */
+ {
+ /* Disable the Channel 4: Reset the CCE Bit */
+ TIMx->CCER &= CCRE_CC4E_Reset;
+
+ /* Select the Output Compare Mode */
+ tmpccmrx |= (u32)TIM_OCInitStruct->TIM_OCMode << 8;
+
+ /* Set the Capture Compare Register value */
+ TIMx->CCR4 = TIM_OCInitStruct->TIM_Pulse;
+
+ /* Set the Capture Compare Enable Bit */
+ tmpccer |= CCRE_CC4E_Set;
+
+ /* Set the Capture Compare Polarity */
+ tmpccer |= (u32)TIM_OCInitStruct->TIM_OCPolarity << 12;
+ }
+
+ TIMx->CCMR2 = (u16)tmpccmrx;
+ }
+ }
+
+ TIMx->CCER = (u16)tmpccer;
+}
+
+/*******************************************************************************
+* Function Name : TIM_ICInit
+* Description : Initializes the TIMx peripheral according to the specified
+* parameters in the TIM_ICInitStruct.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure
+* that contains the configuration information for the specified
+* TIM peripheral.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)
+{
+ /* Check the parameters */
+ assert(IS_TIM_IC_MODE(TIM_ICInitStruct->TIM_ICMode));
+ assert(IS_TIM_CHANNEL(TIM_ICInitStruct->TIM_Channel));
+ assert(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity));
+ assert(IS_TIM_IC_SELECTION(TIM_ICInitStruct->TIM_ICSelection));
+ assert(IS_TIM_IC_PRESCALER(TIM_ICInitStruct->TIM_ICPrescaler));
+ assert(IS_TIM_IC_FILTER(TIM_ICInitStruct->TIM_ICFilter));
+
+ if (TIM_ICInitStruct->TIM_ICMode == TIM_ICMode_ICAP)
+ {
+ if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1)
+ {
+ /* TI1 Configuration */
+ TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_2)
+ {
+ /* TI2 Configuration */
+ TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_3)
+ {
+ /* TI3 Configuration */
+ TI3_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else /* TIM_Channel_4 */
+ {
+ /* TI4 Configuration */
+ TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ }
+ else
+ {
+ PWMI_Config(TIMx, TIM_ICInitStruct);
+ }
+}
+
+/*******************************************************************************
+* Function Name : TIM_TimeBaseStructInit
+* Description : Fills each TIM_TimeBaseInitStruct member with its default value.
+* Input : - TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef
+* structure which will be initialized.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
+{
+ /* Set the default configuration */
+ TIM_TimeBaseInitStruct->TIM_Period = TIM_Period_Reset_Mask;
+ TIM_TimeBaseInitStruct->TIM_Prescaler = TIM_Prescaler_Reset_Mask;
+ TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1;
+ TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OCStructInit
+* Description : Fills each TIM_OCInitStruct member with its default value.
+* Input : - TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure
+* which will be initialized.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct)
+{
+ /* Set the default configuration */
+ TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing;
+ TIM_OCInitStruct->TIM_Channel = TIM_Channel_1;
+ TIM_OCInitStruct->TIM_Pulse = TIM_Pulse_Reset_Mask;
+ TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High;
+}
+
+/*******************************************************************************
+* Function Name : TIM_ICStructInit
+* Description : Fills each TIM_InitStruct member with its default value.
+* Input : - TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure
+* which will be initialized.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct)
+{
+ /* Set the default configuration */
+ TIM_ICInitStruct->TIM_ICMode = TIM_ICMode_ICAP;
+ TIM_ICInitStruct->TIM_Channel = TIM_Channel_1;
+ TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising;
+ TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI;
+ TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1;
+ TIM_ICInitStruct->TIM_ICFilter = TIM_ICFilter_Mask;
+}
+
+/*******************************************************************************
+* Function Name : TIM_Cmd
+* Description : Enables or disables the specified TIM peripheral.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIMx peripheral.
+* - Newstate: new state of the TIMx peripheral.
+* This parameter can be: ENABLE or DISABLE.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the TIM Counter */
+ TIMx->CR1 |= CR1_CEN_Set;
+ }
+ else
+ {
+ /* Disable the TIM Counter */
+ TIMx->CR1 &= CR1_CEN_Reset;
+ }
+}
+
+/*******************************************************************************
+* Function Name : TIM_ITConfig
+* Description : Enables or disables the TIMx interrupts.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_IT: specifies the TIM interrupts sources to be enabled
+* or disabled.
+* This parameter can be any combination of the following values:
+* - TIM_IT_Update: Timer update Interrupt
+* - TIM_IT_CC1: Capture Compare 1 Interrupt
+* - TIM_IT_CC2: Capture Compare 2 Interrupt
+* - TIM_IT_CC3: Capture Compare 3 Interrupt
+* - TIM_IT_CC4: Capture Compare 4 Interrupt
+* - TIM_IT_Trigger: Trigger Interrupt
+* - Newstate: new state of the specified TIMx interrupts.
+* This parameter can be: ENABLE or DISABLE.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ITConfig(TIM_TypeDef* TIMx, u16 TIM_IT, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert(IS_TIM_IT(TIM_IT));
+ assert(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the Interrupt sources */
+ TIMx->DIER |= TIM_IT;
+ }
+ else
+ {
+ /* Disable the Interrupt sources */
+ TIMx->DIER &= (u16)(~TIM_IT);
+ }
+}
+
+/*******************************************************************************
+* Function Name : TIM_DMAConfig
+* Description : Configures the TIMx’s DMA interface.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_DMABase: DMA Base address.
+* This parameter can be one of the following values:
+* - TIM_DMABase_CR1, TIM_DMABase_CR2, TIM_DMABase_SMCR,
+* TIM_DMABase_DIER, TIM_DMABase_SR, TIM_DMABase_EGR,
+* TIM_DMABase_CCMR1, TIM_DMABase_CCMR2, TIM_DMABase_CCER,
+* TIM_DMABase_CNT, TIM_DMABase_PSC, TIM_DMABase_ARR,
+* TIM_DMABase_CCR1, TIM_DMABase_CCR2, TIM_DMABase_CCR3,
+* TIM_DMABase_CCR4, TIM_DMABase_DCR.
+* - TIM_DMABurstLength: DMA Burst length.
+* This parameter can be one value between:
+* TIM_DMABurstLength_1Byte and TIM_DMABurstLength_18Bytes.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_DMAConfig(TIM_TypeDef* TIMx, u16 TIM_DMABase, u16 TIM_DMABurstLength)
+{
+ u32 tmpdcr = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_DMA_BASE(TIM_DMABase));
+ assert(IS_TIM_DMA_LENGTH(TIM_DMABurstLength));
+
+ tmpdcr = TIMx->DCR;
+
+ /* Reset the DBA and the DBL Bits */
+ tmpdcr &= DCR_DMA_Mask;
+
+ /* Set the DMA Base and the DMA Burst Length */
+ tmpdcr |= TIM_DMABase | TIM_DMABurstLength;
+
+ TIMx->DCR = (u16)tmpdcr;
+}
+
+/*******************************************************************************
+* Function Name : TIM_DMACmd
+* Description : Enables or disables the TIMx’s DMA Requests.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_DMASources: specifies the DMA Request sources.
+* This parameter can be any combination of the following values:
+* - TIM_DMA_CC1: Capture Compare 1 DMA source
+* - TIM_DMA_CC2: Capture Compare 2 DMA source
+* - TIM_DMA_CC3: Capture Compare 3 DMA source
+* - TIM_DMA_CC4: Capture Compare 4 DMA source
+* - TIM_DMA_Trigger: Trigger DMA source
+* - Newstate: new state of the DMA Request sources.
+* This parameter can be: ENABLE or DISABLE.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_DMACmd(TIM_TypeDef* TIMx, u16 TIM_DMASource, FunctionalState Newstate)
+{
+ u32 tmpdier = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_DMA_SOURCE(TIM_DMASource));
+ assert(IS_FUNCTIONAL_STATE(Newstate));
+
+ tmpdier = TIMx->DIER;
+
+ if (Newstate != DISABLE)
+ {
+ /* Enable the DMA sources */
+ tmpdier |= TIM_DMASource;
+ }
+ else
+ {
+ /* Disable the DMA sources */
+ tmpdier &= (u16)(~TIM_DMASource);
+ }
+ TIMx->DIER = (u16)tmpdier;
+}
+
+/*******************************************************************************
+* Function Name : TIM_InternalClockConfig
+* Description : Configures the TIMx interrnal Clock
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_InternalClockConfig(TIM_TypeDef* TIMx)
+{
+ /* Disable slave mode to clock the prescaler directly with the internal clock */
+ TIMx->SMCR &= SMCR_SMS_Mask;
+}
+/*******************************************************************************
+* Function Name : TIM_ITRxExternalClockConfig
+* Description : Configures the TIMx Internal Trigger as External Clock
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ITRSource: Trigger source.
+* This parameter can be one of the following values:
+* - TIM_TS_ITR0: Internal Trigger 0
+* - TIM_TS_ITR1: Internal Trigger 1
+* - TIM_TS_ITR2: Internal Trigger 2
+* - TIM_TS_ITR3: Internal Trigger 3
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, u16 TIM_InputTriggerSource)
+{
+ /* Check the parameters */
+ assert(IS_TIM_INTERNAL_TRIGGER_SELECTION(TIM_InputTriggerSource));
+
+ /* Select the Internal Trigger */
+ TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource);
+
+ /* Select the External clock mode1 */
+ TIMx->SMCR |= TIM_SlaveMode_External1;
+}
+/*******************************************************************************
+* Function Name : TIM_TIxExternalClockConfig
+* Description : Configures the TIMx Trigger as External Clock
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_TIxExternalCLKSource: Trigger source.
+* This parameter can be one of the following values:
+* - TIM_TS_TI1F_ED: TI1 Edge Detector
+* - TIM_TS_TI1FP1: Filtered Timer Input 1
+* - TIM_TS_TI2FP2: Filtered Timer Input 2
+* - TIM_ICPolarity: specifies the TIx Polarity.
+* This parameter can be:
+* - TIM_ICPolarity_Rising
+* - TIM_ICPolarity_Falling
+* - ICFilter : specifies the filter value.
+* This parameter must be a value between 0x0 and 0xF.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, u16 TIM_TIxExternalCLKSource,
+ u16 TIM_ICPolarity, u8 ICFilter)
+{
+ /* Check the parameters */
+ assert(IS_TIM_TIX_TRIGGER_SELECTION(TIM_TIxExternalCLKSource));
+ assert(IS_TIM_IC_POLARITY(TIM_ICPolarity));
+ assert(IS_TIM_IC_FILTER(ICFilter));
+
+ /* Configure the Timer Input Clock Source */
+ if (TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2)
+ {
+ TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter);
+ }
+ else
+ {
+ TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter);
+ }
+
+ /* Select the Trigger source */
+ TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource);
+
+ /* Select the External clock mode1 */
+ TIMx->SMCR |= TIM_SlaveMode_External1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_ETRClockMode1Config
+* Description : Configures the External clock Mode1
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ExtTRGPrescaler: The external Trigger Prescaler.
+* It can be one of the following values:
+* - TIM_ExtTRGPSC_OFF
+* - TIM_ExtTRGPSC_DIV2
+* - TIM_ExtTRGPSC_DIV4
+* - TIM_ExtTRGPSC_DIV8.
+* - TIM_ExtTRGPolarity: The external Trigger Polarity.
+* It can be one of the following values:
+* - TIM_ExtTRGPolarity_Inverted
+* - TIM_ExtTRGPolarity_NonInverted
+* - ExtTRGFilter: External Trigger Filter.
+* This parameter must be a value between 0x00 and 0x0F
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, u16 TIM_ExtTRGPrescaler, u16 TIM_ExtTRGPolarity,
+ u8 ExtTRGFilter)
+{
+ /* Check the parameters */
+ assert(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler));
+ assert(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity));
+
+ /* Configure the ETR Clock source */
+ ETR_Config(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter);
+
+ /* Select the External clock mode1 */
+ TIMx->SMCR &= SMCR_SMS_Mask;
+ TIMx->SMCR |= TIM_SlaveMode_External1;
+
+ /* Select the Trigger selection : ETRF */
+ TIMx->SMCR &= SMCR_TS_Mask;
+ TIMx->SMCR |= TIM_TS_ETRF;
+}
+
+/*******************************************************************************
+* Function Name : TIM_ETRClockMode2Config
+* Description : Configures the External clock Mode2
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ExtTRGPrescaler: The external Trigger Prescaler.
+* It can be one of the following values:
+* - TIM_ExtTRGPSC_OFF
+* - TIM_ExtTRGPSC_DIV2
+* - TIM_ExtTRGPSC_DIV4
+* - TIM_ExtTRGPSC_DIV8
+* - TIM_ExtTRGPolarity: The external Trigger Polarity.
+* It can be one of the following values:
+* - TIM_ExtTRGPolarity_Inverted
+* - TIM_ExtTRGPolarity_NonInverted
+* - ExtTRGFilter: External Trigger Filter.
+* This parameter must be a value between 0x00 and 0x0F
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, u16 TIM_ExtTRGPrescaler,
+ u16 TIM_ExtTRGPolarity, u8 ExtTRGFilter)
+{
+ /* Check the parameters */
+ assert(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler));
+ assert(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity));
+
+ /* Configure the ETR Clock source */
+ ETR_Config(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter);
+
+ /* Enable the External clock mode2 */
+ TIMx->SMCR |= SMCR_ECE_Set;
+}
+/*******************************************************************************
+* Function Name : TIM_SelectInputTrigger
+* Description : Selects the Input Trigger source
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_InputTriggerSource: The Input Trigger source.
+* This parameter can be one of the following values:
+* - TIM_TS_ITR0: Internal Trigger 0
+* - TIM_TS_ITR1: Internal Trigger 1
+* - TIM_TS_ITR2: Internal Trigger 2
+* - TIM_TS_ITR3: Internal Trigger 3
+* - TIM_TS_TI1F_ED: TI1 Edge Detector
+* - TIM_TS_TI1FP1: Filtered Timer Input 1
+* - TIM_TS_TI2FP2: Filtered Timer Input 2
+* - TIM_TS_ETRF: External Trigger input
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, u16 TIM_InputTriggerSource)
+{
+ u32 tmpsmcr = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource));
+
+ tmpsmcr = TIMx->SMCR;
+
+ /* Select the Tgigger Source */
+ tmpsmcr &= SMCR_TS_Mask;
+ tmpsmcr |= TIM_InputTriggerSource;
+
+ TIMx->SMCR = (u16)tmpsmcr;
+}
+
+/*******************************************************************************
+* Function Name : TIM_PrescalerConfig
+* Description : Configures the TIMx Prescaler.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - Prescaler: specifies the Prescaler Register value
+* - TIM_PSCReloadMode: specifies the TIM Prescaler Reload mode
+* This parameter can be one of the following values:
+* - TIM_PSCReloadMode_Update: The Prescaler is loaded at
+* the update event.
+* - TIM_PSCReloadMode_Immediate: The Prescaler is loaded
+* immediatly.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_PrescalerConfig(TIM_TypeDef* TIMx, u16 Prescaler, u16 TIM_PSCReloadMode)
+{
+ /* Check the parameters */
+ assert(IS_TIM_PRESCALER_RELOAD(TIM_PSCReloadMode));
+
+ /* Set the Prescaler value */
+ TIMx->PSC = Prescaler;
+
+ /* Set or reset the UG Bit */
+ if (TIM_PSCReloadMode == TIM_PSCReloadMode_Immediate)
+ {
+ TIMx->EGR |= TIM_EventSource_Update;
+ }
+ else
+ {
+ TIMx->EGR &= TIM_EventSource_Update;
+ }
+}
+
+/*******************************************************************************
+* Function Name : TIM_CounterModeConfig
+* Description : Specifies the TIMx Counter Mode to be used.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_CounterMode: specifies the Counter Mode to be used
+* This parameter can be one of the following values:
+* - TIM_CounterMode_Up: TIM Up Counting Mode
+* - TIM_CounterMode_Down: TIM Down Counting Mode
+* - TIM_CounterMode_CenterAligned1: TIM Center Aligned Mode1
+* - TIM_CounterMode_CenterAligned2: TIM Center Aligned Mode2
+* - TIM_CounterMode_CenterAligned3: TIM Center Aligned Mode3
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_CounterModeConfig(TIM_TypeDef* TIMx, u16 TIM_CounterMode)
+{
+ u32 tmpcr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_COUNTER_MODE(TIM_CounterMode));
+
+ tmpcr1 = TIMx->CR1;
+
+ /* Reset the CMS and DIR Bits */
+ tmpcr1 &= CR1_CounterMode_Mask;
+
+ /* Set the Counter Mode */
+ tmpcr1 |= TIM_CounterMode;
+
+ TIMx->CR1 = (u16)tmpcr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_ForcedOC1Config
+* Description : Forces the TIMx output 1 waveform to active or inactive level.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ForcedAction: specifies the forced Action to be set to
+* the output waveform.
+* This parameter can be one of the following values:
+* - TIM_ForcedAction_Active: Force active level on OC1REF
+* - TIM_ForcedAction_InActive: Force inactive level on
+* OC1REF.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, u16 TIM_ForcedAction)
+{
+ u32 tmpccmr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
+
+ tmpccmr1 = TIMx->CCMR1;
+
+ /* Reset the OCM Bits */
+ tmpccmr1 &= CCMR_OCM13_Mask;
+
+ /* Configure The Forced output Mode */
+ tmpccmr1 |= TIM_ForcedAction;
+
+ TIMx->CCMR1 = (u16)tmpccmr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_ForcedOC2Config
+* Description : Forces the TIMx output 2 waveform to active or inactive level.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ForcedAction: specifies the forced Action to be set to
+* the output waveform.
+* This parameter can be one of the following values:
+* - TIM_ForcedAction_Active: Force active level on OC2REF
+* - TIM_ForcedAction_InActive: Force inactive level on
+* OC2REF.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, u16 TIM_ForcedAction)
+{
+ u32 tmpccmr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
+
+ tmpccmr1 = TIMx->CCMR1;
+
+ /* Reset the OCM Bits */
+ tmpccmr1 &= CCMR_OCM24_Mask;
+
+ /* Configure The Forced output Mode */
+ tmpccmr1 |= (u16)(TIM_ForcedAction << 8);
+
+ TIMx->CCMR1 = (u16)tmpccmr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_ForcedOC3Config
+* Description : Forces the TIMx output 3 waveform to active or inactive level.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ForcedAction: specifies the forced Action to be set to
+* the output waveform.
+* This parameter can be one of the following values:
+* - TIM_ForcedAction_Active: Force active level on OC3REF
+* - TIM_ForcedAction_InActive: Force inactive level on
+* OC3REF.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, u16 TIM_ForcedAction)
+{
+ u32 tmpccmr2 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
+
+ tmpccmr2 = TIMx->CCMR2;
+
+ /* Reset the OCM Bits */
+ tmpccmr2 &= CCMR_OCM13_Mask;
+
+ /* Configure The Forced output Mode */
+ tmpccmr2 |= TIM_ForcedAction;
+
+ TIMx->CCMR2 = (u16)tmpccmr2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_ForcedOC4Config
+* Description : Forces the TIMx output 4 waveform to active or inactive level.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ForcedAction: specifies the forced Action to be set to
+* the output waveform.
+* This parameter can be one of the following values:
+* - TIM_ForcedAction_Active: Force active level on OC4REF
+* - TIM_ForcedAction_InActive: Force inactive level on
+* OC4REF.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, u16 TIM_ForcedAction)
+{
+ u32 tmpccmr2 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
+
+ tmpccmr2 = TIMx->CCMR2;
+
+ /* Reset the OCM Bits */
+ tmpccmr2 &= CCMR_OCM24_Mask;
+
+ /* Configure The Forced output Mode */
+ tmpccmr2 |= (u16)(TIM_ForcedAction << 8);
+
+ TIMx->CCMR2 = (u16)tmpccmr2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_ARRPreloadConfig
+* Description : Enables or disables TIMx peripheral Preload register on ARR.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - Newstate: new state of the TIMx peripheral Preload register
+* This parameter can be: ENABLE or DISABLE.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState Newstate)
+{
+ u32 tmpcr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_FUNCTIONAL_STATE(Newstate));
+
+ tmpcr1 = TIMx->CR1;
+
+ if (Newstate != DISABLE)
+ {
+ /* Set the ARR Preload Bit */
+ tmpcr1 |= CR1_ARPE_Set;
+ }
+ else
+ {
+ /* Reset the ARR Preload Bit */
+ tmpcr1 &= CR1_ARPE_Reset;
+ }
+
+ TIMx->CR1 = (u16)tmpcr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SelectCCDMA
+* Description : Selects the TIMx peripheral Capture Compare DMA source.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - Newstate: new state of the Capture Compare DMA source
+* This parameter can be: ENABLE or DISABLE.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState Newstate)
+{
+ u32 tmpcr2 = 0;
+
+ /* Check the parameters */
+ assert(IS_FUNCTIONAL_STATE(Newstate));
+
+ tmpcr2 = TIMx->CR2;
+
+ if (Newstate != DISABLE)
+ {
+ /* Set the CCDS Bit */
+ tmpcr2 |= CR2_CCDS_Set;
+ }
+ else
+ {
+ /* Reset the CCDS Bit */
+ tmpcr2 &= CR2_CCDS_Reset;
+ }
+
+ TIMx->CR2 = (u16)tmpcr2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC1PreloadConfig
+* Description : Enables or disables the TIMx peripheral Preload register on CCR1.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCPreload: new state of the TIMx peripheral Preload
+* register
+* This parameter can be one of the following values:
+* - TIM_OCPreload_Enable
+* - TIM_OCPreload_Disable
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, u16 TIM_OCPreload)
+{
+ u32 tmpccmr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));
+
+ tmpccmr1 = TIMx->CCMR1;
+
+ /* Reset the OCPE Bit */
+ tmpccmr1 &= CCMR_OC13PE_Mask;
+
+ /* Enable or Disable the Output Compare Preload feature */
+ tmpccmr1 |= TIM_OCPreload;
+
+ TIMx->CCMR1 = (u16)tmpccmr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC2PreloadConfig
+* Description : Enables or disables the TIMx peripheral Preload register on CCR2.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCPreload: new state of the TIMx peripheral Preload
+* register
+* This parameter can be one of the following values:
+* - TIM_OCPreload_Enable
+* - TIM_OCPreload_Disable
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, u16 TIM_OCPreload)
+{
+ u32 tmpccmr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));
+
+ tmpccmr1 = TIMx->CCMR1;
+
+ /* Reset the OCPE Bit */
+ tmpccmr1 &= CCMR_OC24PE_Mask;
+
+ /* Enable or Disable the Output Compare Preload feature */
+ tmpccmr1 |= (u16)(TIM_OCPreload << 8);
+
+ TIMx->CCMR1 = (u16)tmpccmr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC3PreloadConfig
+* Description : Enables or disables the TIMx peripheral Preload register on CCR3.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCPreload: new state of the TIMx peripheral Preload
+* register
+* This parameter can be one of the following values:
+* - TIM_OCPreload_Enable
+* - TIM_OCPreload_Disable
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, u16 TIM_OCPreload)
+{
+ u32 tmpccmr2 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));
+
+ tmpccmr2 = TIMx->CCMR2;
+
+ /* Reset the OCPE Bit */
+ tmpccmr2 &= CCMR_OC13PE_Mask;
+
+ /* Enable or Disable the Output Compare Preload feature */
+ tmpccmr2 |= TIM_OCPreload;
+
+ TIMx->CCMR2 = (u16)tmpccmr2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC4PreloadConfig
+* Description : Enables or disables the TIMx peripheral Preload register on CCR4.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCPreload: new state of the TIMx peripheral Preload
+* register
+* This parameter can be one of the following values:
+* - TIM_OCPreload_Enable
+* - TIM_OCPreload_Disable
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, u16 TIM_OCPreload)
+{
+ u32 tmpccmr2 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));
+
+ tmpccmr2 = TIMx->CCMR2;
+
+ /* Reset the OCPE Bit */
+ tmpccmr2 &= CCMR_OC24PE_Mask;
+
+ /* Enable or Disable the Output Compare Preload feature */
+ tmpccmr2 |= (u16)(TIM_OCPreload << 8);
+
+ TIMx->CCMR2 = (u16)tmpccmr2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC1FastConfig
+* Description : Configures the TIMx Output Compare 1 Fast feature.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCFast: new state of the Output Compare Fast Enable Bit.
+* This parameter can be one of the following values:
+* - TIM_OCFast_Enable
+* - TIM_OCFast_Disable
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC1FastConfig(TIM_TypeDef* TIMx, u16 TIM_OCFast)
+{
+ u32 tmpccmr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OCFAST_STATE(TIM_OCFast));
+
+ tmpccmr1 = TIMx->CCMR1;
+
+ /* Reset the OCFE Bit */
+ tmpccmr1 &= CCMR_OC13FE_Mask;
+
+ /* Enable or Disable the Output Compare Fast Bit */
+ tmpccmr1 |= TIM_OCFast;
+
+ TIMx->CCMR1 = (u16)tmpccmr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC2FastConfig
+* Description : Configures the TIMx Output Compare 2 Fast feature.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCFast: new state of the Output Compare Fast Enable Bit.
+* This parameter can be one of the following values:
+* - TIM_OCFast_Enable
+* - TIM_OCFast_Disable
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC2FastConfig(TIM_TypeDef* TIMx, u16 TIM_OCFast)
+{
+ u32 tmpccmr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OCFAST_STATE(TIM_OCFast));
+
+ tmpccmr1 = TIMx->CCMR1;
+
+ /* Reset the OCFE Bit */
+ tmpccmr1 &= CCMR_OC24FE_Mask;
+
+ /* Enable or Disable the Output Compare Fast Bit */
+ tmpccmr1 |= (u16)(TIM_OCFast << 8);
+
+ TIMx->CCMR1 = (u16)tmpccmr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC3FastConfig
+* Description : Configures the TIMx Output Compare 3 Fast feature.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCFast: new state of the Output Compare Fast Enable Bit.
+* This parameter can be one of the following values:
+* - TIM_OCFast_Enable
+* - TIM_OCFast_Disable
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC3FastConfig(TIM_TypeDef* TIMx, u16 TIM_OCFast)
+{
+ u32 tmpccmr2 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OCFAST_STATE(TIM_OCFast));
+
+ tmpccmr2 = TIMx->CCMR2;
+
+ /* Reset the OCFE Bit */
+ tmpccmr2 &= CCMR_OC13FE_Mask;
+
+ /* Enable or Disable the Output Compare Fast Bit */
+ tmpccmr2 |= TIM_OCFast;
+
+ TIMx->CCMR2 = (u16)tmpccmr2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC4FastConfig
+* Description : Configures the TIMx Output Compare 4 Fast feature.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCFast: new state of the Output Compare Fast Enable Bit.
+* This parameter can be one of the following values:
+* - TIM_OCFast_Enable
+* - TIM_OCFast_Disable
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC4FastConfig(TIM_TypeDef* TIMx, u16 TIM_OCFast)
+{
+ u32 tmpccmr2 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OCFAST_STATE(TIM_OCFast));
+
+ tmpccmr2 = TIMx->CCMR2;
+
+ /* Reset the OCFE Bit */
+ tmpccmr2 &= CCMR_OC24FE_Mask;
+
+ /* Enable or Disable the Output Compare Fast Bit */
+ tmpccmr2 |= (u16)(TIM_OCFast << 8);
+
+ TIMx->CCMR2 = (u16)tmpccmr2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_UpdateDisableConfig
+* Description : Enables or Disables the TIMx Update event.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - Newstate: new state of the TIMx peripheral Preload register
+* This parameter can be: ENABLE or DISABLE.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState Newstate)
+{
+ u32 tmpcr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_FUNCTIONAL_STATE(Newstate));
+
+ tmpcr1 = TIMx->CR1;
+
+ if (Newstate != DISABLE)
+ {
+ /* Set the Update Disable Bit */
+ tmpcr1 |= CR1_UDIS_Set;
+ }
+ else
+ {
+ /* Reset the Update Disable Bit */
+ tmpcr1 &= CR1_UDIS_Reset;
+ }
+
+ TIMx->CR1 = (u16)tmpcr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_EncoderInterfaceConfig
+* Description : Configures the TIMx Encoder Interface.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_EncoderMode: specifies the TIMx Encoder Mode.
+* This parameter can be one of the following values:
+* - TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge
+* depending on TI2FP2 level.
+* - TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge
+* depending on TI1FP1 level.
+* - TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and
+* TI2FP2 edges depending on the level of the other input.
+* - TIM_IC1Polarity: specifies the IC1 Polarity
+* This parmeter can be one of the following values:
+* - TIM_ICPolarity_Falling
+* - TIM_ICPolarity_Rising
+* - TIM_IC2Polarity: specifies the IC2 Polarity
+* This parmeter can be one of the following values:
+* - TIM_ICPolarity_Falling
+* - TIM_ICPolarity_Rising
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, u16 TIM_EncoderMode,
+ u16 TIM_IC1Polarity, u16 TIM_IC2Polarity)
+{
+ u32 tmpsmcr = 0;
+ u32 tmpccmr1 = 0;
+ u32 tmpccer = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_ENCODER_MODE(TIM_EncoderMode));
+ assert(IS_TIM_IC_POLARITY(TIM_IC1Polarity));
+ assert(IS_TIM_IC_POLARITY(TIM_IC2Polarity));
+
+ tmpsmcr = TIMx->SMCR;
+ tmpccmr1 = TIMx->CCMR1;
+ tmpccer = TIMx->CCER;
+
+ /* Set the encoder Mode */
+ tmpsmcr &= SMCR_SMS_Mask;
+ tmpsmcr |= TIM_EncoderMode;
+
+ /* Select the Capture Compare 1 and the Capture Compare 2 as input */
+ tmpccmr1 &= CCMR_CC13S_Mask & CCMR_CC24S_Mask;
+ tmpccmr1 |= CCMR_TI13Direct_Set | CCMR_TI24Direct_Set;
+
+ /* Set the TI1 and the TI2 Polarities */
+ tmpccer &= CCER_CC1P_Mask & CCER_CC2P_Mask;
+ tmpccer |= (TIM_IC1Polarity | (u16)((u16)TIM_IC2Polarity << 4));
+
+ TIMx->SMCR = (u16)tmpsmcr;
+
+ TIMx->CCMR1 = (u16)tmpccmr1;
+
+ TIMx->CCER = (u16)tmpccer;
+}
+
+/*******************************************************************************
+* Function Name : TIM_GenerateEvent
+* Description : Configures the TIMx event to be generate by software.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_EventSource: specifies the event source.
+* This parameter can be one or more of the following values:
+* - TIM_EventSource_Update: Timer update Event source
+* - TIM_EventSource_CC1: Timer Capture Compare 1 Event source
+* - TIM_EventSource_CC2: Timer Capture Compare 2 Event source
+* - TIM_EventSource_CC3: Timer Capture Compare 3 Event source
+* - TIM_EventSource_CC4: Timer Capture Compare 4 Event source
+* - TIM_EventSource_Trigger: Timer Trigger Event source
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_GenerateEvent(TIM_TypeDef* TIMx, u16 TIM_EventSource)
+{
+ /* Check the parameters */
+ assert(IS_TIM_EVENT_SOURCE(TIM_EventSource));
+
+ /* Set the event sources */
+ TIMx->EGR |= TIM_EventSource;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC1PolarityConfig
+* Description : Configures the TIMx channel 1 polarity.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCPolarity: specifies the OC1 Polarity
+* This parmeter can be one of the following values:
+* - TIM_OCPolarity_High: Output Compare active high
+* - TIM_OCPolarity_Low: Output Compare active low
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, u16 TIM_OCPolarity)
+{
+ u32 tmpccer = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OC_POLARITY(TIM_OCPolarity));
+
+ tmpccer = TIMx->CCER;
+
+ /* Set or Reset the CC1P Bit */
+ tmpccer &= CCER_CC1P_Mask;
+ tmpccer |= TIM_OCPolarity;
+
+ TIMx->CCER = (u16)tmpccer;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC2PolarityConfig
+* Description : Configures the TIMx channel 2 polarity.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCPolarity: specifies the OC2 Polarity
+* This parmeter can be one of the following values:
+* - TIM_OCPolarity_High: Output Compare active high
+* - TIM_OCPolarity_Low: Output Compare active low
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, u16 TIM_OCPolarity)
+{
+ u32 tmpccer = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OC_POLARITY(TIM_OCPolarity));
+
+ tmpccer = TIMx->CCER;
+
+ /* Set or Reset the CC2P Bit */
+ tmpccer &= CCER_CC2P_Mask;
+ tmpccer |= (u16)((u16)TIM_OCPolarity << 4);
+
+ TIMx->CCER = (u16)tmpccer;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC3PolarityConfig
+* Description : Configures the TIMx channel 3 polarity.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCPolarity: specifies the OC3 Polarity
+* This parmeter can be one of the following values:
+* - TIM_OCPolarity_High: Output Compare active high
+* - TIM_OCPolarity_Low: Output Compare active low
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, u16 TIM_OCPolarity)
+{
+ u32 tmpccer = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OC_POLARITY(TIM_OCPolarity));
+
+ tmpccer = TIMx->CCER;
+
+ /* Set or Reset the CC3P Bit */
+ tmpccer &= CCER_CC3P_Mask;
+ tmpccer |= (u16)((u16)TIM_OCPolarity << 8);
+
+ TIMx->CCER = (u16)tmpccer;
+}
+
+/*******************************************************************************
+* Function Name : TIM_OC4PolarityConfig
+* Description : Configures the TIMx channel 4 polarity.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OCPolarity: specifies the OC4 Polarity
+* This parmeter can be one of the following values:
+* - TIM_OCPolarity_High: Output Compare active high
+* - TIM_OCPolarity_Low: Output Compare active low
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, u16 TIM_OCPolarity)
+{
+ u32 tmpccer = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OC_POLARITY(TIM_OCPolarity));
+
+ tmpccer = TIMx->CCER;
+
+ /* Set or Reset the CC4P Bit */
+ tmpccer &= CCER_CC4P_Mask;
+ tmpccer |= (u16)((u16)TIM_OCPolarity << 12);
+
+ TIMx->CCER = (u16)tmpccer;
+}
+
+/*******************************************************************************
+* Function Name : TIM_UpdateRequestConfig
+* Description : Configures the TIMx Update Request Interrupt source.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_UpdateSource: specifies the Update source.
+* This parameter can be one of the following values:
+* - TIM_UpdateSource_Regular
+* - TIM_UpdateSource_Global
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, u16 TIM_UpdateSource)
+{
+ u32 tmpcr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_UPDATE_SOURCE(TIM_UpdateSource));
+
+ tmpcr1 = TIMx->CR1;
+
+ if (TIM_UpdateSource == TIM_UpdateSource_Regular)
+ {
+ /* Set the URS Bit */
+ tmpcr1 |= CR1_URS_Set;
+ }
+ else
+ {
+ /* Reset the URS Bit */
+ tmpcr1 &= CR1_URS_Reset;
+ }
+ TIMx->CR1 = (u16)tmpcr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SelectHallSensor
+* Description : Enables or disables the TIMx’s Hall sensor interface.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - Newstate: new state of the TIMx Hall sensor interface.
+* This parameter can be: ENABLE or DISABLE.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState Newstate)
+{
+ /* Check the parameters */
+ assert(IS_FUNCTIONAL_STATE(Newstate));
+
+ if (Newstate != DISABLE)
+ {
+ /* Set the TI1S Bit */
+ TIMx->CR2 |= CR2_TI1S_Set;
+ }
+ else
+ {
+ /* Reset the TI1S Bit */
+ TIMx->CR2 &= CR2_TI1S_Reset;
+ }
+}
+
+/*******************************************************************************
+* Function Name : TIM_SelectOnePulseMode
+* Description : Selects the TIMx’s One Pulse Mode.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_OPMode: specifies the OPM Mode to be used.
+* This parameter can be one of the following values:
+* - TIM_OPMode_Single
+* - TIM_OPMode_Repetitive
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, u16 TIM_OPMode)
+{
+ u32 tmpcr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_OPM_MODE(TIM_OPMode));
+
+ tmpcr1 = TIMx->CR1;
+
+ /* Reset the OPM Bit */
+ tmpcr1 &= CR1_OPM_Mask;
+
+ /* Configure the OPM Mode */
+ tmpcr1 |= TIM_OPMode;
+
+ TIMx->CR1 = (u16)tmpcr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SelectOutputTrigger
+* Description : Selects the TIMx Trigger Output Mode.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_TRGOSource: specifies the Trigger Output source.
+* This paramter can be one of the following values:
+* - TIM_TRGOSource_Reset
+* - TIM_TRGOSource_Enable
+* - TIM_TRGOSource_Update
+* - TIM_TRGOSource_OC1
+* - TIM_TRGOSource_OC1Ref
+* - TIM_TRGOSource_OC2Ref
+* - TIM_TRGOSource_OC3Ref
+* - TIM_TRGOSource_OC4Ref
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, u16 TIM_TRGOSource)
+{
+ u32 tmpcr2 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_TRGO_SOURCE(TIM_TRGOSource));
+
+ tmpcr2 = TIMx->CR2;
+ /* Reset the MMS Bits */
+ tmpcr2 &= CR2_MMS_Mask;
+
+ /* Select the TRGO source */
+ tmpcr2 |= TIM_TRGOSource;
+
+ TIMx->CR2 = (u16)tmpcr2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SelectSlaveMode
+* Description : Selects the TIMx Slave Mode.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_SlaveMode: specifies the Timer Slave Mode.
+* This paramter can be one of the following values:
+* - TIM_SlaveMode_Reset
+* - TIM_SlaveMode_Gated
+* - TIM_SlaveMode_Trigger
+* - TIM_SlaveMode_External1
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, u16 TIM_SlaveMode)
+{
+ u32 tmpsmcr = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_SLAVE_MODE(TIM_SlaveMode));
+
+ tmpsmcr = TIMx->SMCR;
+
+ /* Reset the SMS Bits */
+ tmpsmcr &= SMCR_SMS_Mask;
+
+ /* Select the Slave Mode */
+ tmpsmcr |= TIM_SlaveMode;
+
+ TIMx->SMCR = (u16)tmpsmcr;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SelectMasterSlaveMode
+* Description : Sets or Resets the TIMx Master/Slave Mode.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_MasterSlaveMode: specifies the Timer Master Slave Mode.
+* This paramter can be one of the following values:
+* - TIM_MasterSlaveMode_Enable: synchronization between the
+* current timer and its slaves (through TRGO).
+* - TIM_MasterSlaveMode_Disable: No action
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, u16 TIM_MasterSlaveMode)
+{
+ u32 tmpsmcr = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_MSM_STATE(TIM_MasterSlaveMode));
+
+ tmpsmcr = TIMx->SMCR;
+
+ /* Set or Reset the MSM Bit */
+ tmpsmcr &= SMCR_MSM_Mask;
+ tmpsmcr |= TIM_MasterSlaveMode;
+
+ TIMx->SMCR = (u16)tmpsmcr;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SetAutoreload
+* Description : Sets the TIMx Autoreload Register value
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - Autoreload: specifies the Autoreload register new value.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SetAutoreload(TIM_TypeDef* TIMx, u16 Autoreload)
+{
+ /* Set the Autoreload Register value */
+ TIMx->ARR = Autoreload;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SetCompare1
+* Description : Sets the TIMx Capture Compare1 Register value
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - Compare1: specifies the Capture Compare1 register new value.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SetCompare1(TIM_TypeDef* TIMx, u16 Compare1)
+{
+ /* Set the Capture Compare1 Register value */
+ TIMx->CCR1 = Compare1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SetCompare2
+* Description : Sets the TIMx Capture Compare2 Register value
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - Compare2: specifies the Capture Compare2 register new value.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SetCompare2(TIM_TypeDef* TIMx, u16 Compare2)
+{
+ /* Set the Capture Compare2 Register value */
+ TIMx->CCR2 = Compare2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SetCompare3
+* Description : Sets the TIMx Capture Compare3 Register value
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - Compare3: specifies the Capture Compare3 register new value.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SetCompare3(TIM_TypeDef* TIMx, u16 Compare3)
+{
+ /* Set the Capture Compare3 Register value */
+ TIMx->CCR3 = Compare3;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SetCompare4
+* Description : Sets the TIMx Capture Compare4 Register value
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - Compare4: specifies the Capture Compare4 register new value.
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SetCompare4(TIM_TypeDef* TIMx, u16 Compare4)
+{
+ /* Set the Capture Compare4 Register value */
+ TIMx->CCR4 = Compare4;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SetIC1Prescaler
+* Description : Sets the TIMx Input Capture 1 prescaler.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_IC1Prescaler: specifies the Input Capture1 prescaler
+* new value.
+* This parameter can be one of the following values:
+* - TIM_ICPSC_DIV1: no prescaler
+* - TIM_ICPSC_DIV2: capture is done once every 2 events
+* - TIM_ICPSC_DIV4: capture is done once every 4 events
+* - TIM_ICPSC_DIV8: capture is done once every 8 events
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, u16 TIM_IC1Prescaler)
+{
+ u32 tmpccmr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_IC_PRESCALER(TIM_IC1Prescaler));
+
+ tmpccmr1 = TIMx->CCMR1;
+
+ /* Reset the IC1PSC Bits */
+ tmpccmr1 &= CCMR_IC13PSC_Mask;
+
+ /* Set the IC1PSC value */
+ tmpccmr1 |= TIM_IC1Prescaler;
+
+ TIMx->CCMR1 = (u16)tmpccmr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SetIC2Prescaler
+* Description : Sets the TIMx Input Capture 2 prescaler.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_IC2Prescaler: specifies the Input Capture2 prescaler
+* new value.
+* This parameter can be one of the following values:
+* - TIM_ICPSC_DIV1: no prescaler
+* - TIM_ICPSC_DIV2: capture is done once every 2 events
+* - TIM_ICPSC_DIV4: capture is done once every 4 events
+* - TIM_ICPSC_DIV8: capture is done once every 8 events
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, u16 TIM_IC2Prescaler)
+{
+ u32 tmpccmr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_IC_PRESCALER(TIM_IC2Prescaler));
+
+ tmpccmr1 = TIMx->CCMR1;
+
+ /* Reset the IC2PSC Bits */
+ tmpccmr1 &= CCMR_IC24PSC_Mask;
+
+ /* Set the IC2PSC value */
+ tmpccmr1 |= (u16)((u16)TIM_IC2Prescaler << 8);
+
+ TIMx->CCMR1 = (u16)tmpccmr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SetIC3Prescaler
+* Description : Sets the TIMx Input Capture 3 prescaler.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_IC3Prescaler: specifies the Input Capture3 prescaler
+* new value.
+* This parameter can be one of the following values:
+* - TIM_ICPSC_DIV1: no prescaler
+* - TIM_ICPSC_DIV2: capture is done once every 2 events
+* - TIM_ICPSC_DIV4: capture is done once every 4 events
+* - TIM_ICPSC_DIV8: capture is done once every 8 events
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, u16 TIM_IC3Prescaler)
+{
+ u32 tmpccmr2 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_IC_PRESCALER(TIM_IC3Prescaler));
+
+ tmpccmr2 = TIMx->CCMR2;
+
+ /* Reset the IC3PSC Bits */
+ tmpccmr2 &= CCMR_IC13PSC_Mask;
+
+ /* Set the IC3PSC value */
+ tmpccmr2 |= TIM_IC3Prescaler;
+
+ TIMx->CCMR2 = (u16)tmpccmr2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SetIC4Prescaler
+* Description : Sets the TIMx Input Capture 4 prescaler.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_IC4Prescaler: specifies the Input Capture4 prescaler
+* new value.
+* This parameter can be one of the following values:
+* - TIM_ICPSC_DIV1: no prescaler
+* - TIM_ICPSC_DIV2: capture is done once every 2 events
+* - TIM_ICPSC_DIV4: capture is done once every 4 events
+* - TIM_ICPSC_DIV8: capture is done once every 8 events
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, u16 TIM_IC4Prescaler)
+{
+ u32 tmpccmr2 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_IC_PRESCALER(TIM_IC4Prescaler));
+
+ tmpccmr2 = TIMx->CCMR2;
+
+ /* Reset the IC4PSC Bits */
+ tmpccmr2 &= CCMR_IC24PSC_Mask;
+
+ /* Set the IC4PSC value */
+ tmpccmr2 |= (u16)((u16)TIM_IC4Prescaler << 8);
+
+ TIMx->CCMR2 = (u16)tmpccmr2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_SetClockDivision
+* Description : Sets the TIMx Clock Division value.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_CKD: specifies the clock division value.
+* This parameter can be one of the following value:
+* - TIM_CKD_DIV1: TDTS = Tck_tim
+* - TIM_CKD_DIV2: TDTS = 2*Tck_tim
+* - TIM_CKD_DIV4: TDTS = 4*Tck_tim
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_SetClockDivision(TIM_TypeDef* TIMx, u16 TIM_CKD)
+{
+ u32 tmpcr1 = 0;
+
+ /* Check the parameters */
+ assert(IS_TIM_CKD_DIV(TIM_CKD));
+
+ tmpcr1 = TIMx->CR1;
+
+ /* Reset the CKD Bits */
+ tmpcr1 &= CR1_CKD_Mask;
+
+ /* Set the CKD value */
+ tmpcr1 |= TIM_CKD;
+
+ TIMx->CR1 = (u16)tmpcr1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_GetCapture1
+* Description : Gets the TIMx Input Capture 1 value.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* Output : None
+* Return : Capture Compare 1 Register value.
+*******************************************************************************/
+u16 TIM_GetCapture1(TIM_TypeDef* TIMx)
+{
+ /* Get the Capture 1 Register value */
+ return TIMx->CCR1;
+}
+
+/*******************************************************************************
+* Function Name : TIM_GetCapture2
+* Description : Gets the TIMx Input Capture 2 value.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* Output : None
+* Return : Capture Compare 2 Register value.
+*******************************************************************************/
+u16 TIM_GetCapture2(TIM_TypeDef* TIMx)
+{
+ /* Get the Capture 2 Register value */
+ return TIMx->CCR2;
+}
+
+/*******************************************************************************
+* Function Name : TIM_GetCapture3
+* Description : Gets the TIMx Input Capture 3 value.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* Output : None
+* Return : Capture Compare 3 Register value.
+*******************************************************************************/
+u16 TIM_GetCapture3(TIM_TypeDef* TIMx)
+{
+ /* Get the Capture 3 Register value */
+ return TIMx->CCR3;
+}
+
+/*******************************************************************************
+* Function Name : TIM_GetCapture4
+* Description : Gets the TIMx Input Capture 4 value.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* Output : None
+* Return : Capture Compare 4 Register value.
+*******************************************************************************/
+u16 TIM_GetCapture4(TIM_TypeDef* TIMx)
+{
+ /* Get the Capture 4 Register value */
+ return TIMx->CCR4;
+}
+
+/*******************************************************************************
+* Function Name : TIM_GetCounter
+* Description : Gets the TIMx Counter value.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* Output : None
+* Return : Counter Register value.
+*******************************************************************************/
+u16 TIM_GetCounter(TIM_TypeDef* TIMx)
+{
+ /* Get the Counter Register value */
+ return TIMx->CNT;
+}
+
+/*******************************************************************************
+* Function Name : TIM_GetPrescaler
+* Description : Gets the TIMx Prescaler value.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* Output : None
+* Return : Prescaler Register value.
+*******************************************************************************/
+u16 TIM_GetPrescaler(TIM_TypeDef* TIMx)
+{
+ /* Get the Prescaler Register value */
+ return TIMx->PSC;
+}
+
+/*******************************************************************************
+* Function Name : TIM_GetFlagStatus
+* Description : Checks whether the specified TIMx flag is set or not.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_FLAG: specifies the flag to check.
+* This parameter can be one of the following values:
+* - TIM_FLAG_Update: Timer update Flag
+* - TIM_FLAG_CC1: Timer Capture Compare 1 Flag
+* - TIM_FLAG_CC2: Timer Capture Compare 2 Flag
+* - TIM_FLAG_CC3: Timer Capture Compare 3 Flag
+* - TIM_FLAG_CC4: Timer Capture Compare 4 Flag
+* - TIM_FLAG_Trigger: Timer Trigger Flag
+* - TIM_FLAG_CC1OF: Timer Capture Compare 1 overcapture Flag
+* - TIM_FLAG_CC2OF: Timer Capture Compare 2 overcapture Flag
+* - TIM_FLAG_CC3OF: Timer Capture Compare 3 overcapture Flag
+* - TIM_FLAG_CC4OF: Timer Capture Compare 4 overcapture Flag
+* Output : None
+* Return : The new state of TIM_FLAG (SET or RESET).
+*******************************************************************************/
+FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, u16 TIM_FLAG)
+{
+ FlagStatus bitstatus = RESET;
+
+ /* Check the parameters */
+ assert(IS_TIM_GET_FLAG(TIM_FLAG));
+
+ if ((TIMx->SR & TIM_FLAG) != (u16)RESET )
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ return bitstatus;
+}
+
+/*******************************************************************************
+* Function Name : TIM_ClearFlag
+* Description : Clears the TIMx's pending flags.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_FLAG: specifies the flag bit to clear.
+* This parameter can be any combination of the following values:
+* - TIM_FLAG_Update: Timer update Flag
+* - TIM_FLAG_CC1: Timer Capture Compare 1 Flag
+* - TIM_FLAG_CC2: Timer Capture Compare 2 Flag
+* - TIM_FLAG_CC3: Timer Capture Compare 3 Flag
+* - TIM_FLAG_CC4: Timer Capture Compare 4 Flag
+* - TIM_FLAG_Trigger: Timer Trigger Flag
+* - TIM_FLAG_CC1OF: Timer Capture Compare 1 overcapture Flag
+* - TIM_FLAG_CC2OF: Timer Capture Compare 2 overcapture Flag
+* - TIM_FLAG_CC3OF: Timer Capture Compare 3 overcapture Flag
+* - TIM_FLAG_CC4OF: Timer Capture Compare 4 overcapture Flag
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ClearFlag(TIM_TypeDef* TIMx, u16 TIM_FLAG)
+{
+ /* Check the parameters */
+ assert(IS_TIM_CLEAR_FLAG(TIM_FLAG));
+
+ /* Clear the flags */
+ TIMx->SR &= (u16)~TIM_FLAG;
+}
+
+/*******************************************************************************
+* Function Name : TIM_GetITStatus
+* Description : Checks whether the TIMx interrupt has occurred or not.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_IT: specifies the TIM interrupt source to check.
+* This parameter can be one of the following values:
+* - TIM_IT_Update: Timer update Interrupt source
+* - TIM_IT_CC1: Timer Capture Compare 1 Interrupt source
+* - TIM_IT_CC2: Timer Capture Compare 2 Interrupt source
+* - TIM_IT_CC3: Timer Capture Compare 3 Interrupt source
+* - TIM_IT_CC4: Timer Capture Compare 4 Interrupt source
+* - TIM_IT_Trigger: Timer Trigger Interrupt source
+* Output : None
+* Return : The new state of the TIM_IT(SET or RESET).
+*******************************************************************************/
+ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, u16 TIM_IT)
+{
+ ITStatus bitstatus = RESET;
+
+ u16 itstatus = 0x0, itenable = 0x0;
+
+ /* Check the parameters */
+ assert(IS_TIM_GET_IT(TIM_IT));
+
+ itstatus = TIMx->SR & TIM_IT;
+
+ itenable = TIMx->DIER & TIM_IT;
+
+ if ((itstatus != (u16)RESET) && (itenable != (u16)RESET))
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ return bitstatus;
+}
+
+/*******************************************************************************
+* Function Name : TIM_ClearITPendingBit
+* Description : Clears the TIMx's interrupt pending bits.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_IT: specifies the pending bit to clear.
+* This parameter can be any combination of the following values:
+* - TIM_IT_Update: Timer update Interrupt source
+* - TIM_IT_CC1: Timer Capture Compare 1 Interrupt source
+* - TIM_IT_CC2: Timer Capture Compare 2 Interrupt source
+* - TIM_IT_CC3: Timer Capture Compare 3 Interrupt source
+* - TIM_IT_CC4: Timer Capture Compare 4 Interrupt source
+* - TIM_IT_Trigger: Timer Trigger Interrupt source
+* Output : None
+* Return : None
+*******************************************************************************/
+void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, u16 TIM_IT)
+{
+ /* Check the parameters */
+ assert(IS_TIM_IT(TIM_IT));
+
+ /* Clear the IT pending Bit */
+ TIMx->SR &= (u16)~TIM_IT;
+}
+
+/*******************************************************************************
+* Function Name : PWMInput_Config
+* Description : Configures the TIM peripheral according to the specified
+* parameters in the TIM_ICInitStruct to measure an external PWM
+* signal.
+* Input : - TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure
+* that contains the configuration information for the specified
+* TIM peripheral.
+* Output : None
+* Return : None
+*******************************************************************************/
+static void PWMI_Config(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)
+{
+ u8 ICPolarity = TIM_ICPolarity_Rising;
+ u8 ICSelection = TIM_ICSelection_DirectTI;
+
+ /* Select the Opposite Input Polarity */
+ if (TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising)
+ {
+ ICPolarity = TIM_ICPolarity_Falling;
+ }
+ else
+ {
+ ICPolarity = TIM_ICPolarity_Rising;
+ }
+
+ /* Select the Opposite Input */
+ if (TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI)
+ {
+ ICSelection = TIM_ICSelection_IndirectTI;
+ }
+ else
+ {
+ ICSelection = TIM_ICSelection_DirectTI;
+ }
+
+ if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1)
+ {
+ /* TI1 Configuration */
+ TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+
+ /* TI2 Configuration */
+ TI2_Config(TIMx, ICPolarity, ICSelection, TIM_ICInitStruct->TIM_ICFilter);
+
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else
+ {
+ /* TI1 Configuration */
+ TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+
+ /* TI2 Configuration */
+ TI1_Config(TIMx, ICPolarity, ICSelection, TIM_ICInitStruct->TIM_ICFilter);
+
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+}
+
+/*******************************************************************************
+* Function Name : TI1_Config
+* Description : Configure the TI1 as Input.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ICPolarity : The Input Polarity.
+* This parameter can be one of the following values:
+* - TIM_ICPolarity_Rising
+* - TIM_ICPolarity_Falling
+* - TIM_ICSelection: specifies the input to be used.
+* This parameter can be one of the following values:
+* - TIM_ICSelection_DirectTI: TIM Input 1 is selected to
+* be connected to IC1.
+* - TIM_ICSelection_IndirectTI: TIM Input 1 is selected to
+* be connected to IC2.
+* - TIM_ICSelection_TRGI: TIM Input 1 is selected to be
+* connected to TRGI.
+* - TIM_ICFilter: Specifies the Input Capture Filter.
+* This parameter must be a value between 0x00 and 0x0F.
+* Output : None
+* Return : None
+*******************************************************************************/
+static void TI1_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
+ u8 TIM_ICFilter)
+{
+ u32 tmpccmr1 = 0, tmpccer = 0;
+
+ tmpccmr1 = TIMx->CCMR1;
+ tmpccer = TIMx->CCER;
+
+ /* Disable the Channel 1: Reset the CCE Bit */
+ TIMx->CCER &= CCRE_CC1E_Reset;
+
+ /* Select the Input and set the filter */
+ tmpccmr1 &= CCMR_CC13S_Mask & CCMR_IC13F_Mask;
+ tmpccmr1 |= TIM_ICSelection | (u16)((u16)TIM_ICFilter << 4);
+
+ /* Select the Polarity and set the CCE Bit */
+ tmpccer &= CCER_CC1P_Mask & CCRE_CC1E_Mask;
+ tmpccer |= TIM_ICPolarity | CCRE_CC1E_Set;
+
+ TIMx->CCMR1 = 0x0000;
+ TIMx->CCMR1 = (u16)tmpccmr1;
+ TIMx->CCER = (u16)tmpccer;
+}
+
+/*******************************************************************************
+* Function Name : TI2_Config
+* Description : Configure the TI2 as Input.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ICPolarity : The Input Polarity.
+* This parameter can be one of the following values:
+* - TIM_ICPolarity_Rising
+* - TIM_ICPolarity_Falling
+* - TIM_ICSelection: specifies the input to be used.
+* This parameter can be one of the following values:
+* - TIM_ICSelection_DirectTI: TIM Input 2 is selected to
+* be connected to IC2.
+* - TIM_ICSelection_IndirectTI: TIM Input 2 is selected to
+* be connected to IC1.
+* - TIM_ICSelection_TRGI: TIM Input 2 is selected to be
+* connected to TRGI.
+* - TIM_ICFilter: Specifies the Input Capture Filter.
+* This parameter must be a value between 0x00 and 0x0F.
+* Output : None
+* Return : None
+*******************************************************************************/
+static void TI2_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
+ u8 TIM_ICFilter)
+{
+ u32 tmpccmr1 = 0, tmpccer = 0, tmp = 0;
+
+ tmpccmr1 = TIMx->CCMR1;
+ tmpccer = TIMx->CCER;
+ tmp = (u16)((u16)TIM_ICPolarity << 4);
+
+ /* Disable the Channel 2: Reset the CCE Bit */
+ TIMx->CCER &= CCRE_CC2E_Reset;
+
+ /* Select the Input and set the filter */
+ tmpccmr1 &= CCMR_CC24S_Mask & CCMR_IC24F_Mask;
+ tmpccmr1 |= (u16)((u16)TIM_ICFilter << 12);
+ tmpccmr1 |= (u16)((u16)TIM_ICSelection << 8);
+
+ /* Select the Polarity and set the CCE Bit */
+ tmpccer &= CCER_CC2P_Mask & CCRE_CC2E_Mask;
+ tmpccer |= tmp | CCRE_CC2E_Set;
+
+ TIMx->CCMR1 = (u16)tmpccmr1 ;
+ TIMx->CCER = (u16)tmpccer;
+}
+
+/*******************************************************************************
+* Function Name : TI3_Config
+* Description : Configure the TI3 as Input.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ICPolarity : The Input Polarity.
+* This parameter can be one of the following values:
+* - TIM_ICPolarity_Rising
+* - TIM_ICPolarity_Falling
+* - TIM_ICSelection: specifies the input to be used.
+* This parameter can be one of the following values:
+* - TIM_ICSelection_DirectTI: TIM Input 3 is selected to
+* be connected to IC3.
+* - TIM_ICSelection_IndirectTI: TIM Input 3 is selected to
+* be connected to IC4.
+* - TIM_ICSelection_TRGI: TIM Input 3 is selected to be
+* connected to TRGI.
+* - TIM_ICFilter: Specifies the Input Capture Filter.
+* This parameter must be a value between 0x00 and 0x0F.
+* Output : None
+* Return : None
+*******************************************************************************/
+static void TI3_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
+ u8 TIM_ICFilter)
+{
+ u32 tmpccmr2 = 0, tmpccer = 0, tmp = 0;
+
+ tmpccmr2 = TIMx->CCMR2;
+ tmpccer = TIMx->CCER;
+ tmp = (u16)((u16)TIM_ICPolarity << 8);
+
+ /* Disable the Channel 3: Reset the CCE Bit */
+ TIMx->CCER &= CCRE_CC3E_Reset;
+
+ /* Select the Input and set the filter */
+ tmpccmr2 &= CCMR_CC13S_Mask & CCMR_IC13F_Mask;
+ tmpccmr2 |= TIM_ICSelection | (u16)((u16)TIM_ICFilter << 4);
+
+ /* Select the Polarity and set the CCE Bit */
+ tmpccer &= CCER_CC1P_Mask & CCRE_CC1E_Mask;
+ tmpccer |= tmp | CCRE_CC3E_Set;
+
+ TIMx->CCMR2 = (u16)tmpccmr2;
+ TIMx->CCER = (u16)tmpccer;
+}
+
+/*******************************************************************************
+* Function Name : TI4_Config
+* Description : Configure the TI1 as Input.
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ICPolarity : The Input Polarity.
+* This parameter can be one of the following values:
+* - TIM_ICPolarity_Rising
+* - TIM_ICPolarity_Falling
+* - TIM_ICSelection: specifies the input to be used.
+* This parameter can be one of the following values:
+* - TIM_ICSelection_DirectTI: TIM Input 4 is selected to
+* be connected to IC4.
+* - TIM_ICSelection_IndirectTI: TIM Input 4 is selected to
+* be connected to IC3.
+* - TIM_ICSelection_TRGI: TIM Input 4 is selected to be
+* connected to TRGI.
+* - TIM_ICFilter: Specifies the Input Capture Filter.
+* This parameter must be a value between 0x00 and 0x0F.
+* Output : None
+* Return : None
+*******************************************************************************/
+static void TI4_Config(TIM_TypeDef* TIMx, u16 TIM_ICPolarity, u16 TIM_ICSelection,
+ u8 TIM_ICFilter)
+{
+ u32 tmpccmr2 = 0, tmpccer = 0, tmp = 0;
+
+ tmpccmr2 = TIMx->CCMR2;
+ tmpccer = TIMx->CCER;
+ tmp = (u16)((u16)TIM_ICPolarity << 12);
+
+ /* Disable the Channel 4: Reset the CCE Bit */
+ TIMx->CCER &= CCRE_CC4E_Reset;
+
+ /* Select the Input and set the filter */
+ tmpccmr2 &= CCMR_CC24S_Mask & CCMR_IC24F_Mask;
+ tmpccmr2 |= (u16)((u16)TIM_ICSelection << 8) | (u16)((u16)TIM_ICFilter << 12);
+
+ /* Select the Polarity and set the CCE Bit */
+ tmpccer &= CCER_CC4P_Mask & CCRE_CC4E_Mask;
+ tmpccer |= tmp | CCRE_CC4E_Set;
+
+ TIMx->CCMR2 = (u16)tmpccmr2;
+ TIMx->CCER = (u16)tmpccer ;
+}
+
+/*******************************************************************************
+* Function Name : ETR_Config
+* Description : Configure the External Trigger
+* Input : - TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.
+* - TIM_ExtTRGPrescaler: The external Trigger Prescaler.
+* This parameter can be one of the following values:
+* - TIM_ExtTRGPSC_OFF
+* - TIM_ExtTRGPSC_DIV2
+* - TIM_ExtTRGPSC_DIV4
+* - TIM_ExtTRGPSC_DIV8
+* - TIM_ExtTRGPolarity: The external Trigger Polarity.
+* This parameter can be one of the following values:
+* - TIM_ExtTRGPolarity_Inverted
+* - TIM_ExtTRGPolarity_NonInverted
+* - ExtTRGFilter: External Trigger Filter.
+* This parameter must be a value between 0x00 and 0x0F.
+* Output : None
+* Return : None
+*******************************************************************************/
+static void ETR_Config(TIM_TypeDef* TIMx, u16 TIM_ExtTRGPrescaler, u16 TIM_ExtTRGPolarity,
+ u8 ExtTRGFilter)
+{
+ u32 tmpsmcr = 0;
+
+ tmpsmcr = TIMx->SMCR;
+
+ /* Set the Prescaler, the Filter value and the Polarity */
+ tmpsmcr &= SMCR_ETR_Mask;
+ tmpsmcr |= TIM_ExtTRGPrescaler | TIM_ExtTRGPolarity | (u16)((u16)ExtTRGFilter << 8);
+
+ TIMx->SMCR = (u16)tmpsmcr;
+}
+/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/bitmap.h b/Demo/CORTEX_STM32F103_Primer_GCC/bitmap.h
new file mode 100644
index 000000000..2d0c5d062
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/bitmap.h
@@ -0,0 +1,3361 @@
+/*
+ FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry.
+
+ This file is part of the FreeRTOS.org distribution.
+
+ FreeRTOS.org is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ FreeRTOS.org is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with FreeRTOS.org; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ A special exception to the GPL can be applied should you wish to distribute
+ a combined work that includes FreeRTOS.org, without being obliged to provide
+ the source code for any proprietary components. See the licensing section
+ of http://www.FreeRTOS.org for full details of how and when the exception
+ can be applied.
+
+ ***************************************************************************
+ See http://www.FreeRTOS.org for documentation, latest information, license
+ and contact details. Please ensure to read the configuration and relevant
+ port sections of the online documentation.
+
+ Also see http://www.SafeRTOS.com a version that has been certified for use
+ in safety critical systems, plus commercial licensing, development and
+ support options.
+ ***************************************************************************
+*/
+
+/* FreeRTOS.org Logo as a 16bit bitmap. */
+
+#ifndef BITMAP_H
+#define BITMAP_H
+
+const unsigned short pucImage[] =
+{
+0xffff,
+0xffff,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xffff,
+0xffff,
+0xffff,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xffff,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xc318,
+0x0842,
+0x8210,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0c63,
+0xffff,
+0x0842,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0x0000,
+0x8631,
+0x38c6,
+0x38c6,
+0x38c6,
+0x38c6,
+0xfbde,
+0xffff,
+0xbad6,
+0x38c6,
+0xcb5a,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x3ce7,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0x0000,
+0x0842,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0x4529,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x0000,
+0x8210,
+0x0842,
+0x0842,
+0x0842,
+0x0842,
+0x718c,
+0xffff,
+0x8e73,
+0xb6b5,
+0xffff,
+0x0c63,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0c63,
+0xffff,
+0x0842,
+0x0c63,
+0xffff,
+0x0c63,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0c63,
+0xffff,
+0x0c63,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x031a,
+0xe73c,
+0x2b5f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x294e,
+0xa73c,
+0xc108,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x4000,
+0x452b,
+0x6845,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x2845,
+0x031a,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x8422,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x8631,
+0x38c6,
+0x38c6,
+0x38c6,
+0xf7bd,
+0x38c6,
+0x38c6,
+0x8631,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x8108,
+0xa94d,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0422,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xc319,
+0x2c67,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xe94d,
+0xc210,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xc210,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x4211,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0842,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0x0842,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x6a56,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0109,
+0x0000,
+0x0000,
+0x0000,
+0x431a,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xeb5e,
+0x0211,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe94d,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x2634,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0421,
+0x3084,
+0x3084,
+0x3084,
+0xb294,
+0xffff,
+0xf7bd,
+0x8210,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x8422,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x6c67,
+0x294e,
+0x2a56,
+0x2a56,
+0x2a56,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0xc108,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x2c67,
+0x2a56,
+0x2a56,
+0xac67,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x6a56,
+0x4108,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x052b,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xb294,
+0xffff,
+0x494a,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0xa94d,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xe94d,
+0x4000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xc422,
+0x2845,
+0x0000,
+0x0000,
+0x0000,
+0xa94d,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xec67,
+0x452b,
+0x0000,
+0x0000,
+0x0000,
+0x8108,
+0x2845,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x852b,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x4108,
+0xac67,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0211,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0c63,
+0x38c6,
+0x494a,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x2c67,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x852b,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x8108,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x673c,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xaa56,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xeb5e,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x694d,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xa73c,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x8210,
+0xf39c,
+0xbef7,
+0xffff,
+0x75ad,
+0x0421,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0xaa56,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x2a56,
+0x4000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0423,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xc108,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x8422,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0211,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x431a,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xc108,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x38c6,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0x79ce,
+0x4108,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0xea55,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x2c67,
+0x452b,
+0x0211,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe844,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x6a56,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x4000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x8422,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x4108,
+0x6b5f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x452b,
+0x0422,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x8631,
+0xffff,
+0x38c6,
+0xf7bd,
+0xf7bd,
+0xb294,
+0xffff,
+0x494a,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x452b,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xab5e,
+0x852b,
+0xc108,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x294e,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xe844,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xeb5e,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x8633,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x8633,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0c63,
+0xffff,
+0x0842,
+0x34a5,
+0xf39c,
+0x4108,
+0xffff,
+0x0c63,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x294e,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xec67,
+0x8633,
+0x0000,
+0x0000,
+0x0000,
+0x2a56,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x2634,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x2a56,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x2634,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xa844,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x8a52,
+0xffff,
+0x8631,
+0x34a5,
+0xf7bd,
+0xf39c,
+0xffff,
+0x494a,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x4000,
+0xa73c,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xec67,
+0x273c,
+0x0000,
+0x0000,
+0xe94d,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x673c,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xaa56,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x273c,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0109,
+0x6a56,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x4529,
+0xffff,
+0x0c63,
+0x34a5,
+0xffff,
+0xffff,
+0xb6b5,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xc108,
+0x8633,
+0x2a56,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xec67,
+0xc210,
+0x0000,
+0xa94d,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xa94d,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x6c67,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x052b,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x4000,
+0xeb5e,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xa94d,
+0x273c,
+0x8422,
+0x0422,
+0x2845,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0842,
+0x4529,
+0xcf7b,
+0xb6b5,
+0x0c63,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xc108,
+0x052b,
+0xeb5e,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0423,
+0x0000,
+0xc633,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x2b5f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0211,
+0xec67,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x031a,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x052b,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xa94d,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x273c,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xc318,
+0xc318,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x4108,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x273c,
+0x0000,
+0x0422,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0422,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xa73c,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x4000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe73c,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x4633,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x2634,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0421,
+0xbad6,
+0xffff,
+0xffff,
+0x3ce7,
+0x0842,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x2b5f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xc633,
+0x0000,
+0x4000,
+0x6c67,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xeb5e,
+0x8108,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x8211,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x6845,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe94d,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xe94d,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x273c,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0000,
+0xfbde,
+0xffff,
+0xffff,
+0xffff,
+0xffff,
+0x3ce7,
+0x8210,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x2634,
+0xa94d,
+0x452b,
+0x0422,
+0x031a,
+0x0422,
+0xc422,
+0xea55,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xc319,
+0x0000,
+0x0000,
+0x452b,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x2b5f,
+0x4633,
+0x031a,
+0x0422,
+0x673c,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xec67,
+0x8319,
+0x0000,
+0x0422,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x8108,
+0x0000,
+0xa73c,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x6a56,
+0x273c,
+0x031a,
+0x0422,
+0x2845,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0842,
+0xffff,
+0x34a5,
+0xb6b5,
+0x34a5,
+0x8e73,
+0xffff,
+0xcb5a,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x2845,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x6a56,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x6845,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xc633,
+0x0000,
+0x0000,
+0x2634,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0211,
+0x0000,
+0x8319,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x0c63,
+0xffff,
+0x8631,
+0x34a5,
+0xf39c,
+0x4108,
+0xffff,
+0x0c63,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe94d,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xeb5e,
+0x0109,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x4108,
+0xe94d,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xc633,
+0x0000,
+0x0000,
+0x0000,
+0x273c,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0211,
+0x0000,
+0x0000,
+0x273c,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0x8a52,
+0xffff,
+0xc739,
+0x34a5,
+0xbad6,
+0x38c6,
+0xffff,
+0x8631,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x6a56,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x673c,
+0x8000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xc422,
+0x2b5f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xe94d,
+0xc319,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x2634,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0211,
+0x0000,
+0x0000,
+0x0000,
+0x8422,
+0x6a56,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0xed6f,
+0x0000,
+0xc318,
+0xffff,
+0x8e73,
+0x34a5,
+0xffff,
+0xffff,
+0x718c,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0422,
+0xc633,
+0x273c,
+0xa73c,
+0xe844,
+0x2634,
+0xc633,
+0x031a,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x8319,
+0x052b,
+0x273c,
+0x2845,
+0xa844,
+0x2634,
+0x8422,
+0x0211,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0211,
+0x031a,
+0x0422,
+0x031a,
+0x0422,
+0x031a,
+0x0422,
+0x031a,
+0x0422,
+0x031a,
+0x0422,
+0x031a,
+0x0422,
+0x031a,
+0x0422,
+0x4000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x8108,
+0x0422,
+0x031a,
+0x0422,
+0x031a,
+0x0422,
+0x031a,
+0x0422,
+0x031a,
+0x0422,
+0x031a,
+0x4211,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x8a52,
+0x3084,
+0xc739,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0x0000,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xffff,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xffff,
+0xffff,
+0xffff,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xe006,
+0xffff,
+0xffff
+};
+
+#define bmpBITMAP_WIDTH 92
+#define bmpBITMAP_HEIGHT 36
+
+#endif
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/main.c b/Demo/CORTEX_STM32F103_Primer_GCC/main.c
new file mode 100644
index 000000000..fbb16cb74
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/main.c
@@ -0,0 +1,465 @@
+/*
+ FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry.
+
+ This file is part of the FreeRTOS.org distribution.
+
+ FreeRTOS.org is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ FreeRTOS.org is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with FreeRTOS.org; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ A special exception to the GPL can be applied should you wish to distribute
+ a combined work that includes FreeRTOS.org, without being obliged to provide
+ the source code for any proprietary components. See the licensing section
+ of http://www.FreeRTOS.org for full details of how and when the exception
+ can be applied.
+
+ ***************************************************************************
+ See http://www.FreeRTOS.org for documentation, latest information, license
+ and contact details. Please ensure to read the configuration and relevant
+ port sections of the online documentation.
+
+ Also see http://www.SafeRTOS.com a version that has been certified for use
+ in safety critical systems, plus commercial licensing, development and
+ support options.
+ ***************************************************************************
+*/
+
+/*
+ * Creates all the demo application tasks, then starts the scheduler. The WEB
+ * documentation provides more details of the standard demo application tasks.
+ * In addition to the standard demo tasks, the following tasks and tests are
+ * defined and/or created within this file:
+ *
+ * "Fast Interrupt Test" - A high frequency periodic interrupt is generated
+ * using a free running timer to demonstrate the use of the
+ * configKERNEL_INTERRUPT_PRIORITY configuration constant. The interrupt
+ * service routine measures the number of processor clocks that occur between
+ * each interrupt - and in so doing measures the jitter in the interrupt timing.
+ * The maximum measured jitter time is latched in the ulMaxJitter variable, and
+ * displayed on the LCD by the 'Check' task as described below. The
+ * fast interrupt is configured and handled in the timertest.c source file.
+ *
+ * "LCD" task - the LCD task is a 'gatekeeper' task. It is the only task that
+ * is permitted to access the display directly. Other tasks wishing to write a
+ * message to the LCD send the message on a queue to the LCD task instead of
+ * accessing the LCD themselves. The LCD task just blocks on the queue waiting
+ * for messages - waking and displaying the messages as they arrive. Messages
+ * can either be a text string to display, or an instruction to update MEMS
+ * input. The MEMS input is used to display a ball that can be moved around
+ * LCD by tilting the STM32 Primer. 45% is taken as the neutral position.
+ *
+ * "Check" task - This only executes every five seconds but has the highest
+ * priority so is guaranteed to get processor time. Its main function is to
+ * check that all the standard demo tasks are still operational. Should any
+ * unexpected behaviour within a demo task be discovered the 'check' task will
+ * write an error to the LCD (via the LCD task). If all the demo tasks are
+ * executing with their expected behaviour then the check task writes PASS
+ * along with the max jitter time to the LCD (again via the LCD task), as
+ * described above.
+ *
+ * Tick Hook - A tick hook is provided just for demonstration purposes. In
+ * this case it is used to periodically send an instruction to updated the
+ * MEMS input to the LCD task.
+ *
+ */
+
+/* CircleOS includes. Some of the CircleOS peripheral functionality is
+utilised, although CircleOS itself is not used. */
+#include "circle.h"
+
+/* Standard includes. */
+#include
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "Task.h"
+#include "Queue.h"
+
+/* Demo app includes. */
+#include "BlockQ.h"
+#include "blocktim.h"
+#include "GenQTest.h"
+#include "partest.h"
+#include "QPeek.h"
+
+/* The bitmap used to display the FreeRTOS.org logo is stored in 16bit format
+and therefore takes up a large proportion of the Flash space. Setting this
+parameter to 0 excludes the bitmap from the build, freeing up Flash space for
+extra code. */
+#define mainINCLUDE_BITMAP 1
+
+#if mainINCLUDE_BITMAP == 1
+ #include "bitmap.h"
+#endif
+
+/* Task priorities. */
+#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
+#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
+#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
+#define mainGEN_Q_PRIORITY ( tskIDLE_PRIORITY + 0 )
+#define mainFLASH_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
+
+/* Splash screen related constants. */
+#define mainBITMAP_Y ( 38 )
+#define mainBITMAP_X ( 18 )
+#define mainURL_Y ( 8 )
+#define mainURL_X ( 78 )
+#define mainSPLASH_SCREEN_DELAY ( 2000 / portTICK_RATE_MS )
+
+/* Text drawing related constants. */
+#define mainLCD_CHAR_HEIGHT ( 13 )
+#define mainLCD_MAX_Y ( 110 )
+
+/* The maximum number of message that can be waiting for display at any one
+time. */
+#define mainLCD_QUEUE_SIZE ( 3 )
+
+/* The check task uses the sprintf function so requires a little more stack. */
+#define mainCHECK_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 )
+
+/* The LCD task calls some of the CircleOS functions (for MEMS and LCD access),
+these can require a larger stack. */
+#define configLCD_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 )
+
+/* Dimensions the buffer into which the jitter time is written. */
+#define mainMAX_MSG_LEN 25
+
+/* The time between cycles of the 'check' task. */
+#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS )
+
+/* The period at which the MEMS input should be updated. */
+#define mainMEMS_DELAY ( ( portTickType ) 100 / portTICK_RATE_MS )
+
+/* The rate at which the flash task toggles the LED. */
+#define mainFLASH_DELAY ( ( portTickType ) 1000 / portTICK_RATE_MS )
+
+/* The number of nano seconds between each processor clock. */
+#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) )
+
+/* The two types of message that can be sent to the LCD task. */
+#define mainUPDATE_BALL_MESSAGE ( 0 )
+#define mainWRITE_STRING_MESSAGE ( 1 )
+
+/* Type of the message sent to the LCD task. */
+typedef struct
+{
+ portBASE_TYPE xMessageType;
+ signed char *pcMessage;
+} xLCDMessage;
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Configure the clocks, GPIO and other peripherals as required by the demo.
+ */
+static void prvSetupHardware( void );
+
+/*
+ * The LCD is written two by more than one task so is controlled by a
+ * 'gatekeeper' task. This is the only task that is actually permitted to
+ * access the LCD directly. Other tasks wanting to display a message send
+ * the message to the gatekeeper.
+ */
+static void prvLCDTask( void *pvParameters );
+
+/*
+ * Checks the status of all the demo tasks then prints a message to the
+ * display. The message will be either PASS - and include in brackets the
+ * maximum measured jitter time (as described at the to of the file), or a
+ * message that describes which of the standard demo tasks an error has been
+ * discovered in.
+ *
+ * Messages are not written directly to the terminal, but passed to prvLCDTask
+ * via a queue.
+ *
+ * The check task also receives instructions to update the MEMS input, which
+ * in turn can also lead to the LCD being updated.
+ */
+static void prvCheckTask( void *pvParameters );
+
+/*
+ * Configures the timers and interrupts for the fast interrupt test as
+ * described at the top of this file.
+ */
+extern void vSetupTimerTest( void );
+
+/*
+ * A cut down version of sprintf() used to percent the HUGE GCC library
+ * equivalent from being included in the binary image.
+ */
+extern int sprintf(char *out, const char *format, ...);
+
+/*
+ * Simple toggle the LED periodically for timing verification.
+ */
+static void prvFlashTask( void *pvParameters );
+
+/*-----------------------------------------------------------*/
+
+/* The queue used to send messages to the LCD task. */
+xQueueHandle xLCDQueue;
+
+/*-----------------------------------------------------------*/
+
+int main( void )
+{
+ #ifdef DEBUG
+ debug();
+ #endif
+
+ prvSetupHardware();
+
+ /* Create the queue used by the LCD task. Messages for display on the LCD
+ are received via this queue. */
+ xLCDQueue = xQueueCreate( mainLCD_QUEUE_SIZE, sizeof( xLCDMessage ) );
+
+ /* Start the standard demo tasks. */
+ vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
+ vCreateBlockTimeTasks();
+ vStartGenericQueueTasks( mainGEN_Q_PRIORITY );
+ vStartQueuePeekTasks();
+ vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
+
+ /* Start the tasks defined within this file/specific to this demo. */
+ xTaskCreate( prvCheckTask, ( signed portCHAR * ) "Check", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
+ xTaskCreate( prvLCDTask, ( signed portCHAR * ) "LCD", configLCD_TASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
+ xTaskCreate( prvFlashTask, ( signed portCHAR * ) "Flash", configMINIMAL_STACK_SIZE, NULL, mainFLASH_TASK_PRIORITY, NULL );
+
+ /* Configure the timers used by the fast interrupt timer test. */
+ vSetupTimerTest();
+
+ /* Start the scheduler. */
+ vTaskStartScheduler();
+
+ /* Will only get here if there was not enough heap space to create the
+ idle task. */
+ return 0;
+}
+/*-----------------------------------------------------------*/
+
+void prvLCDTask( void *pvParameters )
+{
+xLCDMessage xMessage;
+portCHAR cY = mainLCD_CHAR_HEIGHT;
+const portCHAR * const pcString = "www.FreeRTOS.org";
+const portCHAR * const pcBlankLine = " ";
+
+ DRAW_Init();
+
+ #if mainINCLUDE_BITMAP == 1
+ DRAW_SetImage( pucImage, mainBITMAP_Y, mainBITMAP_X, bmpBITMAP_HEIGHT, bmpBITMAP_WIDTH );
+ #endif
+
+ LCD_SetScreenOrientation( V9 );
+ DRAW_DisplayString( mainURL_Y, mainURL_X, pcString, strlen( pcString ) );
+ vTaskDelay( mainSPLASH_SCREEN_DELAY );
+ LCD_FillRect( 0, 0, CHIP_SCREEN_WIDTH, CHIP_SCREEN_HEIGHT, RGB_WHITE );
+
+ for( ;; )
+ {
+ /* Wait for a message to arrive that requires displaying. */
+ while( xQueueReceive( xLCDQueue, &xMessage, portMAX_DELAY ) != pdPASS );
+
+ /* Check the message type. */
+ if( xMessage.xMessageType == mainUPDATE_BALL_MESSAGE )
+ {
+ /* Read the MEMS and update the ball display on the LCD if required. */
+ MEMS_Handler();
+ POINTER_Handler();
+ }
+ else
+ {
+ /* A text string was sent. First blank off the old text string, then
+ draw the new text on the next line down. */
+ DRAW_DisplayString( 0, cY, pcBlankLine, strlen( pcBlankLine ) );
+
+ cY -= mainLCD_CHAR_HEIGHT;
+ if( cY <= ( mainLCD_CHAR_HEIGHT - 1 ) )
+ {
+ /* Wrap the line onto which we are going to write the text. */
+ cY = mainLCD_MAX_Y;
+ }
+
+ /* Display the message. */
+ DRAW_DisplayString( 0, cY, xMessage.pcMessage, strlen( xMessage.pcMessage ) );
+ }
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvCheckTask( void *pvParameters )
+{
+portTickType xLastExecutionTime;
+xLCDMessage xMessage;
+static signed portCHAR cPassMessage[ mainMAX_MSG_LEN ];
+extern unsigned portSHORT usMaxJitter;
+
+ /* Initialise the xLastExecutionTime variable on task entry. */
+ xLastExecutionTime = xTaskGetTickCount();
+
+ /* Setup the message we are going to send to the LCD task. */
+ xMessage.xMessageType = mainWRITE_STRING_MESSAGE;
+ xMessage.pcMessage = cPassMessage;
+
+ for( ;; )
+ {
+ /* Perform this check every mainCHECK_DELAY milliseconds. */
+ vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY );
+
+ /* Has an error been found in any task? If so then point the text
+ we are going to send to the LCD task to an error message instead of
+ the PASS message. */
+ if( xAreGenericQueueTasksStillRunning() != pdTRUE )
+ {
+ xMessage.pcMessage = "ERROR IN GEN Q";
+ }
+ if( xAreBlockingQueuesStillRunning() != pdTRUE )
+ {
+ xMessage.pcMessage = "ERROR IN BLOCK Q";
+ }
+ else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
+ {
+ xMessage.pcMessage = "ERROR IN BLOCK TIME";
+ }
+ else if( xArePollingQueuesStillRunning() != pdTRUE )
+ {
+ xMessage.pcMessage = "ERROR IN POLL Q";
+ }
+ else if( xAreQueuePeekTasksStillRunning() != pdTRUE )
+ {
+ xMessage.pcMessage = "ERROR IN PEEK Q";
+ }
+ else
+ {
+ /* No errors were found in any task, so send a pass message
+ with the max measured jitter time also included (as per the
+ fast interrupt test described at the top of this file and on
+ the online documentation page for this demo application). */
+ sprintf( ( portCHAR * ) cPassMessage, "PASS [%uns]", ( ( unsigned portLONG ) usMaxJitter ) * mainNS_PER_CLOCK );
+ }
+
+ /* Send the message to the LCD gatekeeper for display. */
+ xQueueSend( xLCDQueue, &xMessage, portMAX_DELAY );
+ }
+}
+/*-----------------------------------------------------------*/
+
+void vApplicationTickHook( void )
+{
+static unsigned portLONG ulCallCount;
+static const xLCDMessage xMemsMessage = { mainUPDATE_BALL_MESSAGE, NULL };
+
+ /* Periodically send a message to the LCD task telling it to update
+ the MEMS input, and then if necessary the LCD. */
+ ulCallCount++;
+ if( ulCallCount >= mainMEMS_DELAY )
+ {
+ ulCallCount = 0;
+ xQueueSendFromISR( xLCDQueue, &xMemsMessage, pdFALSE );
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvSetupHardware( void )
+{
+ /* Start with the clocks in their expected state. */
+ RCC_DeInit();
+
+ /* Enable HSE (high speed external clock). */
+ RCC_HSEConfig( RCC_HSE_ON );
+
+ /* Wait till HSE is ready. */
+ while( RCC_GetFlagStatus( RCC_FLAG_HSERDY ) == RESET )
+ {
+ }
+
+ /* 2 wait states required on the flash. */
+ *( ( unsigned portLONG * ) 0x40022000 ) = 0x02;
+
+ /* HCLK = SYSCLK */
+ RCC_HCLKConfig( RCC_SYSCLK_Div1 );
+
+ /* PCLK2 = HCLK */
+ RCC_PCLK2Config( RCC_HCLK_Div1 );
+
+ /* PCLK1 = HCLK/2 */
+ RCC_PCLK1Config( RCC_HCLK_Div2 );
+
+ /* PLLCLK = 12MHz * 6 = 72 MHz. */
+ RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_6 );
+
+ /* Enable PLL. */
+ RCC_PLLCmd( ENABLE );
+
+ /* Wait till PLL is ready. */
+ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
+ {
+ }
+
+ /* Select PLL as system clock source. */
+ RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK );
+
+ /* Wait till PLL is used as system clock source. */
+ while( RCC_GetSYSCLKSource() != 0x08 )
+ {
+ }
+
+ /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE and AFIO clocks */
+ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
+ | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE );
+
+ /* SPI2 Periph clock enable */
+ RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );
+
+
+ /* Set the Vector Table base address at 0x08000000 */
+ NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 );
+
+ NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
+
+ /* Configure HCLK clock as SysTick clock source. */
+ SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK );
+
+ /* Misc initialisation, including some of the CircleOS features. Note
+ that CircleOS itself is not used. */
+ vParTestInitialise();
+ MEMS_Init();
+ POINTER_Init();
+ POINTER_SetMode( POINTER_RESTORE_LESS );
+}
+/*-----------------------------------------------------------*/
+
+static void prvFlashTask( void *pvParameters )
+{
+portTickType xLastExecutionTime;
+
+ /* Initialise the xLastExecutionTime variable on task entry. */
+ xLastExecutionTime = xTaskGetTickCount();
+
+ for( ;; )
+ {
+ /* Simple toggle the LED periodically. This just provides some timing
+ verification. */
+ vTaskDelayUntil( &xLastExecutionTime, mainFLASH_DELAY );
+ vParTestToggleLED( 0 );
+ }
+}
+/*-----------------------------------------------------------*/
+
+void starting_delay( unsigned long ul )
+{
+ vTaskDelay( ( portTickType ) ul );
+}
+
+
+
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/printf-stdarg.c b/Demo/CORTEX_STM32F103_Primer_GCC/printf-stdarg.c
new file mode 100644
index 000000000..45a824384
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/printf-stdarg.c
@@ -0,0 +1,280 @@
+/*
+ Copyright 2001, 2002 Georges Menie (www.menie.org)
+ stdarg version contributed by Christian Ettinger
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/*
+ putchar is the only external dependency for this file,
+ if you have a working putchar, leave it commented out.
+ If not, uncomment the define below and
+ replace outbyte(c) by your own function call.
+
+#define putchar(c) outbyte(c)
+*/
+
+#include
+
+static void printchar(char **str, int c)
+{
+ extern int putchar(int c);
+
+ if (str) {
+ **str = c;
+ ++(*str);
+ }
+ else (void)putchar(c);
+}
+
+#define PAD_RIGHT 1
+#define PAD_ZERO 2
+
+static int prints(char **out, const char *string, int width, int pad)
+{
+ register int pc = 0, padchar = ' ';
+
+ if (width > 0) {
+ register int len = 0;
+ register const char *ptr;
+ for (ptr = string; *ptr; ++ptr) ++len;
+ if (len >= width) width = 0;
+ else width -= len;
+ if (pad & PAD_ZERO) padchar = '0';
+ }
+ if (!(pad & PAD_RIGHT)) {
+ for ( ; width > 0; --width) {
+ printchar (out, padchar);
+ ++pc;
+ }
+ }
+ for ( ; *string ; ++string) {
+ printchar (out, *string);
+ ++pc;
+ }
+ for ( ; width > 0; --width) {
+ printchar (out, padchar);
+ ++pc;
+ }
+
+ return pc;
+}
+
+/* the following should be enough for 32 bit int */
+#define PRINT_BUF_LEN 12
+
+static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
+{
+ char print_buf[PRINT_BUF_LEN];
+ register char *s;
+ register int t, neg = 0, pc = 0;
+ register unsigned int u = i;
+
+ if (i == 0) {
+ print_buf[0] = '0';
+ print_buf[1] = '\0';
+ return prints (out, print_buf, width, pad);
+ }
+
+ if (sg && b == 10 && i < 0) {
+ neg = 1;
+ u = -i;
+ }
+
+ s = print_buf + PRINT_BUF_LEN-1;
+ *s = '\0';
+
+ while (u) {
+ t = u % b;
+ if( t >= 10 )
+ t += letbase - '0' - 10;
+ *--s = t + '0';
+ u /= b;
+ }
+
+ if (neg) {
+ if( width && (pad & PAD_ZERO) ) {
+ printchar (out, '-');
+ ++pc;
+ --width;
+ }
+ else {
+ *--s = '-';
+ }
+ }
+
+ return pc + prints (out, s, width, pad);
+}
+
+static int print( char **out, const char *format, va_list args )
+{
+ register int width, pad;
+ register int pc = 0;
+ char scr[2];
+
+ for (; *format != 0; ++format) {
+ if (*format == '%') {
+ ++format;
+ width = pad = 0;
+ if (*format == '\0') break;
+ if (*format == '%') goto out;
+ if (*format == '-') {
+ ++format;
+ pad = PAD_RIGHT;
+ }
+ while (*format == '0') {
+ ++format;
+ pad |= PAD_ZERO;
+ }
+ for ( ; *format >= '0' && *format <= '9'; ++format) {
+ width *= 10;
+ width += *format - '0';
+ }
+ if( *format == 's' ) {
+ register char *s = (char *)va_arg( args, int );
+ pc += prints (out, s?s:"(null)", width, pad);
+ continue;
+ }
+ if( *format == 'd' ) {
+ pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a');
+ continue;
+ }
+ if( *format == 'x' ) {
+ pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a');
+ continue;
+ }
+ if( *format == 'X' ) {
+ pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A');
+ continue;
+ }
+ if( *format == 'u' ) {
+ pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a');
+ continue;
+ }
+ if( *format == 'c' ) {
+ /* char are converted to int then pushed on the stack */
+ scr[0] = (char)va_arg( args, int );
+ scr[1] = '\0';
+ pc += prints (out, scr, width, pad);
+ continue;
+ }
+ }
+ else {
+ out:
+ printchar (out, *format);
+ ++pc;
+ }
+ }
+ if (out) **out = '\0';
+ va_end( args );
+ return pc;
+}
+
+int printf(const char *format, ...)
+{
+ va_list args;
+
+ va_start( args, format );
+ return print( 0, format, args );
+}
+
+int sprintf(char *out, const char *format, ...)
+{
+ va_list args;
+
+ va_start( args, format );
+ return print( &out, format, args );
+}
+
+
+int snprintf( char *buf, unsigned int count, const char *format, ... )
+{
+ va_list args;
+
+ ( void ) count;
+
+ va_start( args, format );
+ return print( &buf, format, args );
+}
+
+
+#ifdef TEST_PRINTF
+int main(void)
+{
+ char *ptr = "Hello world!";
+ char *np = 0;
+ int i = 5;
+ unsigned int bs = sizeof(int)*8;
+ int mi;
+ char buf[80];
+
+ mi = (1 << (bs-1)) + 1;
+ printf("%s\n", ptr);
+ printf("printf test\n");
+ printf("%s is null pointer\n", np);
+ printf("%d = 5\n", i);
+ printf("%d = - max int\n", mi);
+ printf("char %c = 'a'\n", 'a');
+ printf("hex %x = ff\n", 0xff);
+ printf("hex %02x = 00\n", 0);
+ printf("signed %d = unsigned %u = hex %x\n", -3, -3, -3);
+ printf("%d %s(s)%", 0, "message");
+ printf("\n");
+ printf("%d %s(s) with %%\n", 0, "message");
+ sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf);
+ sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf);
+ sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf);
+ sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf);
+ sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf);
+ sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf);
+ sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf);
+ sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf);
+
+ return 0;
+}
+
+/*
+ * if you compile this file with
+ * gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c
+ * you will get a normal warning:
+ * printf.c:214: warning: spurious trailing `%' in format
+ * this line is testing an invalid % at the end of the format string.
+ *
+ * this should display (on 32bit int machine) :
+ *
+ * Hello world!
+ * printf test
+ * (null) is null pointer
+ * 5 = 5
+ * -2147483647 = - max int
+ * char a = 'a'
+ * hex ff = ff
+ * hex 00 = 00
+ * signed -3 = unsigned 4294967293 = hex fffffffd
+ * 0 message(s)
+ * 0 message(s) with %
+ * justif: "left "
+ * justif: " right"
+ * 3: 0003 zero padded
+ * 3: 3 left justif.
+ * 3: 3 right justif.
+ * -3: -003 zero padded
+ * -3: -3 left justif.
+ * -3: -3 right justif.
+ */
+
+#endif
+
+
diff --git a/Demo/CORTEX_STM32F103_Primer_GCC/timertest.c b/Demo/CORTEX_STM32F103_Primer_GCC/timertest.c
new file mode 100644
index 000000000..98cc65435
--- /dev/null
+++ b/Demo/CORTEX_STM32F103_Primer_GCC/timertest.c
@@ -0,0 +1,170 @@
+/*
+ FreeRTOS.org V4.6.1 - Copyright (C) 2003-2007 Richard Barry.
+
+ This file is part of the FreeRTOS.org distribution.
+
+ FreeRTOS.org is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ FreeRTOS.org is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with FreeRTOS.org; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ A special exception to the GPL can be applied should you wish to distribute
+ a combined work that includes FreeRTOS.org, without being obliged to provide
+ the source code for any proprietary components. See the licensing section
+ of http://www.FreeRTOS.org for full details of how and when the exception
+ can be applied.
+
+ ***************************************************************************
+ See http://www.FreeRTOS.org for documentation, latest information, license
+ and contact details. Please ensure to read the configuration and relevant
+ port sections of the online documentation.
+
+ Also see http://www.SafeRTOS.com a version that has been certified for use
+ in safety critical systems, plus commercial licensing, development and
+ support options.
+ ***************************************************************************
+*/
+
+/* High speed timer test as described in main.c. */
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+
+/* Library includes. */
+#include "stm32f10x_lib.h"
+#include "stm32f10x_tim.h"
+#include "stm32f10x_map.h"
+
+/* The set frequency of the interrupt. Deviations from this are measured as
+the jitter. */
+#define timerINTERRUPT_FREQUENCY ( ( unsigned portSHORT ) 20000 )
+
+/* The expected time between each of the timer interrupts - if the jitter was
+zero. */
+#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY )
+
+/* The highest available interrupt priority. */
+#define timerHIGHEST_PRIORITY ( 0 )
+
+/* Misc defines. */
+#define timerMAX_32BIT_VALUE ( 0xffffffffUL )
+#define timerTIMER_1_COUNT_VALUE ( * ( ( unsigned long * ) ( TIMER1_BASE + 0x48 ) ) )
+
+/* The number of interrupts to pass before we start looking at the jitter. */
+#define timerSETTLE_TIME 5
+
+/*-----------------------------------------------------------*/
+
+/*
+ * Configures the two timers used to perform the test.
+ */
+void vSetupTimerTest( void );
+
+/* Interrupt handler in which the jitter is measured. */
+void vTimer2IntHandler( void );
+
+/* Stores the value of the maximum recorded jitter between interrupts. */
+volatile unsigned portSHORT usMaxJitter = 0;
+
+/*-----------------------------------------------------------*/
+
+void vSetupTimerTest( void )
+{
+unsigned long ulFrequency;
+TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
+NVIC_InitTypeDef NVIC_InitStructure;
+
+
+ /* Enable timer clocks */
+ RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE );
+ RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );
+
+ /* Initialise data. */
+ TIM_DeInit( TIM2 );
+ TIM_DeInit( TIM3 );
+ TIM_TimeBaseStructInit( &TIM_TimeBaseStructure );
+
+ /* Time base configuration for timer 2 - which generates the interrupts. */
+ ulFrequency = configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY;
+ TIM_TimeBaseStructure.TIM_Period = ( unsigned portSHORT ) ( ulFrequency & 0xffffUL );
+ TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
+ TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
+ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
+ TIM_TimeBaseInit( TIM2, &TIM_TimeBaseStructure );
+ TIM_ARRPreloadConfig( TIM2, ENABLE );
+
+
+ /* Configuration for timer 3 which is used as a high resolution time
+ measurement. */
+ TIM_TimeBaseStructure.TIM_Period = ( unsigned portSHORT ) 0xffff;
+ TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure );
+ TIM_ARRPreloadConfig( TIM3, ENABLE );
+
+ /* Enable TIM2 IT. TIM3 does not generate an interrupt. */
+ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = timerHIGHEST_PRIORITY;
+ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+ NVIC_Init( &NVIC_InitStructure );
+ TIM_ITConfig( TIM2, TIM_IT_Update, ENABLE );
+
+ /* Finally, enable both timers. */
+ TIM_Cmd( TIM2, ENABLE );
+ TIM_Cmd( TIM3, ENABLE );
+}
+/*-----------------------------------------------------------*/
+
+void vTimer2IntHandler( void )
+{
+static unsigned portSHORT usLastCount = 0, usSettleCount = 0, usMaxDifference = 0;
+unsigned portSHORT usThisCount, usDifference;
+
+ /* Capture the free running timer 3 value as we enter the interrupt. */
+ usThisCount = TIM3->CNT;
+
+ if( usSettleCount >= timerSETTLE_TIME )
+ {
+ /* What is the difference between the timer value in this interrupt
+ and the value from the last interrupt. */
+ usDifference = usThisCount - usLastCount;
+
+ /* Store the difference in the timer values if it is larger than the
+ currently stored largest value. The difference over and above the
+ expected difference will give the 'jitter' in the processing of these
+ interrupts. */
+ if( usDifference > usMaxDifference )
+ {
+ usMaxDifference = usDifference;
+ usMaxJitter = usMaxDifference - timerEXPECTED_DIFFERENCE_VALUE;
+ }
+ }
+ else
+ {
+ /* Don't bother storing any values for the first couple of
+ interrupts. */
+ usSettleCount++;
+ }
+
+ /* Remember what the timer value was this time through, so we can calculate
+ the difference the next time through. */
+ usLastCount = usThisCount;
+
+ TIM_ClearITPendingBit( TIM2, TIM_IT_Update );
+}
+
+
+
+
+
+
+
+
diff --git a/Source/include/portable.h b/Source/include/portable.h
index 6c45fdf95..a00fdc3d4 100644
--- a/Source/include/portable.h
+++ b/Source/include/portable.h
@@ -153,6 +153,10 @@
#include "../../Source/portable/GCC/ARM_CM3/portmacro.h"
#endif
+#ifdef GCC_ARMCM3
+ #include "../../Source/portable/GCC/ARM_CM3/portmacro.h"
+#endif
+
#ifdef IAR_ARM_CM3
#include "../../Source/portable/IAR/ARM_CM3/portmacro.h"
#endif