--- /dev/null
+export VERBOSE = true
+export DEBUG = true
+ROOTDIR = $(CURDIR)/uC-sdk
+export BOARD = stm32f429discovery
+
+TARGET = lcdexample.bin
+#TARGET_OBJS = lib/stm32f429i_discovery.o lib/stm32f429i_discovery_lcd.o lib/stm32f429i_discovery_sdram.o lib/fonts.o
+TARGET_SRCS = lcdexample.c lib/stm32f429i_discovery.c lib/stm32f429i_discovery_lcd.c lib/stm32f429i_discovery_sdram.c lib/fonts.c
+
+LIBDEPS = uC-sdk/chips/libchips.a uC-sdk/hardware/libhardware.a uC-sdk/FreeRTOS/libFreeRTOS.a uC-sdk/arch/libarch.a uC-sdk/os/libos.a uC-sdk/libc/libc.a uC-sdk/libm/libm.a uC-sdk/acorn/libacorn.a
+LIBS = -Wl,--start-group $(LIBDEPS) -Wl,--end-group
+TARGET_INCLUDES = include
+
+export MAINDIR = $(CURDIR)
+export ROOTDIR = $(MAINDIR)/uC-sdk/
+
+include $(MAINDIR)/lib/config.mk
+include $(ROOTDIR)/common.mk
+
+all: deps uC-sdk lib $(TARGET)
+
+clean: clean-generic
+ $(Q)rm -f $(TARGET)
+ $(Q)$(MAKE) $(MAKE_OPTS) -C uC-sdk clean
+ $(Q)$(MAKE) $(MAKE_OPTS) -C lib clean
+
+.PHONY: uC-sdk lib
+
+uC-sdk/FreeRTOS/libFreeRTOS.a: uC-sdk
+uC-sdk/arch/libarch.a: uC-sdk
+uC-sdk/os/libos.a: uC-sdk
+uC-sdk/libc/libc.a: uC-sdk
+uC-sdk/libm/libm.a: uC-sdk
+uC-sdk/acorn/libacorn.a: uC-sdk
+uC-sdk/hardware/libhardware.a: uC-sdk
+uC-sdk/chips/libchips.a: uC-sdk
+
+lib:
+ $(E) "[MAKE] Entering lib"
+ $(Q)$(MAKE) $(MAKE_OPTS) -C lib
+
+uC-sdk:
+ $(E) "[MAKE] Entering uC-sdk"
+ $(Q)$(MAKE) $(MAKE_OPTS) -C uC-sdk
+
+deps: ldeps
+ $(E) "[DEPS] Creating dependency tree for uC-sdk"
+ $(Q)$(MAKE) $(MAKE_OPTS) -C uC-sdk ldeps
+ $(E) "[DEPS] Creating dependency tree for lib"
+ $(Q)$(MAKE) $(MAKE_OPTS) -C lib ldeps
+
+include $(ROOTDIR)/FreeRTOS/config.mk
+include $(ROOTDIR)/hardware/config.mk
+include $(ROOTDIR)/arch/config.mk
+include $(ROOTDIR)/os/config.mk
+include $(ROOTDIR)/libc/config.mk
+include $(ROOTDIR)/libm/config.mk
+include $(ROOTDIR)/chips/config.mk
+include $(ROOTDIR)/acorn/config.mk
+include $(ROOTDIR)/target-rules.mk
+
--- /dev/null
+/*
+st-util:
+openocd -f board/stm32f4discovery.cfg
+
+arm-none-eabi-gdbtui -ex "target extended-remote :3333" lcdexample.elf
+monitor reset halt
+load
+continue
+*/
+
+
+
+#include <FreeRTOS.h>
+#include <task.h>
+#include <stdio.h>
+#include <string.h>
+#include <malloc_wrapper.h>
+#include <semiio.h>
+#include <semifs.h>
+
+#include <gpio.h>
+//#include <spi.h>
+#include <ssp.h>
+#include <l3gd20.h>
+
+#include <stm32f4xx.h>
+#include <stm32f4xx_gpio.h>
+#include <stm32f4xx_ltdc.h>
+
+//Accelerometer
+#include <stm32f429i_discovery_lcd.h>
+//#include <stm32f429i_discovery_l3gd20.h>
+
+pin_t led[2];
+l3gd20_t gyro;
+float gyrovalues[3];
+float angles[2];
+
+float xvalues[240], yvalues[240];
+uint8_t currentvalue;
+
+float rx = 0, ry = 0;
+
+void initLed()
+{
+ led[0] = make_pin(GPIO_PORT_G, 13);
+ led[1] = make_pin(GPIO_PORT_G, 14);
+ gpio_config(led[0], pin_dir_write, pull_down);
+ gpio_config(led[1], pin_dir_write, pull_down);
+}
+
+void initLCD()
+{
+ LCD_Init();
+
+ LCD_LayerInit();
+ LTDC_Cmd(ENABLE);
+
+ LCD_SetFont(&Font8x8);
+ LCD_SetLayer(LCD_BACKGROUND_LAYER);
+// LCD_Clear(ASSEMBLE_RGB(0x00, 0x66, 0x00));
+ LCD_SetLayer(LCD_FOREGROUND_LAYER);
+ LCD_SetBackColor(ASSEMBLE_RGB(0x00, 0x00, 0xFF));
+}
+
+void initGyro()
+{
+ pin_t sclk = make_pin(GPIO_PORT_F, 7);
+ pin_t mosi = make_pin(GPIO_PORT_F, 9);
+ pin_t miso = make_pin(GPIO_PORT_F, 8);
+ pin_t cs = make_pin(GPIO_PORT_C, 1);
+ ssp_port_t gyroport = { .ssp = ssp_port_5, .sclk = sclk, .mosi = mosi, .miso = miso };
+
+ if (!l3gd20_init_ssp(&gyro, gyroport, cs))
+ printf("Cannot initialize gyroscope");
+}
+
+void setLed(int n)
+{
+ gpio_set(led[n], 1);
+}
+
+void resetLed(int n)
+{
+ gpio_set(led[n], 0);
+}
+
+
+void gyroTask()
+{
+ while(1)
+ {
+ setLed(1);
+
+ l3gd20_read(&gyro, gyrovalues);
+ angles[0] = (gyrovalues[0] - xvalues[currentvalue])/0.01;
+ angles[1] = (gyrovalues[1] - yvalues[currentvalue])/0.01;
+ xvalues[currentvalue] = gyrovalues[0];
+ yvalues[currentvalue] = gyrovalues[1];
+ currentvalue = (currentvalue + 1) % 240;
+
+ vTaskDelay(10);
+
+ resetLed(1);
+ }
+}
+
+void drawValues(uint16_t xpos, uint16_t ypos)
+{
+ uint8_t i;
+ LCD_SetTextColor(ASSEMBLE_RGB(0xff, 0xff, 0x00));
+ for (i = 0 ; i < 240 ; i++)
+ LCD_DrawRect(i, xpos - (xvalues[i])/2000, 1, 1);
+ LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0xff, 0xff));
+ for (i = 0 ; i < 240 ; i++)
+ LCD_DrawRect(i, ypos - (yvalues[i])/2000, 1, 1);
+}
+
+void drawSquare(uint8_t x, uint8_t y)
+{
+ uint8_t size = 20;
+ LCD_SetTextColor(ASSEMBLE_RGB(0xff, 0x00, 0x00));
+ LCD_DrawFullRect(x - size, y - size, size, size);
+ LCD_SetTextColor(ASSEMBLE_RGB(0xff, 0xff, 0x00));
+ LCD_DrawFullRect(x, y - size, size, size);
+ LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0x00, 0xff));
+ LCD_DrawFullRect(x - size, y, size, size);
+ LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0xff, 0x00));
+ LCD_DrawFullRect(x, y, size, size);
+}
+
+void drawRainbow()
+{
+ uint16_t i = 0;
+ //rouge => jaune
+ for (i = 0 ; i < 40 ; i++)
+ {
+ LCD_SetTextColor(ASSEMBLE_RGB(0xff, i * 0xff / 40, 0x00));
+ LCD_DrawFullRect(i, 0, 1, 10);
+ }
+ //jaune => vert
+ for (i = 0 ; i < 40 ; i++)
+ {
+ LCD_SetTextColor(ASSEMBLE_RGB(0xff - i * 0xff / 40, 0xff, 0x00));
+ LCD_DrawFullRect(i + 40, 0, 1, 10);
+ }
+ //vert => cyan
+ for (i = 0 ; i < 40 ; i++)
+ {
+ LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0xff, i * 0xff / 40));
+ LCD_DrawFullRect(i + 80, 0, 1, 10);
+ }
+ //cyan => bleu
+ for (i = 0 ; i < 40 ; i++)
+ {
+ LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0xff - i * 0xff / 40, 0xff));
+ LCD_DrawFullRect(i + 120, 0, 1, 10);
+ }
+ //bleu => violet
+ for (i = 0 ; i < 40 ; i++)
+ {
+ LCD_SetTextColor(ASSEMBLE_RGB(i * 0xff / 40, 0x00, 0xff));
+ LCD_DrawFullRect(i + 160, 0, 1, 10);
+ }
+ //violet => rouge
+ for (i = 0 ; i < 40 ; i++)
+ {
+ LCD_SetTextColor(ASSEMBLE_RGB(0xff, 0x00, 0xff - i * 0xff / 40));
+ LCD_DrawFullRect(i + 200, 0, 1, 10);
+ }
+}
+
+void drawGradient()
+{
+ uint16_t i = 0;
+
+ for (i = 0 ; i < 0x100 ; i++)
+ {
+ LCD_SetTextColor(ASSEMBLE_RGB(i, i, i));
+ LCD_DrawFullRect(0, 320 - 0xff + i - 1, 240, 1);
+ }
+}
+
+void drawing()
+{
+ drawRainbow();
+
+
+ LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0x00, 0x00));
+ LCD_DrawFullRect(00, 10, 240, 64);
+
+ drawGradient();
+
+ LCD_SetBackColor(ASSEMBLE_RGB(0x00, 0x00, 0x00));
+ LCD_SetTextColor(ASSEMBLE_RGB(0x33, 0xff, 0x33));
+
+ char buffer[32];
+ sprintf(buffer, "rx=%f", gyrovalues[0]);
+ LCD_DisplayStringLine(24, (uint8_t *)buffer);
+ sprintf(buffer, "ry=%.2f", gyrovalues[1]);
+ LCD_DisplayStringLine(36, (uint8_t *)buffer);
+
+ drawValues(200, 200);
+
+ uint32_t posx = rx * 50 / 600;
+ uint32_t posy = ry * 50 / 600;
+ drawSquare(120 + posx, 160 + posy);
+}
+
+void drawTask()
+{
+ while(1)
+ {
+ setLed(0);
+ drawing();
+// resetLed(1);
+// vTaskDelay(500);
+ resetLed(0);
+// setLed(1);
+ vTaskDelay(100);
+ }
+}
+
+int main()
+{
+ init_malloc_wrapper();
+
+ //monitor arm semihosting enable
+ //register_semiio();
+ //register_semifs();
+
+ printf("Init led\n");
+ initLed();
+
+ printf("Init lcd\n");
+ initLCD();
+
+ printf("Init gyro\n");
+ initGyro();
+
+
+ printf("Start task\n");
+ xTaskCreate(drawTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+ xTaskCreate(gyroTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+
+ //start task scheduler
+ vTaskStartScheduler();
+
+ return 0;
+}
--- /dev/null
+all: $(TARGET_OBJ)
+
+export BOARD = stm32f429discovery
+
+include $(ROOTDIR)/common.mk
+include config.mk
+include $(ROOTDIR)/arch/config.mk
+include $(ROOTDIR)/FreeRTOS/config.mk
+
+#TARGET_SRCS += i2c.c
+TARGET_SRCS += fonts
+TARGET_SRCS += stm32f429i_discovery.c
+TARGET_SRCS += stm32f429i_discovery_lcd.c
+TARGET_SRCS += stm32f429i_discovery_sdram.c
+#TARGET_SRCS += stm32f4xx_discovery_lis302dl.c
+
+include $(ROOTDIR)/target-rules.mk
+
+clean: clean-generic
--- /dev/null
+TARGET_INCLUDES += $(MAINDIR)/lib
+
+ifeq ($(USE_MPU),true)
+TARGET_CPPFLAGS += -DportUSING_MPU_WRAPPERS=1
+endif
--- /dev/null
+/**\r
+ ******************************************************************************\r
+ * @file fonts.c\r
+ * @author MCD Application Team\r
+ * @version V5.0.2\r
+ * @date 05-March-2012\r
+ * @brief This file provides text fonts for STM32xx-EVAL's LCD driver. \r
+ ******************************************************************************\r
+ * @attention\r
+ *\r
+ * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>\r
+ *\r
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+ * You may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at:\r
+ *\r
+ * http://www.st.com/software_license_agreement_liberty_v2\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software \r
+ * distributed under the License is distributed on an "AS IS" BASIS, \r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ ******************************************************************************\r
+ */\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "fonts.h"\r
+\r
+/** @addtogroup Utilities\r
+ * @{\r
+ */\r
+ \r
+/** @addtogroup STM32_EVAL\r
+ * @{\r
+ */ \r
+\r
+/** @addtogroup Common\r
+ * @{\r
+ */\r
+\r
+/** @addtogroup FONTS\r
+ * @brief This file includes the Fonts driver of STM32xx-EVAL boards.\r
+ * @{\r
+ */ \r
+\r
+/** @defgroup FONTS_Private_Types\r
+ * @{\r
+ */ \r
+/**\r
+ * @}\r
+ */ \r
+\r
+\r
+/** @defgroup FONTS_Private_Defines\r
+ * @{\r
+ */\r
+/**\r
+ * @}\r
+ */ \r
+\r
+\r
+/** @defgroup FONTS_Private_Macros\r
+ * @{\r
+ */\r
+/**\r
+ * @}\r
+ */ \r
+ \r
+\r
+/** @defgroup FONTS_Private_Variables\r
+ * @{\r
+ */\r
+const uint16_t ASCII16x24_Table [] = {\r
+/** \r
+ * @brief Space ' ' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '!' \r
+ */ \r
+ 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000,\r
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '"' \r
+ */ \r
+ 0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '#' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60,\r
+ 0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318,\r
+ 0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000,\r
+/** \r
+ * @brief '$' \r
+ */ \r
+ 0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C,\r
+ 0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C,\r
+ 0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '%' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611,\r
+ 0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460,\r
+ 0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '&' \r
+ */ \r
+ 0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0,\r
+ 0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06,\r
+ 0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief ''' \r
+ */ \r
+ 0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '(' \r
+ */ \r
+ 0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060,\r
+ 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030,\r
+ 0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000,\r
+/** \r
+ * @brief ')' \r
+ */ \r
+ 0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300,\r
+ 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600,\r
+ 0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000,\r
+/** \r
+ * @brief '*' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,\r
+ 0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '+' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief ',' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000,\r
+/** \r
+ * @brief '-' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '.' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '/' \r
+ */ \r
+ 0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300,\r
+ 0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0,\r
+ 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '0' \r
+ */ \r
+ 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C,\r
+ 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38,\r
+ 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '1' \r
+ */ \r
+ 0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180,\r
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '2' \r
+ */ \r
+ 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800,\r
+ 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018,\r
+ 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '3' \r
+ */ \r
+ 0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600,\r
+ 0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18,\r
+ 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '4' \r
+ */ \r
+ 0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60,\r
+ 0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00,\r
+ 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '5' \r
+ */ \r
+ 0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC,\r
+ 0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18,\r
+ 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '6' \r
+ */ \r
+ 0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC,\r
+ 0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38,\r
+ 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '7' \r
+ */ \r
+ 0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380,\r
+ 0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030,\r
+ 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '8' \r
+ */ \r
+ 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638,\r
+ 0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38,\r
+ 0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '9' \r
+ */ \r
+ 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C,\r
+ 0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C,\r
+ 0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief ':' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief ';' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '<' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0,\r
+ 0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '=' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '>' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0,\r
+ 0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '?' \r
+ */ \r
+ 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00,\r
+ 0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000,\r
+ 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '@' \r
+ */ \r
+ 0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411,\r
+ 0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004,\r
+ 0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'A' \r
+ */ \r
+ 0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60,\r
+ 0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C,\r
+ 0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'B' \r
+ */ \r
+ 0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C,\r
+ 0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C,\r
+ 0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'C' \r
+ */ \r
+ 0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006,\r
+ 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C,\r
+ 0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'D' \r
+ */ \r
+ 0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006,\r
+ 0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06,\r
+ 0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'E' \r
+ */ \r
+ 0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,\r
+ 0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,\r
+ 0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'F' \r
+ */ \r
+ 0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,\r
+ 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,\r
+ 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'G' \r
+ */ \r
+ 0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003,\r
+ 0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C,\r
+ 0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'H' \r
+ */ \r
+ 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,\r
+ 0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,\r
+ 0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'I' \r
+ */ \r
+ 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'J' \r
+ */ \r
+ 0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600,\r
+ 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738,\r
+ 0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'K' \r
+ */ \r
+ 0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6,\r
+ 0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806,\r
+ 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'L' \r
+ */ \r
+ 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,\r
+ 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,\r
+ 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'M' \r
+ */ \r
+ 0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836,\r
+ 0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6,\r
+ 0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'N' \r
+ */ \r
+ 0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC,\r
+ 0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C,\r
+ 0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'O' \r
+ */ \r
+ 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003,\r
+ 0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C,\r
+ 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'P' \r
+ */ \r
+ 0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C,\r
+ 0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,\r
+ 0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'Q' \r
+ */ \r
+ 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003,\r
+ 0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C,\r
+ 0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'R' \r
+ */ \r
+ 0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806,\r
+ 0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006,\r
+ 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'S' \r
+ */ \r
+ 0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C,\r
+ 0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C,\r
+ 0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'T' \r
+ */ \r
+ 0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'U' \r
+ */ \r
+ 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,\r
+ 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818,\r
+ 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'V' \r
+ */ \r
+ 0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C,\r
+ 0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360,\r
+ 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'W' \r
+ */ \r
+ 0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366,\r
+ 0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C,\r
+ 0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'X' \r
+ */ \r
+ 0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0,\r
+ 0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C,\r
+ 0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'Y' \r
+ */ \r
+ 0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660,\r
+ 0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'Z' \r
+ */ \r
+ 0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600,\r
+ 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006,\r
+ 0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '[' \r
+ */ \r
+ 0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060,\r
+ 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060,\r
+ 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000,\r
+/** \r
+ * @brief '\' \r
+ */ \r
+ 0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0,\r
+ 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300,\r
+ 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief ']' \r
+ */ \r
+ 0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,\r
+ 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,\r
+ 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000,\r
+/** \r
+ * @brief '^' \r
+ */ \r
+ 0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630,\r
+ 0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '_' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief ''' \r
+ */ \r
+ 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'a' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8,\r
+ 0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C,\r
+ 0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'b' \r
+ */ \r
+ 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8,\r
+ 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38,\r
+ 0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'c' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0,\r
+ 0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30,\r
+ 0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'd' \r
+ */ \r
+ 0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0,\r
+ 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30,\r
+ 0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'e' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0,\r
+ 0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30,\r
+ 0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'f' \r
+ */ \r
+ 0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0,\r
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+ 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'g' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8,\r
+ 0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18,\r
+ 0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000,\r
+/** \r
+ * @brief 'h' \r
+ */ \r
+ 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8,\r
+ 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818,\r
+ 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'i' \r
+ */ \r
+ 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,\r
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+ 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'j' \r
+ */ \r
+ 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,\r
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000,\r
+/** \r
+ * @brief 'k' \r
+ */ \r
+ 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C,\r
+ 0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C,\r
+ 0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'l' \r
+ */ \r
+ 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+ 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'm' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF,\r
+ 0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183,\r
+ 0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'n' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8,\r
+ 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818,\r
+ 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'o' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0,\r
+ 0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30,\r
+ 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'p' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8,\r
+ 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38,\r
+ 0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000,\r
+/** \r
+ * @brief 'q' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0,\r
+ 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30,\r
+ 0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000,\r
+/** \r
+ * @brief 'r' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0,\r
+ 0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030,\r
+ 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 's' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0,\r
+ 0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38,\r
+ 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 't' \r
+ */ \r
+ 0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0,\r
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+ 0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'u' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818,\r
+ 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38,\r
+ 0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'v' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18,\r
+ 0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360,\r
+ 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'w' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1,\r
+ 0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C,\r
+ 0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'x' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38,\r
+ 0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30,\r
+ 0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief 'y' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830,\r
+ 0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380,\r
+ 0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000,\r
+/** \r
+ * @brief 'z' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC,\r
+ 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018,\r
+ 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+ * @brief '{' \r
+ */ \r
+ 0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+ 0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0,\r
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000,\r
+/** \r
+ * @brief '|' \r
+ */ \r
+ 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000,\r
+/** \r
+ * @brief '}' \r
+ */ \r
+ 0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180,\r
+ 0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180,\r
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000,\r
+/** \r
+ * @brief '~' \r
+ */ \r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};\r
+\r
+const uint16_t ASCII12x12_Table [] = {\r
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+ 0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x2000,0x0000,0x0000,\r
+ 0x0000,0x5000,0x5000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+ 0x0000,0x0900,0x0900,0x1200,0x7f00,0x1200,0x7f00,0x1200,0x2400,0x2400,0x0000,0x0000,\r
+ 0x1000,0x3800,0x5400,0x5000,0x5000,0x3800,0x1400,0x5400,0x5400,0x3800,0x1000,0x0000,\r
+ 0x0000,0x3080,0x4900,0x4900,0x4a00,0x32c0,0x0520,0x0920,0x0920,0x10c0,0x0000,0x0000,\r
+ 0x0000,0x0c00,0x1200,0x1200,0x1400,0x1800,0x2500,0x2300,0x2300,0x1d80,0x0000,0x0000,\r
+ 0x0000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+ 0x0000,0x0800,0x1000,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x1000,\r
+ 0x0000,0x4000,0x2000,0x2000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x2000,0x2000,\r
+ 0x0000,0x2000,0x7000,0x2000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x4000,\r
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x0000,0x0000,\r
+ 0x0000,0x1000,0x1000,0x1000,0x2000,0x2000,0x2000,0x2000,0x4000,0x4000,0x0000,0x0000,\r
+ 0x0000,0x1000,0x2800,0x4400,0x4400,0x4400,0x4400,0x4400,0x2800,0x1000,0x0000,0x0000,\r
+ 0x0000,0x1000,0x3000,0x5000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,\r
+ 0x0000,0x3000,0x4800,0x4400,0x0400,0x0800,0x1000,0x2000,0x4000,0x7c00,0x0000,0x0000,\r
+ 0x0000,0x3000,0x4800,0x0400,0x0800,0x1000,0x0800,0x4400,0x4800,0x3000,0x0000,0x0000,\r
+ 0x0000,0x0800,0x1800,0x1800,0x2800,0x2800,0x4800,0x7c00,0x0800,0x0800,0x0000,0x0000,\r
+ 0x0000,0x3c00,0x2000,0x4000,0x7000,0x4800,0x0400,0x4400,0x4800,0x3000,0x0000,0x0000,\r
+ 0x0000,0x1800,0x2400,0x4000,0x5000,0x6800,0x4400,0x4400,0x2800,0x1000,0x0000,0x0000,\r
+ 0x0000,0x7c00,0x0400,0x0800,0x1000,0x1000,0x1000,0x2000,0x2000,0x2000,0x0000,0x0000,\r
+ 0x0000,0x1000,0x2800,0x4400,0x2800,0x1000,0x2800,0x4400,0x2800,0x1000,0x0000,0x0000,\r
+ 0x0000,0x1000,0x2800,0x4400,0x4400,0x2c00,0x1400,0x0400,0x4800,0x3000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x4000,\r
+ 0x0000,0x0000,0x0400,0x0800,0x3000,0x4000,0x3000,0x0800,0x0400,0x0000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x4000,0x2000,0x1800,0x0400,0x1800,0x2000,0x4000,0x0000,0x0000,0x0000,\r
+ 0x0000,0x3800,0x6400,0x4400,0x0400,0x0800,0x1000,0x1000,0x0000,0x1000,0x0000,0x0000,\r
+ 0x0000,0x0f80,0x1040,0x2ea0,0x51a0,0x5120,0x5120,0x5120,0x5320,0x4dc0,0x2020,0x1040,\r
+ 0x0000,0x0800,0x1400,0x1400,0x1400,0x2200,0x3e00,0x2200,0x4100,0x4100,0x0000,0x0000,\r
+ 0x0000,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x0000,0x0000,\r
+ 0x0000,0x0e00,0x1100,0x2100,0x2000,0x2000,0x2000,0x2100,0x1100,0x0e00,0x0000,0x0000,\r
+ 0x0000,0x3c00,0x2200,0x2100,0x2100,0x2100,0x2100,0x2100,0x2200,0x3c00,0x0000,0x0000,\r
+ 0x0000,0x3e00,0x2000,0x2000,0x2000,0x3e00,0x2000,0x2000,0x2000,0x3e00,0x0000,0x0000,\r
+ 0x0000,0x3e00,0x2000,0x2000,0x2000,0x3c00,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000,\r
+ 0x0000,0x0e00,0x1100,0x2100,0x2000,0x2700,0x2100,0x2100,0x1100,0x0e00,0x0000,0x0000,\r
+ 0x0000,0x2100,0x2100,0x2100,0x2100,0x3f00,0x2100,0x2100,0x2100,0x2100,0x0000,0x0000,\r
+ 0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000,\r
+ 0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x4800,0x3000,0x0000,0x0000,\r
+ 0x0000,0x2200,0x2400,0x2800,0x2800,0x3800,0x2800,0x2400,0x2400,0x2200,0x0000,0x0000,\r
+ 0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x3e00,0x0000,0x0000,\r
+ 0x0000,0x2080,0x3180,0x3180,0x3180,0x2a80,0x2a80,0x2a80,0x2a80,0x2480,0x0000,0x0000,\r
+ 0x0000,0x2100,0x3100,0x3100,0x2900,0x2900,0x2500,0x2300,0x2300,0x2100,0x0000,0x0000,\r
+ 0x0000,0x0c00,0x1200,0x2100,0x2100,0x2100,0x2100,0x2100,0x1200,0x0c00,0x0000,0x0000,\r
+ 0x0000,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000,\r
+ 0x0000,0x0c00,0x1200,0x2100,0x2100,0x2100,0x2100,0x2100,0x1600,0x0d00,0x0100,0x0000,\r
+ 0x0000,0x3e00,0x2100,0x2100,0x2100,0x3e00,0x2400,0x2200,0x2100,0x2080,0x0000,0x0000,\r
+ 0x0000,0x1c00,0x2200,0x2200,0x2000,0x1c00,0x0200,0x2200,0x2200,0x1c00,0x0000,0x0000,\r
+ 0x0000,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,\r
+ 0x0000,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x1200,0x0c00,0x0000,0x0000,\r
+ 0x0000,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x1400,0x0800,0x0000,0x0000,\r
+ 0x0000,0x4440,0x4a40,0x2a40,0x2a80,0x2a80,0x2a80,0x2a80,0x2a80,0x1100,0x0000,0x0000,\r
+ 0x0000,0x4100,0x2200,0x1400,0x1400,0x0800,0x1400,0x1400,0x2200,0x4100,0x0000,0x0000,\r
+ 0x0000,0x4100,0x2200,0x2200,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,\r
+ 0x0000,0x7e00,0x0200,0x0400,0x0800,0x1000,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000,\r
+ 0x0000,0x3000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,\r
+ 0x0000,0x4000,0x4000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x1000,0x0000,0x0000,\r
+ 0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,\r
+ 0x0000,0x1000,0x2800,0x2800,0x2800,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,\r
+ 0x4000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x3800,0x4400,0x0400,0x3c00,0x4400,0x4400,0x3c00,0x0000,0x0000,\r
+ 0x0000,0x4000,0x4000,0x5800,0x6400,0x4400,0x4400,0x4400,0x6400,0x5800,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x3000,0x4800,0x4000,0x4000,0x4000,0x4800,0x3000,0x0000,0x0000,\r
+ 0x0000,0x0400,0x0400,0x3400,0x4c00,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x3800,0x4400,0x4400,0x7c00,0x4000,0x4400,0x3800,0x0000,0x0000,\r
+ 0x0000,0x6000,0x4000,0xe000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x3400,0x4c00,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0400,0x4400,\r
+ 0x0000,0x4000,0x4000,0x5800,0x6400,0x4400,0x4400,0x4400,0x4400,0x4400,0x0000,0x0000,\r
+ 0x0000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,\r
+ 0x0000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,\r
+ 0x0000,0x4000,0x4000,0x4800,0x5000,0x6000,0x5000,0x5000,0x4800,0x4800,0x0000,0x0000,\r
+ 0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x5200,0x6d00,0x4900,0x4900,0x4900,0x4900,0x4900,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x5800,0x6400,0x4400,0x4400,0x4400,0x4400,0x4400,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x3800,0x4400,0x4400,0x4400,0x4400,0x4400,0x3800,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x5800,0x6400,0x4400,0x4400,0x4400,0x6400,0x5800,0x4000,0x4000,\r
+ 0x0000,0x0000,0x0000,0x3400,0x4c00,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0400,0x0400,\r
+ 0x0000,0x0000,0x0000,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x3000,0x4800,0x4000,0x3000,0x0800,0x4800,0x3000,0x0000,0x0000,\r
+ 0x0000,0x4000,0x4000,0xe000,0x4000,0x4000,0x4000,0x4000,0x4000,0x6000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x4400,0x4400,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x4400,0x4400,0x2800,0x2800,0x2800,0x2800,0x1000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x4900,0x4900,0x5500,0x5500,0x5500,0x5500,0x2200,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x4400,0x2800,0x2800,0x1000,0x2800,0x2800,0x4400,0x0000,0x0000,\r
+ 0x0000,0x0000,0x0000,0x4400,0x4400,0x2800,0x2800,0x2800,0x1000,0x1000,0x1000,0x1000,\r
+ 0x0000,0x0000,0x0000,0x7800,0x0800,0x1000,0x2000,0x2000,0x4000,0x7800,0x0000,0x0000,\r
+ 0x0000,0x1000,0x2000,0x2000,0x2000,0x2000,0x4000,0x2000,0x2000,0x2000,0x2000,0x2000,\r
+ 0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,\r
+ 0x0000,0x4000,0x2000,0x2000,0x2000,0x2000,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000,\r
+ 0x0000,0x0000,0x0000,0x0000,0x7400,0x5800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+ 0x0000,0x0000,0x7000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x7000,0x0000,0x0000};\r
+\r
+const uint16_t ASCII8x12_Table [] = {\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,\r
+ 0x00,0x00,0x00,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x14,0x14,0x3e,0x14,0x28,0x7c,0x28,0x28,0x00,\r
+ 0x00,0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x14,0x54,0x38,0x10,\r
+ 0x00,0x00,0x00,0x44,0xa8,0xa8,0x50,0x14,0x1a,0x2a,0x24,0x00,\r
+ 0x00,0x00,0x00,0x20,0x50,0x50,0x20,0xe8,0x98,0x98,0x60,0x00,\r
+ 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x40,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,\r
+ 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,\r
+ 0x00,0x00,0x00,0x40,0xe0,0x40,0xa0,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,\r
+ 0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x80,0x80,0x00,\r
+ 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00,\r
+ 0x00,0x00,0x00,0x20,0x60,0xa0,0x20,0x20,0x20,0x20,0x20,0x00,\r
+ 0x00,0x00,0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x80,0xf0,0x00,\r
+ 0x00,0x00,0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00,\r
+ 0x00,0x00,0x00,0x10,0x30,0x50,0x50,0x90,0xf8,0x10,0x10,0x00,\r
+ 0x00,0x00,0x00,0x70,0x40,0x80,0xe0,0x10,0x10,0x90,0x60,0x00,\r
+ 0x00,0x00,0x00,0x60,0x90,0x80,0xa0,0xd0,0x90,0x90,0x60,0x00,\r
+ 0x00,0x00,0x00,0xf0,0x10,0x20,0x20,0x20,0x40,0x40,0x40,0x00,\r
+ 0x00,0x00,0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00,\r
+ 0x00,0x00,0x00,0x60,0x90,0x90,0xb0,0x50,0x10,0x90,0x60,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x40,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x40,0x40,\r
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x60,0x80,0x60,0x10,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xf0,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x10,0x60,0x80,0x00,0x00,\r
+ 0x00,0x00,0x00,0x60,0x90,0x10,0x20,0x40,0x40,0x00,0x40,0x00,\r
+ 0x00,0x00,0x00,0x1c,0x22,0x5b,0xa5,0xa5,0xa5,0xa5,0x9e,0x41,\r
+ 0x00,0x00,0x00,0x20,0x50,0x50,0x50,0x50,0x70,0x88,0x88,0x00,\r
+ 0x00,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0x88,0xf0,0x00,\r
+ 0x00,0x00,0x00,0x38,0x44,0x84,0x80,0x80,0x84,0x44,0x38,0x00,\r
+ 0x00,0x00,0x00,0xe0,0x90,0x88,0x88,0x88,0x88,0x90,0xe0,0x00,\r
+ 0x00,0x00,0x00,0xf8,0x80,0x80,0xf8,0x80,0x80,0x80,0xf8,0x00,\r
+ 0x00,0x00,0x00,0x78,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x00,\r
+ 0x00,0x00,0x00,0x38,0x44,0x84,0x80,0x9c,0x84,0x44,0x38,0x00,\r
+ 0x00,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x88,0x00,\r
+ 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,\r
+ 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x90,0x90,0x60,0x00,\r
+ 0x00,0x00,0x00,0x88,0x90,0xa0,0xe0,0xa0,0x90,0x90,0x88,0x00,\r
+ 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xf0,0x00,\r
+ 0x00,0x00,0x00,0x82,0xc6,0xc6,0xaa,0xaa,0xaa,0xaa,0x92,0x00,\r
+ 0x00,0x00,0x00,0x84,0xc4,0xa4,0xa4,0x94,0x94,0x8c,0x84,0x00,\r
+ 0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x48,0x30,0x00,\r
+ 0x00,0x00,0x00,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x80,0x00,\r
+ 0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x58,0x34,0x04,\r
+ 0x00,0x00,0x00,0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x42,0x00,\r
+ 0x00,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x88,0x70,0x00,\r
+ 0x00,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,\r
+ 0x00,0x00,0x00,0x84,0x84,0x84,0x84,0x84,0x84,0x48,0x30,0x00,\r
+ 0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x50,0x50,0x50,0x20,0x00,\r
+ 0x00,0x00,0x00,0x92,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x44,0x00,\r
+ 0x00,0x00,0x00,0x84,0x48,0x48,0x30,0x30,0x48,0x48,0x84,0x00,\r
+ 0x00,0x00,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00,\r
+ 0x00,0x00,0x00,0xf8,0x08,0x10,0x20,0x20,0x40,0x80,0xf8,0x00,\r
+ 0x00,0x00,0x00,0xc0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,\r
+ 0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x20,0x20,0x00,\r
+ 0x00,0x00,0x00,0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,\r
+ 0x00,0x00,0x00,0x40,0xa0,0xa0,0xa0,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,\r
+ 0x00,0x00,0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x70,0x90,0x90,0x70,0x00,\r
+ 0x00,0x00,0x00,0x80,0x80,0xa0,0xd0,0x90,0x90,0xd0,0xa0,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00,\r
+ 0x00,0x00,0x00,0x10,0x10,0x50,0xb0,0x90,0x90,0xb0,0x50,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0xf0,0x80,0x90,0x60,0x00,\r
+ 0x00,0x00,0x00,0xc0,0x80,0xc0,0x80,0x80,0x80,0x80,0x80,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x50,0xb0,0x90,0x90,0xb0,0x50,0x10,\r
+ 0x00,0x00,0x00,0x80,0x80,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00,\r
+ 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,\r
+ 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,\r
+ 0x00,0x00,0x00,0x80,0x80,0x90,0xa0,0xc0,0xa0,0x90,0x90,0x00,\r
+ 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0xa6,0xda,0x92,0x92,0x92,0x92,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0xa0,0xd0,0x90,0x90,0xd0,0xa0,0x80,\r
+ 0x00,0x00,0x00,0x00,0x00,0x50,0xb0,0x90,0x90,0xb0,0x50,0x10,\r
+ 0x00,0x00,0x00,0x00,0x00,0xa0,0xc0,0x80,0x80,0x80,0x80,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0x90,0x40,0x20,0x90,0x60,0x00,\r
+ 0x00,0x00,0x00,0x80,0x80,0xc0,0x80,0x80,0x80,0x80,0xc0,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xb0,0x50,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x50,0x20,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x92,0xaa,0xaa,0xaa,0xaa,0x44,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00,\r
+ 0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x50,0x50,0x20,0x20,0x20,\r
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0x10,0x20,0x40,0x80,0xf0,0x00,\r
+ 0x00,0x00,0x00,0xc0,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80,\r
+ 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,\r
+ 0x00,0x00,0x00,0xc0,0x40,0x40,0x40,0x20,0x40,0x40,0x40,0x40,\r
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xb0,0x00,0x00,0x00,0x00,\r
+ 0x00,0x00,0x00,0x00,0xe0,0xa0,0xa0,0xa0,0xa0,0xa0,0xe0,0x00};\r
+\r
+const uint16_t ASCII8x8_Table [] = {\r
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40,\r
+ 0xa0, 0xa0, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+ 0x00, 0x24, 0x24, 0xfe, 0x48, 0xfc, 0x48, 0x48,\r
+ 0x38, 0x54, 0x50, 0x38, 0x14, 0x14, 0x54, 0x38,\r
+ 0x44, 0xa8, 0xa8, 0x50, 0x14, 0x1a, 0x2a, 0x24,\r
+ 0x10, 0x28, 0x28, 0x10, 0x74, 0x4c, 0x4c, 0x30,\r
+ 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+ 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08,\r
+ 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10,\r
+ 0x00, 0x00, 0x24, 0x18, 0x3c, 0x18, 0x24, 0x00,\r
+ 0x00, 0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x00,\r
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x10,\r
+ 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,\r
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,\r
+ 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x20,\r
+ 0x18, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x18,\r
+ 0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x08, 0x08,\r
+ 0x38, 0x44, 0x00, 0x04, 0x08, 0x10, 0x20, 0x7c,\r
+ 0x18, 0x24, 0x04, 0x18, 0x04, 0x04, 0x24, 0x18,\r
+ 0x04, 0x0c, 0x14, 0x24, 0x44, 0x7e, 0x04, 0x04,\r
+ 0x3c, 0x20, 0x20, 0x38, 0x04, 0x04, 0x24, 0x18,\r
+ 0x18, 0x24, 0x20, 0x38, 0x24, 0x24, 0x24, 0x18,\r
+ 0x3c, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x10,\r
+ 0x18, 0x24, 0x24, 0x18, 0x24, 0x24, 0x24, 0x18,\r
+ 0x18, 0x24, 0x24, 0x24, 0x1c, 0x04, 0x24, 0x18,\r
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00,\r
+ 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x10, 0x00,\r
+ 0x00, 0x00, 0x04, 0x18, 0x20, 0x18, 0x04, 0x00,\r
+ 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x00,\r
+ 0x00, 0x00, 0x20, 0x18, 0x04, 0x18, 0x20, 0x00,\r
+ 0x18, 0x24, 0x04, 0x08, 0x10, 0x10, 0x00, 0x10,\r
+ 0x3c, 0x42, 0x99, 0xa5, 0xa5, 0x9d, 0x42, 0x38,\r
+ 0x38, 0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x44,\r
+ 0x78, 0x44, 0x44, 0x78, 0x44, 0x44, 0x44, 0x78,\r
+ 0x1c, 0x22, 0x42, 0x40, 0x40, 0x42, 0x22, 0x1c,\r
+ 0x70, 0x48, 0x44, 0x44, 0x44, 0x44, 0x48, 0x70,\r
+ 0x7c, 0x40, 0x40, 0x7c, 0x40, 0x40, 0x40, 0x7c,\r
+ 0x3c, 0x20, 0x20, 0x38, 0x20, 0x20, 0x20, 0x20,\r
+ 0x1c, 0x22, 0x42, 0x40, 0x4e, 0x42, 0x22, 0x1c,\r
+ 0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x44, 0x44,\r
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x24, 0x24, 0x18,\r
+ 0x44, 0x48, 0x50, 0x70, 0x50, 0x48, 0x48, 0x44,\r
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,\r
+ 0x82, 0xc6, 0xc6, 0xaa, 0xaa, 0xaa, 0xaa, 0x92,\r
+ 0x42, 0x62, 0x52, 0x52, 0x4a, 0x4a, 0x46, 0x42,\r
+ 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18,\r
+ 0x78, 0x44, 0x44, 0x44, 0x78, 0x40, 0x40, 0x40,\r
+ 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x2c, 0x1a,\r
+ 0x78, 0x44, 0x44, 0x78, 0x50, 0x48, 0x44, 0x42,\r
+ 0x38, 0x44, 0x40, 0x38, 0x04, 0x44, 0x44, 0x38,\r
+ 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+ 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18,\r
+ 0x44, 0x44, 0x28, 0x28, 0x28, 0x28, 0x28, 0x10,\r
+ 0x92, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x44,\r
+ 0x42, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x42,\r
+ 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+ 0x7c, 0x04, 0x08, 0x10, 0x10, 0x20, 0x40, 0x7c,\r
+ 0x1c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1c,\r
+ 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04,\r
+ 0x1c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x1c,\r
+ 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+ 0x20, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+ 0x00, 0x00, 0x18, 0x04, 0x1c, 0x24, 0x24, 0x1c,\r
+ 0x20, 0x20, 0x28, 0x34, 0x24, 0x24, 0x34, 0x28,\r
+ 0x00, 0x00, 0x18, 0x24, 0x20, 0x20, 0x24, 0x18,\r
+ 0x04, 0x04, 0x14, 0x2c, 0x24, 0x24, 0x2c, 0x14,\r
+ 0x00, 0x00, 0x18, 0x24, 0x3c, 0x20, 0x24, 0x18,\r
+ 0x00, 0x18, 0x10, 0x10, 0x18, 0x10, 0x10, 0x10,\r
+ 0x00, 0x18, 0x24, 0x24, 0x18, 0x04, 0x24, 0x18,\r
+ 0x20, 0x20, 0x28, 0x34, 0x24, 0x24, 0x24, 0x24,\r
+ 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+ 0x08, 0x00, 0x08, 0x08, 0x08, 0x08, 0x28, 0x10,\r
+ 0x20, 0x20, 0x24, 0x28, 0x30, 0x28, 0x24, 0x24,\r
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+ 0x00, 0x00, 0xa6, 0xda, 0x92, 0x92, 0x92, 0x92,\r
+ 0x00, 0x00, 0x28, 0x34, 0x24, 0x24, 0x24, 0x24,\r
+ 0x00, 0x00, 0x18, 0x24, 0x24, 0x24, 0x24, 0x18,\r
+ 0x00, 0x28, 0x34, 0x24, 0x38, 0x20, 0x20, 0x20,\r
+ 0x00, 0x14, 0x2c, 0x24, 0x1c, 0x04, 0x04, 0x04,\r
+ 0x00, 0x00, 0x2c, 0x30, 0x20, 0x20, 0x20, 0x20,\r
+ 0x00, 0x00, 0x18, 0x24, 0x10, 0x08, 0x24, 0x18,\r
+ 0x00, 0x10, 0x38, 0x10, 0x10, 0x10, 0x10, 0x18,\r
+ 0x00, 0x00, 0x24, 0x24, 0x24, 0x24, 0x2c, 0x14,\r
+ 0x00, 0x00, 0x44, 0x44, 0x28, 0x28, 0x28, 0x10,\r
+ 0x00, 0x00, 0x92, 0xaa, 0xaa, 0xaa, 0xaa, 0x44,\r
+ 0x00, 0x00, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44,\r
+ 0x00, 0x28, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10,\r
+ 0x00, 0x00, 0x3c, 0x04, 0x08, 0x10, 0x20, 0x3c,\r
+ 0x00, 0x08, 0x10, 0x10, 0x20, 0x10, 0x10, 0x08,\r
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+ 0x00, 0x10, 0x08, 0x08, 0x04, 0x08, 0x08, 0x10,\r
+ 0x00, 0x00, 0x00, 0x60, 0x92, 0x0c, 0x00, 0x00,\r
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\r
+\r
+\r
+sFONT Font16x24 = {\r
+ ASCII16x24_Table,\r
+ 16, /* Width */\r
+ 24, /* Height */\r
+};\r
+\r
+sFONT Font12x12 = {\r
+ ASCII12x12_Table,\r
+ 12, /* Width */\r
+ 12, /* Height */\r
+};\r
+\r
+sFONT Font8x12 = {\r
+ ASCII8x12_Table,\r
+ 8, /* Width */\r
+ 12, /* Height */\r
+};\r
+\r
+\r
+sFONT Font8x8 = {\r
+ ASCII8x8_Table,\r
+ 8, /* Width */\r
+ 8, /* Height */\r
+};\r
+ \r
+/**\r
+ * @}\r
+ */ \r
+\r
+\r
+/** @defgroup FONTS_Private_Function_Prototypes\r
+ * @{\r
+ */ \r
+/**\r
+ * @}\r
+ */ \r
+\r
+\r
+/** @defgroup FONTS_Private_Functions\r
+ * @{\r
+ */\r
+ \r
+/**\r
+ * @}\r
+ */\r
+ \r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
--- /dev/null
+/**\r
+ ******************************************************************************\r
+ * @file fonts.h\r
+ * @author MCD Application Team\r
+ * @version V5.0.2\r
+ * @date 05-March-2012\r
+ * @brief Header for fonts.c file\r
+ ******************************************************************************\r
+ * @attention\r
+ *\r
+ * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>\r
+ *\r
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+ * You may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at:\r
+ *\r
+ * http://www.st.com/software_license_agreement_liberty_v2\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software \r
+ * distributed under the License is distributed on an "AS IS" BASIS, \r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ ******************************************************************************\r
+ */\r
+\r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __FONTS_H\r
+#define __FONTS_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include <stdint.h>\r
+\r
+/** @addtogroup Utilities\r
+ * @{\r
+ */\r
+ \r
+/** @addtogroup STM32_EVAL\r
+ * @{\r
+ */ \r
+\r
+/** @addtogroup Common\r
+ * @{\r
+ */\r
+\r
+/** @addtogroup FONTS\r
+ * @{\r
+ */ \r
+\r
+/** @defgroup FONTS_Exported_Types\r
+ * @{\r
+ */ \r
+typedef struct _tFont\r
+{ \r
+ const uint16_t *table;\r
+ uint16_t Width;\r
+ uint16_t Height;\r
+ \r
+} sFONT;\r
+\r
+extern sFONT Font16x24;\r
+extern sFONT Font12x12;\r
+extern sFONT Font8x12;\r
+extern sFONT Font8x8;\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/** @defgroup FONTS_Exported_Constants\r
+ * @{\r
+ */ \r
+#define LINE(x) ((x) * (((sFONT *)LCD_GetFont())->Height))\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/** @defgroup FONTS_Exported_Macros\r
+ * @{\r
+ */ \r
+/**\r
+ * @}\r
+ */ \r
+\r
+/** @defgroup FONTS_Exported_Functions\r
+ * @{\r
+ */ \r
+/**\r
+ * @}\r
+ */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+ \r
+#endif /* __FONTS_H */\r
+ \r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
--- /dev/null
+/**\r
+ ******************************************************************************\r
+ * @file stm32f429i_discovery.c\r
+ * @author MCD Application Team\r
+ * @version V1.0.1\r
+ * @date 28-October-2013\r
+ * @brief This file provides set of firmware functions to manage Leds and\r
+ * push-button available on STM32F429I-DISCO Kit from STMicroelectronics.\r
+ ******************************************************************************\r
+ * @attention\r
+ *\r
+ * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+ *\r
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+ * You may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at:\r
+ *\r
+ * http://www.st.com/software_license_agreement_liberty_v2\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software \r
+ * distributed under the License is distributed on an "AS IS" BASIS, \r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ ******************************************************************************\r
+ */ \r
+ \r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f429i_discovery.h"\r
+\r
+/** @addtogroup Utilities\r
+ * @{\r
+ */ \r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+ * @{\r
+ */ \r
+\r
+/** @addtogroup STM32F429I_DISCOVERY\r
+ * @{\r
+ */\r
+ \r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL \r
+ * @brief This file provides set of firmware functions to manage Leds and push-button\r
+ * available on STM32F429I-Discovery Kit from STMicroelectronics.\r
+ * @{\r
+ */ \r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_TypesDefinitions\r
+ * @{\r
+ */ \r
+/**\r
+ * @}\r
+ */ \r
+\r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_Defines\r
+ * @{\r
+ */ \r
+/**\r
+ * @}\r
+ */ \r
+\r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_Macros\r
+ * @{\r
+ */ \r
+/**\r
+ * @}\r
+ */ \r
+\r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_Variables\r
+ * @{\r
+ */ \r
+GPIO_TypeDef* GPIO_PORT[LEDn] = {LED3_GPIO_PORT, LED4_GPIO_PORT};\r
+const uint16_t GPIO_PIN[LEDn] = {LED3_PIN, LED4_PIN};\r
+const uint32_t GPIO_CLK[LEDn] = {LED3_GPIO_CLK, LED4_GPIO_CLK};\r
+\r
+GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {USER_BUTTON_GPIO_PORT}; \r
+\r
+const uint16_t BUTTON_PIN[BUTTONn] = {USER_BUTTON_PIN}; \r
+\r
+const uint32_t BUTTON_CLK[BUTTONn] = {USER_BUTTON_GPIO_CLK};\r
+\r
+const uint16_t BUTTON_EXTI_LINE[BUTTONn] = {USER_BUTTON_EXTI_LINE};\r
+\r
+const uint8_t BUTTON_PORT_SOURCE[BUTTONn] = {USER_BUTTON_EXTI_PORT_SOURCE};\r
+ \r
+const uint8_t BUTTON_PIN_SOURCE[BUTTONn] = {USER_BUTTON_EXTI_PIN_SOURCE}; \r
+const uint8_t BUTTON_IRQn[BUTTONn] = {USER_BUTTON_EXTI_IRQn};\r
+\r
+DMA_InitTypeDef sEEDMA_InitStructure; \r
+NVIC_InitTypeDef NVIC_InitStructure;\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_FunctionPrototypes\r
+ * @{\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_Functions\r
+ * @{\r
+ */ \r
+\r
+/**\r
+ * @brief Configures LED GPIO.\r
+ * @param Led: Specifies the Led to be configured. \r
+ * This parameter can be one of following parameters:\r
+ * @arg LED3\r
+ * @arg LED4\r
+ * @retval None\r
+ */\r
+void STM_EVAL_LEDInit(Led_TypeDef Led)\r
+{\r
+ GPIO_InitTypeDef GPIO_InitStructure;\r
+ \r
+ /* Enable the GPIO_LED Clock */\r
+ RCC_AHB1PeriphClockCmd(GPIO_CLK[Led], ENABLE);\r
+\r
+ /* Configure the GPIO_LED pin */\r
+ GPIO_InitStructure.GPIO_Pin = GPIO_PIN[Led];\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+ GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure);\r
+}\r
+\r
+/**\r
+ * @brief Turns selected LED On.\r
+ * @param Led: Specifies the Led to be set on. \r
+ * This parameter can be one of following parameters:\r
+ * @arg LED3\r
+ * @arg LED4 \r
+ * @retval None\r
+ */\r
+void STM_EVAL_LEDOn(Led_TypeDef Led)\r
+{\r
+ GPIO_PORT[Led]->BSRRL = GPIO_PIN[Led];\r
+}\r
+\r
+/**\r
+ * @brief Turns selected LED Off.\r
+ * @param Led: Specifies the Led to be set off. \r
+ * This parameter can be one of following parameters:\r
+ * @arg LED3\r
+ * @arg LED4\r
+ * @retval None\r
+ */\r
+void STM_EVAL_LEDOff(Led_TypeDef Led)\r
+{\r
+ GPIO_PORT[Led]->BSRRH = GPIO_PIN[Led]; \r
+}\r
+\r
+/**\r
+ * @brief Toggles the selected LED.\r
+ * @param Led: Specifies the Led to be toggled. \r
+ * This parameter can be one of following parameters:\r
+ * @arg LED3\r
+ * @arg LED4 \r
+ * @retval None\r
+ */\r
+void STM_EVAL_LEDToggle(Led_TypeDef Led)\r
+{\r
+ GPIO_PORT[Led]->ODR ^= GPIO_PIN[Led];\r
+}\r
+\r
+/**\r
+ * @brief Configures Button GPIO and EXTI Line.\r
+ * @param Button: Specifies the Button to be configured.\r
+ * This parameter should be: BUTTON_USER\r
+ * @param Button_Mode: Specifies Button mode.\r
+ * This parameter can be one of following parameters: \r
+ * @arg BUTTON_MODE_GPIO: Button will be used as simple IO \r
+ * @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line with interrupt\r
+ * generation capability \r
+ * @retval None\r
+ */\r
+void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode)\r
+{\r
+ GPIO_InitTypeDef GPIO_InitStructure;\r
+ EXTI_InitTypeDef EXTI_InitStructure;\r
+ NVIC_InitTypeDef NVIC_InitStructure;\r
+\r
+ /* Enable the BUTTON Clock */\r
+ RCC_AHB1PeriphClockCmd(BUTTON_CLK[Button], ENABLE);\r
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);\r
+\r
+ /* Configure Button pin as input */\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;\r
+ GPIO_InitStructure.GPIO_Pin = BUTTON_PIN[Button];\r
+ GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStructure);\r
+\r
+ if (Button_Mode == BUTTON_MODE_EXTI)\r
+ {\r
+ /* Connect Button EXTI Line to Button GPIO Pin */\r
+ SYSCFG_EXTILineConfig(BUTTON_PORT_SOURCE[Button], BUTTON_PIN_SOURCE[Button]);\r
+\r
+ /* Configure Button EXTI line */\r
+ EXTI_InitStructure.EXTI_Line = BUTTON_EXTI_LINE[Button];\r
+ EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;\r
+ EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; \r
+ EXTI_InitStructure.EXTI_LineCmd = ENABLE;\r
+ EXTI_Init(&EXTI_InitStructure);\r
+\r
+ /* Enable and set Button EXTI Interrupt to the lowest priority */\r
+ NVIC_InitStructure.NVIC_IRQChannel = BUTTON_IRQn[Button];\r
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;\r
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;\r
+ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;\r
+\r
+ NVIC_Init(&NVIC_InitStructure); \r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Returns the selected Button state.\r
+ * @param Button: Specifies the Button to be checked.\r
+ * This parameter should be: BUTTON_USER \r
+ * @retval The Button GPIO pin value.\r
+ */\r
+uint32_t STM_EVAL_PBGetState(Button_TypeDef Button)\r
+{\r
+ return GPIO_ReadInputDataBit(BUTTON_PORT[Button], BUTTON_PIN[Button]);\r
+}\r
+\r
+/**\r
+ * @brief DeInitializes peripherals used by the I2C EEPROM driver.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void sEE_LowLevel_DeInit(void)\r
+{\r
+ GPIO_InitTypeDef GPIO_InitStructure; \r
+ \r
+ /* sEE_I2C Peripheral Disable */\r
+ I2C_Cmd(sEE_I2C, DISABLE);\r
+ \r
+ /* sEE_I2C DeInit */\r
+ I2C_DeInit(sEE_I2C);\r
+\r
+ /*!< sEE_I2C Periph clock disable */\r
+ RCC_APB1PeriphClockCmd(sEE_I2C_CLK, DISABLE);\r
+ \r
+ /*!< GPIO configuration */ \r
+ /*!< Configure sEE_I2C pins: SCL */\r
+ GPIO_InitStructure.GPIO_Pin = sEE_I2C_SCL_PIN;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(sEE_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /*!< Configure sEE_I2C pins: SDA */\r
+ GPIO_InitStructure.GPIO_Pin = sEE_I2C_SDA_PIN;\r
+ GPIO_Init(sEE_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* Configure and enable I2C DMA TX Stream interrupt */\r
+ NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_TX_IRQn;\r
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO;\r
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO;\r
+ NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;\r
+ NVIC_Init(&NVIC_InitStructure);\r
+\r
+ /* Configure and enable I2C DMA RX Stream interrupt */\r
+ NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_RX_IRQn;\r
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO;\r
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO;\r
+ NVIC_Init(&NVIC_InitStructure); \r
+ \r
+ /* Disable and Deinitialize the DMA Streams */\r
+ DMA_Cmd(sEE_I2C_DMA_STREAM_TX, DISABLE);\r
+ DMA_Cmd(sEE_I2C_DMA_STREAM_RX, DISABLE);\r
+ DMA_DeInit(sEE_I2C_DMA_STREAM_TX);\r
+ DMA_DeInit(sEE_I2C_DMA_STREAM_RX);\r
+}\r
+\r
+/**\r
+ * @brief Initializes peripherals used by the I2C EEPROM driver.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void sEE_LowLevel_Init(void)\r
+{\r
+ GPIO_InitTypeDef GPIO_InitStructure; \r
+ \r
+ /*!< sEE_I2C Periph clock enable */\r
+ RCC_APB1PeriphClockCmd(sEE_I2C_CLK, ENABLE);\r
+ \r
+ /*!< sEE_I2C_SCL_GPIO_CLK and sEE_I2C_SDA_GPIO_CLK Periph clock enable */\r
+ RCC_AHB1PeriphClockCmd(sEE_I2C_SCL_GPIO_CLK | sEE_I2C_SDA_GPIO_CLK, ENABLE);\r
+ \r
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);\r
+ \r
+ /* Reset sEE_I2C IP */\r
+ RCC_APB1PeriphResetCmd(sEE_I2C_CLK, ENABLE); \r
+ /* Release reset signal of sEE_I2C IP */\r
+ RCC_APB1PeriphResetCmd(sEE_I2C_CLK, DISABLE);\r
+ \r
+ /*!< GPIO configuration */ \r
+ /*!< Configure sEE_I2C pins: SCL */ \r
+ GPIO_InitStructure.GPIO_Pin = sEE_I2C_SCL_PIN;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(sEE_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /*!< Configure sEE_I2C pins: SDA */\r
+ GPIO_InitStructure.GPIO_Pin = sEE_I2C_SDA_PIN;\r
+ GPIO_Init(sEE_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* Connect PXx to I2C_SCL*/\r
+ GPIO_PinAFConfig(sEE_I2C_SCL_GPIO_PORT, sEE_I2C_SCL_SOURCE, sEE_I2C_SCL_AF);\r
+\r
+ /* Connect PXx to I2C_SDA*/\r
+ GPIO_PinAFConfig(sEE_I2C_SDA_GPIO_PORT, sEE_I2C_SDA_SOURCE, sEE_I2C_SDA_AF); \r
+ \r
+ /* Configure and enable I2C DMA TX Channel interrupt */\r
+ NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_TX_IRQn;\r
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO;\r
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO;\r
+ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;\r
+ NVIC_Init(&NVIC_InitStructure);\r
+\r
+ /* Configure and enable I2C DMA RX Channel interrupt */\r
+ NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_RX_IRQn;\r
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO;\r
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO;\r
+ NVIC_Init(&NVIC_InitStructure); \r
+ \r
+ /*!< I2C DMA TX and RX channels configuration */\r
+ /* Enable the DMA clock */\r
+ RCC_AHB1PeriphClockCmd(sEE_I2C_DMA_CLK, ENABLE);\r
+ \r
+ /* Clear any pending flag on Rx Stream */\r
+ DMA_ClearFlag(sEE_I2C_DMA_STREAM_TX, sEE_TX_DMA_FLAG_FEIF | sEE_TX_DMA_FLAG_DMEIF | sEE_TX_DMA_FLAG_TEIF | \\r
+ sEE_TX_DMA_FLAG_HTIF | sEE_TX_DMA_FLAG_TCIF);\r
+ /* Disable the EE I2C Tx DMA stream */\r
+ DMA_Cmd(sEE_I2C_DMA_STREAM_TX, DISABLE);\r
+ /* Configure the DMA stream for the EE I2C peripheral TX direction */\r
+ DMA_DeInit(sEE_I2C_DMA_STREAM_TX);\r
+ sEEDMA_InitStructure.DMA_Channel = sEE_I2C_DMA_CHANNEL;\r
+ sEEDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)sEE_I2C_DR_Address;\r
+ sEEDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)0; /* This parameter will be configured durig communication */;\r
+ sEEDMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; /* This parameter will be configured durig communication */\r
+ sEEDMA_InitStructure.DMA_BufferSize = 0xFFFF; /* This parameter will be configured durig communication */\r
+ sEEDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;\r
+ sEEDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;\r
+ sEEDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;\r
+ sEEDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;\r
+ sEEDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;\r
+ sEEDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;\r
+ sEEDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;\r
+ sEEDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;\r
+ sEEDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;\r
+ sEEDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;\r
+ DMA_Init(sEE_I2C_DMA_STREAM_TX, &sEEDMA_InitStructure);\r
+\r
+ /* Clear any pending flag on Rx Stream */\r
+ DMA_ClearFlag(sEE_I2C_DMA_STREAM_RX, sEE_RX_DMA_FLAG_FEIF | sEE_RX_DMA_FLAG_DMEIF | sEE_RX_DMA_FLAG_TEIF | \\r
+ sEE_RX_DMA_FLAG_HTIF | sEE_RX_DMA_FLAG_TCIF);\r
+ /* Disable the EE I2C DMA Rx stream */\r
+ DMA_Cmd(sEE_I2C_DMA_STREAM_RX, DISABLE);\r
+ /* Configure the DMA stream for the EE I2C peripheral RX direction */\r
+ DMA_DeInit(sEE_I2C_DMA_STREAM_RX);\r
+ DMA_Init(sEE_I2C_DMA_STREAM_RX, &sEEDMA_InitStructure);\r
+ \r
+ /* Enable the DMA Channels Interrupts */\r
+ DMA_ITConfig(sEE_I2C_DMA_STREAM_TX, DMA_IT_TC, ENABLE);\r
+ DMA_ITConfig(sEE_I2C_DMA_STREAM_RX, DMA_IT_TC, ENABLE); \r
+}\r
+\r
+/**\r
+ * @brief Initializes DMA channel used by the I2C EEPROM driver.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void sEE_LowLevel_DMAConfig(uint32_t pBuffer, uint32_t BufferSize, uint32_t Direction)\r
+{ \r
+ /* Initialize the DMA with the new parameters */\r
+ if (Direction == sEE_DIRECTION_TX)\r
+ {\r
+ /* Configure the DMA Tx Stream with the buffer address and the buffer size */\r
+ sEEDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)pBuffer;\r
+ sEEDMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; \r
+ sEEDMA_InitStructure.DMA_BufferSize = (uint32_t)BufferSize; \r
+ DMA_Init(sEE_I2C_DMA_STREAM_TX, &sEEDMA_InitStructure); \r
+ }\r
+ else\r
+ { \r
+ /* Configure the DMA Rx Stream with the buffer address and the buffer size */\r
+ sEEDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)pBuffer;\r
+ sEEDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;\r
+ sEEDMA_InitStructure.DMA_BufferSize = (uint32_t)BufferSize; \r
+ DMA_Init(sEE_I2C_DMA_STREAM_RX, &sEEDMA_InitStructure); \r
+ }\r
+}\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+ \r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
--- /dev/null
+/**\r
+ ******************************************************************************\r
+ * @file stm32f429i_discovery.h\r
+ * @author MCD Application Team\r
+ * @version V1.0.1\r
+ * @date 28-October-2013\r
+ * @brief This file contains definitions for STM32F429I-DISCO Kit Leds, push-\r
+ * buttons hardware resources.\r
+ ******************************************************************************\r
+ * @attention\r
+ *\r
+ * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+ *\r
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+ * You may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at:\r
+ *\r
+ * http://www.st.com/software_license_agreement_liberty_v2\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software \r
+ * distributed under the License is distributed on an "AS IS" BASIS, \r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ ******************************************************************************\r
+ */\r
+\r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __STM32F429I_DISCOVERY_H\r
+#define __STM32F429I_DISCOVERY_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif\r
+ \r
+/* Includes ------------------------------------------------------------------*/\r
+ #include "stm32f4xx.h"\r
+ \r
+/** @addtogroup Utilities\r
+ * @{\r
+ */\r
+ \r
+/** @addtogroup STM32F4_DISCOVERY\r
+ * @{\r
+ */\r
+ \r
+/** @addtogroup STM32F429I_DISCOVERY\r
+ * @{\r
+ */\r
+ \r
+/** @addtogroup STM32F429I_DISCOVERY_LOW_LEVEL\r
+ * @{\r
+ */ \r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Exported_Types\r
+ * @{\r
+ */\r
+typedef enum \r
+{\r
+ LED3 = 0,\r
+ LED4 = 1\r
+} Led_TypeDef;\r
+\r
+typedef enum \r
+{ \r
+ BUTTON_USER = 0,\r
+} Button_TypeDef;\r
+\r
+typedef enum \r
+{ \r
+ BUTTON_MODE_GPIO = 0,\r
+ BUTTON_MODE_EXTI = 1\r
+} ButtonMode_TypeDef; \r
+/**\r
+ * @}\r
+ */ \r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Exported_Constants\r
+ * @{\r
+ */ \r
+\r
+/** \r
+ * @brief Define for STM32F429I_DISCO board \r
+ */ \r
+#if !defined (USE_STM32F429I_DISCO)\r
+ #define USE_STM32F429I_DISCO\r
+#endif\r
+\r
+\r
+/** @addtogroup STM32F429I_DISCOVERY_LOW_LEVEL_LED\r
+ * @{\r
+ */\r
+#define LEDn 2\r
+ \r
+#define LED3_PIN GPIO_Pin_13\r
+#define LED3_GPIO_PORT GPIOG\r
+#define LED3_GPIO_CLK RCC_AHB1Periph_GPIOG \r
+\r
+#define LED4_PIN GPIO_Pin_14\r
+#define LED4_GPIO_PORT GPIOG\r
+#define LED4_GPIO_CLK RCC_AHB1Periph_GPIOG \r
+/**\r
+ * @}\r
+ */ \r
+ \r
+/** @addtogroup STM32F429I_DISCOVERY_LOW_LEVEL_BUTTON\r
+ * @{\r
+ */ \r
+#define BUTTONn 1 \r
+\r
+/**\r
+ * @brief Wakeup push-button\r
+ */\r
+#define USER_BUTTON_PIN GPIO_Pin_0\r
+#define USER_BUTTON_GPIO_PORT GPIOA\r
+#define USER_BUTTON_GPIO_CLK RCC_AHB1Periph_GPIOA\r
+#define USER_BUTTON_EXTI_LINE EXTI_Line0\r
+#define USER_BUTTON_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA\r
+#define USER_BUTTON_EXTI_PIN_SOURCE EXTI_PinSource0\r
+#define USER_BUTTON_EXTI_IRQn EXTI0_IRQn \r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @addtogroup STM32F429I_DISCOVERY_LOW_LEVEL_I2C_EE\r
+ * @{\r
+ */\r
+/**\r
+ * @brief I2C EEPROM Interface pins\r
+ */ \r
+#define sEE_I2C I2C3\r
+#define sEE_I2C_CLK RCC_APB1Periph_I2C3\r
+#define sEE_I2C_SCL_PIN GPIO_Pin_8 /* PA.08 */\r
+#define sEE_I2C_SCL_GPIO_PORT GPIOA /* GPIOA */\r
+#define sEE_I2C_SCL_GPIO_CLK RCC_AHB1Periph_GPIOA\r
+#define sEE_I2C_SCL_SOURCE GPIO_PinSource8\r
+#define sEE_I2C_SCL_AF GPIO_AF_I2C3\r
+#define sEE_I2C_SDA_PIN GPIO_Pin_9 /* PC.09 */\r
+#define sEE_I2C_SDA_GPIO_PORT GPIOC /* GPIOC */\r
+#define sEE_I2C_SDA_GPIO_CLK RCC_AHB1Periph_GPIOC\r
+#define sEE_I2C_SDA_SOURCE GPIO_PinSource9\r
+#define sEE_I2C_SDA_AF GPIO_AF_I2C3\r
+#define sEE_M24C64_32\r
+\r
+#define sEE_I2C_DMA DMA1 \r
+#define sEE_I2C_DMA_CHANNEL DMA_Channel_3\r
+#define sEE_I2C_DMA_STREAM_TX DMA1_Stream4\r
+#define sEE_I2C_DMA_STREAM_RX DMA1_Stream2 \r
+#define sEE_I2C_DMA_CLK RCC_AHB1Periph_DMA1\r
+#define sEE_I2C_DR_Address ((uint32_t)0x40005C10)\r
+#define sEE_USE_DMA\r
+ \r
+#define sEE_I2C_DMA_TX_IRQn DMA1_Stream4_IRQn\r
+#define sEE_I2C_DMA_RX_IRQn DMA1_Stream2_IRQn\r
+#define sEE_I2C_DMA_TX_IRQHandler DMA1_Stream4_IRQHandler\r
+#define sEE_I2C_DMA_RX_IRQHandler DMA1_Stream2_IRQHandler \r
+#define sEE_I2C_DMA_PREPRIO 0\r
+#define sEE_I2C_DMA_SUBPRIO 0 \r
+ \r
+#define sEE_TX_DMA_FLAG_FEIF DMA_FLAG_FEIF4\r
+#define sEE_TX_DMA_FLAG_DMEIF DMA_FLAG_DMEIF4\r
+#define sEE_TX_DMA_FLAG_TEIF DMA_FLAG_TEIF4\r
+#define sEE_TX_DMA_FLAG_HTIF DMA_FLAG_HTIF4\r
+#define sEE_TX_DMA_FLAG_TCIF DMA_FLAG_TCIF4\r
+#define sEE_RX_DMA_FLAG_FEIF DMA_FLAG_FEIF2\r
+#define sEE_RX_DMA_FLAG_DMEIF DMA_FLAG_DMEIF2\r
+#define sEE_RX_DMA_FLAG_TEIF DMA_FLAG_TEIF2\r
+#define sEE_RX_DMA_FLAG_HTIF DMA_FLAG_HTIF2\r
+#define sEE_RX_DMA_FLAG_TCIF DMA_FLAG_TCIF2\r
+ \r
+#define sEE_DIRECTION_TX 0\r
+#define sEE_DIRECTION_RX 1 \r
+\r
+/* I2C clock speed configuration (in Hz), used by I2C EEPROM memory and IO Expander drivers */\r
+#ifndef I2C_SPEED\r
+ #define I2C_SPEED 100000\r
+#endif /* I2C_SPEED */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Exported_Macros\r
+ * @{\r
+ */ \r
+/**\r
+ * @}\r
+ */ \r
+\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Exported_Functions\r
+ * @{\r
+ */\r
+void STM_EVAL_LEDInit(Led_TypeDef Led);\r
+void STM_EVAL_LEDOn(Led_TypeDef Led);\r
+void STM_EVAL_LEDOff(Led_TypeDef Led);\r
+void STM_EVAL_LEDToggle(Led_TypeDef Led);\r
+void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode);\r
+uint32_t STM_EVAL_PBGetState(Button_TypeDef Button);\r
+void sEE_LowLevel_DeInit(void);\r
+void sEE_LowLevel_Init(void);\r
+void sEE_LowLevel_DMAConfig(uint32_t pBuffer, uint32_t BufferSize, uint32_t Direction);\r
+/**\r
+ * @}\r
+ */\r
+ \r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __STM32F429I_DISCOVERY_H */\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
--- /dev/null
+/**\r
+ ******************************************************************************\r
+ * @file stm32f429i_discovery_l3gd20.c\r
+ * @author MCD Application Team\r
+ * @version V1.0.1\r
+ * @date 28-October-2013\r
+ * @brief This file provides a set of functions needed to manage the l3gd20\r
+ * MEMS three-axis digital output gyroscope available on STM32F429I-DISCO Kit.\r
+ ******************************************************************************\r
+ * @attention\r
+ *\r
+ * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+ *\r
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+ * You may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at:\r
+ *\r
+ * http://www.st.com/software_license_agreement_liberty_v2\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software \r
+ * distributed under the License is distributed on an "AS IS" BASIS, \r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ ******************************************************************************\r
+ */\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f429i_discovery_l3gd20.h"\r
+/** @addtogroup Utilities\r
+ * @{\r
+ */ \r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+ * @{\r
+ */ \r
+ \r
+/** @addtogroup STM32429I_DISCO\r
+ * @{\r
+ */ \r
+\r
+/** @addtogroup STM32F429I_DISCOVERY_L3GD20\r
+ * @{\r
+ */\r
+\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_TypesDefinitions\r
+ * @{\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_Defines\r
+ * @{\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_Macros\r
+ * @{\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+ \r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_Variables\r
+ * @{\r
+ */ \r
+__IO uint32_t L3GD20Timeout = L3GD20_FLAG_TIMEOUT; \r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_FunctionPrototypes\r
+ * @{\r
+ */\r
+static uint8_t L3GD20_SendByte(uint8_t byte);\r
+static void L3GD20_LowLevel_Init(void);\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_Functions\r
+ * @{\r
+ */\r
+\r
+/**\r
+ * @brief Set L3GD20 Initialization.\r
+ * @param L3GD20_InitStruct: pointer to a L3GD20_InitTypeDef structure \r
+ * that contains the configuration setting for the L3GD20.\r
+ * @retval None\r
+ */\r
+void L3GD20_Init(L3GD20_InitTypeDef *L3GD20_InitStruct)\r
+{ \r
+ uint8_t ctrl1 = 0x00, ctrl4 = 0x00;\r
+ \r
+ /* Configure the low level interface ---------------------------------------*/\r
+ L3GD20_LowLevel_Init();\r
+ \r
+ /* Configure MEMS: data rate, power mode, full scale and axes */\r
+ ctrl1 |= (uint8_t) (L3GD20_InitStruct->Power_Mode | L3GD20_InitStruct->Output_DataRate | \\r
+ L3GD20_InitStruct->Axes_Enable | L3GD20_InitStruct->Band_Width);\r
+ \r
+ ctrl4 |= (uint8_t) (L3GD20_InitStruct->BlockData_Update | L3GD20_InitStruct->Endianness | \\r
+ L3GD20_InitStruct->Full_Scale);\r
+ \r
+ /* Write value to MEMS CTRL_REG1 regsister */\r
+ L3GD20_Write(&ctrl1, L3GD20_CTRL_REG1_ADDR, 1);\r
+ \r
+ /* Write value to MEMS CTRL_REG4 regsister */\r
+ L3GD20_Write(&ctrl4, L3GD20_CTRL_REG4_ADDR, 1);\r
+}\r
+\r
+/**\r
+ * @brief Reboot memory content of L3GD20\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void L3GD20_RebootCmd(void)\r
+{\r
+ uint8_t tmpreg;\r
+ \r
+ /* Read CTRL_REG5 register */\r
+ L3GD20_Read(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);\r
+ \r
+ /* Enable the reboot memory */\r
+ tmpreg |= L3GD20_BOOT_REBOOTMEMORY;\r
+ \r
+ /* Write value to MEMS CTRL_REG5 regsister */\r
+ L3GD20_Write(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);\r
+}\r
+\r
+/**\r
+ * @brief Set L3GD20 Interrupt configuration\r
+ * @param L3GD20_InterruptConfig_TypeDef: pointer to a L3GD20_InterruptConfig_TypeDef \r
+ * structure that contains the configuration setting for the L3GD20 Interrupt.\r
+ * @retval None\r
+ */\r
+void L3GD20_INT1InterruptConfig(L3GD20_InterruptConfigTypeDef *L3GD20_IntConfigStruct)\r
+{\r
+ uint8_t ctrl_cfr = 0x00, ctrl3 = 0x00;\r
+ \r
+ /* Read INT1_CFG register */\r
+ L3GD20_Read(&ctrl_cfr, L3GD20_INT1_CFG_ADDR, 1);\r
+ \r
+ /* Read CTRL_REG3 register */\r
+ L3GD20_Read(&ctrl3, L3GD20_CTRL_REG3_ADDR, 1);\r
+ \r
+ ctrl_cfr &= 0x80;\r
+ \r
+ ctrl3 &= 0xDF;\r
+ \r
+ /* Configure latch Interrupt request and axe interrupts */ \r
+ ctrl_cfr |= (uint8_t)(L3GD20_IntConfigStruct->Latch_Request| \\r
+ L3GD20_IntConfigStruct->Interrupt_Axes);\r
+ \r
+ ctrl3 |= (uint8_t)(L3GD20_IntConfigStruct->Interrupt_ActiveEdge);\r
+ \r
+ /* Write value to MEMS INT1_CFG register */\r
+ L3GD20_Write(&ctrl_cfr, L3GD20_INT1_CFG_ADDR, 1);\r
+ \r
+ /* Write value to MEMS CTRL_REG3 register */\r
+ L3GD20_Write(&ctrl3, L3GD20_CTRL_REG3_ADDR, 1);\r
+}\r
+\r
+/**\r
+ * @brief Enable or disable INT1 interrupt\r
+ * @param InterruptState: State of INT1 Interrupt \r
+ * This parameter can be: \r
+ * @arg L3GD20_INT1INTERRUPT_DISABLE\r
+ * @arg L3GD20_INT1INTERRUPT_ENABLE \r
+ * @retval None\r
+ */\r
+void L3GD20_INT1InterruptCmd(uint8_t InterruptState)\r
+{ \r
+ uint8_t tmpreg;\r
+ \r
+ /* Read CTRL_REG3 register */\r
+ L3GD20_Read(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);\r
+ \r
+ tmpreg &= 0x7F; \r
+ tmpreg |= InterruptState;\r
+ \r
+ /* Write value to MEMS CTRL_REG3 regsister */\r
+ L3GD20_Write(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);\r
+}\r
+\r
+/**\r
+ * @brief Enable or disable INT2 interrupt\r
+ * @param InterruptState: State of INT1 Interrupt \r
+ * This parameter can be: \r
+ * @arg L3GD20_INT2INTERRUPT_DISABLE\r
+ * @arg L3GD20_INT2INTERRUPT_ENABLE \r
+ * @retval None\r
+ */\r
+void L3GD20_INT2InterruptCmd(uint8_t InterruptState)\r
+{ \r
+ uint8_t tmpreg;\r
+ \r
+ /* Read CTRL_REG3 register */\r
+ L3GD20_Read(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);\r
+ \r
+ tmpreg &= 0xF7; \r
+ tmpreg |= InterruptState;\r
+ \r
+ /* Write value to MEMS CTRL_REG3 regsister */\r
+ L3GD20_Write(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);\r
+}\r
+\r
+/**\r
+ * @brief Set High Pass Filter Modality\r
+ * @param L3GD20_FilterStruct: pointer to a L3GD20_FilterConfigTypeDef structure \r
+ * that contains the configuration setting for the L3GD20. \r
+ * @retval None\r
+ */\r
+void L3GD20_FilterConfig(L3GD20_FilterConfigTypeDef *L3GD20_FilterStruct) \r
+{\r
+ uint8_t tmpreg;\r
+ \r
+ /* Read CTRL_REG2 register */\r
+ L3GD20_Read(&tmpreg, L3GD20_CTRL_REG2_ADDR, 1);\r
+ \r
+ tmpreg &= 0xC0;\r
+ \r
+ /* Configure MEMS: mode and cutoff frquency */\r
+ tmpreg |= (uint8_t) (L3GD20_FilterStruct->HighPassFilter_Mode_Selection |\\r
+ L3GD20_FilterStruct->HighPassFilter_CutOff_Frequency); \r
+\r
+ /* Write value to MEMS CTRL_REG2 regsister */\r
+ L3GD20_Write(&tmpreg, L3GD20_CTRL_REG2_ADDR, 1);\r
+}\r
+\r
+/**\r
+ * @brief Enable or Disable High Pass Filter\r
+ * @param HighPassFilterState: new state of the High Pass Filter feature.\r
+ * This parameter can be: \r
+ * @arg: L3GD20_HIGHPASSFILTER_DISABLE \r
+ * @arg: L3GD20_HIGHPASSFILTER_ENABLE \r
+ * @retval None\r
+ */\r
+void L3GD20_FilterCmd(uint8_t HighPassFilterState)\r
+ {\r
+ uint8_t tmpreg;\r
+ \r
+ /* Read CTRL_REG5 register */\r
+ L3GD20_Read(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);\r
+ \r
+ tmpreg &= 0xEF;\r
+\r
+ tmpreg |= HighPassFilterState;\r
+\r
+ /* Write value to MEMS CTRL_REG5 regsister */\r
+ L3GD20_Write(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);\r
+}\r
+\r
+/**\r
+ * @brief Get status for L3GD20 data\r
+ * @param None \r
+ * @retval L3GD20 status\r
+ */\r
+uint8_t L3GD20_GetDataStatus(void)\r
+{\r
+ uint8_t tmpreg;\r
+ \r
+ /* Read STATUS_REG register */\r
+ L3GD20_Read(&tmpreg, L3GD20_STATUS_REG_ADDR, 1);\r
+ \r
+ return tmpreg;\r
+}\r
+\r
+/**\r
+ * @brief Writes a block of data to the L3GD20.\r
+ * @param pBuffer : pointer to the buffer containing the data to be written to the L3GD20.\r
+ * @param WriteAddr : L3GD20's internal address to write to.\r
+ * @param NumByteToWrite: Number of bytes to write.\r
+ * @retval None\r
+ */\r
+void L3GD20_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite)\r
+{\r
+ /* Configure the MS bit: \r
+ - When 0, the address will remain unchanged in multiple read/write commands.\r
+ - When 1, the address will be auto incremented in multiple read/write commands.\r
+ */\r
+ if(NumByteToWrite > 0x01)\r
+ {\r
+ WriteAddr |= (uint8_t)MULTIPLEBYTE_CMD;\r
+ }\r
+ /* Set chip select Low at the start of the transmission */\r
+ L3GD20_CS_LOW();\r
+ \r
+ /* Send the Address of the indexed register */\r
+ L3GD20_SendByte(WriteAddr);\r
+\r
+ /* Send the data that will be written into the device (MSB First) */\r
+ while(NumByteToWrite >= 0x01)\r
+ {\r
+ L3GD20_SendByte(*pBuffer);\r
+ NumByteToWrite--;\r
+ pBuffer++;\r
+ }\r
+ \r
+ /* Set chip select High at the end of the transmission */ \r
+ L3GD20_CS_HIGH();\r
+}\r
+\r
+/**\r
+ * @brief Reads a block of data from the L3GD20.\r
+ * @param pBuffer : pointer to the buffer that receives the data read from the L3GD20.\r
+ * @param ReadAddr : L3GD20's internal address to read from.\r
+ * @param NumByteToRead : number of bytes to read from the L3GD20.\r
+ * @retval None\r
+ */\r
+void L3GD20_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead)\r
+{ \r
+ if(NumByteToRead > 0x01)\r
+ {\r
+ ReadAddr |= (uint8_t)(READWRITE_CMD | MULTIPLEBYTE_CMD);\r
+ }\r
+ else\r
+ {\r
+ ReadAddr |= (uint8_t)READWRITE_CMD;\r
+ }\r
+ /* Set chip select Low at the start of the transmission */\r
+ L3GD20_CS_LOW();\r
+ \r
+ /* Send the Address of the indexed register */\r
+ L3GD20_SendByte(ReadAddr);\r
+ \r
+ /* Receive the data that will be read from the device (MSB First) */\r
+ while(NumByteToRead > 0x00)\r
+ {\r
+ /* Send dummy byte (0x00) to generate the SPI clock to L3GD20 (Slave device) */\r
+ *pBuffer = L3GD20_SendByte(DUMMY_BYTE);\r
+ NumByteToRead--;\r
+ pBuffer++;\r
+ }\r
+ \r
+ /* Set chip select High at the end of the transmission */ \r
+ L3GD20_CS_HIGH();\r
+} \r
+\r
+/**\r
+ * @brief Initializes the low level interface used to drive the L3GD20\r
+ * @param None\r
+ * @retval None\r
+ */\r
+static void L3GD20_LowLevel_Init(void)\r
+{\r
+ GPIO_InitTypeDef GPIO_InitStructure;\r
+ SPI_InitTypeDef SPI_InitStructure;\r
+\r
+ /* Enable the SPI periph */\r
+ RCC_APB2PeriphClockCmd(L3GD20_SPI_CLK, ENABLE);\r
+\r
+ /* Enable SCK, MOSI and MISO GPIO clocks */\r
+ RCC_AHB1PeriphClockCmd(L3GD20_SPI_SCK_GPIO_CLK | L3GD20_SPI_MISO_GPIO_CLK | L3GD20_SPI_MOSI_GPIO_CLK, ENABLE);\r
+\r
+ /* Enable CS GPIO clock */\r
+ RCC_AHB1PeriphClockCmd(L3GD20_SPI_CS_GPIO_CLK, ENABLE);\r
+ \r
+ /* Enable INT1 GPIO clock */\r
+ RCC_AHB1PeriphClockCmd(L3GD20_SPI_INT1_GPIO_CLK, ENABLE);\r
+ \r
+ /* Enable INT2 GPIO clock */\r
+ RCC_AHB1PeriphClockCmd(L3GD20_SPI_INT2_GPIO_CLK, ENABLE);\r
+\r
+ GPIO_PinAFConfig(L3GD20_SPI_SCK_GPIO_PORT, L3GD20_SPI_SCK_SOURCE, L3GD20_SPI_SCK_AF);\r
+ GPIO_PinAFConfig(L3GD20_SPI_MISO_GPIO_PORT, L3GD20_SPI_MISO_SOURCE, L3GD20_SPI_MISO_AF);\r
+ GPIO_PinAFConfig(L3GD20_SPI_MOSI_GPIO_PORT, L3GD20_SPI_MOSI_SOURCE, L3GD20_SPI_MOSI_AF);\r
+\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;\r
+\r
+ /* SPI SCK pin configuration */\r
+ GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_SCK_PIN;\r
+ GPIO_Init(L3GD20_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* SPI MOSI pin configuration */\r
+ GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_MOSI_PIN;\r
+ GPIO_Init(L3GD20_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* SPI MISO pin configuration */\r
+ GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_MISO_PIN;\r
+ GPIO_Init(L3GD20_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* SPI configuration -------------------------------------------------------*/\r
+ SPI_I2S_DeInit(L3GD20_SPI);\r
+ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;\r
+ SPI_InitStructure.SPI_Mode = SPI_Mode_Master;\r
+ SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;\r
+ SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;\r
+ SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;\r
+ SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;\r
+ /* SPI baudrate is set to 5.6 MHz (PCLK2/SPI_BaudRatePrescaler = 90/16 = 5.625 MHz) \r
+ to verify these constraints:\r
+ - ILI9341 LCD SPI interface max baudrate is 10MHz for write and 6.66MHz for read\r
+ - l3gd20 SPI interface max baudrate is 10MHz for write/read\r
+ - PCLK2 frequency is set to 90 MHz \r
+ */\r
+ SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;\r
+ SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;\r
+ SPI_InitStructure.SPI_CRCPolynomial = 7;\r
+ SPI_Init(L3GD20_SPI, &SPI_InitStructure);\r
+\r
+ /* Enable L3GD20_SPI */\r
+ SPI_Cmd(L3GD20_SPI, ENABLE);\r
+ \r
+ /* Configure GPIO PIN for Lis Chip select */\r
+ GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_CS_PIN;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(L3GD20_SPI_CS_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* Deselect : Chip Select high */\r
+ GPIO_SetBits(L3GD20_SPI_CS_GPIO_PORT, L3GD20_SPI_CS_PIN);\r
+ \r
+ /* Configure GPIO PINs to detect Interrupts */\r
+ GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_INT1_PIN;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(L3GD20_SPI_INT1_GPIO_PORT, &GPIO_InitStructure);\r
+ \r
+ GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_INT2_PIN;\r
+ GPIO_Init(L3GD20_SPI_INT2_GPIO_PORT, &GPIO_InitStructure);\r
+} \r
+\r
+/**\r
+ * @brief Sends a Byte through the SPI interface and return the Byte received \r
+ * from the SPI bus.\r
+ * @param Byte : Byte send.\r
+ * @retval The received byte value\r
+ */\r
+static uint8_t L3GD20_SendByte(uint8_t byte)\r
+{\r
+ /* Loop while DR register in not empty */\r
+ L3GD20Timeout = L3GD20_FLAG_TIMEOUT;\r
+ while (SPI_I2S_GetFlagStatus(L3GD20_SPI, SPI_I2S_FLAG_TXE) == RESET)\r
+ {\r
+ if((L3GD20Timeout--) == 0) return L3GD20_TIMEOUT_UserCallback();\r
+ }\r
+ \r
+ /* Send a Byte through the SPI peripheral */\r
+ SPI_I2S_SendData(L3GD20_SPI, (uint16_t)byte);\r
+ /* Wait to receive a Byte */\r
+ L3GD20Timeout = L3GD20_FLAG_TIMEOUT;\r
+ while (SPI_I2S_GetFlagStatus(L3GD20_SPI, SPI_I2S_FLAG_RXNE) == RESET)\r
+ {\r
+ if((L3GD20Timeout--) == 0) return L3GD20_TIMEOUT_UserCallback();\r
+ }\r
+ \r
+ /* Return the Byte read from the SPI bus */\r
+ return (uint8_t)SPI_I2S_ReceiveData(L3GD20_SPI);\r
+}\r
+\r
+#ifdef USE_DEFAULT_TIMEOUT_CALLBACK\r
+/**\r
+ * @brief Basic management of the timeout situation.\r
+ * @param None.\r
+ * @retval None.\r
+ */\r
+uint32_t L3GD20_TIMEOUT_UserCallback(void)\r
+{\r
+ /* Block communication and all processes */\r
+ while (1)\r
+ { \r
+ }\r
+}\r
+#endif /* USE_DEFAULT_TIMEOUT_CALLBACK */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+ \r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+ \r
+ /**\r
+ * @}\r
+ */ \r
+ \r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \r
--- /dev/null
+/**\r
+ ******************************************************************************\r
+ * @file stm32f429i_discovery_l3gd20.h\r
+ * @author MCD Application Team\r
+ * @version V1.0.1\r
+ * @date 28-October-2013\r
+ * @brief This file contains definitions for stm32f429i_discovery_l3gd20.c \r
+ * firmware driver.\r
+ ******************************************************************************\r
+ * @attention\r
+ *\r
+ * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+ *\r
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+ * You may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at:\r
+ *\r
+ * http://www.st.com/software_license_agreement_liberty_v2\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software \r
+ * distributed under the License is distributed on an "AS IS" BASIS, \r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ ******************************************************************************\r
+ */\r
+ \r
+\r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __STM32F429I_DISCOVERY_L3GD20_H\r
+#define __STM32F429I_DISCOVERY_L3GD20_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f4xx.h"\r
+#include "stm32f4xx_spi.h"\r
+#include "stm32f4xx_rcc.h"\r
+\r
+/** @addtogroup Utilities\r
+ * @{\r
+ */\r
+ \r
+/** @addtogroup STM32F4_DISCOVERY\r
+ * @{\r
+ */ \r
+\r
+/** @addtogroup STM32F429I_DISCOVERY\r
+ * @{\r
+ */\r
+ \r
+/** @addtogroup STM32F429I_DISCOVERY_L3GD20\r
+ * @{\r
+ */\r
+ \r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Exported_Types\r
+ * @{\r
+ */\r
+\r
+/* L3GD20 struct */\r
+typedef struct\r
+{\r
+ uint8_t Power_Mode; /* Power-down/Sleep/Normal Mode */\r
+ uint8_t Output_DataRate; /* OUT data rate */\r
+ uint8_t Axes_Enable; /* Axes enable */\r
+ uint8_t Band_Width; /* Bandwidth selection */\r
+ uint8_t BlockData_Update; /* Block Data Update */\r
+ uint8_t Endianness; /* Endian Data selection */\r
+ uint8_t Full_Scale; /* Full Scale selection */\r
+}L3GD20_InitTypeDef;\r
+\r
+/* L3GD20 High Pass Filter struct */\r
+typedef struct\r
+{\r
+ uint8_t HighPassFilter_Mode_Selection; /* Internal filter mode */\r
+ uint8_t HighPassFilter_CutOff_Frequency; /* High pass filter cut-off frequency */\r
+}L3GD20_FilterConfigTypeDef;\r
+\r
+/* L3GD20 Interrupt struct */\r
+typedef struct\r
+{\r
+ uint8_t Latch_Request; /* Latch interrupt request into CLICK_SRC register */\r
+ uint8_t Interrupt_Axes; /* X, Y, Z Axes Interrupts */ \r
+ uint8_t Interrupt_ActiveEdge; /* Interrupt Active edge */\r
+}L3GD20_InterruptConfigTypeDef; \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+\r
+/**\r
+ * @}\r
+ */\r
+ \r
+/** @defgroup STM32F429I-DISCO_L3GD20_Exported_Constants\r
+ * @{\r
+ */\r
+\r
+/* Read/Write command */\r
+#define READWRITE_CMD ((uint8_t)0x80) \r
+/* Multiple byte read/write command */ \r
+#define MULTIPLEBYTE_CMD ((uint8_t)0x40)\r
+/* Dummy Byte Send by the SPI Master device in order to generate the Clock to the Slave device */\r
+#define DUMMY_BYTE ((uint8_t)0x00)\r
+\r
+/* Uncomment the following line to use the default L3GD20_TIMEOUT_UserCallback() \r
+ function implemented in stm32f429i_discovery_lgd20.c file.\r
+ L3GD20_TIMEOUT_UserCallback() function is called whenever a timeout condition \r
+ occure during communication (waiting transmit data register empty flag(TXE)\r
+ or waiting receive data register is not empty flag (RXNE)). */ \r
+/* #define USE_DEFAULT_TIMEOUT_CALLBACK */\r
+\r
+/* Maximum Timeout values for flags waiting loops. These timeouts are not based\r
+ on accurate values, they just guarantee that the application will not remain\r
+ stuck if the SPI communication is corrupted.\r
+ You may modify these timeout values depending on CPU frequency and application\r
+ conditions (interrupts routines ...). */ \r
+#define L3GD20_FLAG_TIMEOUT ((uint32_t)0x1000)\r
+\r
+/**\r
+ * @brief L3GD20 SPI Interface pins\r
+ */\r
+#define L3GD20_SPI SPI5\r
+#define L3GD20_SPI_CLK RCC_APB2Periph_SPI5\r
+\r
+#define L3GD20_SPI_SCK_PIN GPIO_Pin_7 /* PF.07 */\r
+#define L3GD20_SPI_SCK_GPIO_PORT GPIOF /* GPIOF */\r
+#define L3GD20_SPI_SCK_GPIO_CLK RCC_AHB1Periph_GPIOF\r
+#define L3GD20_SPI_SCK_SOURCE GPIO_PinSource7\r
+#define L3GD20_SPI_SCK_AF GPIO_AF_SPI5\r
+\r
+#define L3GD20_SPI_MISO_PIN GPIO_Pin_8 /* PF.08 */\r
+#define L3GD20_SPI_MISO_GPIO_PORT GPIOF /* GPIOF */\r
+#define L3GD20_SPI_MISO_GPIO_CLK RCC_AHB1Periph_GPIOF\r
+#define L3GD20_SPI_MISO_SOURCE GPIO_PinSource8\r
+#define L3GD20_SPI_MISO_AF GPIO_AF_SPI5\r
+\r
+#define L3GD20_SPI_MOSI_PIN GPIO_Pin_9 /* PF.09 */\r
+#define L3GD20_SPI_MOSI_GPIO_PORT GPIOF /* GPIOF */\r
+#define L3GD20_SPI_MOSI_GPIO_CLK RCC_AHB1Periph_GPIOF\r
+#define L3GD20_SPI_MOSI_SOURCE GPIO_PinSource9\r
+#define L3GD20_SPI_MOSI_AF GPIO_AF_SPI5\r
+\r
+#define L3GD20_SPI_CS_PIN GPIO_Pin_1 /* PC.01 */\r
+#define L3GD20_SPI_CS_GPIO_PORT GPIOC /* GPIOC */\r
+#define L3GD20_SPI_CS_GPIO_CLK RCC_AHB1Periph_GPIOC\r
+\r
+#define L3GD20_SPI_INT1_PIN GPIO_Pin_1 /* PA.01 */\r
+#define L3GD20_SPI_INT1_GPIO_PORT GPIOA /* GPIOA */\r
+#define L3GD20_SPI_INT1_GPIO_CLK RCC_AHB1Periph_GPIOA\r
+#define L3GD20_SPI_INT1_EXTI_LINE EXTI_Line1\r
+#define L3GD20_SPI_INT1_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA\r
+#define L3GD20_SPI_INT1_EXTI_PIN_SOURCE EXTI_PinSource1\r
+#define L3GD20_SPI_INT1_EXTI_IRQn EXTI1_IRQn \r
+\r
+#define L3GD20_SPI_INT2_PIN GPIO_Pin_2 /* PA.02 */\r
+#define L3GD20_SPI_INT2_GPIO_PORT GPIOA /* GPIOA */\r
+#define L3GD20_SPI_INT2_GPIO_CLK RCC_AHB1Periph_GPIOA\r
+#define L3GD20_SPI_INT2_EXTI_LINE EXTI_Line2\r
+#define L3GD20_SPI_INT2_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA\r
+#define L3GD20_SPI_INT2_EXTI_PIN_SOURCE EXTI_PinSource2\r
+#define L3GD20_SPI_INT2_EXTI_IRQn EXTI2_IRQn \r
+\r
+/******************************************************************************/\r
+/*************************** START REGISTER MAPPING **************************/\r
+/******************************************************************************/\r
+#define L3GD20_WHO_AM_I_ADDR 0x0F /* device identification register */\r
+#define L3GD20_CTRL_REG1_ADDR 0x20 /* Control register 1 */\r
+#define L3GD20_CTRL_REG2_ADDR 0x21 /* Control register 2 */\r
+#define L3GD20_CTRL_REG3_ADDR 0x22 /* Control register 3 */\r
+#define L3GD20_CTRL_REG4_ADDR 0x23 /* Control register 4 */\r
+#define L3GD20_CTRL_REG5_ADDR 0x24 /* Control register 5 */\r
+#define L3GD20_REFERENCE_REG_ADDR 0x25 /* Reference register */\r
+#define L3GD20_OUT_TEMP_ADDR 0x26 /* Out temp register */\r
+#define L3GD20_STATUS_REG_ADDR 0x27 /* Status register */\r
+#define L3GD20_OUT_X_L_ADDR 0x28 /* Output Register X */\r
+#define L3GD20_OUT_X_H_ADDR 0x29 /* Output Register X */\r
+#define L3GD20_OUT_Y_L_ADDR 0x2A /* Output Register Y */\r
+#define L3GD20_OUT_Y_H_ADDR 0x2B /* Output Register Y */\r
+#define L3GD20_OUT_Z_L_ADDR 0x2C /* Output Register Z */\r
+#define L3GD20_OUT_Z_H_ADDR 0x2D /* Output Register Z */ \r
+#define L3GD20_FIFO_CTRL_REG_ADDR 0x2E /* Fifo control Register */\r
+#define L3GD20_FIFO_SRC_REG_ADDR 0x2F /* Fifo src Register */\r
+\r
+#define L3GD20_INT1_CFG_ADDR 0x30 /* Interrupt 1 configuration Register */\r
+#define L3GD20_INT1_SRC_ADDR 0x31 /* Interrupt 1 source Register */\r
+#define L3GD20_INT1_TSH_XH_ADDR 0x32 /* Interrupt 1 Threshold X register */\r
+#define L3GD20_INT1_TSH_XL_ADDR 0x33 /* Interrupt 1 Threshold X register */\r
+#define L3GD20_INT1_TSH_YH_ADDR 0x34 /* Interrupt 1 Threshold Y register */\r
+#define L3GD20_INT1_TSH_YL_ADDR 0x35 /* Interrupt 1 Threshold Y register */\r
+#define L3GD20_INT1_TSH_ZH_ADDR 0x36 /* Interrupt 1 Threshold Z register */\r
+#define L3GD20_INT1_TSH_ZL_ADDR 0x37 /* Interrupt 1 Threshold Z register */\r
+#define L3GD20_INT1_DURATION_ADDR 0x38 /* Interrupt 1 DURATION register */\r
+\r
+/******************************************************************************/\r
+/**************************** END REGISTER MAPPING ***************************/\r
+/******************************************************************************/\r
+\r
+#define I_AM_L3GD20 ((uint8_t)0xD4)\r
+\r
+/** @defgroup Power_Mode_selection \r
+ * @{\r
+ */\r
+#define L3GD20_MODE_POWERDOWN ((uint8_t)0x00)\r
+#define L3GD20_MODE_ACTIVE ((uint8_t)0x08)\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup OutPut_DataRate_Selection \r
+ * @{\r
+ */\r
+#define L3GD20_OUTPUT_DATARATE_1 ((uint8_t)0x00)\r
+#define L3GD20_OUTPUT_DATARATE_2 ((uint8_t)0x40)\r
+#define L3GD20_OUTPUT_DATARATE_3 ((uint8_t)0x80)\r
+#define L3GD20_OUTPUT_DATARATE_4 ((uint8_t)0xC0)\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup Axes_Selection \r
+ * @{\r
+ */\r
+#define L3GD20_X_ENABLE ((uint8_t)0x02)\r
+#define L3GD20_Y_ENABLE ((uint8_t)0x01)\r
+#define L3GD20_Z_ENABLE ((uint8_t)0x04)\r
+#define L3GD20_AXES_ENABLE ((uint8_t)0x07)\r
+#define L3GD20_AXES_DISABLE ((uint8_t)0x00)\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup BandWidth_Selection \r
+ * @{\r
+ */\r
+#define L3GD20_BANDWIDTH_1 ((uint8_t)0x00)\r
+#define L3GD20_BANDWIDTH_2 ((uint8_t)0x10)\r
+#define L3GD20_BANDWIDTH_3 ((uint8_t)0x20)\r
+#define L3GD20_BANDWIDTH_4 ((uint8_t)0x30)\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup Full_Scale_Selection \r
+ * @{\r
+ */\r
+#define L3GD20_FULLSCALE_250 ((uint8_t)0x00)\r
+#define L3GD20_FULLSCALE_500 ((uint8_t)0x10)\r
+#define L3GD20_FULLSCALE_2000 ((uint8_t)0x20) \r
+/**\r
+ * @}\r
+ */\r
+ \r
+/** @defgroup Block_Data_Update \r
+ * @{\r
+ */ \r
+#define L3GD20_BlockDataUpdate_Continous ((uint8_t)0x00)\r
+#define L3GD20_BlockDataUpdate_Single ((uint8_t)0x80)\r
+/**\r
+ * @}\r
+ */\r
+ \r
+/** @defgroup Endian_Data_selection\r
+ * @{\r
+ */ \r
+#define L3GD20_BLE_LSB ((uint8_t)0x00)\r
+#define L3GD20_BLE_MSB ((uint8_t)0x40)\r
+/**\r
+ * @}\r
+ */\r
+ \r
+/** @defgroup High_Pass_Filter_status \r
+ * @{\r
+ */ \r
+#define L3GD20_HIGHPASSFILTER_DISABLE ((uint8_t)0x00)\r
+#define L3GD20_HIGHPASSFILTER_ENABLE ((uint8_t)0x10)\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup INT1_Interrupt_status \r
+ * @{\r
+ */ \r
+#define L3GD20_INT1INTERRUPT_DISABLE ((uint8_t)0x00)\r
+#define L3GD20_INT1INTERRUPT_ENABLE ((uint8_t)0x80)\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup INT2_Interrupt_status \r
+ * @{\r
+ */ \r
+#define L3GD20_INT2INTERRUPT_DISABLE ((uint8_t)0x00)\r
+#define L3GD20_INT2INTERRUPT_ENABLE ((uint8_t)0x08)\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup INT1_Interrupt_ActiveEdge \r
+ * @{\r
+ */ \r
+#define L3GD20_INT1INTERRUPT_LOW_EDGE ((uint8_t)0x20)\r
+#define L3GD20_INT1INTERRUPT_HIGH_EDGE ((uint8_t)0x00)\r
+/**\r
+ * @}\r
+ */\r
+ \r
+/** @defgroup Boot_Mode_selection \r
+ * @{\r
+ */\r
+#define L3GD20_BOOT_NORMALMODE ((uint8_t)0x00)\r
+#define L3GD20_BOOT_REBOOTMEMORY ((uint8_t)0x80)\r
+/**\r
+ * @}\r
+ */ \r
+ \r
+/** @defgroup High_Pass_Filter_Mode \r
+ * @{\r
+ */ \r
+#define L3GD20_HPM_NORMAL_MODE_RES ((uint8_t)0x00)\r
+#define L3GD20_HPM_REF_SIGNAL ((uint8_t)0x10)\r
+#define L3GD20_HPM_NORMAL_MODE ((uint8_t)0x20)\r
+#define L3GD20_HPM_AUTORESET_INT ((uint8_t)0x30)\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup High_Pass_CUT OFF_Frequency \r
+ * @{\r
+ */ \r
+#define L3GD20_HPFCF_0 0x00\r
+#define L3GD20_HPFCF_1 0x01\r
+#define L3GD20_HPFCF_2 0x02\r
+#define L3GD20_HPFCF_3 0x03\r
+#define L3GD20_HPFCF_4 0x04\r
+#define L3GD20_HPFCF_5 0x05\r
+#define L3GD20_HPFCF_6 0x06\r
+#define L3GD20_HPFCF_7 0x07\r
+#define L3GD20_HPFCF_8 0x08\r
+#define L3GD20_HPFCF_9 0x09\r
+/**\r
+ * @}\r
+ */\r
+\r
+\r
+/** @defgroup STM32F429I-DISCO_L3GD20_Exported_Macros\r
+ * @{\r
+ */\r
+#define L3GD20_CS_LOW() GPIO_ResetBits(L3GD20_SPI_CS_GPIO_PORT, L3GD20_SPI_CS_PIN)\r
+#define L3GD20_CS_HIGH() GPIO_SetBits(L3GD20_SPI_CS_GPIO_PORT, L3GD20_SPI_CS_PIN)\r
+/**\r
+ * @}\r
+ */\r
+ \r
+/** @defgroup STM32F429I-DISCO_L3GD20_Exported_Functions\r
+ * @{\r
+ */\r
+/* Sensor Configuration Functions */ \r
+void L3GD20_Init(L3GD20_InitTypeDef *L3GD20_InitStruct);\r
+void L3GD20_RebootCmd(void);\r
+\r
+/*INT1 Interrupt Configuration Functions */\r
+void L3GD20_INT1InterruptCmd(uint8_t InterruptState);\r
+void L3GD20_INT2InterruptCmd(uint8_t InterruptState);\r
+void L3GD20_INT1InterruptConfig(L3GD20_InterruptConfigTypeDef *L3GD20_IntConfigStruct);\r
+uint8_t L3GD20_GetDataStatus(void);\r
+\r
+/* High Pass Filter Configuration Functions */\r
+void L3GD20_FilterConfig(L3GD20_FilterConfigTypeDef *L3GD20_FilterStruct);\r
+void L3GD20_FilterCmd(uint8_t HighPassFilterState);\r
+void L3GD20_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite);\r
+void L3GD20_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead);\r
+\r
+/* USER Callbacks: This is function for which prototype only is declared in\r
+ MEMS accelerometre driver and that should be implemented into user applicaiton. */ \r
+/* L3GD20_TIMEOUT_UserCallback() function is called whenever a timeout condition \r
+ occure during communication (waiting transmit data register empty flag(TXE)\r
+ or waiting receive data register is not empty flag (RXNE)).\r
+ You can use the default timeout callback implementation by uncommenting the \r
+ define USE_DEFAULT_TIMEOUT_CALLBACK in stm32f429i_discovery_l3gd20.h file.\r
+ Typically the user implementation of this callback should reset MEMS peripheral\r
+ and re-initialize communication or in worst case reset all the application. */\r
+uint32_t L3GD20_TIMEOUT_UserCallback(void);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __STM32F429I_DISCOVERY_L3GD20_H */\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \r
--- /dev/null
+/**\r
+ ******************************************************************************\r
+ * @file stm32f429i_discovery_lcd.c\r
+ * @author MCD Application Team\r
+ * @version V1.0.1\r
+ * @date 28-October-2013\r
+ * @brief This file includes the LCD driver for ILI9341 Liquid Crystal\r
+ * Display Modules of STM32F429I-DISCO kit (MB1075).\r
+ ******************************************************************************\r
+ * @attention\r
+ *\r
+ * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+ *\r
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+ * You may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at:\r
+ *\r
+ * http://www.st.com/software_license_agreement_liberty_v2\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ ******************************************************************************\r
+ */\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f429i_discovery_lcd.h"\r
+#include "stm32f4xx_ltdc.h"\r
+#include "stm32f4xx_dma2d.h"\r
+//#include "fonts.c"\r
+\r
+\r
+/** @addtogroup Utilities\r
+ * @{\r
+ */\r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+ * @{\r
+ */\r
+\r
+/** @addtogroup STM32F429I_DISCOVERY\r
+ * @{\r
+ */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD\r
+ * @brief This file includes the LCD driver for (ILI9341)\r
+ * @{\r
+ */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_TypesDefinitions\r
+ * @{\r
+ */\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_Defines\r
+ * @{\r
+ */\r
+\r
+#define POLY_Y(Z) ((int32_t)((Points + Z)->X))\r
+#define POLY_X(Z) ((int32_t)((Points + Z)->Y))\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_Macros\r
+ * @{\r
+ */\r
+#define ABS(X) ((X) > 0 ? (X) : -(X))\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_Variables\r
+ * @{\r
+ */\r
+static sFONT *LCD_Currentfonts;\r
+/* Global variables to set the written text color */\r
+static uint16_t CurrentTextColor = 0x0000;\r
+static uint16_t CurrentBackColor = 0xFFFF;\r
+/* Default LCD configuration with LCD Layer 1 */\r
+static uint32_t CurrentFrameBuffer = LCD_FRAME_BUFFER;\r
+static uint32_t CurrentLayer = LCD_BACKGROUND_LAYER;\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_FunctionPrototypes\r
+ * @{\r
+ */\r
+#ifndef USE_Delay\r
+static void delay(__IO uint32_t nCount);\r
+#endif /* USE_Delay*/\r
+\r
+static void PutPixel(int16_t x, int16_t y);\r
+static void LCD_PolyLineRelativeClosed(pPoint Points, uint16_t PointCount, uint16_t Closed);\r
+static void LCD_AF_GPIOConfig(void);\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_Functions\r
+ * @{\r
+ */\r
+\r
+/**\r
+ * @brief DeInitializes the LCD.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void LCD_DeInit(void)\r
+{\r
+ GPIO_InitTypeDef GPIO_InitStructure;\r
+\r
+ /* LCD Display Off */\r
+ LCD_DisplayOff();\r
+\r
+ /* LCD_SPI disable */\r
+ SPI_Cmd(LCD_SPI, DISABLE);\r
+\r
+ /* LCD_SPI DeInit */\r
+ SPI_I2S_DeInit(LCD_SPI);\r
+\r
+ /* Disable SPI clock */\r
+ RCC_APB2PeriphClockCmd(LCD_SPI_CLK, DISABLE);\r
+\r
+ /* Configure NCS in Output Push-Pull mode */\r
+ GPIO_InitStructure.GPIO_Pin = LCD_NCS_PIN;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(LCD_NCS_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* Configure SPI pins: SCK, MISO and MOSI */\r
+ GPIO_InitStructure.GPIO_Pin = LCD_SPI_SCK_PIN;\r
+ GPIO_Init(LCD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ GPIO_InitStructure.GPIO_Pin = LCD_SPI_MISO_PIN;\r
+ GPIO_Init(LCD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ GPIO_InitStructure.GPIO_Pin = LCD_SPI_MOSI_PIN;\r
+ GPIO_Init(LCD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* GPIOA configuration */\r
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_MCO);\r
+\r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6 |\r
+ GPIO_Pin_11 | GPIO_Pin_12;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(GPIOA, &GPIO_InitStructure);\r
+\r
+ /* GPIOB configuration */\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_MCO);\r
+\r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 |\r
+ GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(GPIOB, &GPIO_InitStructure);\r
+\r
+ /* GPIOC configuration */\r
+ GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_MCO);\r
+\r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(GPIOC, &GPIO_InitStructure);\r
+\r
+ /* GPIOD configuration */\r
+ GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_MCO);\r
+\r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(GPIOD, &GPIO_InitStructure);\r
+\r
+ /* GPIOF configuration */\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource10, GPIO_AF_MCO);\r
+\r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(GPIOF, &GPIO_InitStructure);\r
+\r
+ /* GPIOG configuration */\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource6, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource7, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource10, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_MCO);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource12, GPIO_AF_MCO);\r
+\r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10 |\r
+ GPIO_Pin_11 | GPIO_Pin_12;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(GPIOG, &GPIO_InitStructure);\r
+}\r
+\r
+/**\r
+ * @brief Initializes the LCD.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void LCD_Init(void)\r
+{\r
+ LTDC_InitTypeDef LTDC_InitStruct;\r
+\r
+ /* Configure the LCD Control pins ------------------------------------------*/\r
+ LCD_CtrlLinesConfig();\r
+ LCD_ChipSelect(DISABLE);\r
+ LCD_ChipSelect(ENABLE);\r
+\r
+ /* Configure the LCD_SPI interface -----------------------------------------*/\r
+ LCD_SPIConfig();\r
+\r
+ /* Power on the LCD --------------------------------------------------------*/\r
+ LCD_PowerOn();\r
+\r
+ /* Enable the LTDC Clock */\r
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE);\r
+\r
+ /* Enable the DMA2D Clock */\r
+ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE);\r
+\r
+ /* Configure the LCD Control pins */\r
+ LCD_AF_GPIOConfig();\r
+\r
+ /* Configure the FMC Parallel interface : SDRAM is used as Frame Buffer for LCD */\r
+ SDRAM_Init();\r
+\r
+ /* LTDC Configuration *********************************************************/\r
+ /* Polarity configuration */\r
+ /* Initialize the horizontal synchronization polarity as active low */\r
+ LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;\r
+ /* Initialize the vertical synchronization polarity as active low */\r
+ LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;\r
+ /* Initialize the data enable polarity as active low */\r
+ LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;\r
+ /* Initialize the pixel clock polarity as input pixel clock */\r
+ LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;\r
+\r
+ /* Configure R,G,B component values for LCD background color */\r
+ LTDC_InitStruct.LTDC_BackgroundRedValue = 0;\r
+ LTDC_InitStruct.LTDC_BackgroundGreenValue = 0;\r
+ LTDC_InitStruct.LTDC_BackgroundBlueValue = 0;\r
+\r
+ /* Configure PLLSAI prescalers for LCD */\r
+ /* Enable Pixel Clock */\r
+ /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */\r
+ /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAI_N = 192 Mhz */\r
+ /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAI_R = 192/4 = 48 Mhz */\r
+ /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 48/8 = 6 Mhz */\r
+ RCC_PLLSAIConfig(192, 7, 4);\r
+ RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);\r
+\r
+ /* Enable PLLSAI Clock */\r
+ RCC_PLLSAICmd(ENABLE);\r
+ /* Wait for PLLSAI activation */\r
+ while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET)\r
+ {\r
+ }\r
+\r
+ /* Timing configuration */\r
+ /* Configure horizontal synchronization width */\r
+ LTDC_InitStruct.LTDC_HorizontalSync = 9;\r
+ /* Configure vertical synchronization height */\r
+ LTDC_InitStruct.LTDC_VerticalSync = 1;\r
+ /* Configure accumulated horizontal back porch */\r
+ LTDC_InitStruct.LTDC_AccumulatedHBP = 29;\r
+ /* Configure accumulated vertical back porch */\r
+ LTDC_InitStruct.LTDC_AccumulatedVBP = 3;\r
+ /* Configure accumulated active width */\r
+ LTDC_InitStruct.LTDC_AccumulatedActiveW = 269;\r
+ /* Configure accumulated active height */\r
+ LTDC_InitStruct.LTDC_AccumulatedActiveH = 323;\r
+ /* Configure total width */\r
+ LTDC_InitStruct.LTDC_TotalWidth = 279;\r
+ /* Configure total height */\r
+ LTDC_InitStruct.LTDC_TotalHeigh = 327;\r
+\r
+ LTDC_Init(<DC_InitStruct);\r
+}\r
+\r
+/**\r
+ * @brief Initializes the LCD Layers.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void LCD_LayerInit(void)\r
+{\r
+ LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct;\r
+\r
+ /* Windowing configuration */\r
+ /* In this case all the active display area is used to display a picture then :\r
+ Horizontal start = horizontal synchronization + Horizontal back porch = 30\r
+ Horizontal stop = Horizontal start + window width -1 = 30 + 240 -1\r
+ Vertical start = vertical synchronization + vertical back porch = 4\r
+ Vertical stop = Vertical start + window height -1 = 4 + 320 -1 */\r
+ LTDC_Layer_InitStruct.LTDC_HorizontalStart = 30;\r
+ LTDC_Layer_InitStruct.LTDC_HorizontalStop = (LCD_PIXEL_WIDTH + 30 - 1);\r
+ LTDC_Layer_InitStruct.LTDC_VerticalStart = 4;\r
+ LTDC_Layer_InitStruct.LTDC_VerticalStop = (LCD_PIXEL_HEIGHT + 4 - 1);\r
+\r
+ /* Pixel Format configuration*/\r
+ LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565;\r
+ /* Alpha constant (255 totally opaque) */\r
+ LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255;\r
+ /* Default Color configuration (configure A,R,G,B component values) */\r
+ LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0;\r
+ LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0;\r
+ LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0;\r
+ LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0;\r
+ /* Configure blending factors */\r
+ LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA;\r
+ LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_CA;\r
+\r
+ /* the length of one line of pixels in bytes + 3 then :\r
+ Line Lenth = Active high width x number of bytes per pixel + 3\r
+ Active high width = LCD_PIXEL_WIDTH\r
+ number of bytes per pixel = 2 (pixel_format : RGB565)\r
+ */\r
+ LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((LCD_PIXEL_WIDTH * 2) + 3);\r
+ /* the pitch is the increment from the start of one line of pixels to the\r
+ start of the next line in bytes, then :\r
+ Pitch = Active high width x number of bytes per pixel */\r
+ LTDC_Layer_InitStruct.LTDC_CFBPitch = (LCD_PIXEL_WIDTH * 2);\r
+\r
+ /* Configure the number of lines */\r
+ LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCD_PIXEL_HEIGHT;\r
+\r
+ /* Start Address configuration : the LCD Frame buffer is defined on SDRAM */\r
+ LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER;\r
+\r
+ /* Initialize LTDC layer 1 */\r
+ LTDC_LayerInit(LTDC_Layer1, <DC_Layer_InitStruct);\r
+\r
+ /* Configure Layer2 */\r
+ /* Start Address configuration : the LCD Frame buffer is defined on SDRAM w/ Offset */\r
+ LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER + BUFFER_OFFSET;\r
+\r
+ /* Configure blending factors */\r
+ LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA;\r
+ LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA;\r
+\r
+ /* Initialize LTDC layer 2 */\r
+ LTDC_LayerInit(LTDC_Layer2, <DC_Layer_InitStruct);\r
+\r
+ /* LTDC configuration reload */\r
+ LTDC_ReloadConfig(LTDC_IMReload);\r
+\r
+ /* Enable foreground & background Layers */\r
+ LTDC_LayerCmd(LTDC_Layer1, ENABLE);\r
+ LTDC_LayerCmd(LTDC_Layer2, ENABLE);\r
+\r
+ /* LTDC configuration reload */\r
+ LTDC_ReloadConfig(LTDC_IMReload);\r
+\r
+ /* Set default font */\r
+ LCD_SetFont(&LCD_DEFAULT_FONT);\r
+\r
+ /* dithering activation */\r
+ LTDC_DitherCmd(ENABLE);\r
+}\r
+\r
+/**\r
+ * @brief Controls LCD Chip Select (CS) pin\r
+ * @param NewState CS pin state\r
+ * @retval None\r
+ */\r
+void LCD_ChipSelect(FunctionalState NewState)\r
+{\r
+ if (NewState == DISABLE)\r
+ {\r
+ GPIO_ResetBits(LCD_NCS_GPIO_PORT, LCD_NCS_PIN); /* CS pin low: LCD disabled */\r
+ }\r
+ else\r
+ {\r
+ GPIO_SetBits(LCD_NCS_GPIO_PORT, LCD_NCS_PIN); /* CS pin high: LCD enabled */\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Sets the LCD Layer.\r
+ * @param Layerx: specifies the Layer foreground or background.\r
+ * @retval None\r
+ */\r
+void LCD_SetLayer(uint32_t Layerx)\r
+{\r
+ if (Layerx == LCD_BACKGROUND_LAYER)\r
+ {\r
+ CurrentFrameBuffer = LCD_FRAME_BUFFER;\r
+ CurrentLayer = LCD_BACKGROUND_LAYER;\r
+ }\r
+ else\r
+ {\r
+ CurrentFrameBuffer = LCD_FRAME_BUFFER + BUFFER_OFFSET;\r
+ CurrentLayer = LCD_FOREGROUND_LAYER;\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Sets the LCD Text and Background colors.\r
+ * @param TextColor: specifies the Text Color.\r
+ * @param BackColor: specifies the Background Color.\r
+ * @retval None\r
+ */\r
+void LCD_SetColors(uint16_t TextColor, uint16_t BackColor)\r
+{\r
+ CurrentTextColor = TextColor;\r
+ CurrentBackColor = BackColor;\r
+}\r
+\r
+/**\r
+ * @brief Gets the LCD Text and Background colors.\r
+ * @param TextColor: pointer to the variable that will contain the Text\r
+ Color.\r
+ * @param BackColor: pointer to the variable that will contain the Background\r
+ Color.\r
+ * @retval None\r
+ */\r
+void LCD_GetColors(uint16_t *TextColor, uint16_t *BackColor)\r
+{\r
+ *TextColor = CurrentTextColor;\r
+ *BackColor = CurrentBackColor;\r
+}\r
+\r
+/**\r
+ * @brief Sets the Text color.\r
+ * @param Color: specifies the Text color code RGB(5-6-5).\r
+ * @retval None\r
+ */\r
+void LCD_SetTextColor(uint16_t Color)\r
+{\r
+ CurrentTextColor = Color;\r
+}\r
+\r
+/**\r
+ * @brief Sets the Background color.\r
+ * @param Color: specifies the Background color code RGB(5-6-5).\r
+ * @retval None\r
+ */\r
+void LCD_SetBackColor(uint16_t Color)\r
+{\r
+ CurrentBackColor = Color;\r
+}\r
+\r
+/**\r
+ * @brief Sets the Text Font.\r
+ * @param fonts: specifies the font to be used.\r
+ * @retval None\r
+ */\r
+void LCD_SetFont(sFONT *fonts)\r
+{\r
+ LCD_Currentfonts = fonts;\r
+}\r
+\r
+/**\r
+ * @brief Configure the transparency.\r
+ * @param transparency: specifies the transparency,\r
+ * This parameter must range from 0x00 to 0xFF.\r
+ * @retval None\r
+ */\r
+void LCD_SetTransparency(uint8_t transparency)\r
+{\r
+ if (CurrentLayer == LCD_BACKGROUND_LAYER)\r
+ {\r
+ LTDC_LayerAlpha(LTDC_Layer1, transparency);\r
+ }\r
+ else\r
+ {\r
+ LTDC_LayerAlpha(LTDC_Layer2, transparency);\r
+ }\r
+ LTDC_ReloadConfig(LTDC_IMReload);\r
+}\r
+\r
+/**\r
+ * @brief Gets the Text Font.\r
+ * @param None.\r
+ * @retval the used font.\r
+ */\r
+sFONT *LCD_GetFont(void)\r
+{\r
+ return LCD_Currentfonts;\r
+}\r
+\r
+/**\r
+ * @brief Clears the selected line.\r
+ * @param Line: the Line to be cleared.\r
+ * This parameter can be one of the following values:\r
+ * @arg LCD_LINE_x: where x can be: 0..13 if LCD_Currentfonts is Font16x24\r
+ * 0..26 if LCD_Currentfonts is Font12x12 or Font8x12\r
+ * 0..39 if LCD_Currentfonts is Font8x8\r
+ * @retval None\r
+ */\r
+void LCD_ClearLine(uint16_t Line)\r
+{\r
+ uint16_t refcolumn = 0;\r
+ /* Send the string character by character on lCD */\r
+ while ((refcolumn < LCD_PIXEL_WIDTH) && (((refcolumn + LCD_Currentfonts->Width)& 0xFFFF) >= LCD_Currentfonts->Width))\r
+ {\r
+ /* Display one character on LCD */\r
+ LCD_DisplayChar(Line, refcolumn, ' ');\r
+ /* Decrement the column position by 16 */\r
+ refcolumn += LCD_Currentfonts->Width;\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Clears the hole LCD.\r
+ * @param Color: the color of the background.\r
+ * @retval None\r
+ */\r
+void LCD_Clear(uint16_t Color)\r
+{\r
+ uint32_t index = 0;\r
+\r
+ /* erase memory */\r
+ for (index = 0x00; index < BUFFER_OFFSET; index++)\r
+ {\r
+ *(__IO uint16_t*)(CurrentFrameBuffer + (2*index)) = Color;\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Sets the cursor position.\r
+ * @param Xpos: specifies the X position.\r
+ * @param Ypos: specifies the Y position.\r
+ * @retval Display Address\r
+ */\r
+uint32_t LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)\r
+{\r
+ return CurrentFrameBuffer + 2*(Xpos + (LCD_PIXEL_WIDTH*Ypos));\r
+}\r
+\r
+/**\r
+ * @brief Config and Sets the color Keying.\r
+ * @param RGBValue: Specifies the Color reference.\r
+ * @retval None\r
+ */\r
+void LCD_SetColorKeying(uint32_t RGBValue)\r
+{\r
+ LTDC_ColorKeying_InitTypeDef LTDC_colorkeying_InitStruct;\r
+\r
+ /* configure the color Keying */\r
+ LTDC_colorkeying_InitStruct.LTDC_ColorKeyBlue = 0x0000FF & RGBValue;\r
+ LTDC_colorkeying_InitStruct.LTDC_ColorKeyGreen = (0x00FF00 & RGBValue) >> 8;\r
+ LTDC_colorkeying_InitStruct.LTDC_ColorKeyRed = (0xFF0000 & RGBValue) >> 16;\r
+\r
+ if (CurrentLayer == LCD_BACKGROUND_LAYER)\r
+ {\r
+ /* Enable the color Keying for Layer1 */\r
+ LTDC_ColorKeyingConfig(LTDC_Layer1, <DC_colorkeying_InitStruct, ENABLE);\r
+ LTDC_ReloadConfig(LTDC_IMReload);\r
+ }\r
+ else\r
+ {\r
+ /* Enable the color Keying for Layer2 */\r
+ LTDC_ColorKeyingConfig(LTDC_Layer2, <DC_colorkeying_InitStruct, ENABLE);\r
+ LTDC_ReloadConfig(LTDC_IMReload);\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Disable the color Keying.\r
+ * @param RGBValue: Specifies the Color reference.\r
+ * @retval None\r
+ */\r
+void LCD_ReSetColorKeying(void)\r
+{\r
+ LTDC_ColorKeying_InitTypeDef LTDC_colorkeying_InitStruct;\r
+\r
+ if (CurrentLayer == LCD_BACKGROUND_LAYER)\r
+ {\r
+ /* Disable the color Keying for Layer1 */\r
+ LTDC_ColorKeyingConfig(LTDC_Layer1, <DC_colorkeying_InitStruct, DISABLE);\r
+ LTDC_ReloadConfig(LTDC_IMReload);\r
+ }\r
+ else\r
+ {\r
+ /* Disable the color Keying for Layer2 */\r
+ LTDC_ColorKeyingConfig(LTDC_Layer2, <DC_colorkeying_InitStruct, DISABLE);\r
+ LTDC_ReloadConfig(LTDC_IMReload);\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Draws a character on LCD.\r
+ * @param Xpos: the Line where to display the character shape.\r
+ * @param Ypos: start column address.\r
+ * @param c: pointer to the character data.\r
+ * @retval None\r
+ */\r
+void LCD_DrawChar(uint16_t Xpos, uint16_t Ypos, const uint16_t *c)\r
+{\r
+ uint32_t index = 0, counter = 0, xpos =0;\r
+ uint32_t Xaddress = 0;\r
+\r
+ xpos = Xpos*LCD_PIXEL_WIDTH*2;\r
+ Xaddress += Ypos;\r
+\r
+ for(index = 0; index < LCD_Currentfonts->Height; index++)\r
+ {\r
+\r
+ for(counter = 0; counter < LCD_Currentfonts->Width; counter++)\r
+ {\r
+\r
+ if((((c[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> counter)) == 0x00) &&(LCD_Currentfonts->Width <= 12))||\r
+ (((c[index] & (0x1 << counter)) == 0x00)&&(LCD_Currentfonts->Width > 12 )))\r
+ {\r
+ /* Write data value to all SDRAM memory */\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*Xaddress) + xpos) = CurrentBackColor;\r
+ }\r
+ else\r
+ {\r
+ /* Write data value to all SDRAM memory */\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*Xaddress) + xpos) = CurrentTextColor;\r
+ }\r
+ Xaddress++;\r
+ }\r
+ Xaddress += (LCD_PIXEL_WIDTH - LCD_Currentfonts->Width);\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Displays one character (16dots width, 24dots height).\r
+ * @param Line: the Line where to display the character shape .\r
+ * This parameter can be one of the following values:\r
+ * @arg Linex: where x can be 0..29\r
+ * @param Column: start column address.\r
+ * @param Ascii: character ascii code, must be between 0x20 and 0x7E.\r
+ * @retval None\r
+ */\r
+void LCD_DisplayChar(uint16_t Line, uint16_t Column, uint8_t Ascii)\r
+{\r
+ Ascii -= 32;\r
+\r
+ LCD_DrawChar(Line, Column, &LCD_Currentfonts->table[Ascii * LCD_Currentfonts->Height]);\r
+}\r
+\r
+/**\r
+ * @brief Displays a maximum of 20 char on the LCD.\r
+ * @param Line: the Line where to display the character shape .\r
+ * This parameter can be one of the following values:\r
+ * @arg Linex: where x can be 0..9\r
+ * @param *ptr: pointer to string to display on LCD.\r
+ * @retval None\r
+ */\r
+void LCD_DisplayStringLine(uint16_t Line, uint8_t *ptr)\r
+{\r
+ uint16_t refcolumn = 0;\r
+ /* Send the string character by character on lCD */\r
+ while ((refcolumn < LCD_PIXEL_WIDTH) && ((*ptr != 0) & (((refcolumn + LCD_Currentfonts->Width) & 0xFFFF) >= LCD_Currentfonts->Width)))\r
+ {\r
+ /* Display one character on LCD */\r
+ LCD_DisplayChar(Line, refcolumn, *ptr);\r
+ /* Decrement the column position by width */\r
+ refcolumn += LCD_Currentfonts->Width;\r
+ /* Point on the next character */\r
+ ptr++;\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Sets a display window\r
+ * @param Xpos: specifies the X bottom left position from 0 to 240.\r
+ * @param Ypos: specifies the Y bottom left position from 0 to 320.\r
+ * @param Height: display window height, can be a value from 0 to 320.\r
+ * @param Width: display window width, can be a value from 0 to 240.\r
+ * @retval None\r
+ */\r
+void LCD_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Height, uint16_t Width)\r
+{\r
+\r
+ if (CurrentLayer == LCD_BACKGROUND_LAYER)\r
+ {\r
+ /* reconfigure the layer1 position */\r
+ LTDC_LayerPosition(LTDC_Layer1, Xpos, Ypos);\r
+ LTDC_ReloadConfig(LTDC_IMReload);\r
+\r
+ /* reconfigure the layer1 size */\r
+ LTDC_LayerSize(LTDC_Layer1, Width, Height);\r
+ LTDC_ReloadConfig(LTDC_IMReload);\r
+ }\r
+ else\r
+ {\r
+ /* reconfigure the layer2 position */\r
+ LTDC_LayerPosition(LTDC_Layer2, Xpos, Ypos);\r
+ LTDC_ReloadConfig(LTDC_IMReload);\r
+\r
+ /* reconfigure the layer2 size */\r
+ LTDC_LayerSize(LTDC_Layer2, Width, Height);\r
+ LTDC_ReloadConfig(LTDC_IMReload);\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Disables LCD Window mode.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void LCD_WindowModeDisable(void)\r
+{\r
+ LCD_SetDisplayWindow(0, 0, LCD_PIXEL_HEIGHT, LCD_PIXEL_WIDTH);\r
+}\r
+\r
+/**\r
+ * @brief Displays a line.\r
+ * @param Xpos: specifies the X position, can be a value from 0 to 240.\r
+ * @param Ypos: specifies the Y position, can be a value from 0 to 320.\r
+ * @param Length: line length.\r
+ * @param Direction: line direction.\r
+ * This parameter can be one of the following values: LCD_DIR_HORIZONTAL or LCD_DIR_VERTICAL.\r
+ * @retval None\r
+ */\r
+void LCD_DrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction)\r
+{\r
+ DMA2D_InitTypeDef DMA2D_InitStruct;\r
+\r
+ uint32_t Xaddress = 0;\r
+ uint16_t Red_Value = 0, Green_Value = 0, Blue_Value = 0;\r
+\r
+ Xaddress = CurrentFrameBuffer + 2*(LCD_PIXEL_WIDTH*Ypos + Xpos);\r
+\r
+ Red_Value = (0xF800 & CurrentTextColor) >> 11;\r
+ Blue_Value = 0x001F & CurrentTextColor;\r
+ Green_Value = (0x07E0 & CurrentTextColor) >> 5;\r
+\r
+ /* Configure DMA2D */\r
+ DMA2D_DeInit();\r
+ DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;\r
+ DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;\r
+ DMA2D_InitStruct.DMA2D_OutputGreen = Green_Value;\r
+ DMA2D_InitStruct.DMA2D_OutputBlue = Blue_Value;\r
+ DMA2D_InitStruct.DMA2D_OutputRed = Red_Value;\r
+ DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;\r
+ DMA2D_InitStruct.DMA2D_OutputMemoryAdd = Xaddress;\r
+\r
+ if(Direction == LCD_DIR_HORIZONTAL)\r
+ {\r
+ DMA2D_InitStruct.DMA2D_OutputOffset = 0;\r
+ DMA2D_InitStruct.DMA2D_NumberOfLine = 1;\r
+ DMA2D_InitStruct.DMA2D_PixelPerLine = Length;\r
+ }\r
+ else\r
+ {\r
+ DMA2D_InitStruct.DMA2D_OutputOffset = LCD_PIXEL_WIDTH - 1;\r
+ DMA2D_InitStruct.DMA2D_NumberOfLine = Length;\r
+ DMA2D_InitStruct.DMA2D_PixelPerLine = 1;\r
+ }\r
+\r
+ DMA2D_Init(&DMA2D_InitStruct);\r
+ /* Start Transfer */\r
+ DMA2D_StartTransfer();\r
+ /* Wait for CTC Flag activation */\r
+ while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET)\r
+ {\r
+ }\r
+\r
+}\r
+\r
+/**\r
+ * @brief Displays a rectangle.\r
+ * @param Xpos: specifies the X position, can be a value from 0 to 240.\r
+ * @param Ypos: specifies the Y position, can be a value from 0 to 320.\r
+ * @param Height: display rectangle height, can be a value from 0 to 320.\r
+ * @param Width: display rectangle width, can be a value from 0 to 240.\r
+ * @retval None\r
+ */\r
+void LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Height, uint16_t Width)\r
+{\r
+ /* draw horizontal lines */\r
+ LCD_DrawLine(Xpos, Ypos, Width, LCD_DIR_HORIZONTAL);\r
+ LCD_DrawLine(Xpos, (Ypos+ Height), Width, LCD_DIR_HORIZONTAL);\r
+\r
+ /* draw vertical lines */\r
+ LCD_DrawLine(Xpos, Ypos, Height, LCD_DIR_VERTICAL);\r
+ LCD_DrawLine((Xpos + Width), Ypos, Height, LCD_DIR_VERTICAL);\r
+}\r
+\r
+/**\r
+ * @brief Draw a circle.\r
+ * @param Xpos: specifies the X position, can be a value from 0 to 240.\r
+ * @param Ypos: specifies the Y position, can be a value from 0 to 320.\r
+ * @param Radius: radius of the circle.\r
+ * @retval None\r
+ */\r
+void LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)\r
+{\r
+ int x = -Radius, y = 0, err = 2-2*Radius, e2;\r
+ do {\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-x) + LCD_PIXEL_WIDTH*(Ypos+y)))) = CurrentTextColor;\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+x) + LCD_PIXEL_WIDTH*(Ypos+y)))) = CurrentTextColor;\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+x) + LCD_PIXEL_WIDTH*(Ypos-y)))) = CurrentTextColor;\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-x) + LCD_PIXEL_WIDTH*(Ypos-y)))) = CurrentTextColor;\r
+\r
+ e2 = err;\r
+ if (e2 <= y) {\r
+ err += ++y*2+1;\r
+ if (-x == y && e2 <= x) e2 = 0;\r
+ }\r
+ if (e2 > x) err += ++x*2+1;\r
+ }\r
+ while (x <= 0);\r
+}\r
+\r
+/**\r
+ * @brief Draw a full ellipse.\r
+ * @param Xpos: specifies the X position, can be a value from 0 to 240.\r
+ * @param Ypos: specifies the Y position, can be a value from 0 to 320.\r
+ * @param Radius: minor radius of ellipse.\r
+ * @param Radius2: major radius of ellipse.\r
+ * @retval None\r
+ */\r
+void LCD_DrawFullEllipse(int Xpos, int Ypos, int Radius, int Radius2)\r
+{\r
+ int x = -Radius, y = 0, err = 2-2*Radius, e2;\r
+ float K = 0, rad1 = 0, rad2 = 0;\r
+\r
+ rad1 = Radius;\r
+ rad2 = Radius2;\r
+\r
+ if (Radius > Radius2)\r
+ {\r
+ do\r
+ {\r
+ K = (float)(rad1/rad2);\r
+ LCD_DrawLine((Xpos+x), (Ypos-(uint16_t)(y/K)), (2*(uint16_t)(y/K) + 1), LCD_DIR_VERTICAL);\r
+ LCD_DrawLine((Xpos-x), (Ypos-(uint16_t)(y/K)), (2*(uint16_t)(y/K) + 1), LCD_DIR_VERTICAL);\r
+\r
+ e2 = err;\r
+ if (e2 <= y)\r
+ {\r
+ err += ++y*2+1;\r
+ if (-x == y && e2 <= x) e2 = 0;\r
+ }\r
+ if (e2 > x) err += ++x*2+1;\r
+\r
+ }\r
+ while (x <= 0);\r
+ }\r
+ else\r
+ {\r
+ y = -Radius2;\r
+ x = 0;\r
+ do\r
+ {\r
+ K = (float)(rad2/rad1);\r
+ LCD_DrawLine((Xpos-(uint16_t)(x/K)), (Ypos+y), (2*(uint16_t)(x/K) + 1), LCD_DIR_HORIZONTAL);\r
+ LCD_DrawLine((Xpos-(uint16_t)(x/K)), (Ypos-y), (2*(uint16_t)(x/K) + 1), LCD_DIR_HORIZONTAL);\r
+\r
+ e2 = err;\r
+ if (e2 <= x)\r
+ {\r
+ err += ++x*2+1;\r
+ if (-y == x && e2 <= y) e2 = 0;\r
+ }\r
+ if (e2 > y) err += ++y*2+1;\r
+ }\r
+ while (y <= 0);\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Displays an Ellipse.\r
+ * @param Xpos: specifies the X position, can be a value from 0 to 240.\r
+ * @param Ypos: specifies the Y position, can be a value from 0 to 320.\r
+ * @param Radius: specifies Radius.\r
+ * @param Radius2: specifies Radius2.\r
+ * @retval None\r
+ */\r
+void LCD_DrawEllipse(int Xpos, int Ypos, int Radius, int Radius2)\r
+{\r
+ int x = -Radius, y = 0, err = 2-2*Radius, e2;\r
+ float K = 0, rad1 = 0, rad2 = 0;\r
+\r
+ rad1 = Radius;\r
+ rad2 = Radius2;\r
+\r
+ if (Radius > Radius2)\r
+ {\r
+ do {\r
+ K = (float)(rad1/rad2);\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-x) + LCD_PIXEL_WIDTH*(Ypos+(uint16_t)(y/K))))) = CurrentTextColor;\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+x) + LCD_PIXEL_WIDTH*(Ypos+(uint16_t)(y/K))))) = CurrentTextColor;\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+x) + LCD_PIXEL_WIDTH*(Ypos-(uint16_t)(y/K))))) = CurrentTextColor;\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-x) + LCD_PIXEL_WIDTH*(Ypos-(uint16_t)(y/K))))) = CurrentTextColor;\r
+\r
+ e2 = err;\r
+ if (e2 <= y) {\r
+ err += ++y*2+1;\r
+ if (-x == y && e2 <= x) e2 = 0;\r
+ }\r
+ if (e2 > x) err += ++x*2+1;\r
+ }\r
+ while (x <= 0);\r
+ }\r
+ else\r
+ {\r
+ y = -Radius2;\r
+ x = 0;\r
+ do {\r
+ K = (float)(rad2/rad1);\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-(uint16_t)(x/K)) + LCD_PIXEL_WIDTH*(Ypos+y)))) = CurrentTextColor;\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+(uint16_t)(x/K)) + LCD_PIXEL_WIDTH*(Ypos+y)))) = CurrentTextColor;\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+(uint16_t)(x/K)) + LCD_PIXEL_WIDTH*(Ypos-y)))) = CurrentTextColor;\r
+ *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-(uint16_t)(x/K)) + LCD_PIXEL_WIDTH*(Ypos-y)))) = CurrentTextColor;\r
+\r
+ e2 = err;\r
+ if (e2 <= x) {\r
+ err += ++x*2+1;\r
+ if (-y == x && e2 <= y) e2 = 0;\r
+ }\r
+ if (e2 > y) err += ++y*2+1;\r
+ }\r
+ while (y <= 0);\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Displays a mono-color picture.\r
+ * @param Pict: pointer to the picture array.\r
+ * @retval None\r
+ */\r
+void LCD_DrawMonoPict(const uint32_t *Pict)\r
+{\r
+ uint32_t index = 0, counter = 0;\r
+\r
+\r
+ for(index = 0; index < 2400; index++)\r
+ {\r
+ for(counter = 0; counter < 32; counter++)\r
+ {\r
+ if((Pict[index] & (1 << counter)) == 0x00)\r
+ {\r
+ *(__IO uint16_t*)(CurrentFrameBuffer) = CurrentBackColor;\r
+ }\r
+ else\r
+ {\r
+ *(__IO uint16_t*)(CurrentFrameBuffer) = CurrentTextColor;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Displays a bitmap picture loaded in the internal Flash.\r
+ * @param BmpAddress: Bmp picture address in the internal Flash.\r
+ * @retval None\r
+ */\r
+void LCD_WriteBMP(uint32_t BmpAddress)\r
+{\r
+ uint32_t index = 0, size = 0, width = 0, height = 0, bit_pixel = 0;\r
+ uint32_t Address;\r
+ uint32_t currentline = 0, linenumber = 0;\r
+\r
+ Address = CurrentFrameBuffer;\r
+\r
+ /* Read bitmap size */\r
+ size = *(__IO uint16_t *) (BmpAddress + 2);\r
+ size |= (*(__IO uint16_t *) (BmpAddress + 4)) << 16;\r
+\r
+ /* Get bitmap data address offset */\r
+ index = *(__IO uint16_t *) (BmpAddress + 10);\r
+ index |= (*(__IO uint16_t *) (BmpAddress + 12)) << 16;\r
+\r
+ /* Read bitmap width */\r
+ width = *(uint16_t *) (BmpAddress + 18);\r
+ width |= (*(uint16_t *) (BmpAddress + 20)) << 16;\r
+\r
+ /* Read bitmap height */\r
+ height = *(uint16_t *) (BmpAddress + 22);\r
+ height |= (*(uint16_t *) (BmpAddress + 24)) << 16;\r
+\r
+ /* Read bit/pixel */\r
+ bit_pixel = *(uint16_t *) (BmpAddress + 28);\r
+\r
+ if (CurrentLayer == LCD_BACKGROUND_LAYER)\r
+ {\r
+ /* reconfigure layer size in accordance with the picture */\r
+ LTDC_LayerSize(LTDC_Layer1, width, height);\r
+ LTDC_ReloadConfig(LTDC_VBReload);\r
+\r
+ /* Reconfigure the Layer pixel format in accordance with the picture */\r
+ if ((bit_pixel/8) == 4)\r
+ {\r
+ LTDC_LayerPixelFormat(LTDC_Layer1, LTDC_Pixelformat_ARGB8888);\r
+ LTDC_ReloadConfig(LTDC_VBReload);\r
+ }\r
+ else if ((bit_pixel/8) == 2)\r
+ {\r
+ LTDC_LayerPixelFormat(LTDC_Layer1, LTDC_Pixelformat_RGB565);\r
+ LTDC_ReloadConfig(LTDC_VBReload);\r
+ }\r
+ else\r
+ {\r
+ LTDC_LayerPixelFormat(LTDC_Layer1, LTDC_Pixelformat_RGB888);\r
+ LTDC_ReloadConfig(LTDC_VBReload);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /* reconfigure layer size in accordance with the picture */\r
+ LTDC_LayerSize(LTDC_Layer2, width, height);\r
+ LTDC_ReloadConfig(LTDC_VBReload);\r
+\r
+ /* Reconfigure the Layer pixel format in accordance with the picture */\r
+ if ((bit_pixel/8) == 4)\r
+ {\r
+ LTDC_LayerPixelFormat(LTDC_Layer2, LTDC_Pixelformat_ARGB8888);\r
+ LTDC_ReloadConfig(LTDC_VBReload);\r
+ }\r
+ else if ((bit_pixel/8) == 2)\r
+ {\r
+ LTDC_LayerPixelFormat(LTDC_Layer2, LTDC_Pixelformat_RGB565);\r
+ LTDC_ReloadConfig(LTDC_VBReload);\r
+ }\r
+ else\r
+ {\r
+ LTDC_LayerPixelFormat(LTDC_Layer2, LTDC_Pixelformat_RGB888);\r
+ LTDC_ReloadConfig(LTDC_VBReload);\r
+ }\r
+ }\r
+\r
+ /* compute the real size of the picture (without the header)) */\r
+ size = (size - index);\r
+\r
+ /* bypass the bitmap header */\r
+ BmpAddress += index;\r
+\r
+ /* start copie image from the bottom */\r
+ Address += width*(height-1)*(bit_pixel/8);\r
+\r
+ for(index = 0; index < size; index++)\r
+ {\r
+ *(__IO uint8_t*) (Address) = *(__IO uint8_t *)BmpAddress;\r
+\r
+ /*jump on next byte */\r
+ BmpAddress++;\r
+ Address++;\r
+ currentline++;\r
+\r
+ if((currentline/(bit_pixel/8)) == width)\r
+ {\r
+ if(linenumber < height)\r
+ {\r
+ linenumber++;\r
+ Address -=(2*width*(bit_pixel/8));\r
+ currentline = 0;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Displays a full rectangle.\r
+ * @param Xpos: specifies the X position, can be a value from 0 to 240.\r
+ * @param Ypos: specifies the Y position, can be a value from 0 to 320.\r
+ * @param Height: rectangle height.\r
+ * @param Width: rectangle width.\r
+ * @retval None\r
+ */\r
+void LCD_DrawFullRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)\r
+{\r
+ DMA2D_InitTypeDef DMA2D_InitStruct;\r
+\r
+ uint32_t Xaddress = 0;\r
+ uint16_t Red_Value = 0, Green_Value = 0, Blue_Value = 0;\r
+\r
+ Red_Value = (0xF800 & CurrentTextColor) >> 11;\r
+ Blue_Value = 0x001F & CurrentTextColor;\r
+ Green_Value = (0x07E0 & CurrentTextColor) >> 5;\r
+\r
+ Xaddress = CurrentFrameBuffer + 2*(LCD_PIXEL_WIDTH*Ypos + Xpos);\r
+\r
+ /* configure DMA2D */\r
+ DMA2D_DeInit();\r
+ DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;\r
+ DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;\r
+ DMA2D_InitStruct.DMA2D_OutputGreen = Green_Value;\r
+ DMA2D_InitStruct.DMA2D_OutputBlue = Blue_Value;\r
+ DMA2D_InitStruct.DMA2D_OutputRed = Red_Value;\r
+ DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;\r
+ DMA2D_InitStruct.DMA2D_OutputMemoryAdd = Xaddress;\r
+ DMA2D_InitStruct.DMA2D_OutputOffset = (LCD_PIXEL_WIDTH - Width);\r
+ DMA2D_InitStruct.DMA2D_NumberOfLine = Height;\r
+ DMA2D_InitStruct.DMA2D_PixelPerLine = Width;\r
+ DMA2D_Init(&DMA2D_InitStruct);\r
+\r
+ /* Start Transfer */\r
+ DMA2D_StartTransfer();\r
+\r
+ /* Wait for CTC Flag activation */\r
+ while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET)\r
+ {\r
+ }\r
+\r
+ LCD_SetTextColor(CurrentTextColor);\r
+}\r
+\r
+/**\r
+ * @brief Displays a full circle.\r
+ * @param Xpos: specifies the X position, can be a value from 0 to 240.\r
+ * @param Ypos: specifies the Y position, can be a value from 0 to 320.\r
+ * @param Radius\r
+ * @retval None\r
+ */\r
+void LCD_DrawFullCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)\r
+{\r
+ int32_t D; /* Decision Variable */\r
+ uint32_t CurX;/* Current X Value */\r
+ uint32_t CurY;/* Current Y Value */\r
+\r
+ D = 3 - (Radius << 1);\r
+\r
+ CurX = 0;\r
+ CurY = Radius;\r
+\r
+ while (CurX <= CurY)\r
+ {\r
+ if(CurY > 0)\r
+ {\r
+ LCD_DrawLine(Xpos - CurX, Ypos - CurY, 2*CurY, LCD_DIR_VERTICAL);\r
+ LCD_DrawLine(Xpos + CurX, Ypos - CurY, 2*CurY, LCD_DIR_VERTICAL);\r
+ }\r
+\r
+ if(CurX > 0)\r
+ {\r
+ LCD_DrawLine(Xpos - CurY, Ypos - CurX, 2*CurX, LCD_DIR_VERTICAL);\r
+ LCD_DrawLine(Xpos + CurY, Ypos - CurX, 2*CurX, LCD_DIR_VERTICAL);\r
+ }\r
+ if (D < 0)\r
+ {\r
+ D += (CurX << 2) + 6;\r
+ }\r
+ else\r
+ {\r
+ D += ((CurX - CurY) << 2) + 10;\r
+ CurY--;\r
+ }\r
+ CurX++;\r
+ }\r
+\r
+ LCD_DrawCircle(Xpos, Ypos, Radius);\r
+}\r
+\r
+/**\r
+ * @brief Displays an uni-line (between two points).\r
+ * @param x1: specifies the point 1 x position.\r
+ * @param y1: specifies the point 1 y position.\r
+ * @param x2: specifies the point 2 x position.\r
+ * @param y2: specifies the point 2 y position.\r
+ * @retval None\r
+ */\r
+void LCD_DrawUniLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)\r
+{\r
+ int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,\r
+ yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0,\r
+ curpixel = 0;\r
+\r
+ deltax = ABS(x2 - x1); /* The difference between the x's */\r
+ deltay = ABS(y2 - y1); /* The difference between the y's */\r
+ x = x1; /* Start x off at the first pixel */\r
+ y = y1; /* Start y off at the first pixel */\r
+\r
+ if (x2 >= x1) /* The x-values are increasing */\r
+ {\r
+ xinc1 = 1;\r
+ xinc2 = 1;\r
+ }\r
+ else /* The x-values are decreasing */\r
+ {\r
+ xinc1 = -1;\r
+ xinc2 = -1;\r
+ }\r
+\r
+ if (y2 >= y1) /* The y-values are increasing */\r
+ {\r
+ yinc1 = 1;\r
+ yinc2 = 1;\r
+ }\r
+ else /* The y-values are decreasing */\r
+ {\r
+ yinc1 = -1;\r
+ yinc2 = -1;\r
+ }\r
+\r
+ if (deltax >= deltay) /* There is at least one x-value for every y-value */\r
+ {\r
+ xinc1 = 0; /* Don't change the x when numerator >= denominator */\r
+ yinc2 = 0; /* Don't change the y for every iteration */\r
+ den = deltax;\r
+ num = deltax / 2;\r
+ numadd = deltay;\r
+ numpixels = deltax; /* There are more x-values than y-values */\r
+ }\r
+ else /* There is at least one y-value for every x-value */\r
+ {\r
+ xinc2 = 0; /* Don't change the x for every iteration */\r
+ yinc1 = 0; /* Don't change the y when numerator >= denominator */\r
+ den = deltay;\r
+ num = deltay / 2;\r
+ numadd = deltax;\r
+ numpixels = deltay; /* There are more y-values than x-values */\r
+ }\r
+\r
+ for (curpixel = 0; curpixel <= numpixels; curpixel++)\r
+ {\r
+ PutPixel(x, y); /* Draw the current pixel */\r
+ num += numadd; /* Increase the numerator by the top of the fraction */\r
+ if (num >= den) /* Check if numerator >= denominator */\r
+ {\r
+ num -= den; /* Calculate the new numerator value */\r
+ x += xinc1; /* Change the x as appropriate */\r
+ y += yinc1; /* Change the y as appropriate */\r
+ }\r
+ x += xinc2; /* Change the x as appropriate */\r
+ y += yinc2; /* Change the y as appropriate */\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Displays an triangle.\r
+ * @param Points: pointer to the points array.\r
+ * @retval None\r
+ */\r
+void LCD_Triangle(pPoint Points, uint16_t PointCount)\r
+{\r
+ int16_t X = 0, Y = 0;\r
+ pPoint First = Points;\r
+\r
+ if(PointCount != 3)\r
+ {\r
+ return;\r
+ }\r
+\r
+ while(--PointCount)\r
+ {\r
+ X = Points->X;\r
+ Y = Points->Y;\r
+ Points++;\r
+ LCD_DrawUniLine(X, Y, Points->X, Points->Y);\r
+ }\r
+ LCD_DrawUniLine(First->X, First->Y, Points->X, Points->Y);\r
+}\r
+\r
+/**\r
+ * @brief Fill an triangle (between 3 points).\r
+ * @param x1..3: x position of triangle point 1..3.\r
+ * @param y1..3: y position of triangle point 1..3.\r
+ * @retval None\r
+ */\r
+void LCD_FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3)\r
+{\r
+\r
+ int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,\r
+ yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0,\r
+ curpixel = 0;\r
+\r
+ deltax = ABS(x2 - x1); /* The difference between the x's */\r
+ deltay = ABS(y2 - y1); /* The difference between the y's */\r
+ x = x1; /* Start x off at the first pixel */\r
+ y = y1; /* Start y off at the first pixel */\r
+\r
+ if (x2 >= x1) /* The x-values are increasing */\r
+ {\r
+ xinc1 = 1;\r
+ xinc2 = 1;\r
+ }\r
+ else /* The x-values are decreasing */\r
+ {\r
+ xinc1 = -1;\r
+ xinc2 = -1;\r
+ }\r
+\r
+ if (y2 >= y1) /* The y-values are increasing */\r
+ {\r
+ yinc1 = 1;\r
+ yinc2 = 1;\r
+ }\r
+ else /* The y-values are decreasing */\r
+ {\r
+ yinc1 = -1;\r
+ yinc2 = -1;\r
+ }\r
+\r
+ if (deltax >= deltay) /* There is at least one x-value for every y-value */\r
+ {\r
+ xinc1 = 0; /* Don't change the x when numerator >= denominator */\r
+ yinc2 = 0; /* Don't change the y for every iteration */\r
+ den = deltax;\r
+ num = deltax / 2;\r
+ numadd = deltay;\r
+ numpixels = deltax; /* There are more x-values than y-values */\r
+ }\r
+ else /* There is at least one y-value for every x-value */\r
+ {\r
+ xinc2 = 0; /* Don't change the x for every iteration */\r
+ yinc1 = 0; /* Don't change the y when numerator >= denominator */\r
+ den = deltay;\r
+ num = deltay / 2;\r
+ numadd = deltax;\r
+ numpixels = deltay; /* There are more y-values than x-values */\r
+ }\r
+\r
+ for (curpixel = 0; curpixel <= numpixels; curpixel++)\r
+ {\r
+ LCD_DrawUniLine(x, y, x3, y3);\r
+\r
+ num += numadd; /* Increase the numerator by the top of the fraction */\r
+ if (num >= den) /* Check if numerator >= denominator */\r
+ {\r
+ num -= den; /* Calculate the new numerator value */\r
+ x += xinc1; /* Change the x as appropriate */\r
+ y += yinc1; /* Change the y as appropriate */\r
+ }\r
+ x += xinc2; /* Change the x as appropriate */\r
+ y += yinc2; /* Change the y as appropriate */\r
+ }\r
+\r
+\r
+}\r
+/**\r
+ * @brief Displays an poly-line (between many points).\r
+ * @param Points: pointer to the points array.\r
+ * @param PointCount: Number of points.\r
+ * @retval None\r
+ */\r
+void LCD_PolyLine(pPoint Points, uint16_t PointCount)\r
+{\r
+ int16_t X = 0, Y = 0;\r
+\r
+ if(PointCount < 2)\r
+ {\r
+ return;\r
+ }\r
+\r
+ while(--PointCount)\r
+ {\r
+ X = Points->X;\r
+ Y = Points->Y;\r
+ Points++;\r
+ LCD_DrawUniLine(X, Y, Points->X, Points->Y);\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Displays an relative poly-line (between many points).\r
+ * @param Points: pointer to the points array.\r
+ * @param PointCount: Number of points.\r
+ * @param Closed: specifies if the draw is closed or not.\r
+ * 1: closed, 0 : not closed.\r
+ * @retval None\r
+ */\r
+static void LCD_PolyLineRelativeClosed(pPoint Points, uint16_t PointCount, uint16_t Closed)\r
+{\r
+ int16_t X = 0, Y = 0;\r
+ pPoint First = Points;\r
+\r
+ if(PointCount < 2)\r
+ {\r
+ return;\r
+ }\r
+ X = Points->X;\r
+ Y = Points->Y;\r
+ while(--PointCount)\r
+ {\r
+ Points++;\r
+ LCD_DrawUniLine(X, Y, X + Points->X, Y + Points->Y);\r
+ X = X + Points->X;\r
+ Y = Y + Points->Y;\r
+ }\r
+ if(Closed)\r
+ {\r
+ LCD_DrawUniLine(First->X, First->Y, X, Y);\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief Displays a closed poly-line (between many points).\r
+ * @param Points: pointer to the points array.\r
+ * @param PointCount: Number of points.\r
+ * @retval None\r
+ */\r
+void LCD_ClosedPolyLine(pPoint Points, uint16_t PointCount)\r
+{\r
+ LCD_PolyLine(Points, PointCount);\r
+ LCD_DrawUniLine(Points->X, Points->Y, (Points+PointCount-1)->X, (Points+PointCount-1)->Y);\r
+}\r
+\r
+/**\r
+ * @brief Displays a relative poly-line (between many points).\r
+ * @param Points: pointer to the points array.\r
+ * @param PointCount: Number of points.\r
+ * @retval None\r
+ */\r
+void LCD_PolyLineRelative(pPoint Points, uint16_t PointCount)\r
+{\r
+ LCD_PolyLineRelativeClosed(Points, PointCount, 0);\r
+}\r
+\r
+/**\r
+ * @brief Displays a closed relative poly-line (between many points).\r
+ * @param Points: pointer to the points array.\r
+ * @param PointCount: Number of points.\r
+ * @retval None\r
+ */\r
+void LCD_ClosedPolyLineRelative(pPoint Points, uint16_t PointCount)\r
+{\r
+ LCD_PolyLineRelativeClosed(Points, PointCount, 1);\r
+}\r
+\r
+/**\r
+ * @brief Displays a full poly-line (between many points).\r
+ * @param Points: pointer to the points array.\r
+ * @param PointCount: Number of points.\r
+ * @retval None\r
+ */\r
+void LCD_FillPolyLine(pPoint Points, uint16_t PointCount)\r
+{\r
+\r
+ int16_t X = 0, Y = 0, X2 = 0, Y2 = 0, X_center = 0, Y_center = 0, X_first = 0, Y_first = 0, pixelX = 0, pixelY = 0, counter = 0;\r
+ uint16_t IMAGE_LEFT = 0, IMAGE_RIGHT = 0, IMAGE_TOP = 0, IMAGE_BOTTOM = 0;\r
+\r
+ IMAGE_LEFT = IMAGE_RIGHT = Points->X;\r
+ IMAGE_TOP= IMAGE_BOTTOM = Points->Y;\r
+\r
+ for(counter = 1; counter < PointCount; counter++)\r
+ {\r
+ pixelX = POLY_X(counter);\r
+ if(pixelX < IMAGE_LEFT)\r
+ {\r
+ IMAGE_LEFT = pixelX;\r
+ }\r
+ if(pixelX > IMAGE_RIGHT)\r
+ {\r
+ IMAGE_RIGHT = pixelX;\r
+ }\r
+\r
+ pixelY = POLY_Y(counter);\r
+ if(pixelY < IMAGE_TOP)\r
+ {\r
+ IMAGE_TOP = pixelY;\r
+ }\r
+ if(pixelY > IMAGE_BOTTOM)\r
+ {\r
+ IMAGE_BOTTOM = pixelY;\r
+ }\r
+ }\r
+\r
+ if(PointCount < 2)\r
+ {\r
+ return;\r
+ }\r
+\r
+ X_center = (IMAGE_LEFT + IMAGE_RIGHT)/2;\r
+ Y_center = (IMAGE_BOTTOM + IMAGE_TOP)/2;\r
+\r
+ X_first = Points->X;\r
+ Y_first = Points->Y;\r
+\r
+ while(--PointCount)\r
+ {\r
+ X = Points->X;\r
+ Y = Points->Y;\r
+ Points++;\r
+ X2 = Points->X;\r
+ Y2 = Points->Y;\r
+\r
+ LCD_FillTriangle(X, X2, X_center, Y, Y2, Y_center);\r
+ LCD_FillTriangle(X, X_center, X2, Y, Y_center, Y2);\r
+ LCD_FillTriangle(X_center, X2, X, Y_center, Y2, Y);\r
+ }\r
+\r
+ LCD_FillTriangle(X_first, X2, X_center, Y_first, Y2, Y_center);\r
+ LCD_FillTriangle(X_first, X_center, X2, Y_first, Y_center, Y2);\r
+ LCD_FillTriangle(X_center, X2, X_first, Y_center, Y2, Y_first);\r
+}\r
+\r
+/**\r
+ * @brief Writes command to select the LCD register.\r
+ * @param LCD_Reg: address of the selected register.\r
+ * @retval None\r
+ */\r
+void LCD_WriteCommand(uint8_t LCD_Reg)\r
+{\r
+ /* Reset WRX to send command */\r
+ LCD_CtrlLinesWrite(LCD_WRX_GPIO_PORT, LCD_WRX_PIN, Bit_RESET);\r
+\r
+ /* Reset LCD control line(/CS) and Send command */\r
+ LCD_ChipSelect(DISABLE);\r
+ SPI_I2S_SendData(LCD_SPI, LCD_Reg);\r
+\r
+ /* Wait until a data is sent(not busy), before config /CS HIGH */\r
+\r
+ while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_TXE) == RESET) ;\r
+\r
+ while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET);\r
+\r
+ LCD_ChipSelect(ENABLE);\r
+}\r
+\r
+/**\r
+ * @brief Writes data to select the LCD register.\r
+ * This function must be used after LCD_WriteCommand() function\r
+ * @param value: data to write to the selected register.\r
+ * @retval None\r
+ */\r
+void LCD_WriteData(uint8_t value)\r
+{\r
+ /* Set WRX to send data */\r
+ LCD_CtrlLinesWrite(LCD_WRX_GPIO_PORT, LCD_WRX_PIN, Bit_SET);\r
+\r
+ /* Reset LCD control line(/CS) and Send data */\r
+ LCD_ChipSelect(DISABLE);\r
+ SPI_I2S_SendData(LCD_SPI, value);\r
+\r
+ /* Wait until a data is sent(not busy), before config /CS HIGH */\r
+\r
+ while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_TXE) == RESET) ;\r
+\r
+ while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET);\r
+\r
+ LCD_ChipSelect(ENABLE);\r
+}\r
+\r
+/**\r
+ * @brief Configure the LCD controller (Power On sequence as described in ILI9341 Datasheet)\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void LCD_PowerOn(void)\r
+{\r
+ LCD_WriteCommand(0xCA);\r
+ LCD_WriteData(0xC3);\r
+ LCD_WriteData(0x08);\r
+ LCD_WriteData(0x50);\r
+ LCD_WriteCommand(LCD_POWERB);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0xC1);\r
+ LCD_WriteData(0x30);\r
+ LCD_WriteCommand(LCD_POWER_SEQ);\r
+ LCD_WriteData(0x64);\r
+ LCD_WriteData(0x03);\r
+ LCD_WriteData(0x12);\r
+ LCD_WriteData(0x81);\r
+ LCD_WriteCommand(LCD_DTCA);\r
+ LCD_WriteData(0x85);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0x78);\r
+ LCD_WriteCommand(LCD_POWERA);\r
+ LCD_WriteData(0x39);\r
+ LCD_WriteData(0x2C);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0x34);\r
+ LCD_WriteData(0x02);\r
+ LCD_WriteCommand(LCD_PRC);\r
+ LCD_WriteData(0x20);\r
+ LCD_WriteCommand(LCD_DTCB);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteCommand(LCD_FRC);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0x1B);\r
+ LCD_WriteCommand(LCD_DFC);\r
+ LCD_WriteData(0x0A);\r
+ LCD_WriteData(0xA2);\r
+ LCD_WriteCommand(LCD_POWER1);\r
+ LCD_WriteData(0x10);\r
+ LCD_WriteCommand(LCD_POWER2);\r
+ LCD_WriteData(0x10);\r
+ LCD_WriteCommand(LCD_VCOM1);\r
+ LCD_WriteData(0x45);\r
+ LCD_WriteData(0x15);\r
+ LCD_WriteCommand(LCD_VCOM2);\r
+ LCD_WriteData(0x90);\r
+ LCD_WriteCommand(LCD_MAC);\r
+ LCD_WriteData(0xC8);\r
+ LCD_WriteCommand(LCD_3GAMMA_EN);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteCommand(LCD_RGB_INTERFACE);\r
+ LCD_WriteData(0xC2);\r
+ LCD_WriteCommand(LCD_DFC);\r
+ LCD_WriteData(0x0A);\r
+ LCD_WriteData(0xA7);\r
+ LCD_WriteData(0x27);\r
+ LCD_WriteData(0x04);\r
+\r
+ /* colomn address set */\r
+ LCD_WriteCommand(LCD_COLUMN_ADDR);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0xEF);\r
+ /* Page Address Set */\r
+ LCD_WriteCommand(LCD_PAGE_ADDR);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0x01);\r
+ LCD_WriteData(0x3F);\r
+ LCD_WriteCommand(LCD_INTERFACE);\r
+ LCD_WriteData(0x01);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0x06);\r
+\r
+ LCD_WriteCommand(LCD_GRAM);\r
+ delay(200);\r
+\r
+ LCD_WriteCommand(LCD_GAMMA);\r
+ LCD_WriteData(0x01);\r
+\r
+ LCD_WriteCommand(LCD_PGAMMA);\r
+ LCD_WriteData(0x0F);\r
+ LCD_WriteData(0x29);\r
+ LCD_WriteData(0x24);\r
+ LCD_WriteData(0x0C);\r
+ LCD_WriteData(0x0E);\r
+ LCD_WriteData(0x09);\r
+ LCD_WriteData(0x4E);\r
+ LCD_WriteData(0x78);\r
+ LCD_WriteData(0x3C);\r
+ LCD_WriteData(0x09);\r
+ LCD_WriteData(0x13);\r
+ LCD_WriteData(0x05);\r
+ LCD_WriteData(0x17);\r
+ LCD_WriteData(0x11);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteCommand(LCD_NGAMMA);\r
+ LCD_WriteData(0x00);\r
+ LCD_WriteData(0x16);\r
+ LCD_WriteData(0x1B);\r
+ LCD_WriteData(0x04);\r
+ LCD_WriteData(0x11);\r
+ LCD_WriteData(0x07);\r
+ LCD_WriteData(0x31);\r
+ LCD_WriteData(0x33);\r
+ LCD_WriteData(0x42);\r
+ LCD_WriteData(0x05);\r
+ LCD_WriteData(0x0C);\r
+ LCD_WriteData(0x0A);\r
+ LCD_WriteData(0x28);\r
+ LCD_WriteData(0x2F);\r
+ LCD_WriteData(0x0F);\r
+\r
+ LCD_WriteCommand(LCD_SLEEP_OUT);\r
+ delay(200);\r
+ LCD_WriteCommand(LCD_DISPLAY_ON);\r
+ /* GRAM start writing */\r
+ LCD_WriteCommand(LCD_GRAM);\r
+ }\r
+\r
+/**\r
+ * @brief Enables the Display.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void LCD_DisplayOn(void)\r
+{\r
+ LCD_WriteCommand(LCD_DISPLAY_ON);\r
+}\r
+\r
+/**\r
+ * @brief Disables the Display.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void LCD_DisplayOff(void)\r
+{\r
+ /* Display Off */\r
+ LCD_WriteCommand(LCD_DISPLAY_OFF);\r
+}\r
+\r
+/**\r
+ * @brief Configures LCD control lines in Output Push-Pull mode.\r
+ * @note The LCD_NCS line can be configured in Open Drain mode\r
+ * when VDDIO is lower than required LCD supply.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void LCD_CtrlLinesConfig(void)\r
+{\r
+ GPIO_InitTypeDef GPIO_InitStructure;\r
+\r
+ /* Enable GPIOs clock*/\r
+ RCC_AHB1PeriphClockCmd(LCD_NCS_GPIO_CLK | LCD_WRX_GPIO_CLK, ENABLE);\r
+\r
+ /* Configure NCS in Output Push-Pull mode */\r
+ GPIO_InitStructure.GPIO_Pin = LCD_NCS_PIN;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(LCD_NCS_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* Configure WRX in Output Push-Pull mode */\r
+ GPIO_InitStructure.GPIO_Pin = LCD_WRX_PIN;\r
+ GPIO_Init(LCD_WRX_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* Set chip select pin high */\r
+ LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET);\r
+}\r
+\r
+/**\r
+ * @brief Sets or reset LCD control lines.\r
+ * @param GPIOx: where x can be B or D to select the GPIO peripheral.\r
+ * @param CtrlPins: the Control line.\r
+ * This parameter can be:\r
+ * @arg LCD_NCS_PIN: Chip Select pin\r
+ * @arg LCD_NWR_PIN: Read/Write Selection pin\r
+ * @arg LCD_RS_PIN: Register/RAM Selection pin\r
+ * @param BitVal: specifies the value to be written to the selected bit.\r
+ * This parameter can be:\r
+ * @arg Bit_RESET: to clear the port pin\r
+ * @arg Bit_SET: to set the port pin\r
+ * @retval None\r
+ */\r
+void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, uint16_t CtrlPins, BitAction BitVal)\r
+{\r
+ /* Set or Reset the control line */\r
+ GPIO_WriteBit(GPIOx, (uint16_t)CtrlPins, (BitAction)BitVal);\r
+}\r
+\r
+/**\r
+ * @brief Configures the LCD_SPI interface.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void LCD_SPIConfig(void)\r
+{\r
+ SPI_InitTypeDef SPI_InitStructure;\r
+ GPIO_InitTypeDef GPIO_InitStructure;\r
+\r
+ /* Enable LCD_SPI_SCK_GPIO_CLK, LCD_SPI_MISO_GPIO_CLK and LCD_SPI_MOSI_GPIO_CLK clock */\r
+ RCC_AHB1PeriphClockCmd(LCD_SPI_SCK_GPIO_CLK | LCD_SPI_MISO_GPIO_CLK | LCD_SPI_MOSI_GPIO_CLK, ENABLE);\r
+\r
+ /* Enable LCD_SPI and SYSCFG clock */\r
+ RCC_APB2PeriphClockCmd(LCD_SPI_CLK, ENABLE);\r
+\r
+ /* Configure LCD_SPI SCK pin */\r
+ GPIO_InitStructure.GPIO_Pin = LCD_SPI_SCK_PIN;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;\r
+ GPIO_Init(LCD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* Configure LCD_SPI MISO pin */\r
+ GPIO_InitStructure.GPIO_Pin = LCD_SPI_MISO_PIN;\r
+ GPIO_Init(LCD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* Configure LCD_SPI MOSI pin */\r
+ GPIO_InitStructure.GPIO_Pin = LCD_SPI_MOSI_PIN;\r
+ GPIO_Init(LCD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+ /* Connect SPI SCK */\r
+ GPIO_PinAFConfig(LCD_SPI_SCK_GPIO_PORT, LCD_SPI_SCK_SOURCE, LCD_SPI_SCK_AF);\r
+\r
+ /* Connect SPI MISO */\r
+ GPIO_PinAFConfig(LCD_SPI_MISO_GPIO_PORT, LCD_SPI_MISO_SOURCE, LCD_SPI_MISO_AF);\r
+\r
+ /* Connect SPI MOSI */\r
+ GPIO_PinAFConfig(LCD_SPI_MOSI_GPIO_PORT, LCD_SPI_MOSI_SOURCE, LCD_SPI_MOSI_AF);\r
+\r
+ SPI_I2S_DeInit(LCD_SPI);\r
+\r
+ /* SPI configuration -------------------------------------------------------*/\r
+ /* If the SPI peripheral is already enabled, don't reconfigure it */\r
+ if ((LCD_SPI->CR1 & SPI_CR1_SPE) == 0)\r
+ {\r
+ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;\r
+ SPI_InitStructure.SPI_Mode = SPI_Mode_Master;\r
+ SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;\r
+ SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;\r
+ SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;\r
+ SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;\r
+ /* SPI baudrate is set to 5.6 MHz (PCLK2/SPI_BaudRatePrescaler = 90/16 = 5.625 MHz)\r
+ to verify these constraints:\r
+ - ILI9341 LCD SPI interface max baudrate is 10MHz for write and 6.66MHz for read\r
+ - l3gd20 SPI interface max baudrate is 10MHz for write/read\r
+ - PCLK2 frequency is set to 90 MHz\r
+ */\r
+ SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;\r
+ SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;\r
+ SPI_InitStructure.SPI_CRCPolynomial = 7;\r
+ SPI_Init(LCD_SPI, &SPI_InitStructure);\r
+\r
+ /* Enable L3GD20_SPI */\r
+ SPI_Cmd(LCD_SPI, ENABLE);\r
+ }\r
+}\r
+\r
+/**\r
+ * @brief GPIO config for LTDC.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+static void LCD_AF_GPIOConfig(void)\r
+{\r
+ GPIO_InitTypeDef GPIO_InitStruct;\r
+\r
+ /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOF, GPIOG AHB Clocks */\r
+ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | \\r
+ RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | \\r
+ RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);\r
+\r
+/* GPIOs Configuration */\r
+/*\r
+ +------------------------+-----------------------+----------------------------+\r
+ + LCD pins assignment +\r
+ +------------------------+-----------------------+----------------------------+\r
+ | LCD_TFT R2 <-> PC.10 | LCD_TFT G2 <-> PA.06 | LCD_TFT B2 <-> PD.06 |\r
+ | LCD_TFT R3 <-> PB.00 | LCD_TFT G3 <-> PG.10 | LCD_TFT B3 <-> PG.11 |\r
+ | LCD_TFT R4 <-> PA.11 | LCD_TFT G4 <-> PB.10 | LCD_TFT B4 <-> PG.12 |\r
+ | LCD_TFT R5 <-> PA.12 | LCD_TFT G5 <-> PB.11 | LCD_TFT B5 <-> PA.03 |\r
+ | LCD_TFT R6 <-> PB.01 | LCD_TFT G6 <-> PC.07 | LCD_TFT B6 <-> PB.08 |\r
+ | LCD_TFT R7 <-> PG.06 | LCD_TFT G7 <-> PD.03 | LCD_TFT B7 <-> PB.09 |\r
+ -------------------------------------------------------------------------------\r
+ | LCD_TFT HSYNC <-> PC.06 | LCDTFT VSYNC <-> PA.04 |\r
+ | LCD_TFT CLK <-> PG.07 | LCD_TFT DE <-> PF.10 |\r
+ -----------------------------------------------------\r
+\r
+*/\r
+\r
+ /* GPIOA configuration */\r
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_LTDC);\r
+\r
+ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6 | \\r
+ GPIO_Pin_11 | GPIO_Pin_12;\r
+\r
+ GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;\r
+ GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;\r
+ GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+ GPIO_Init(GPIOA, &GPIO_InitStruct);\r
+\r
+ /* GPIOB configuration */\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, 0x09);\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, 0x09);\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_LTDC);\r
+\r
+ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | \\r
+ GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;\r
+\r
+ GPIO_Init(GPIOB, &GPIO_InitStruct);\r
+\r
+ /* GPIOC configuration */\r
+ GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_LTDC);\r
+\r
+ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10;\r
+\r
+ GPIO_Init(GPIOC, &GPIO_InitStruct);\r
+\r
+ /* GPIOD configuration */\r
+ GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_LTDC);\r
+\r
+ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;\r
+\r
+ GPIO_Init(GPIOD, &GPIO_InitStruct);\r
+\r
+ /* GPIOF configuration */\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource10, GPIO_AF_LTDC);\r
+\r
+ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;\r
+\r
+ GPIO_Init(GPIOF, &GPIO_InitStruct);\r
+\r
+ /* GPIOG configuration */\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource6, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource7, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource10, 0x09);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_LTDC);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource12, 0x09);\r
+\r
+ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10 | \\r
+ GPIO_Pin_11 | GPIO_Pin_12;\r
+\r
+ GPIO_Init(GPIOG, &GPIO_InitStruct);\r
+\r
+}\r
+\r
+/**\r
+ * @brief Displays a pixel.\r
+ * @param x: pixel x.\r
+ * @param y: pixel y.\r
+ * @retval None\r
+ */\r
+static void PutPixel(int16_t x, int16_t y)\r
+{\r
+ if(x < 0 || x > 239 || y < 0 || y > 319)\r
+ {\r
+ return;\r
+ }\r
+ LCD_DrawLine(x, y, 1, LCD_DIR_HORIZONTAL);\r
+}\r
+\r
+#ifndef USE_Delay\r
+/**\r
+ * @brief Inserts a delay time.\r
+ * @param nCount: specifies the delay time length.\r
+ * @retval None\r
+ */\r
+static void delay(__IO uint32_t nCount)\r
+{\r
+ __IO uint32_t index = 0;\r
+ for(index = nCount; index != 0; index--)\r
+ {\r
+ }\r
+}\r
+#endif /* USE_Delay*/\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
--- /dev/null
+/**\r
+ ******************************************************************************\r
+ * @file stm32f429i_discovery_lcd.h\r
+ * @author MCD Application Team\r
+ * @version V1.0.1\r
+ * @date 28-October-2013\r
+ * @brief This file contains all the functions prototypes for the \r
+ * stm32f429i_discovery_lcd.c driver.\r
+ ******************************************************************************\r
+ * @attention\r
+ *\r
+ * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+ *\r
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+ * You may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at:\r
+ *\r
+ * http://www.st.com/software_license_agreement_liberty_v2\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software \r
+ * distributed under the License is distributed on an "AS IS" BASIS, \r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ ******************************************************************************\r
+ */\r
+\r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __STM32F429I_DISCOVERY_LCD_H\r
+#define __STM32F429I_DISCOVERY_LCD_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif \r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f4xx.h"\r
+#include "stm32f429i_discovery.h"\r
+#include "stm32f429i_discovery_sdram.h"\r
+#include "fonts.h"\r
+\r
+/** @addtogroup Utilities\r
+ * @{\r
+ */\r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+ * @{\r
+ */ \r
+\r
+/** @addtogroup STM32F429I_DISCOVERY\r
+ * @{\r
+ */\r
+ \r
+/** @addtogroup STM32F429I_DISCOVERY_LCD\r
+ * @{\r
+ */ \r
+\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Exported_Types\r
+ * @{\r
+ */\r
+typedef struct \r
+{\r
+ int16_t X;\r
+ int16_t Y;\r
+} Point, * pPoint; \r
+/**\r
+ * @}\r
+ */ \r
+\r
+/** @defgroup stm32f429i_discovery_LCD_Exported_Constants\r
+ * @{\r
+ */ \r
+\r
+/* LCD Size (Width and Height) */\r
+#define LCD_PIXEL_WIDTH ((uint16_t)240)\r
+#define LCD_PIXEL_HEIGHT ((uint16_t)320)\r
+\r
+#define LCD_FRAME_BUFFER ((uint32_t)0xD0000000)\r
+#define BUFFER_OFFSET ((uint32_t)0x50000) \r
+/**\r
+ * @brief Uncomment the line below if you want to use user defined Delay function\r
+ * (for precise timing), otherwise default _delay_ function defined within\r
+ * this driver is used (less precise timing). \r
+ */\r
+/* #define USE_Delay */\r
+\r
+#ifdef USE_Delay\r
+#include "main.h" \r
+ #define _delay_ Delay /* !< User can provide more timing precise _delay_ function\r
+ (with 10ms time base), using SysTick for example */\r
+#else\r
+ #define _delay_ delay /* !< Default _delay_ function with less precise timing */\r
+#endif\r
+\r
+\r
+/** \r
+ * @brief LCD Control pin \r
+ */ \r
+#define LCD_NCS_PIN GPIO_Pin_2 \r
+#define LCD_NCS_GPIO_PORT GPIOC \r
+#define LCD_NCS_GPIO_CLK RCC_AHB1Periph_GPIOC \r
+\r
+/** \r
+ * @brief LCD Command/data pin \r
+ */\r
+#define LCD_WRX_PIN GPIO_Pin_13 \r
+#define LCD_WRX_GPIO_PORT GPIOD\r
+#define LCD_WRX_GPIO_CLK RCC_AHB1Periph_GPIOD \r
+\r
+/** \r
+ * @brief LCD SPI Interface pins \r
+ */ \r
+#define LCD_SPI_SCK_PIN GPIO_Pin_7 /* PF.07 */\r
+#define LCD_SPI_SCK_GPIO_PORT GPIOF /* GPIOF */\r
+#define LCD_SPI_SCK_GPIO_CLK RCC_AHB1Periph_GPIOF \r
+#define LCD_SPI_SCK_SOURCE GPIO_PinSource7\r
+#define LCD_SPI_SCK_AF GPIO_AF_SPI5\r
+#define LCD_SPI_MISO_PIN GPIO_Pin_8 /* PF.08 */\r
+#define LCD_SPI_MISO_GPIO_PORT GPIOF /* GPIOF */\r
+#define LCD_SPI_MISO_GPIO_CLK RCC_AHB1Periph_GPIOF \r
+#define LCD_SPI_MISO_SOURCE GPIO_PinSource8\r
+#define LCD_SPI_MISO_AF GPIO_AF_SPI5\r
+#define LCD_SPI_MOSI_PIN GPIO_Pin_9 /* PF.09 */\r
+#define LCD_SPI_MOSI_GPIO_PORT GPIOF /* GPIOF */\r
+#define LCD_SPI_MOSI_GPIO_CLK RCC_AHB1Periph_GPIOF \r
+#define LCD_SPI_MOSI_SOURCE GPIO_PinSource9\r
+#define LCD_SPI_MOSI_AF GPIO_AF_SPI5\r
+#define LCD_SPI SPI5\r
+#define LCD_SPI_CLK RCC_APB2Periph_SPI5 \r
+\r
+/** \r
+ * @brief LCD Registers \r
+ */ \r
+#define LCD_SLEEP_OUT 0x11 /* Sleep out register */\r
+#define LCD_GAMMA 0x26 /* Gamma register */\r
+#define LCD_DISPLAY_OFF 0x28 /* Display off register */\r
+#define LCD_DISPLAY_ON 0x29 /* Display on register */\r
+#define LCD_COLUMN_ADDR 0x2A /* Colomn address register */ \r
+#define LCD_PAGE_ADDR 0x2B /* Page address register */ \r
+#define LCD_GRAM 0x2C /* GRAM register */ \r
+#define LCD_MAC 0x36 /* Memory Access Control register*/\r
+#define LCD_PIXEL_FORMAT 0x3A /* Pixel Format register */\r
+#define LCD_WDB 0x51 /* Write Brightness Display register */\r
+#define LCD_WCD 0x53 /* Write Control Display register*/\r
+#define LCD_RGB_INTERFACE 0xB0 /* RGB Interface Signal Control */\r
+#define LCD_FRC 0xB1 /* Frame Rate Control register */\r
+#define LCD_BPC 0xB5 /* Blanking Porch Control register*/\r
+#define LCD_DFC 0xB6 /* Display Function Control register*/\r
+#define LCD_POWER1 0xC0 /* Power Control 1 register */\r
+#define LCD_POWER2 0xC1 /* Power Control 2 register */\r
+#define LCD_VCOM1 0xC5 /* VCOM Control 1 register */\r
+#define LCD_VCOM2 0xC7 /* VCOM Control 2 register */\r
+#define LCD_POWERA 0xCB /* Power control A register */\r
+#define LCD_POWERB 0xCF /* Power control B register */\r
+#define LCD_PGAMMA 0xE0 /* Positive Gamma Correction register*/\r
+#define LCD_NGAMMA 0xE1 /* Negative Gamma Correction register*/\r
+#define LCD_DTCA 0xE8 /* Driver timing control A */\r
+#define LCD_DTCB 0xEA /* Driver timing control B */\r
+#define LCD_POWER_SEQ 0xED /* Power on sequence register */\r
+#define LCD_3GAMMA_EN 0xF2 /* 3 Gamma enable register */\r
+#define LCD_INTERFACE 0xF6 /* Interface control register */\r
+#define LCD_PRC 0xF7 /* Pump ratio control register */\r
+\r
+/** \r
+ * @brief LCD color \r
+ */ \r
+#define LCD_COLOR_WHITE 0xFFFF\r
+#define LCD_COLOR_BLACK 0x0000\r
+#define LCD_COLOR_GREY 0xF7DE\r
+#define LCD_COLOR_BLUE 0x001F\r
+#define LCD_COLOR_BLUE2 0x051F\r
+#define LCD_COLOR_RED 0xF800\r
+#define LCD_COLOR_MAGENTA 0xF81F\r
+#define LCD_COLOR_GREEN 0x07E0\r
+#define LCD_COLOR_CYAN 0x7FFF\r
+#define LCD_COLOR_YELLOW 0xFFE0\r
+\r
+/** \r
+ * @brief LCD Lines depending on the chosen fonts. \r
+ */\r
+#define LCD_LINE_0 LINE(0)\r
+#define LCD_LINE_1 LINE(1)\r
+#define LCD_LINE_2 LINE(2)\r
+#define LCD_LINE_3 LINE(3)\r
+#define LCD_LINE_4 LINE(4)\r
+#define LCD_LINE_5 LINE(5)\r
+#define LCD_LINE_6 LINE(6)\r
+#define LCD_LINE_7 LINE(7)\r
+#define LCD_LINE_8 LINE(8)\r
+#define LCD_LINE_9 LINE(9)\r
+#define LCD_LINE_10 LINE(10)\r
+#define LCD_LINE_11 LINE(11)\r
+#define LCD_LINE_12 LINE(12)\r
+#define LCD_LINE_13 LINE(13)\r
+#define LCD_LINE_14 LINE(14)\r
+#define LCD_LINE_15 LINE(15)\r
+#define LCD_LINE_16 LINE(16)\r
+#define LCD_LINE_17 LINE(17)\r
+#define LCD_LINE_18 LINE(18)\r
+#define LCD_LINE_19 LINE(19)\r
+#define LCD_LINE_20 LINE(20)\r
+#define LCD_LINE_21 LINE(21)\r
+#define LCD_LINE_22 LINE(22)\r
+#define LCD_LINE_23 LINE(23)\r
+#define LCD_LINE_24 LINE(24)\r
+#define LCD_LINE_25 LINE(25)\r
+#define LCD_LINE_26 LINE(26)\r
+#define LCD_LINE_27 LINE(27)\r
+#define LCD_LINE_28 LINE(28)\r
+#define LCD_LINE_29 LINE(29)\r
+#define LCD_LINE_30 LINE(30)\r
+#define LCD_LINE_31 LINE(31)\r
+#define LCD_LINE_32 LINE(32)\r
+#define LCD_LINE_33 LINE(33)\r
+#define LCD_LINE_34 LINE(34)\r
+#define LCD_LINE_35 LINE(35)\r
+#define LCD_LINE_36 LINE(36)\r
+#define LCD_LINE_37 LINE(37)\r
+#define LCD_LINE_38 LINE(38)\r
+#define LCD_LINE_39 LINE(39)\r
+\r
+/** \r
+ * @brief LCD default font \r
+ */ \r
+#define LCD_DEFAULT_FONT Font16x24\r
+\r
+/** \r
+ * @brief LCD Direction \r
+ */ \r
+#define LCD_DIR_HORIZONTAL 0x0000\r
+#define LCD_DIR_VERTICAL 0x0001\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/** \r
+ * @brief LCD Layer \r
+ */ \r
+#define LCD_BACKGROUND_LAYER 0x0000\r
+#define LCD_FOREGROUND_LAYER 0x0001\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Exported_Macros\r
+ * @{\r
+ */ \r
+#define ASSEMBLE_RGB(R, G, B) ((((R)& 0xF8) << 8) | (((G) & 0xFC) << 3) | (((B) & 0xF8) >> 3)) \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Exported_Functions\r
+ * @{\r
+ */ \r
+void LCD_DeInit(void); \r
+void LCD_Init(void);\r
+void LCD_LayerInit(void);\r
+void LCD_ChipSelect(FunctionalState NewState);\r
+void LCD_SetLayer(uint32_t Layerx);\r
+void LCD_SetColors(uint16_t _TextColor, uint16_t _BackColor); \r
+void LCD_GetColors(uint16_t *_TextColor, uint16_t *_BackColor);\r
+void LCD_SetTextColor(uint16_t Color);\r
+void LCD_SetBackColor(uint16_t Color);\r
+void LCD_SetTransparency(uint8_t transparency);\r
+void LCD_ClearLine(uint16_t Line);\r
+void LCD_Clear(uint16_t Color);\r
+uint32_t LCD_SetCursor(uint16_t Xpos, uint16_t Ypos);\r
+void LCD_SetColorKeying(uint32_t RGBValue);\r
+void LCD_ReSetColorKeying(void);\r
+void LCD_DrawChar(uint16_t Xpos, uint16_t Ypos, const uint16_t *c);\r
+void LCD_DisplayChar(uint16_t Line, uint16_t Column, uint8_t Ascii);\r
+void LCD_SetFont(sFONT *fonts);\r
+sFONT * LCD_GetFont(void);\r
+void LCD_DisplayStringLine(uint16_t Line, uint8_t *ptr);\r
+void LCD_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Height, uint16_t Width);\r
+void LCD_WindowModeDisable(void);\r
+void LCD_DrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction);\r
+void LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Height, uint16_t Width);\r
+void LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius);\r
+void LCD_DrawEllipse(int Xpos, int Ypos, int Radius, int Radius2);\r
+void LCD_DrawFullEllipse(int Xpos, int Ypos, int Radius, int Radius2);\r
+void LCD_DrawMonoPict(const uint32_t *Pict);\r
+void LCD_WriteBMP(uint32_t BmpAddress);\r
+void LCD_DrawUniLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);\r
+void LCD_DrawFullRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);\r
+void LCD_DrawFullCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius);\r
+void LCD_PolyLine(pPoint Points, uint16_t PointCount);\r
+void LCD_PolyLineRelative(pPoint Points, uint16_t PointCount);\r
+void LCD_ClosedPolyLine(pPoint Points, uint16_t PointCount);\r
+void LCD_ClosedPolyLineRelative(pPoint Points, uint16_t PointCount);\r
+void LCD_FillPolyLine(pPoint Points, uint16_t PointCount);\r
+void LCD_Triangle(pPoint Points, uint16_t PointCount);\r
+void LCD_FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3);\r
+void LCD_WriteCommand(uint8_t LCD_Reg);\r
+void LCD_WriteData(uint8_t value);\r
+void LCD_PowerOn(void);\r
+void LCD_DisplayOn(void);\r
+void LCD_DisplayOff(void);\r
+void LCD_CtrlLinesConfig(void);\r
+void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, uint16_t CtrlPins, BitAction BitVal);\r
+void LCD_SPIConfig(void);\r
+/**\r
+ * @}\r
+ */ \r
+ \r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __STM32F429I_DISCOVERY_LCD_H */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/**\r
+ * @}\r
+ */\r
+ \r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
--- /dev/null
+/**\r
+ ******************************************************************************\r
+ * @file stm32f429i_discovery_sdram.c\r
+ * @author MCD Application Team\r
+ * @version V1.0.1\r
+ * @date 28-October-2013\r
+ * @brief This file provides a set of functions needed to drive the\r
+ * IS42S16400J SDRAM memory mounted on STM32F429I-DISCO Kit. \r
+ ******************************************************************************\r
+ * @attention\r
+ *\r
+ * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+ *\r
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+ * You may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at:\r
+ *\r
+ * http://www.st.com/software_license_agreement_liberty_v2\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software \r
+ * distributed under the License is distributed on an "AS IS" BASIS, \r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ ******************************************************************************\r
+ */\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f429i_discovery_sdram.h"\r
+#include "stm32f4xx_fmc.h"\r
+/** @addtogroup Utilities\r
+ * @{\r
+ */ \r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+ * @{\r
+ */ \r
+\r
+/** @addtogroup STM32429I_DISCO\r
+ * @{\r
+ */\r
+ \r
+/** @addtogroup STM32429I_DISCO_SDRAM\r
+ * @brief This file provides a set of functions needed to drive the \r
+ * IS42S16400J SDRAM memory mounted on STM32429I-DISCO board.\r
+ * @{\r
+ */ \r
+\r
+/** @defgroup STM32429I_DISCO_SDRAM_Private_Functions\r
+ * @{\r
+ */\r
+\r
+#ifndef USE_Delay\r
+static void delay(__IO uint32_t nCount);\r
+#endif /* USE_Delay*/\r
+\r
+/**\r
+ * @brief Configures the FMC and GPIOs to interface with the SDRAM memory.\r
+ * This function must be called before any read/write operation\r
+ * on the SDRAM.\r
+ * @param None\r
+ * @retval None\r
+ */\r
+void SDRAM_Init(void)\r
+{\r
+ FMC_SDRAMInitTypeDef FMC_SDRAMInitStructure;\r
+ FMC_SDRAMTimingInitTypeDef FMC_SDRAMTimingInitStructure; \r
+ \r
+ /* GPIO configuration for FMC SDRAM bank */\r
+ SDRAM_GPIOConfig();\r
+ \r
+ /* Enable FMC clock */\r
+ RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);\r
+ \r
+/* FMC Configuration ---------------------------------------------------------*/\r
+/* FMC SDRAM Bank configuration */ \r
+ /* Timing configuration for 90 Mhz of SD clock frequency (180Mhz/2) */\r
+ /* TMRD: 2 Clock cycles */\r
+ FMC_SDRAMTimingInitStructure.FMC_LoadToActiveDelay = 2; \r
+ /* TXSR: min=70ns (7x11.11ns) */\r
+ FMC_SDRAMTimingInitStructure.FMC_ExitSelfRefreshDelay = 7;\r
+ /* TRAS: min=42ns (4x11.11ns) max=120k (ns) */\r
+ FMC_SDRAMTimingInitStructure.FMC_SelfRefreshTime = 4;\r
+ /* TRC: min=70 (7x11.11ns) */ \r
+ FMC_SDRAMTimingInitStructure.FMC_RowCycleDelay = 7; \r
+ /* TWR: min=1+ 7ns (1+1x11.11ns) */\r
+ FMC_SDRAMTimingInitStructure.FMC_WriteRecoveryTime = 2; \r
+ /* TRP: 20ns => 2x11.11ns */\r
+ FMC_SDRAMTimingInitStructure.FMC_RPDelay = 2; \r
+ /* TRCD: 20ns => 2x11.11ns */\r
+ FMC_SDRAMTimingInitStructure.FMC_RCDDelay = 2;\r
+\r
+/* FMC SDRAM control configuration */\r
+ FMC_SDRAMInitStructure.FMC_Bank = FMC_Bank2_SDRAM;\r
+ /* Row addressing: [7:0] */\r
+ FMC_SDRAMInitStructure.FMC_ColumnBitsNumber = FMC_ColumnBits_Number_8b;\r
+ /* Column addressing: [11:0] */\r
+ FMC_SDRAMInitStructure.FMC_RowBitsNumber = FMC_RowBits_Number_12b;\r
+ FMC_SDRAMInitStructure.FMC_SDMemoryDataWidth = SDRAM_MEMORY_WIDTH;\r
+ FMC_SDRAMInitStructure.FMC_InternalBankNumber = FMC_InternalBank_Number_4;\r
+ FMC_SDRAMInitStructure.FMC_CASLatency = SDRAM_CAS_LATENCY; \r
+ FMC_SDRAMInitStructure.FMC_WriteProtection = FMC_Write_Protection_Disable;\r
+ FMC_SDRAMInitStructure.FMC_SDClockPeriod = SDCLOCK_PERIOD; \r
+ FMC_SDRAMInitStructure.FMC_ReadBurst = SDRAM_READBURST;\r
+ FMC_SDRAMInitStructure.FMC_ReadPipeDelay = FMC_ReadPipe_Delay_1;\r
+ FMC_SDRAMInitStructure.FMC_SDRAMTimingStruct = &FMC_SDRAMTimingInitStructure;\r
+ \r
+ /* FMC SDRAM bank initialization */\r
+ FMC_SDRAMInit(&FMC_SDRAMInitStructure); \r
+ \r
+ /* FMC SDRAM device initialization sequence */\r
+ SDRAM_InitSequence(); \r
+ \r
+}\r
+\r
+/**\r
+ * @brief Configures all SDRAM memory I/Os pins. \r
+ * @param None. \r
+ * @retval None.\r
+ */\r
+void SDRAM_GPIOConfig(void)\r
+{\r
+ GPIO_InitTypeDef GPIO_InitStructure;\r
+ \r
+ /* Enable GPIOs clock */\r
+ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD |\r
+ RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);\r
+ \r
+/*-- GPIOs Configuration -----------------------------------------------------*/\r
+/*\r
+ +-------------------+--------------------+--------------------+--------------------+\r
+ + SDRAM pins assignment +\r
+ +-------------------+--------------------+--------------------+--------------------+\r
+ | PD0 <-> FMC_D2 | PE0 <-> FMC_NBL0 | PF0 <-> FMC_A0 | PG0 <-> FMC_A10 |\r
+ | PD1 <-> FMC_D3 | PE1 <-> FMC_NBL1 | PF1 <-> FMC_A1 | PG1 <-> FMC_A11 |\r
+ | PD8 <-> FMC_D13 | PE7 <-> FMC_D4 | PF2 <-> FMC_A2 | PG8 <-> FMC_SDCLK |\r
+ | PD9 <-> FMC_D14 | PE8 <-> FMC_D5 | PF3 <-> FMC_A3 | PG15 <-> FMC_NCAS |\r
+ | PD10 <-> FMC_D15 | PE9 <-> FMC_D6 | PF4 <-> FMC_A4 |--------------------+ \r
+ | PD14 <-> FMC_D0 | PE10 <-> FMC_D7 | PF5 <-> FMC_A5 | \r
+ | PD15 <-> FMC_D1 | PE11 <-> FMC_D8 | PF11 <-> FMC_NRAS | \r
+ +-------------------| PE12 <-> FMC_D9 | PF12 <-> FMC_A6 | \r
+ | PE13 <-> FMC_D10 | PF13 <-> FMC_A7 | \r
+ | PE14 <-> FMC_D11 | PF14 <-> FMC_A8 |\r
+ | PE15 <-> FMC_D12 | PF15 <-> FMC_A9 |\r
+ +-------------------+--------------------+--------------------+\r
+ | PB5 <-> FMC_SDCKE1| \r
+ | PB6 <-> FMC_SDNE1 | \r
+ | PC0 <-> FMC_SDNWE |\r
+ +-------------------+ \r
+ \r
+*/\r
+ \r
+ /* Common GPIO configuration */\r
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+\r
+ /* GPIOB configuration */\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource5 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOB, GPIO_PinSource6 , GPIO_AF_FMC);\r
+ \r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; \r
+\r
+ GPIO_Init(GPIOB, &GPIO_InitStructure); \r
+\r
+ /* GPIOC configuration */\r
+ GPIO_PinAFConfig(GPIOC, GPIO_PinSource0 , GPIO_AF_FMC);\r
+ \r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; \r
+\r
+ GPIO_Init(GPIOC, &GPIO_InitStructure); \r
+ \r
+ /* GPIOD configuration */\r
+ GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FMC);\r
+\r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 |\r
+ GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |\r
+ GPIO_Pin_15;\r
+\r
+ GPIO_Init(GPIOD, &GPIO_InitStructure);\r
+\r
+ /* GPIOE configuration */\r
+ GPIO_PinAFConfig(GPIOE, GPIO_PinSource0 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOE, GPIO_PinSource1 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FMC);\r
+\r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_7 |\r
+ GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |\r
+ GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 |\r
+ GPIO_Pin_14 | GPIO_Pin_15;\r
+\r
+ GPIO_Init(GPIOE, &GPIO_InitStructure);\r
+\r
+ /* GPIOF configuration */\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource0 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource1 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource2 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource3 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource4 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource5 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource11 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource12 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource13 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource14 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOF, GPIO_PinSource15 , GPIO_AF_FMC);\r
+\r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | \r
+ GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |\r
+ GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 |\r
+ GPIO_Pin_14 | GPIO_Pin_15; \r
+\r
+ GPIO_Init(GPIOF, &GPIO_InitStructure);\r
+\r
+ /* GPIOG configuration */\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource0 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource1 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource4 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource5 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource8 , GPIO_AF_FMC);\r
+ GPIO_PinAFConfig(GPIOG, GPIO_PinSource15 , GPIO_AF_FMC);\r
+ \r
+\r
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 |\r
+ GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_15;\r
+\r
+ GPIO_Init(GPIOG, &GPIO_InitStructure); \r
+}\r
+\r
+/**\r
+ * @brief Executes the SDRAM memory initialization sequence. \r
+ * @param None. \r
+ * @retval None.\r
+ */\r
+void SDRAM_InitSequence(void)\r
+{\r
+ FMC_SDRAMCommandTypeDef FMC_SDRAMCommandStructure;\r
+ uint32_t tmpr = 0;\r
+ \r
+/* Step 3 --------------------------------------------------------------------*/\r
+ /* Configure a clock configuration enable command */\r
+ FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_CLK_Enabled;\r
+ FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank2;\r
+ FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;\r
+ FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;\r
+ /* Wait until the SDRAM controller is ready */ \r
+ while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+ {\r
+ }\r
+ /* Send the command */\r
+ FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure); \r
+ \r
+/* Step 4 --------------------------------------------------------------------*/\r
+ /* Insert 100 ms delay */\r
+ __Delay(10);\r
+ \r
+/* Step 5 --------------------------------------------------------------------*/\r
+ /* Configure a PALL (precharge all) command */ \r
+ FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_PALL;\r
+ FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank2;\r
+ FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;\r
+ FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;\r
+ /* Wait until the SDRAM controller is ready */ \r
+ while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+ {\r
+ }\r
+ /* Send the command */\r
+ FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);\r
+ \r
+/* Step 6 --------------------------------------------------------------------*/\r
+ /* Configure a Auto-Refresh command */ \r
+ FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_AutoRefresh;\r
+ FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank2;\r
+ FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 4;\r
+ FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;\r
+ /* Wait until the SDRAM controller is ready */ \r
+ while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+ {\r
+ }\r
+ /* Send the first command */\r
+ FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);\r
+ \r
+ /* Wait until the SDRAM controller is ready */ \r
+ while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+ {\r
+ }\r
+ /* Send the second command */\r
+ FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);\r
+ \r
+/* Step 7 --------------------------------------------------------------------*/\r
+ /* Program the external memory mode register */\r
+ tmpr = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2 |\r
+ SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |\r
+ SDRAM_MODEREG_CAS_LATENCY_3 |\r
+ SDRAM_MODEREG_OPERATING_MODE_STANDARD |\r
+ SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;\r
+ \r
+ /* Configure a load Mode register command*/ \r
+ FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_LoadMode;\r
+ FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank2;\r
+ FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;\r
+ FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = tmpr;\r
+ /* Wait until the SDRAM controller is ready */ \r
+ while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+ {\r
+ }\r
+ /* Send the command */\r
+ FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);\r
+ \r
+/* Step 8 --------------------------------------------------------------------*/\r
+\r
+ /* Set the refresh rate counter */\r
+ /* (15.62 us x Freq) - 20 */\r
+ /* Set the device refresh counter */\r
+ FMC_SetRefreshCount(1386);\r
+ /* Wait until the SDRAM controller is ready */ \r
+ while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+ {\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ * @brief Writes a Entire-word buffer to the SDRAM memory. \r
+ * @param pBuffer: pointer to buffer. \r
+ * @param uwWriteAddress: SDRAM memory internal address from which the data will be \r
+ * written.\r
+ * @param uwBufferSize: number of words to write. \r
+ * @retval None.\r
+ */\r
+void SDRAM_WriteBuffer(uint32_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize)\r
+{\r
+ __IO uint32_t write_pointer = (uint32_t)uwWriteAddress;\r
+\r
+ /* Disable write protection */\r
+ FMC_SDRAMWriteProtectionConfig(FMC_Bank2_SDRAM, DISABLE);\r
+ \r
+ /* Wait until the SDRAM controller is ready */ \r
+ while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+ {\r
+ }\r
+\r
+ /* While there is data to write */\r
+ for (; uwBufferSize != 0; uwBufferSize--) \r
+ {\r
+ /* Transfer data to the memory */\r
+ *(uint32_t *) (SDRAM_BANK_ADDR + write_pointer) = *pBuffer++;\r
+\r
+ /* Increment the address*/\r
+ write_pointer += 4;\r
+ }\r
+ \r
+}\r
+\r
+/**\r
+ * @brief Reads data buffer from the SDRAM memory. \r
+ * @param pBuffer: pointer to buffer. \r
+ * @param ReadAddress: SDRAM memory internal address from which the data will be \r
+ * read.\r
+ * @param uwBufferSize: number of words to write. \r
+ * @retval None.\r
+ */\r
+void SDRAM_ReadBuffer(uint32_t* pBuffer, uint32_t uwReadAddress, uint32_t uwBufferSize)\r
+{\r
+ __IO uint32_t write_pointer = (uint32_t)uwReadAddress;\r
+ \r
+ \r
+ /* Wait until the SDRAM controller is ready */ \r
+ while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+ {\r
+ }\r
+ \r
+ /* Read data */\r
+ for(; uwBufferSize != 0x00; uwBufferSize--)\r
+ {\r
+ *pBuffer++ = *(__IO uint32_t *)(SDRAM_BANK_ADDR + write_pointer );\r
+ \r
+ /* Increment the address*/\r
+ write_pointer += 4;\r
+ } \r
+}\r
+\r
+#ifndef USE_Delay\r
+/**\r
+ * @brief Inserts a delay time.\r
+ * @param nCount: specifies the delay time length.\r
+ * @retval None\r
+ */\r
+static void delay(__IO uint32_t nCount)\r
+{\r
+ __IO uint32_t index = 0; \r
+ for(index = (100000 * nCount); index != 0; index--)\r
+ {\r
+ }\r
+}\r
+#endif /* USE_Delay */\r
+\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
--- /dev/null
+/**\r
+ ******************************************************************************\r
+ * @file stm32f429i_discovery_sdram.h\r
+ * @author MCD Application Team\r
+ * @version V1.0.1\r
+ * @date 28-October-2013\r
+ * @brief This file contains all the functions prototypes for the \r
+ * stm324x9i_disco_sdram.c driver.\r
+ ******************************************************************************\r
+ * @attention\r
+ *\r
+ * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+ *\r
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+ * You may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at:\r
+ *\r
+ * http://www.st.com/software_license_agreement_liberty_v2\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software \r
+ * distributed under the License is distributed on an "AS IS" BASIS, \r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ ******************************************************************************\r
+ */ \r
+\r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __STM32429I_DISCO_SDRAM_H\r
+#define __STM32429I_DISCO_SDRAM_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f4xx.h"\r
+\r
+/** @addtogroup Utilities\r
+ * @{\r
+ */\r
+ \r
+/** @addtogroup STM32F4_EVAL\r
+ * @{\r
+ */ \r
+\r
+/** @addtogroup STM32F429I_DISCOVERY\r
+ * @{\r
+ */\r
+ \r
+/** @addtogroup STM32F429I_DISCOVERY_SDRAM\r
+ * @{\r
+ */ \r
+ \r
+/** @defgroup STM32429I_DISCO_SDRAM_Private_Defines\r
+ * @{\r
+ */\r
+\r
+/**\r
+ * @brief FMC SDRAM Bank address\r
+ */ \r
+#define SDRAM_BANK_ADDR ((uint32_t)0xD0000000)\r
+ \r
+/**\r
+ * @brief FMC SDRAM Memory Width\r
+ */ \r
+/* #define SDRAM_MEMORY_WIDTH FMC_SDMemory_Width_8b */\r
+#define SDRAM_MEMORY_WIDTH FMC_SDMemory_Width_16b \r
+\r
+/**\r
+ * @brief FMC SDRAM CAS Latency\r
+ */ \r
+/* #define SDRAM_CAS_LATENCY FMC_CAS_Latency_2 */\r
+#define SDRAM_CAS_LATENCY FMC_CAS_Latency_3\r
+\r
+/**\r
+ * @brief FMC SDRAM Memory clock period\r
+ */ \r
+#define SDCLOCK_PERIOD FMC_SDClock_Period_2 /* Default configuration used with LCD */\r
+/* #define SDCLOCK_PERIOD FMC_SDClock_Period_3 */\r
+\r
+/**\r
+ * @brief FMC SDRAM Memory Read Burst feature\r
+ */ \r
+#define SDRAM_READBURST FMC_Read_Burst_Disable /* Default configuration used with LCD */\r
+/* #define SDRAM_READBURST FMC_Read_Burst_Enable */\r
+\r
+/**\r
+ * @brief FMC SDRAM Bank Remap\r
+ */ \r
+/* #define SDRAM_BANK_REMAP */ \r
+\r
+\r
+\r
+/**\r
+ * @brief Uncomment the line below if you want to use user defined Delay function\r
+ * (for precise timing), otherwise default _delay_ function defined within\r
+ * this driver is used (less precise timing). \r
+ */\r
+ \r
+/* #define USE_Delay */\r
+\r
+#ifdef USE_Delay\r
+ #define __Delay Delay /* User can provide more timing precise __Delay function\r
+ (with 10ms time base), using SysTick for example */\r
+#else\r
+ #define __Delay delay /* Default __Delay function with less precise timing */\r
+#endif\r
+\r
+/**\r
+ * @brief FMC SDRAM Mode definition register defines\r
+ */\r
+#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000)\r
+#define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001)\r
+#define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002)\r
+#define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004)\r
+#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000)\r
+#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008)\r
+#define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020)\r
+#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030)\r
+#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000)\r
+#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) \r
+#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200) \r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/** @defgroup STM32429I_DISCO_SDRAM_Exported_Functions\r
+ * @{\r
+ */ \r
+void SDRAM_Init(void);\r
+void SDRAM_GPIOConfig(void);\r
+void SDRAM_InitSequence(void);\r
+void SDRAM_WriteBuffer(uint32_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize);\r
+void SDRAM_ReadBuffer(uint32_t* pBuffer, uint32_t uwReadAddress, uint32_t uwBufferSize);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __STM32429I_DISCO_SDRAM_H */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+ \r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+/**\r
+ * @}\r
+ */ \r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r