From 2fff65aed2477a503c72629d27e2a330d30c02d1 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Wed, 25 Jan 2017 22:23:13 +0100 Subject: o Seemingly working Mutexes. o Dropping the privileged/unprivileged split for now. --- .../STM32_EVAL/STM3210E_EVAL/Release_Notes.html | 277 ++++ .../STM3210E_EVAL/stm3210e_eval_fsmc_sram.c | 243 +++ .../STM3210E_EVAL/stm3210e_eval_fsmc_sram.h | 110 ++ .../STM3210E_EVAL/stm3210e_eval_i2c_tsensor.c | 982 ++++++++++++ .../STM3210E_EVAL/stm3210e_eval_i2c_tsensor.h | 179 +++ .../STM32_EVAL/STM3210E_EVAL/stm3210e_eval_lcd.c | 1565 ++++++++++++++++++++ .../STM32_EVAL/STM3210E_EVAL/stm3210e_eval_lcd.h | 385 +++++ .../STM3210E_EVAL/stm3210e_eval_spi_flash.c | 546 +++++++ .../STM3210E_EVAL/stm3210e_eval_spi_flash.h | 157 ++ 9 files changed, 4444 insertions(+) create mode 100644 thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/Release_Notes.html create mode 100644 thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_fsmc_sram.c create mode 100644 thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_fsmc_sram.h create mode 100644 thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_i2c_tsensor.c create mode 100644 thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_i2c_tsensor.h create mode 100644 thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_lcd.c create mode 100644 thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_lcd.h create mode 100644 thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_spi_flash.c create mode 100644 thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_spi_flash.h (limited to 'thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL') diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/Release_Notes.html b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/Release_Notes.html new file mode 100644 index 0000000..5a4bcf1 --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/Release_Notes.html @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + Release Notes for STM3210E_EVAL Evaluation Board Drivers + + + + + + + + + +
+


+

+
+ + + + + + +
+ + + + + + + + + +
+

Back to Release page

+
+

Release +Notes for STM3210E_EVAL Evaluation Board Drivers

+

Copyright +2013 STMicroelectronics

+

+
+

 

+ + + + + + +
+

Contents

+
    +
  1. STM3210E_EVAL Evaluation Board Drivers +update History
  2. +
  3. License
  4. +
+ + +

STM3210E_EVAL Evaluation Board Drivers update History


+

V5.1.0 / 8-January-2013

+ + +

Main +Changes

+ + + +
    +
  • stm3210e_eval_lcd.c: update to support new LCD AM240320LGTNQW00H (controller HX8347-D)
  • +
+

V5.0.1 / 05-March-2012

+

Main +Changes

+ +
  • All source files: license disclaimer text update and add link to the License file on ST Internet.
+ + +

V5.0.0 / 03-February-2012

+

Main +Changes

+ +
  • All source files: update disclaimer to add reference to the new license agreement
  • Update STM32 Evaluation Board Drivers architecture and folder organization, full API compatibility maintained vs. V4.6.2
    • All the HW drivers required for each board are provided within this board folder. The concerned drivers are:
      • stm32_eval_i2c_ee.c\.h: I2C M24Cxx EEPROM memory driver
      • stm32_eval_i2c_tsensor.c\.h: I2C LM75 temperature sensor driver
      • stm32_eval_spi_flash.c\.h: SPI M25Pxxx FLASH memory driver
      • stm32_eval_sdio_sd.c\.h: SDIO SD Card memory driver
      • stm32_eval_spi_sd.c\.h: SPI SD Card memory driver 
      • These drivers were moved from \Common to \STM32XXX_EVAL folder(s)
    • \Common folder contains only drivers for the fonts and log module used by the LCD driver
    • stm32_eval.c\.h files removed, as consequence you need to perform the following update on your project configuration  (based on EVAL drivers V4.6.2):
      • In the project files, add your EVAL board driver source file "stm3210e_eval.c" instead of "stm32_eval.c"
      • Include your EVAL board driver header file #include "stm3210e_eval.h" instead of #include "stm32_eval.h"
      • If +you are using the EVAL board's LCD, you need to add the include of +the LCD header file #include "stm3210e_eval_lcd.h"
        • If +you are using the LCD log module, after copying it to the application +folder you have to edit it and update the name of the LCD header file. For more details, refer to the lcd_log_conf_template.h driver description.
  • stm3210e_eval_lcd.c
    • Remove “static” from TextColor and BackColor variables declaration (need to be changed from other application modules) 
  • stm3210e_eval.h/.c
    • change value of “SDIO_TRANSFER_CLK_DIV” define from 0 to 1 to achieve SD max frequency at 24MHz.
    • Remove SD_DMAEndOfTransferStatus() function as now the DMA transfer is tracked using DMA End of transfer interrupt.
    • Update SD_LowLevel_DMA_TxConfig() and SD_LowLevel_DMA_RxConfig() functions to enable the DMA transfer complete IT
  • stm3210e_eval_sdio_sd.h/.c
    • Add new function SD_ProcessDMAIRQ() to be called from the DMA end of transfer interrupt. 
    • Add some improvements by handling SDIO errors and adding timeout for different loops.
    • Update to support SDHC memory cards with capacity greater than 4 GB
      • SD_CardInfo structure, define CardCapacity variable as 64-bit long (instead of 32-bit)
      • Declare ReadAddr and WriteAddr parameters in SD_ReadBlock(),SD_WriteBlock(), SD_ReadMultiBlocks() and SD_WriteMultiBlocks() as 64-bit long (instead of 32-bit)
    • Refer to the driver header file's comments for more information on how to use the provided API.
  • stm3210e_eval_fsmc_nor.c
    • NOR_ProgramBuffer() function: remove this comment "This function must be used only with S29GL128P NOR memory."  

V4.6.2 / 22-July-2011

+

Main +Changes

+ +
  • STM3210C_EVAL
    • stm3210c_eval_lcd.c: update to support new LCD AM240320D5TOQW01H (controller ILI9325)
  • STM322xG-EVAL
    • stm322xg_eval.h: fix value of the SDIO clock divider (SDIO_TRANSFER_CLK_DIV constant) to 2 instead of 0
    • stm322xg_eval_lcd.c: increase FSMC AddressSetupTime value from 1 to 3 to be compliant with some LCD access timing
    • stm322xg_eval_audio_codec.c: update Codec_CtrlInterface_Init() and Codec_GPIO_Init() functions to not reconfigure the I2C peripheral if it's already enabled and configured (to +avoid configuring the I2C twice when using both Audio codec and IO +Expander drivers in the same application).

V4.6.1 / 18-April-2011

+

Main +Changes

+ +
  • Update some STM322xG_EVAL drivers (no change on the API) to fix warnings with TASKING C compiler.
  • Change the Release Notes name to STM32 Evaluation Board Drivers
  • stm322xg_eval.c
    • SD_LowLevel_Init(): change SDIO pins speed configuration to "GPIO_Speed_25MHz"

V4.6.0 / 11-March-2011

+

Main +Changes

+ +
  • Official version supporting STM322xG_EVAL evaluation board RevB (for STM32F2xx devices).
  • Common
    • Add +new LCD log utility drivers: The LCD Log module allows to automatically +set a header and footer on any application using the LCD display and +allows to dump user, debug and error messages by using the following +macros: LCD_ErrLog(),    LCD_UsrLog() and LCD_DbgLog().
Note: the STM322xG_EVAL board RevA was wrongly named STM3220F_EVAL

V4.5.0 / 07-March-2011

+

Main +Changes

+ +
  • stm32_eval_sdio_sd.c\.h: driver improvement
    • SD Clock increased to 24MHz to improve the data transfer performance.
    • Add +new functions to check the SDIO peripheral and SD Card status at any +time: SD_WaitReadOperation(), SD_WaitWriteOperation(). The +software sequence is little bit changed but without any impact on +driver API. For more details, refer to the stm32_eval_sdio_sd.c +driver description.
    • Add +new structure containing the SD Status register parameters. This +structure is called by the +         + SD_SendSDStatus() function.
    • Transfers mode updated
      • Read/Write Block using Polling and DMA modes
      • Read/Write Multi Blocks using DMA mode only
      • Interrupt mode removed
    • Data transfer functions are managing only fixed Block size (512-byte) 
  • STM32100B-EVAL
    • stm32100b_eval_cec.c: fix some strict ANSI-C errors
  • STM32100E-EVAL
    • stm32100e_eval_cec.c: fix some strict ANSI-C errors
+

V4.4.0 / 31-December-2010

+

Main +Changes

+ +
  • Add new directory for STM32L152-EVAL board containing the following files:
    • stm32l152_eval.h/.c, stm32l152_eval_lcd.h/.c, stm32l152_eval_glass_lcd.h/.c, stm32l152_eval_i2c_ee.h/.c
  • Add support for the STM32100E-EVAL Rev B: SPI FLASH CS pin "sFLASH_CS_PIN" changed from PB.02 to PE.06.
  • stm32100e_eval_lcd.h/.c: Add support for "LCD_ILI9325" LCD controller.
  • stm32100e_eval_fsmc_onenand.h/.c driver updated to correct asynchronous and synchronous read operations procedures.
    +
+ +

4.3.0 +- 10/15/2010

+
  1. General
+ +
  • I2C EEPROM, Temperature Sensor and IOE Expander drivers updated to use the DMA for read/write transfer and add more robustness
  • SD Card (SDIO) driver updated to add more robustness
  • SPI Flash and SD Card (SPI) drivers: SPI MISO pin configuration changed to Input Floating 
+ + + +
  1. Utilities
+ + + + + +
  • Add new directory for STM32100E-EVAL board containing the following files:
    • stm32100e_eval.h/.c, +stm32100e_eval_lcd.h/.c, stm32100e_eval_cec.h/.c, +stm32100e_eval_fsmc_onenand.h/.c, stm32100e_eval_fsmc_sram.h/.c, +stm32100e_eval_ioe.h/.c
      +
  • Common
    • stm32_eval_sdio_sd.c: +Update the DMA End of Transfer Check loop inside the SD_ReadBlock(), +SD_WriteBlock(), SD_ReadMultiBlocks() and SD_Write MultiBlocks().
    • stm32_eval_i2c_ee.c/.h
      +
      • Enhanced sEE_WaitEepromStandbyState() function for more robustness.
      • Enhanced Read and Write operations to manage I2C limitations.
      • Add Timeout management with user callback implementation which allows recovering from I2C bus errors.
      • Add +critical sections user callbacks allowing to disable then enable +interrupts when I2C operation require to be not interrupted.
    • stm32_eval_i2c_tsensor.c/.h
      +
      • Enhanced I2C communication functions by using DMA for registers Read and Write operations.
      • Add Timeout management with user callback implementation which allows recovering from I2C bus errors.
  • STM32100B_EVAL
    • stm32100b_eval.h: Add LM75 DMA defines.
    • stm32100b_eval_lcd.c: Change "SPI_FLASH" by "sFLASH" in LCD_DrawBMP() function.
  • STM3210B_EVAL
    • stm3210b_eval.h: Add LM75 DMA defines.
    • stm3210b_eval_lcd.c: Change "SPI_FLASH" by "sFLASH" in LCD_DrawBMP() function.
  • STM3210C_EVAL
    • stm3210c_eval.h: Add EEPROM driver Timeout define.
    • stm3210c_eval_lcd.c: Change "SPI_FLASH" by "sFLASH" in LCD_DrawBMP() function.
    • stm3210c_eval_i2c_ioe.c
      • Enhanced I2C communication functions by using DMA for registers Read and Write operations.
      • Add Timeout management with user callback implementation which allows recovering from I2C bus errors.
      • change IOE_I2C_SPEED from "400000" to "300000".
  • STM3210E_EVAL
    • stm3210e_eval.c: change "void SD_WaitForDMAEndOfTransfer(void)" to "uint32_t SD_DMAEndOfTransferStatus(void)".
    • stm3210e_eval.h: Add LM75 DMA defines.
    • stm3210e_eval_fsmc_nand.h: remove "NAND_CMD_AREA_TRUE1" define.
    • stm3210e_eval_fsmc_nand.c: Update FSMC timing in NAND_Init() function to be aligned with AN2784 application note.
    • stm3210e_eval_fsmc_nor.c
      • NOR_Init() function: add FSMC_AsynchronousWait field to FSMC_NORSRAMInitStructure 
    • stm3210e_eval_fsmc_sram.c
      +
      • Update FSMC timing in SRAM_Init() function to be aligned with AN2784 application note.
        +
      • SRAM_Init() function: add FSMC_AsynchronousWait field to FSMC_NORSRAMInitStructure 
    • stm3210e_eval_lcd.c
      • LCD_FSMCConfig() function: add FSMC_AsynchronousWait field to FSMC_NORSRAMInitStructure 
+ + +

4.2.0 +- 04/16/2010

+
  1. General
+ +
  • I2C EEPROM driver +update to use the DMA to +perform data transfer to/from EEPROM memory.
+ +
  1. Utilities
+
  • STM32_EVAL
+
    • stm32_eval_i2c_ee.c: +updated to use the DMA to perform data transfer to/from +EEPROM memory. For more details, refer to the description provided +within this file.
    • stm3210c_eval.c: add low level +functions to configure the DMA (needed for I2C EEPROM driver)
      +
    • stm3210c_eval_ioe.c: add a delay +in IOE_TS_GetState() function to wait till the end of ADC +conversion
    • stm3210e_eval_fsmc_nor.c: add PD6 pin configuration in +NOR_Init() function
    • stm3210b_eval_lcd.c: remove the +second ";" from "static void PutPixel(int16_t x, int16_t y);;" 
+

4.1.0 +- 03/01/2010

+
  1. General
+
  • Add support +for STM32 Low-density Value line (STM32F100x4/6) and +Medium-density Value line (STM32F100x8/B) devices.
  • Add support for the +STMicroelectronics STM32100B-EVAL evaluation board.
+
  1. Utilities
+
  • STM32_EVAL
+
  • Add new directory +"Common" containing a common drivers for all STM32 evaluation boards: +fonts.h/.c, stm32_eval_i2c_ee.h/.c, stm32_eval_spi_flash.h/.c, + stm32_eval_i2c_tsensor.h/.c, + stm32_eval_spi_sd.h/.c +and stm32_eval_sdio_sd.h/.c
  • Add new driver for the +STM32100B-EVAL managing Leds, push button and COM ports.
  • New HDMI CEC High level +driver.
    +
  • For all LCD drivers new fonts has +been added.
  • New FSMC memories +drivers for STM3210E-EVAL board: stm3210e_eval_fsmc_sram.h/.c, stm3210e_eval_fsmc_nor.h/.c +and stm3210e_eval_fsmc_nand.h/.c.

License

+

Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); You may not use this package except in compliance with the License. You may obtain a copy of the License at:


Unless +required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See +the License for the specific language governing permissions and +limitations under the License.
+ +
+
+

For +complete documentation on STM32 Microcontrollers +visit www.st.com/STM32

+
+

+
+
+

 

+
+ + \ No newline at end of file diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_fsmc_sram.c b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_fsmc_sram.c new file mode 100644 index 0000000..368fbf7 --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_fsmc_sram.c @@ -0,0 +1,243 @@ +/** + ****************************************************************************** + * @file stm3210e_eval_fsmc_sram.c + * @author MCD Application Team + * @version V5.1.0 + * @date 18-January-2013 + * @brief This file provides a set of functions needed to drive the + * IS61WV51216BLL SRAM memory mounted on STM3210E-EVAL board. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm3210e_eval_fsmc_sram.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL_FSMC_SRAM + * @brief This file provides a set of functions needed to drive the + * IS61WV51216BLL SRAM memory mounted on STM3210E-EVAL board. + * @{ + */ + +/** @defgroup STM3210E_EVAL_FSMC_SRAM_Private_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_FSMC_SRAM_Private_Defines + * @{ + */ +/** + * @brief FSMC Bank 1 NOR/SRAM3 + */ +#define Bank1_SRAM3_ADDR ((uint32_t)0x68000000) +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_FSMC_SRAM_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_FSMC_SRAM_Private_Variables + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_FSMC_SRAM_Private_Function_Prototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_FSMC_SRAM_Private_Functions + * @{ + */ + +/** + * @brief Configures the FSMC and GPIOs to interface with the SRAM memory. + * This function must be called before any write/read operation + * on the SRAM. + * @param None + * @retval None + */ +void SRAM_Init(void) +{ + FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; + FSMC_NORSRAMTimingInitTypeDef p; + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOE | + RCC_APB2Periph_GPIOF, ENABLE); + +/*-- GPIO Configuration ------------------------------------------------------*/ + /*!< SRAM Data lines configuration */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 | + GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | + GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | + GPIO_Pin_15; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + /*!< SRAM Address lines configuration */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | + GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 | + GPIO_Pin_14 | GPIO_Pin_15; + GPIO_Init(GPIOF, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | + GPIO_Pin_4 | GPIO_Pin_5; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + /*!< NOE and NWE configuration */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + /*!< NE3 configuration */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + /*!< NBL0, NBL1 configuration */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; + GPIO_Init(GPIOE, &GPIO_InitStructure); + +/*-- FSMC Configuration ------------------------------------------------------*/ + p.FSMC_AddressSetupTime = 0; + p.FSMC_AddressHoldTime = 0; + p.FSMC_DataSetupTime = 1; + p.FSMC_BusTurnAroundDuration = 0; + p.FSMC_CLKDivision = 0; + p.FSMC_DataLatency = 0; + p.FSMC_AccessMode = FSMC_AccessMode_A; + + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3; + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; + + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + + /*!< Enable FSMC Bank1_SRAM Bank */ + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); +} + +/** + * @brief Writes a Half-word buffer to the FSMC SRAM memory. + * @param pBuffer : pointer to buffer. + * @param WriteAddr : SRAM memory internal address from which the data will be + * written. + * @param NumHalfwordToWrite : number of half-words to write. + * @retval None + */ +void SRAM_WriteBuffer(uint16_t* pBuffer, uint32_t WriteAddr, uint32_t NumHalfwordToWrite) +{ + for(; NumHalfwordToWrite != 0; NumHalfwordToWrite--) /*!< while there is data to write */ + { + /*!< Transfer data to the memory */ + *(uint16_t *) (Bank1_SRAM3_ADDR + WriteAddr) = *pBuffer++; + + /*!< Increment the address*/ + WriteAddr += 2; + } +} + +/** + * @brief Reads a block of data from the FSMC SRAM memory. + * @param pBuffer : pointer to the buffer that receives the data read from the + * SRAM memory. + * @param ReadAddr : SRAM memory internal address to read from. + * @param NumHalfwordToRead : number of half-words to read. + * @retval None + */ +void SRAM_ReadBuffer(uint16_t* pBuffer, uint32_t ReadAddr, uint32_t NumHalfwordToRead) +{ + for(; NumHalfwordToRead != 0; NumHalfwordToRead--) /*!< while there is data to read */ + { + /*!< Read a half-word from the memory */ + *pBuffer++ = *(__IO uint16_t*) (Bank1_SRAM3_ADDR + ReadAddr); + + /*!< Increment the address*/ + ReadAddr += 2; + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_fsmc_sram.h b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_fsmc_sram.h new file mode 100644 index 0000000..31c1c88 --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_fsmc_sram.h @@ -0,0 +1,110 @@ +/** + ****************************************************************************** + * @file stm3210e_eval_fsmc_sram.h + * @author MCD Application Team + * @version V5.1.0 + * @date 18-January-2013 + * @brief This file contains all the functions prototypes for the + * stm3210e_eval_fsmc_sram firmware driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM3210E_EVAL_FSMC_SRAM_H +#define __STM3210E_EVAL_FSMC_SRAM_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f10x.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL_FSMC_SRAM + * @{ + */ + +/** @defgroup STM3210E_EVAL_FSMC_SRAM_Exported_Types + * @{ + */ +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_FSMC_SRAM_Exported_Constants + * @{ + */ +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_FSMC_SRAM_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_FSMC_SRAM_Exported_Functions + * @{ + */ + +void SRAM_Init(void); +void SRAM_WriteBuffer(uint16_t* pBuffer, uint32_t WriteAddr, uint32_t NumHalfwordToWrite); +void SRAM_ReadBuffer(uint16_t* pBuffer, uint32_t ReadAddr, uint32_t NumHalfwordToRead); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM3210E_EVAL_FSMC_SRAM_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_i2c_tsensor.c b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_i2c_tsensor.c new file mode 100644 index 0000000..b654eec --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_i2c_tsensor.c @@ -0,0 +1,982 @@ +/** + ****************************************************************************** + * @file stm3210e_eval_i2c_tsensor.c + * @author MCD Application Team + * @version V5.1.0 + * @date 18-January-2013 + * @brief This file provides a set of functions needed to manage the I2C LM75 + * temperature sensor mounted on STM3210E-EVAL board. + * It implements a high level communication layer for read and write + * from/to this sensor. The needed STM32 hardware resources (I2C and + * GPIO) are defined in stm3210e_eval.h file, and the initialization is + * performed in LM75_LowLevel_Init() function declared in stm3210e_eval.c + * file. + * + * Note: + * ----- + * This driver uses the DMA method to send and receive data on I2C bus, + * which allows higher efficiency and reliability of the communication. + * + * You can easily tailor this driver to any other development board, + * by just adapting the defines for hardware resources and + * LM75_LowLevel_Init() function. + * + * +-----------------------------------------------------------------+ + * | Pin assignment | + * +---------------------------------------+-----------+-------------+ + * | STM32 I2C Pins | STLM75 | Pin | + * +---------------------------------------+-----------+-------------+ + * | LM75_I2C_SDA_PIN/ SDA | SDA | 1 | + * | LM75_I2C_SCL_PIN/ SCL | SCL | 2 | + * | LM75_I2C_SMBUSALERT_PIN/ SMBUS ALERT | OS/INT | 3 | + * | . | GND | 4 (0V) | + * | . | GND | 5 (0V) | + * | . | GND | 6 (0V) | + * | . | GND | 7 (0V) | + * | . | VDD | 8 (3.3V)| + * +---------------------------------------+-----------+-------------+ + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm3210e_eval_i2c_tsensor.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL_I2C_TSENSOR + * @brief This file includes the LM75 Temperature Sensor driver of + * STM3210E-EVAL board. + * @{ + */ + +/** @defgroup STM3210E_EVAL_I2C_TSENSOR_Private_Types + * @{ + */ +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_I2C_TSENSOR_Private_Defines + * @{ + */ +#define LM75_SD_SET 0x01 /*!< Set SD bit in the configuration register */ +#define LM75_SD_RESET 0xFE /*!< Reset SD bit in the configuration register */ +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_I2C_TSENSOR_Private_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_I2C_TSENSOR_Private_Variables + * @{ + */ + +__IO uint32_t LM75_Timeout = LM75_LONG_TIMEOUT; +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_I2C_TSENSOR_Private_Function_Prototypes + * @{ + */ +static void LM75_DMA_Config(LM75_DMADirection_TypeDef Direction, uint8_t* buffer, uint8_t NumData); + +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_I2C_TSENSOR_Private_Functions + * @{ + */ + +/** + * @brief DeInitializes the LM75_I2C. + * @param None + * @retval None + */ +void LM75_DeInit(void) +{ + LM75_LowLevel_DeInit(); +} + +/** + * @brief Initializes the LM75_I2C. + * @param None + * @retval None + */ +void LM75_Init(void) +{ + I2C_InitTypeDef I2C_InitStructure; + + LM75_LowLevel_Init(); + + I2C_DeInit(LM75_I2C); + + /*!< LM75_I2C Init */ + I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusHost; + I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; + I2C_InitStructure.I2C_OwnAddress1 = 0x00; + I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; + I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; + I2C_InitStructure.I2C_ClockSpeed = LM75_I2C_SPEED; + I2C_Init(LM75_I2C, &I2C_InitStructure); + + /*!< Enable SMBus Alert interrupt */ + I2C_ITConfig(LM75_I2C, I2C_IT_ERR, ENABLE); + + /*!< LM75_I2C Init */ + I2C_Cmd(LM75_I2C, ENABLE); +} + + +/** + * @brief Configure the DMA Peripheral used to handle communication via I2C. + * @param None + * @retval None + */ + +static void LM75_DMA_Config(LM75_DMADirection_TypeDef Direction, uint8_t* buffer, uint8_t NumData) +{ + DMA_InitTypeDef DMA_InitStructure; + + RCC_AHBPeriphClockCmd(LM75_DMA_CLK, ENABLE); + + /* Initialize the DMA_PeripheralBaseAddr member */ + DMA_InitStructure.DMA_PeripheralBaseAddr = LM75_I2C_DR; + /* Initialize the DMA_MemoryBaseAddr member */ + DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buffer; + /* Initialize the DMA_PeripheralInc member */ + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + /* Initialize the DMA_MemoryInc member */ + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + /* Initialize the DMA_PeripheralDataSize member */ + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + /* Initialize the DMA_MemoryDataSize member */ + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + /* Initialize the DMA_Mode member */ + DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; + /* Initialize the DMA_Priority member */ + DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; + /* Initialize the DMA_M2M member */ + DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; + + /* If using DMA for Reception */ + if (Direction == LM75_DMA_RX) + { + /* Initialize the DMA_DIR member */ + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; + + /* Initialize the DMA_BufferSize member */ + DMA_InitStructure.DMA_BufferSize = NumData; + + DMA_DeInit(LM75_DMA_RX_CHANNEL); + + DMA_Init(LM75_DMA_RX_CHANNEL, &DMA_InitStructure); + } + /* If using DMA for Transmission */ + else if (Direction == LM75_DMA_TX) + { + /* Initialize the DMA_DIR member */ + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; + + /* Initialize the DMA_BufferSize member */ + DMA_InitStructure.DMA_BufferSize = NumData; + + DMA_DeInit(LM75_DMA_TX_CHANNEL); + + DMA_Init(LM75_DMA_TX_CHANNEL, &DMA_InitStructure); + } +} + + +/** + * @brief Checks the LM75 status. + * @param None + * @retval ErrorStatus: LM75 Status (ERROR or SUCCESS). + */ +ErrorStatus LM75_GetStatus(void) +{ + uint32_t I2C_TimeOut = I2C_TIMEOUT; + + /*!< Clear the LM75_I2C AF flag */ + I2C_ClearFlag(LM75_I2C, I2C_FLAG_AF); + + /*!< Enable LM75_I2C acknowledgement if it is already disabled by other function */ + I2C_AcknowledgeConfig(LM75_I2C, ENABLE); + + /*---------------------------- Transmission Phase ---------------------------*/ + + /*!< Send LM75_I2C START condition */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /*!< Test on LM75_I2C EV5 and clear it */ + while ((!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB)) && I2C_TimeOut) /*!< EV5 */ + { + I2C_TimeOut--; + } + if (I2C_TimeOut == 0) + { + return ERROR; + } + + I2C_TimeOut = I2C_TIMEOUT; + + /*!< Send STLM75 slave address for write */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Transmitter); + + while ((!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && I2C_TimeOut)/* EV6 */ + { + I2C_TimeOut--; + } + + if ((I2C_GetFlagStatus(LM75_I2C, I2C_FLAG_AF) != 0x00) || (I2C_TimeOut == 0)) + { + return ERROR; + } + else + { + return SUCCESS; + } +} +/** + * @brief Read the specified register from the LM75. + * @param RegName: specifies the LM75 register to be read. + * This member can be one of the following values: + * - LM75_REG_TEMP: temperature register + * - LM75_REG_TOS: Over-limit temperature register + * - LM75_REG_THYS: Hysteresis temperature register + * @retval LM75 register value. + */ +uint16_t LM75_ReadReg(uint8_t RegName) +{ + uint8_t LM75_BufferRX[2] ={0,0}; + uint16_t tmp = 0; + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BUSY)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure DMA Peripheral */ + LM75_DMA_Config(LM75_DMA_RX, (uint8_t*)LM75_BufferRX, 2); + + /* Enable DMA NACK automatic generation */ + I2C_DMALastTransferCmd(LM75_I2C, ENABLE); + + /* Enable the I2C peripheral */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Test on SB Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send device address for write */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Transmitter); + + /* Test on ADDR Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send the device's internal address to write to */ + I2C_SendData(LM75_I2C, RegName); + + /* Test on TXE FLag (data sent) */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while ((!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BTF))) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send START condition a second time */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Test on SB Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send LM75 address for read */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Receiver); + + /* Test on ADDR Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Enable I2C DMA request */ + I2C_DMACmd(LM75_I2C,ENABLE); + + /* Enable DMA RX Channel */ + DMA_Cmd(LM75_DMA_RX_CHANNEL, ENABLE); + + /* Wait until DMA Transfer Complete */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (!DMA_GetFlagStatus(LM75_DMA_RX_TCFLAG)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send STOP Condition */ + I2C_GenerateSTOP(LM75_I2C, ENABLE); + + /* Disable DMA RX Channel */ + DMA_Cmd(LM75_DMA_RX_CHANNEL, DISABLE); + + /* Disable I2C DMA request */ + I2C_DMACmd(LM75_I2C,DISABLE); + + /* Clear DMA RX Transfer Complete Flag */ + DMA_ClearFlag(LM75_DMA_RX_TCFLAG); + + /*!< Store LM75_I2C received data */ + tmp = (uint16_t)(LM75_BufferRX[0] << 8); + tmp |= LM75_BufferRX[1]; + + /* return a Reg value */ + return (uint16_t)tmp; +} + +/** + * @brief Write to the specified register of the LM75. + * @param RegName: specifies the LM75 register to be written. + * This member can be one of the following values: + * - LM75_REG_TOS: Over-limit temperature register + * - LM75_REG_THYS: Hysteresis temperature register + * @param RegValue: value to be written to LM75 register. + * @retval None + */ +uint8_t LM75_WriteReg(uint8_t RegName, uint16_t RegValue) +{ + uint8_t LM75_BufferTX[2] ={0,0}; + LM75_BufferTX[0] = (uint8_t)(RegValue >> 8); + LM75_BufferTX[1] = (uint8_t)(RegValue); + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BUSY)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure DMA Peripheral */ + LM75_DMA_Config(LM75_DMA_TX, (uint8_t*)LM75_BufferTX, 2); + + /* Enable the I2C peripheral */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Test on SB Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Transmit the slave address and enable writing operation */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Transmitter); + + /* Test on ADDR Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Transmit the first address for r/w operations */ + I2C_SendData(LM75_I2C, RegName); + + /* Test on TXE FLag (data sent) */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while ((!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BTF))) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Enable I2C DMA request */ + I2C_DMACmd(LM75_I2C,ENABLE); + + /* Enable DMA TX Channel */ + DMA_Cmd(LM75_DMA_TX_CHANNEL, ENABLE); + + /* Wait until DMA Transfer Complete */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (!DMA_GetFlagStatus(LM75_DMA_TX_TCFLAG)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Wait until BTF Flag is set before generating STOP */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BTF)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send STOP Condition */ + I2C_GenerateSTOP(LM75_I2C, ENABLE); + + /* Disable DMA TX Channel */ + DMA_Cmd(LM75_DMA_TX_CHANNEL, DISABLE); + + /* Disable I2C DMA request */ + I2C_DMACmd(LM75_I2C,DISABLE); + + /* Clear DMA TX Transfer Complete Flag */ + DMA_ClearFlag(LM75_DMA_TX_TCFLAG); + + return LM75_OK; +} + +/** + * @brief Read Temperature register of LM75: double temperature value. + * @param None + * @retval LM75 measured temperature value. + */ +uint16_t LM75_ReadTemp(void) +{ + uint8_t LM75_BufferRX[2] ={0,0}; + uint16_t tmp = 0; + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BUSY)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure DMA Peripheral */ + LM75_DMA_Config(LM75_DMA_RX, (uint8_t*)LM75_BufferRX, 2); + + /* Enable DMA NACK automatic generation */ + I2C_DMALastTransferCmd(LM75_I2C, ENABLE); + + /* Enable the I2C peripheral */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Test on SB Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send device address for write */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Transmitter); + + /* Test on ADDR Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send the device's internal address to write to */ + I2C_SendData(LM75_I2C, LM75_REG_TEMP); + + /* Test on TXE FLag (data sent) */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while ((!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BTF))) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send START condition a second time */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Test on SB Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send LM75 address for read */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Receiver); + + /* Test on ADDR Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Enable I2C DMA request */ + I2C_DMACmd(LM75_I2C,ENABLE); + + /* Enable DMA RX Channel */ + DMA_Cmd(LM75_DMA_RX_CHANNEL, ENABLE); + + /* Wait until DMA Transfer Complete */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (!DMA_GetFlagStatus(LM75_DMA_RX_TCFLAG)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send STOP Condition */ + I2C_GenerateSTOP(LM75_I2C, ENABLE); + + /* Disable DMA RX Channel */ + DMA_Cmd(LM75_DMA_RX_CHANNEL, DISABLE); + + /* Disable I2C DMA request */ + I2C_DMACmd(LM75_I2C,DISABLE); + + /* Clear DMA RX Transfer Complete Flag */ + DMA_ClearFlag(LM75_DMA_RX_TCFLAG); + + /*!< Store LM75_I2C received data */ + tmp = (uint16_t)(LM75_BufferRX[0] << 8); + tmp |= LM75_BufferRX[1]; + + /*!< Return Temperature value */ + return (uint16_t)(tmp >> 7); +} + +/** + * @brief Read the configuration register from the LM75. + * @param None + * @retval LM75 configuration register value. + */ +uint8_t LM75_ReadConfReg(void) +{ + uint8_t LM75_BufferRX[2] ={0,0}; + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BUSY)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure DMA Peripheral */ + LM75_DMA_Config(LM75_DMA_RX, (uint8_t*)LM75_BufferRX, 2); + + /* Enable DMA NACK automatic generation */ + I2C_DMALastTransferCmd(LM75_I2C, ENABLE); + + /* Enable the I2C peripheral */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Test on SB Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send device address for write */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Transmitter); + + /* Test on ADDR Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send the device's internal address to write to */ + I2C_SendData(LM75_I2C, LM75_REG_CONF); + + /* Test on TXE FLag (data sent) */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while ((!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BTF))) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send START condition a second time */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Test on SB Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send LM75 address for read */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Receiver); + + /* Test on ADDR Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Enable I2C DMA request */ + I2C_DMACmd(LM75_I2C,ENABLE); + + /* Enable DMA RX Channel */ + DMA_Cmd(LM75_DMA_RX_CHANNEL, ENABLE); + + /* Wait until DMA Transfer Complete */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (!DMA_GetFlagStatus(LM75_DMA_RX_TCFLAG)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send STOP Condition */ + I2C_GenerateSTOP(LM75_I2C, ENABLE); + + /* Disable DMA RX Channel */ + DMA_Cmd(LM75_DMA_RX_CHANNEL, DISABLE); + + /* Disable I2C DMA request */ + I2C_DMACmd(LM75_I2C,DISABLE); + + /* Clear DMA RX Transfer Complete Flag */ + DMA_ClearFlag(LM75_DMA_RX_TCFLAG); + + /*!< Return Temperature value */ + return (uint8_t)LM75_BufferRX[0]; +} + +/** + * @brief Write to the configuration register of the LM75. + * @param RegValue: sepecifies the value to be written to LM75 configuration + * register. + * @retval None + */ +uint8_t LM75_WriteConfReg(uint8_t RegValue) +{ + uint8_t LM75_BufferTX = 0; + LM75_BufferTX = (uint8_t)(RegValue); + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BUSY)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure DMA Peripheral */ + LM75_DMA_Config(LM75_DMA_TX, (uint8_t*)(&LM75_BufferTX), 1); + + /* Enable the I2C peripheral */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Test on SB Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Transmit the slave address and enable writing operation */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Transmitter); + + /* Test on ADDR Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Transmit the first address for r/w operations */ + I2C_SendData(LM75_I2C, LM75_REG_CONF); + + /* Test on TXE FLag (data sent) */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while ((!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BTF))) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Enable I2C DMA request */ + I2C_DMACmd(LM75_I2C,ENABLE); + + /* Enable DMA TX Channel */ + DMA_Cmd(LM75_DMA_TX_CHANNEL, ENABLE); + + /* Wait until DMA Transfer Complete */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (!DMA_GetFlagStatus(LM75_DMA_TX_TCFLAG)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Wait until BTF Flag is set before generating STOP */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while ((!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BTF))) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send STOP Condition */ + I2C_GenerateSTOP(LM75_I2C, ENABLE); + + /* Disable DMA TX Channel */ + DMA_Cmd(LM75_DMA_TX_CHANNEL, DISABLE); + + /* Disable I2C DMA request */ + I2C_DMACmd(LM75_I2C,DISABLE); + + /* Clear DMA TX Transfer Complete Flag */ + DMA_ClearFlag(LM75_DMA_TX_TCFLAG); + + return LM75_OK; + +} + +/** + * @brief Enables or disables the LM75. + * @param NewState: specifies the LM75 new status. This parameter can be ENABLE + * or DISABLE. + * @retval None + */ +uint8_t LM75_ShutDown(FunctionalState NewState) +{ + uint8_t LM75_BufferRX[2] ={0,0}; + uint8_t LM75_BufferTX = 0; + __IO uint8_t RegValue = 0; + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BUSY)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure DMA Peripheral */ + LM75_DMA_Config(LM75_DMA_RX, (uint8_t*)LM75_BufferRX, 2); + + /* Enable DMA NACK automatic generation */ + I2C_DMALastTransferCmd(LM75_I2C, ENABLE); + + /* Enable the I2C peripheral */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Test on SB Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send device address for write */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Transmitter); + + /* Test on ADDR Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send the device's internal address to write to */ + I2C_SendData(LM75_I2C, LM75_REG_CONF); + + /* Test on TXE FLag (data sent) */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while ((!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BTF))) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send START condition a second time */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Test on SB Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send LM75 address for read */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Receiver); + + /* Test on ADDR Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Enable I2C DMA request */ + I2C_DMACmd(LM75_I2C,ENABLE); + + /* Enable DMA RX Channel */ + DMA_Cmd(LM75_DMA_RX_CHANNEL, ENABLE); + + /* Wait until DMA Transfer Complete */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (!DMA_GetFlagStatus(LM75_DMA_RX_TCFLAG)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send STOP Condition */ + I2C_GenerateSTOP(LM75_I2C, ENABLE); + + /* Disable DMA RX Channel */ + DMA_Cmd(LM75_DMA_RX_CHANNEL, DISABLE); + + /* Disable I2C DMA request */ + I2C_DMACmd(LM75_I2C,DISABLE); + + /* Clear DMA RX Transfer Complete Flag */ + DMA_ClearFlag(LM75_DMA_RX_TCFLAG); + + /*!< Get received data */ + RegValue = (uint8_t)LM75_BufferRX[0]; + + /*---------------------------- Transmission Phase ---------------------------*/ + + /*!< Enable or disable SD bit */ + if (NewState != DISABLE) + { + /*!< Enable LM75 */ + LM75_BufferTX = RegValue & LM75_SD_RESET; + } + else + { + /*!< Disable LM75 */ + LM75_BufferTX = RegValue | LM75_SD_SET; + } + + /* Test on BUSY Flag */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BUSY)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Configure DMA Peripheral */ + LM75_DMA_Config(LM75_DMA_TX, (uint8_t*)(&LM75_BufferTX), 1); + + /* Enable the I2C peripheral */ + I2C_GenerateSTART(LM75_I2C, ENABLE); + + /* Test on SB Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_SB) == RESET) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Transmit the slave address and enable writing operation */ + I2C_Send7bitAddress(LM75_I2C, LM75_ADDR, I2C_Direction_Transmitter); + + /* Test on ADDR Flag */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while (!I2C_CheckEvent(LM75_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Transmit the first address for r/w operations */ + I2C_SendData(LM75_I2C, LM75_REG_CONF); + + /* Test on TXE FLag (data sent) */ + LM75_Timeout = LM75_FLAG_TIMEOUT; + while ((!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BTF))) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Enable I2C DMA request */ + I2C_DMACmd(LM75_I2C,ENABLE); + + /* Enable DMA TX Channel */ + DMA_Cmd(LM75_DMA_TX_CHANNEL, ENABLE); + + /* Wait until DMA Transfer Complete */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while (!DMA_GetFlagStatus(LM75_DMA_TX_TCFLAG)) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Wait until BTF Flag is set before generating STOP */ + LM75_Timeout = LM75_LONG_TIMEOUT; + while ((!I2C_GetFlagStatus(LM75_I2C,I2C_FLAG_BTF))) + { + if((LM75_Timeout--) == 0) return LM75_TIMEOUT_UserCallback(); + } + + /* Send STOP Condition */ + I2C_GenerateSTOP(LM75_I2C, ENABLE); + + /* Disable DMA TX Channel */ + DMA_Cmd(LM75_DMA_TX_CHANNEL, DISABLE); + + /* Disable I2C DMA request */ + I2C_DMACmd(LM75_I2C,DISABLE); + + /* Clear DMA TX Transfer Complete Flag */ + DMA_ClearFlag(LM75_DMA_TX_TCFLAG); + + return LM75_OK; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_i2c_tsensor.h b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_i2c_tsensor.h new file mode 100644 index 0000000..e1b22b6 --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_i2c_tsensor.h @@ -0,0 +1,179 @@ +/** + ****************************************************************************** + * @file stm3210e_eval_i2c_tsensor.h + * @author MCD Application Team + * @version V5.1.0 + * @date 18-January-2013 + * @brief This file contains all the functions prototypes for the + * stm3210e_eval_i2c_tsensor firmware driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM3210E_EVAL_I2C_TSENSOR_H +#define __STM3210E_EVAL_I2C_TSENSOR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm3210e_eval.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL_I2C_TSENSOR + * @{ + */ + +/** @defgroup STM3210E_EVAL_I2C_TSENSOR_Exported_Types + * @{ + */ + + /** + * @brief IOE DMA Direction + */ +typedef enum +{ + LM75_DMA_TX = 0, + LM75_DMA_RX = 1 +}LM75_DMADirection_TypeDef; + +/** + * @brief TSENSOR Status + */ +typedef enum +{ + LM75_OK = 0, + LM75_FAIL +}LM75_Status_TypDef; + +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_I2C_TSENSOR_Exported_Constants + * @{ + */ + +/* Uncomment the following line to use Timeout_User_Callback LM75_TimeoutUserCallback(). + If This Callback is enabled, it should be implemented by user in main function . + LM75_TimeoutUserCallback() function is called whenever a timeout condition + occure during communication (waiting on an event that doesn't occur, bus + errors, busy devices ...). */ +/* #define USE_TIMEOUT_USER_CALLBACK */ + +/* Maximum Timeout values for flags and events waiting loops. These timeouts are + not based on accurate values, they just guarantee that the application will + not remain stuck if the I2C communication is corrupted. + You may modify these timeout values depending on CPU frequency and application + conditions (interrupts routines ...). */ +#define LM75_FLAG_TIMEOUT ((uint32_t)0x1000) +#define LM75_LONG_TIMEOUT ((uint32_t)(10 * LM75_FLAG_TIMEOUT)) + + +/** + * @brief Block Size + */ +#define LM75_REG_TEMP 0x00 /*!< Temperature Register of LM75 */ +#define LM75_REG_CONF 0x01 /*!< Configuration Register of LM75 */ +#define LM75_REG_THYS 0x02 /*!< Temperature Register of LM75 */ +#define LM75_REG_TOS 0x03 /*!< Over-temp Shutdown threshold Register of LM75 */ +#define I2C_TIMEOUT ((uint32_t)0x3FFFF) /*!< I2C Time out */ +#define LM75_ADDR 0x90 /*!< LM75 address */ +#define LM75_I2C_SPEED 100000 /*!< I2C Speed */ + + + +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_I2C_TSENSOR_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_I2C_TSENSOR_Exported_Functions + * @{ + */ +void LM75_DeInit(void); +void LM75_Init(void); +ErrorStatus LM75_GetStatus(void); +uint16_t LM75_ReadTemp(void); +uint16_t LM75_ReadReg(uint8_t RegName); +uint8_t LM75_WriteReg(uint8_t RegName, uint16_t RegValue); +uint8_t LM75_ReadConfReg(void); +uint8_t LM75_WriteConfReg(uint8_t RegValue); +uint8_t LM75_ShutDown(FunctionalState NewState); + +/** + * @brief Timeout user callback function. This function is called when a timeout + * condition occurs during communication with IO Expander. Only protoype + * of this function is decalred in IO Expander driver. Its implementation + * may be done into user application. This function may typically stop + * current operations and reset the I2C peripheral and IO Expander. + * To enable this function use uncomment the define USE_TIMEOUT_USER_CALLBACK + * at the top of this file. + */ +#ifdef USE_TIMEOUT_USER_CALLBACK + uint8_t LM75_TIMEOUT_UserCallback(void); +#else + #define LM75_TIMEOUT_UserCallback() LM75_FAIL +#endif /* USE_TIMEOUT_USER_CALLBACK */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM3210E_EVAL_I2C_TSENSOR_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_lcd.c b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_lcd.c new file mode 100644 index 0000000..88cc61d --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_lcd.c @@ -0,0 +1,1565 @@ +/** + ****************************************************************************** + * @file stm3210e_eval_lcd.c + * @author MCD Application Team + * @version V5.1.0 + * @date 18-January-2013 + * @brief This file includes the LCD driver for AM-240320L8TNQW00H + * (LCD_ILI9320), AM-240320LDTNQW00H (LCD_SPFD5408B) + * and AM240320LGTNQW00H (HX8347-D) Liquid Crystal + * Display Module of STM3210E-EVAL board. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm3210e_eval_lcd.h" +#include "../Common/fonts.c" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL + * @{ + */ + +/** @defgroup STM3210E_EVAL_LCD + * @brief This file includes the LCD driver for AM-240320L8TNQW00H + * (LCD_ILI9320) and AM-240320LDTNQW00H (LCD_SPFD5408B) Liquid Crystal + * Display Module of STM3210E-EVAL board. + * @{ + */ + +/** @defgroup STM3210E_EVAL_LCD_Private_TypesDefinitions + * @{ + */ +typedef struct +{ + __IO uint16_t LCD_REG; + __IO uint16_t LCD_RAM; +} LCD_TypeDef; +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_LCD_Private_Defines + * @{ + */ +/* Note: LCD /CS is CE4 - Bank 4 of NOR/SRAM Bank 1~4 */ +#define LCD_BASE ((uint32_t)(0x60000000 | 0x0C000000)) +#define LCD ((LCD_TypeDef *) LCD_BASE) +#define MAX_POLY_CORNERS 200 +#define POLY_Y(Z) ((int32_t)((Points + Z)->X)) +#define POLY_X(Z) ((int32_t)((Points + Z)->Y)) +#define LCD_HX8347D 0x0047 + +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_LCD_Private_Macros + * @{ + */ +#define ABS(X) ((X) > 0 ? (X) : -(X)) +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_LCD_Private_Variables + * @{ + */ +static sFONT *LCD_Currentfonts; +/* Global variables to set the written text color */ +__IO uint16_t TextColor = 0x0000, BackColor = 0xFFFF; +static __IO uint16_t LCD_ID = 0; + +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_LCD_Private_FunctionPrototypes + * @{ + */ +#ifndef USE_Delay +static void delay(__IO uint32_t nCount); +#endif /* USE_Delay*/ +static void PutPixel(int16_t x, int16_t y); +static void LCD_PolyLineRelativeClosed(pPoint Points, uint16_t PointCount, uint16_t Closed); + +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_LCD_Private_Functions + * @{ + */ + +/** + * @brief DeInitializes the LCD. + * @param None + * @retval None + */ +void LCD_DeInit(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + /* LCD Display Off */ + LCD_DisplayOff(); + + /* BANK 4 (of NOR/SRAM Bank 1~4) is disabled */ + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); + + /* LCD_SPI DeInit */ + FSMC_NORSRAMDeInit(FSMC_Bank1_NORSRAM4); + + /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14), + PD.10(D15), PD.14(D0), PD.15(D1) as input floating */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | + GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | + GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_Init(GPIOD, &GPIO_InitStructure); + /* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10), + PE.14(D11), PE.15(D12) as alternate function push pull */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | + GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | + GPIO_Pin_15; + GPIO_Init(GPIOE, &GPIO_InitStructure); + /* Set PF.00(A0 (RS)) as alternate function push pull */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_Init(GPIOF, &GPIO_InitStructure); + /* Set PG.12(NE4 (LCD/CS)) as alternate function push pull - CE3(LCD /CS) */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; + GPIO_Init(GPIOG, &GPIO_InitStructure); +} + +/** + * @brief Initializes the LCD. + * @param None + * @retval None + */ +void STM3210E_LCD_Init(void) +{ + /* Configure the LCD Control pins */ + LCD_CtrlLinesConfig(); + + /* Configure the FSMC Parallel interface */ + LCD_FSMCConfig(); + + /* delay 50 ms */ + _delay_(5); + + /* Read the LCD ID */ + LCD_ID = LCD_ReadReg(0x00); + + /* Check if the LCD is HX8347D Controller */ + if(LCD_ID == LCD_HX8347D) + { + /* Driving ability setting */ + LCD_WriteReg(LCD_REG_234, 0x00); + LCD_WriteReg(LCD_REG_235, 0x20); + LCD_WriteReg(LCD_REG_236, 0x0C); + LCD_WriteReg(LCD_REG_237, 0xC4); + LCD_WriteReg(LCD_REG_232, 0x40); + LCD_WriteReg(LCD_REG_233, 0x38); + LCD_WriteReg(LCD_REG_241, 0x01); /* RGB 18-bit interface ;0x0110 */ + LCD_WriteReg(LCD_REG_242, 0x10); + LCD_WriteReg(LCD_REG_39, 0xA3); + + /* Adjust the Gamma Curve */ + LCD_WriteReg(LCD_REG_64, 0x01); + LCD_WriteReg(LCD_REG_65, 0x00); + LCD_WriteReg(LCD_REG_66, 0x00); + LCD_WriteReg(LCD_REG_67, 0x10); + LCD_WriteReg(LCD_REG_68, 0x0E); + LCD_WriteReg(LCD_REG_69, 0x24); + LCD_WriteReg(LCD_REG_70, 0x04); + LCD_WriteReg(LCD_REG_71, 0x50); + LCD_WriteReg(LCD_REG_72, 0x02); + LCD_WriteReg(LCD_REG_73, 0x13); + LCD_WriteReg(LCD_REG_74, 0x19); + LCD_WriteReg(LCD_REG_75, 0x19); + LCD_WriteReg(LCD_REG_76, 0x16); + + LCD_WriteReg(LCD_REG_80, 0x1B); + LCD_WriteReg(LCD_REG_81, 0x31); + LCD_WriteReg(LCD_REG_82, 0x2F); + LCD_WriteReg(LCD_REG_83, 0x3F); + LCD_WriteReg(LCD_REG_84, 0x3F); + LCD_WriteReg(LCD_REG_85, 0x3E); + LCD_WriteReg(LCD_REG_86, 0x2F); + LCD_WriteReg(LCD_REG_87, 0x7B); + LCD_WriteReg(LCD_REG_88, 0x09); + LCD_WriteReg(LCD_REG_89, 0x06); + LCD_WriteReg(LCD_REG_90, 0x06); + LCD_WriteReg(LCD_REG_91, 0x0C); + LCD_WriteReg(LCD_REG_92, 0x1D); + LCD_WriteReg(LCD_REG_93, 0xCC); + + /* Power voltage setting */ + LCD_WriteReg(LCD_REG_27, 0x1B); + LCD_WriteReg(LCD_REG_26, 0x01); + LCD_WriteReg(LCD_REG_36, 0x2F); + LCD_WriteReg(LCD_REG_37, 0x57); + /*****VCOM offset ****/ + LCD_WriteReg(LCD_REG_35, 0x86); + + /* Power on setting */ + LCD_WriteReg(LCD_REG_24, 0x36); /* Display frame rate:75Hz(2.85MHz X 117%) */ + LCD_WriteReg(LCD_REG_25, 0x01); /* Internal oscillator start to oscillate */ + LCD_WriteReg(LCD_REG_1,0x00); + LCD_WriteReg(LCD_REG_31, 0x88); /* Step-up Circuit 1 on,open abnormal power-off monitor */ + _delay_(6); + LCD_WriteReg(LCD_REG_31, 0x80); /* Step-up Circuit 1 off */ + _delay_(6); + LCD_WriteReg(LCD_REG_31, 0x90); /* VCOML voltage can output to negative voltage, + (1.0V ~ VCL+0.5V) */ + _delay_(6); + LCD_WriteReg(LCD_REG_31, 0xD0); /* Step-up Circuit 2 on */ + _delay_(6); + + LCD_WriteReg(LCD_REG_23, 0x05); /* COLMOD control */ + + /* Set GRAM Area - Partial Display Control */ + LCD_WriteReg(LCD_REG_1, 0x00); /* Scroll off */ + + LCD_WriteReg(LCD_REG_2, 0x00); + LCD_WriteReg(LCD_REG_3, 0x00); + LCD_WriteReg(LCD_REG_4, 0x01); /* X,Y swap */ + LCD_WriteReg(LCD_REG_5, 0x3F); /* X,Y swap */ + + LCD_WriteReg(LCD_REG_6, 0x00); + LCD_WriteReg(LCD_REG_7, 0x00); + LCD_WriteReg(LCD_REG_8, 0x00); /* X,Y swap */ + LCD_WriteReg(LCD_REG_9, 0xEF); /* X,Y swap */ + + /* Memory access control */ + /* bit7 controls left,right swap(X) */ + /* bit6 controls up,down swap(Y) */ + /* bit5 controls X,Y swap */ + LCD_WriteReg(LCD_REG_22, 0x28); + + /* SET PANEL */ + LCD_WriteReg(LCD_REG_54, 0x00); /* Panel characteristic control */ + LCD_WriteReg(LCD_REG_54, 0x04); /* Panel characteristic control: gate driver shift reverse[work] */ + LCD_WriteReg(LCD_REG_40, 0x38); /* Display control3: source output->PT(0,0) */ + _delay_(20); + LCD_WriteReg(LCD_REG_40, 0x3C); /* Display control3: source output->Display */ + } + else + { + /* Check if the LCD is SPFD5408B Controller */ + if(LCD_ReadReg(0x00) == 0x5408) + { + /* Start Initial Sequence ------------------------------------------------*/ + LCD_WriteReg(LCD_REG_1, 0x0100); /* Set SS bit */ + LCD_WriteReg(LCD_REG_2, 0x0700); /* Set 1 line inversion */ + LCD_WriteReg(LCD_REG_3, 0x1030); /* Set GRAM write direction and BGR=1. */ + LCD_WriteReg(LCD_REG_4, 0x0000); /* Resize register */ + LCD_WriteReg(LCD_REG_8, 0x0202); /* Set the back porch and front porch */ + LCD_WriteReg(LCD_REG_9, 0x0000); /* Set non-display area refresh cycle ISC[3:0] */ + LCD_WriteReg(LCD_REG_10, 0x0000); /* FMARK function */ + LCD_WriteReg(LCD_REG_12, 0x0000); /* RGB 18-bit System interface setting */ + LCD_WriteReg(LCD_REG_13, 0x0000); /* Frame marker Position */ + LCD_WriteReg(LCD_REG_15, 0x0000); /* RGB interface polarity, no impact */ + /* Power On sequence -----------------------------------------------------*/ + LCD_WriteReg(LCD_REG_16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + LCD_WriteReg(LCD_REG_17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ + LCD_WriteReg(LCD_REG_18, 0x0000); /* VREG1OUT voltage */ + LCD_WriteReg(LCD_REG_19, 0x0000); /* VDV[4:0] for VCOM amplitude */ + _delay_(60); /* Dis-charge capacitor power voltage (200ms) */ + LCD_WriteReg(LCD_REG_17, 0x0007); /* DC1[2:0], DC0[2:0], VC[2:0] */ + _delay_(20); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_16, 0x12B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + _delay_(20); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_18, 0x01BD); /* External reference voltage= Vci */ + _delay_(20); + LCD_WriteReg(LCD_REG_19, 0x1400); /* VDV[4:0] for VCOM amplitude */ + LCD_WriteReg(LCD_REG_41, 0x000E); /* VCM[4:0] for VCOMH */ + _delay_(20); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_32, 0x0000); /* GRAM horizontal Address */ + LCD_WriteReg(LCD_REG_33, 0x013F); /* GRAM Vertical Address */ + /* Adjust the Gamma Curve (SPFD5408B)-------------------------------------*/ + LCD_WriteReg(LCD_REG_48, 0x0b0d); + LCD_WriteReg(LCD_REG_49, 0x1923); + LCD_WriteReg(LCD_REG_50, 0x1c26); + LCD_WriteReg(LCD_REG_51, 0x261c); + LCD_WriteReg(LCD_REG_52, 0x2419); + LCD_WriteReg(LCD_REG_53, 0x0d0b); + LCD_WriteReg(LCD_REG_54, 0x1006); + LCD_WriteReg(LCD_REG_55, 0x0610); + LCD_WriteReg(LCD_REG_56, 0x0706); + LCD_WriteReg(LCD_REG_57, 0x0304); + LCD_WriteReg(LCD_REG_58, 0x0e05); + LCD_WriteReg(LCD_REG_59, 0x0e01); + LCD_WriteReg(LCD_REG_60, 0x010e); + LCD_WriteReg(LCD_REG_61, 0x050e); + LCD_WriteReg(LCD_REG_62, 0x0403); + LCD_WriteReg(LCD_REG_63, 0x0607); + /* Set GRAM area ---------------------------------------------------------*/ + LCD_WriteReg(LCD_REG_80, 0x0000); /* Horizontal GRAM Start Address */ + LCD_WriteReg(LCD_REG_81, 0x00EF); /* Horizontal GRAM End Address */ + LCD_WriteReg(LCD_REG_82, 0x0000); /* Vertical GRAM Start Address */ + LCD_WriteReg(LCD_REG_83, 0x013F); /* Vertical GRAM End Address */ + LCD_WriteReg(LCD_REG_96, 0xA700); /* Gate Scan Line */ + LCD_WriteReg(LCD_REG_97, 0x0001); /* NDL, VLE, REV */ + LCD_WriteReg(LCD_REG_106, 0x0000); /* set scrolling line */ + /* Partial Display Control -----------------------------------------------*/ + LCD_WriteReg(LCD_REG_128, 0x0000); + LCD_WriteReg(LCD_REG_129, 0x0000); + LCD_WriteReg(LCD_REG_130, 0x0000); + LCD_WriteReg(LCD_REG_131, 0x0000); + LCD_WriteReg(LCD_REG_132, 0x0000); + LCD_WriteReg(LCD_REG_133, 0x0000); + /* Panel Control ---------------------------------------------------------*/ + LCD_WriteReg(LCD_REG_144, 0x0010); + LCD_WriteReg(LCD_REG_146, 0x0000); + LCD_WriteReg(LCD_REG_147, 0x0003); + LCD_WriteReg(LCD_REG_149, 0x0110); + LCD_WriteReg(LCD_REG_151, 0x0000); + LCD_WriteReg(LCD_REG_152, 0x0000); + /* Set GRAM write direction and BGR=1 + I/D=01 (Horizontal : increment, Vertical : decrement) + AM=1 (address is updated in vertical writing direction) */ + LCD_WriteReg(LCD_REG_3, 0x1018); + LCD_WriteReg(LCD_REG_7, 0x0112); /* 262K color and display ON */ + LCD_SetFont(&LCD_DEFAULT_FONT); + return; + } + /* Start Initial Sequence ----------------------------------------------------*/ + LCD_WriteReg(LCD_REG_229,0x8000); /* Set the internal vcore voltage */ + LCD_WriteReg(LCD_REG_0, 0x0001); /* Start internal OSC. */ + LCD_WriteReg(LCD_REG_1, 0x0100); /* set SS and SM bit */ + LCD_WriteReg(LCD_REG_2, 0x0700); /* set 1 line inversion */ + LCD_WriteReg(LCD_REG_3, 0x1030); /* set GRAM write direction and BGR=1. */ + LCD_WriteReg(LCD_REG_4, 0x0000); /* Resize register */ + LCD_WriteReg(LCD_REG_8, 0x0202); /* set the back porch and front porch */ + LCD_WriteReg(LCD_REG_9, 0x0000); /* set non-display area refresh cycle ISC[3:0] */ + LCD_WriteReg(LCD_REG_10, 0x0000); /* FMARK function */ + LCD_WriteReg(LCD_REG_12, 0x0000); /* RGB interface setting */ + LCD_WriteReg(LCD_REG_13, 0x0000); /* Frame marker Position */ + LCD_WriteReg(LCD_REG_15, 0x0000); /* RGB interface polarity */ + /* Power On sequence ---------------------------------------------------------*/ + LCD_WriteReg(LCD_REG_16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + LCD_WriteReg(LCD_REG_17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ + LCD_WriteReg(LCD_REG_18, 0x0000); /* VREG1OUT voltage */ + LCD_WriteReg(LCD_REG_19, 0x0000); /* VDV[4:0] for VCOM amplitude */ + _delay_(20); /* Dis-charge capacitor power voltage (200ms) */ + LCD_WriteReg(LCD_REG_16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + LCD_WriteReg(LCD_REG_17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */ + _delay_(20); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_18, 0x0139); /* VREG1OUT voltage */ + _delay_(20); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_19, 0x1d00); /* VDV[4:0] for VCOM amplitude */ + LCD_WriteReg(LCD_REG_41, 0x0013); /* VCM[4:0] for VCOMH */ + _delay_(20); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_32, 0x0000); /* GRAM horizontal Address */ + LCD_WriteReg(LCD_REG_33, 0x0000); /* GRAM Vertical Address */ + /* Adjust the Gamma Curve ----------------------------------------------------*/ + LCD_WriteReg(LCD_REG_48, 0x0006); + LCD_WriteReg(LCD_REG_49, 0x0101); + LCD_WriteReg(LCD_REG_50, 0x0003); + LCD_WriteReg(LCD_REG_53, 0x0106); + LCD_WriteReg(LCD_REG_54, 0x0b02); + LCD_WriteReg(LCD_REG_55, 0x0302); + LCD_WriteReg(LCD_REG_56, 0x0707); + LCD_WriteReg(LCD_REG_57, 0x0007); + LCD_WriteReg(LCD_REG_60, 0x0600); + LCD_WriteReg(LCD_REG_61, 0x020b); + + /* Set GRAM area -------------------------------------------------------------*/ + LCD_WriteReg(LCD_REG_80, 0x0000); /* Horizontal GRAM Start Address */ + LCD_WriteReg(LCD_REG_81, 0x00EF); /* Horizontal GRAM End Address */ + LCD_WriteReg(LCD_REG_82, 0x0000); /* Vertical GRAM Start Address */ + LCD_WriteReg(LCD_REG_83, 0x013F); /* Vertical GRAM End Address */ + LCD_WriteReg(LCD_REG_96, 0x2700); /* Gate Scan Line */ + LCD_WriteReg(LCD_REG_97, 0x0001); /* NDL,VLE, REV */ + LCD_WriteReg(LCD_REG_106, 0x0000); /* set scrolling line */ + /* Partial Display Control ---------------------------------------------------*/ + LCD_WriteReg(LCD_REG_128, 0x0000); + LCD_WriteReg(LCD_REG_129, 0x0000); + LCD_WriteReg(LCD_REG_130, 0x0000); + LCD_WriteReg(LCD_REG_131, 0x0000); + LCD_WriteReg(LCD_REG_132, 0x0000); + LCD_WriteReg(LCD_REG_133, 0x0000); + /* Panel Control -------------------------------------------------------------*/ + LCD_WriteReg(LCD_REG_144, 0x0010); + LCD_WriteReg(LCD_REG_146, 0x0000); + LCD_WriteReg(LCD_REG_147, 0x0003); + LCD_WriteReg(LCD_REG_149, 0x0110); + LCD_WriteReg(LCD_REG_151, 0x0000); + LCD_WriteReg(LCD_REG_152, 0x0000); + /* Set GRAM write direction and BGR = 1 */ + /* I/D=01 (Horizontal : increment, Vertical : decrement) */ + /* AM=1 (address is updated in vertical writing direction) */ + LCD_WriteReg(LCD_REG_3, 0x1018); + LCD_WriteReg(LCD_REG_7, 0x0173); /* 262K color and display ON */ + } + LCD_SetFont(&LCD_DEFAULT_FONT); +} + +/** + * @brief Sets the LCD Text and Background colors. + * @param _TextColor: specifies the Text Color. + * @param _BackColor: specifies the Background Color. + * @retval None + */ +void LCD_SetColors(__IO uint16_t _TextColor, __IO uint16_t _BackColor) +{ + TextColor = _TextColor; + BackColor = _BackColor; +} + +/** + * @brief Gets the LCD Text and Background colors. + * @param _TextColor: pointer to the variable that will contain the Text + Color. + * @param _BackColor: pointer to the variable that will contain the Background + Color. + * @retval None + */ +void LCD_GetColors(__IO uint16_t *_TextColor, __IO uint16_t *_BackColor) +{ + *_TextColor = TextColor; + *_BackColor = BackColor; +} + +/** + * @brief Sets the Text color. + * @param Color: specifies the Text color code RGB(5-6-5). + * @retval None + */ +void LCD_SetTextColor(__IO uint16_t Color) +{ + TextColor = Color; +} + +/** + * @brief Sets the Background color. + * @param Color: specifies the Background color code RGB(5-6-5). + * @retval None + */ +void LCD_SetBackColor(__IO uint16_t Color) +{ + BackColor = Color; +} + +/** + * @brief Sets the Text Font. + * @param fonts: specifies the font to be used. + * @retval None + */ +void LCD_SetFont(sFONT *fonts) +{ + LCD_Currentfonts = fonts; +} + +/** + * @brief Gets the Text Font. + * @param None. + * @retval the used font. + */ +sFONT *LCD_GetFont(void) +{ + return LCD_Currentfonts; +} + +/** + * @brief Clears the selected line. + * @param Line: the Line to be cleared. + * This parameter can be one of the following values: + * @arg Linex: where x can be 0..n + * @retval None + */ +void LCD_ClearLine(uint16_t Line) +{ + uint16_t refcolumn = 319; + int16_t deltacolumn = -LCD_Currentfonts->Width; + uint32_t i = 0; + + /* Send the string character by character on lCD */ + while (i <= 320/LCD_Currentfonts->Width) + { + /* Display one character on LCD */ + LCD_DisplayChar(Line, refcolumn, ' '); + /* Decrement the column position by deltacolumn(16 or -16 for HX8347G) */ + refcolumn += deltacolumn; + /* Increment the character counter */ + i++; + } +} + +/** + * @brief Clears the hole LCD. + * @param Color: the color of the background. + * @retval None + */ +void LCD_Clear(uint16_t Color) +{ + uint32_t index = 0; + + if(LCD_ID == LCD_HX8347D) + { + LCD_SetCursor(0x00, 0x0000); + } + else + { + LCD_SetCursor(0x00, 0x013F); + } + + /* Prepare to write GRAM */ + LCD_WriteRAM_Prepare(); + for(index = 0; index < 76800; index++) + { + LCD->LCD_RAM = Color; + } +} + +/** + * @brief Sets the cursor position. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @retval None + */ +void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos) +{ + if(LCD_ID == LCD_HX8347D) + { + LCD_WriteReg(LCD_REG_2, Ypos >> 8); + LCD_WriteReg(LCD_REG_3, Ypos & 0xFF); + LCD_WriteReg(LCD_REG_6, 0x00); + LCD_WriteReg(LCD_REG_7, Xpos); + } + else + { + LCD_WriteReg(LCD_REG_32, Xpos); + LCD_WriteReg(LCD_REG_33, Ypos); + } +} + +/** + * @brief Draws a character on LCD. + * @param Xpos: the Line where to display the character shape. + * @param Ypos: start column address. + * @param *c: pointer to the character data. + * @retval None + */ +void LCD_DrawChar(uint16_t Xpos, uint16_t Ypos, const uint16_t *c) +{ + uint32_t index = 0, i = 0; + uint8_t Xaddress = 0; + + Xaddress = Xpos; + + LCD_SetCursor(Xaddress, Ypos); + + for(index = 0; index < LCD_Currentfonts->Height; index++) + { + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + for(i = 0; i < LCD_Currentfonts->Width; i++) + { + if((((c[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> i)) == 0x00) &&(LCD_Currentfonts->Width <= 12))|| + (((c[index] & (0x1 << i)) == 0x00)&&(LCD_Currentfonts->Width > 12 ))) + { + LCD_WriteRAM(BackColor); + } + else + { + LCD_WriteRAM(TextColor); + } + } + Xaddress++; + LCD_SetCursor(Xaddress, Ypos); + } +} + +/** + * @brief Displays one character (16dots width, 24dots height). + * @param Line: the Line where to display the character shape . + * This parameter can be one of the following values: + * @arg Linex: where x can be 0..9 + * @param Column: start column address. + * @param Ascii: character ascii code, must be between 0x20 and 0x7E. + * @retval None +*/ +void LCD_DisplayChar(uint16_t Line, uint16_t Column, uint8_t Ascii) +{ + Ascii -= 32; + if(LCD_ID == LCD_HX8347D) + { + Column = 319 - Column; + } + else + { + Column = Column; + } + + LCD_DrawChar(Line, Column, &LCD_Currentfonts->table[Ascii * LCD_Currentfonts->Height]); +} + +/** + * @brief Displays a maximum of 20 char on the LCD. + * @param Line: the Line where to display the character shape . + * This parameter can be one of the following values: + * @arg Linex: where x can be 0..9 + * @param *ptr: pointer to string to display on LCD. + * @retval None + */ +void LCD_DisplayStringLine(uint16_t Line, uint8_t *ptr) +{ + uint32_t i = 0; + uint16_t refcolumn = 0; + int16_t deltacolumn; + + refcolumn = 319; + deltacolumn = -LCD_Currentfonts->Width; + + /* Send the string character by character on lCD */ + while ((*ptr != 0) & (i < 320/LCD_Currentfonts->Width)) + { + /* Display one character on LCD */ + LCD_DisplayChar(Line, refcolumn, *ptr); + /* Decrement the column position by deltacolumn(16 or -16 for HX8347G) */ + refcolumn += deltacolumn; + /* Point on the next character */ + ptr++; + /* Increment the character counter */ + i++; + } +} + +/** + * @brief Sets a display window + * @param Xpos: specifies the X buttom left position. + * @param Ypos: specifies the Y buttom left position. + * @param Height: display window height. + * @param Width: display window width. + * @retval None + */ +void LCD_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint8_t Height, uint16_t Width) +{ + if(LCD_ID == LCD_HX8347D) + { + LCD_WriteReg(LCD_REG_2, (319 - Ypos) >> 8); /* SC */ + LCD_WriteReg(LCD_REG_3, (319 - Ypos) & 0xFF); /* SC */ + + LCD_WriteReg(LCD_REG_4, (319 - (Ypos - Width + 1)) >> 8); /* EC */ + LCD_WriteReg(LCD_REG_5, (319 - (Ypos - Width + 1)) & 0xFF); /* EC */ + + LCD_WriteReg(LCD_REG_6, 0x0); /* SP */ + LCD_WriteReg(LCD_REG_7, (239 - Xpos) & 0xFF); /* SP */ + + LCD_WriteReg(LCD_REG_8, 0x0); /* EP */ + LCD_WriteReg(LCD_REG_9, (239 - (Xpos - Height + 1)) & 0xFF); /* EP */ + } + else + { + /* Horizontal GRAM Start Address */ + if(Xpos >= Height) + { + LCD_WriteReg(LCD_REG_80, (Xpos - Height + 1)); + } + else + { + LCD_WriteReg(LCD_REG_80, 0); + } + /* Horizontal GRAM End Address */ + LCD_WriteReg(LCD_REG_81, Xpos); + /* Vertical GRAM Start Address */ + if(Ypos >= Width) + { + LCD_WriteReg(LCD_REG_82, (Ypos - Width + 1)); + } + else + { + LCD_WriteReg(LCD_REG_82, 0); + } + /* Vertical GRAM End Address */ + LCD_WriteReg(LCD_REG_83, Ypos); + LCD_SetCursor(Xpos, Ypos); + } +} + +/** + * @brief Disables LCD Window mode. + * @param None + * @retval None + */ +void LCD_WindowModeDisable(void) +{ + LCD_SetDisplayWindow(239, 0x13F, 240, 320); + + if(LCD_ReadReg(0x00) == LCD_HX8347D) + { + LCD_WriteReg(LCD_REG_22, 0x28); + } + else + { + LCD_WriteReg(LCD_REG_3, 0x1018); + } +} + +/** + * @brief Displays a line. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @param Length: line length. + * @param Direction: line direction. + * This parameter can be one of the following values: Vertical or Horizontal. + * @retval None + */ +void LCD_DrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction) +{ + uint32_t i = 0; + + if(LCD_ID == LCD_HX8347D) + { + LCD_SetCursor(Xpos, (LCD_PIXEL_WIDTH - 1) - Ypos); + } + else + { + LCD_SetCursor(Xpos, Ypos); + } + if(Direction == LCD_DIR_HORIZONTAL) + { + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + for(i = 0; i < Length; i++) + { + LCD_WriteRAM(TextColor); + } + } + else + { + for(i = 0; i < Length; i++) + { + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + LCD_WriteRAM(TextColor); + Xpos++; + if(LCD_ID == LCD_HX8347D) + { + LCD_SetCursor(Xpos, (LCD_PIXEL_WIDTH - 1) - Ypos); + } + else + { + LCD_SetCursor(Xpos, Ypos); + } + } + } +} + +/** + * @brief Displays a rectangle. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @param Height: display rectangle height. + * @param Width: display rectangle width. + * @retval None + */ +void LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint8_t Height, uint16_t Width) +{ + LCD_DrawLine(Xpos, Ypos, Width, LCD_DIR_HORIZONTAL); + LCD_DrawLine((Xpos + Height), Ypos, Width, LCD_DIR_HORIZONTAL); + + LCD_DrawLine(Xpos, Ypos, Height, LCD_DIR_VERTICAL); + LCD_DrawLine(Xpos, (Ypos - Width + 1), Height, LCD_DIR_VERTICAL); +} + +/** + * @brief Displays a circle. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @param Radius + * @retval None + */ +void LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius) +{ + int32_t D;/* Decision Variable */ + uint32_t CurX;/* Current X Value */ + uint32_t CurY;/* Current Y Value */ + + if(LCD_ID == LCD_HX8347D) + { + Ypos = (LCD_PIXEL_WIDTH - 1) - Ypos; + } + D = 3 - (Radius << 1); + CurX = 0; + CurY = Radius; + + while (CurX <= CurY) + { + LCD_SetCursor(Xpos + CurX, Ypos + CurY); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + LCD_WriteRAM(TextColor); + LCD_SetCursor(Xpos + CurX, Ypos - CurY); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + LCD_WriteRAM(TextColor); + LCD_SetCursor(Xpos - CurX, Ypos + CurY); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + LCD_WriteRAM(TextColor); + LCD_SetCursor(Xpos - CurX, Ypos - CurY); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + LCD_WriteRAM(TextColor); + LCD_SetCursor(Xpos + CurY, Ypos + CurX); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + LCD_WriteRAM(TextColor); + LCD_SetCursor(Xpos + CurY, Ypos - CurX); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + LCD_WriteRAM(TextColor); + LCD_SetCursor(Xpos - CurY, Ypos + CurX); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + LCD_WriteRAM(TextColor); + LCD_SetCursor(Xpos - CurY, Ypos - CurX); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + LCD_WriteRAM(TextColor); + if (D < 0) + { + D += (CurX << 2) + 6; + } + else + { + D += ((CurX - CurY) << 2) + 10; + CurY--; + } + CurX++; + } +} + +/** + * @brief Displays a monocolor picture. + * @param *Pict: pointer to the picture array. + * @retval None + */ +void LCD_DrawMonoPict(const uint32_t *Pict) +{ + uint32_t index = 0, i = 0; + + if(LCD_ID == LCD_HX8347D) + { + LCD_SetCursor(0, 0); + } + else + { + LCD_SetCursor(0, (LCD_PIXEL_WIDTH - 1)); + } + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + for(index = 0; index < 2400; index++) + { + for(i = 0; i < 32; i++) + { + if((Pict[index] & (1 << i)) == 0x00) + { + LCD_WriteRAM(BackColor); + } + else + { + LCD_WriteRAM(TextColor); + } + } + } +} + +/** + * @brief Displays a bitmap picture loaded in the internal Flash. + * @param BmpAddress: Bmp picture address in the internal Flash. + * @retval None + */ +void LCD_WriteBMP(uint32_t BmpAddress) +{ + uint32_t index = 0, size = 0; + /* Read bitmap size */ + size = *(__IO uint16_t *) (BmpAddress + 2); + size |= (*(__IO uint16_t *) (BmpAddress + 4)) << 16; + /* Get bitmap data address offset */ + index = *(__IO uint16_t *) (BmpAddress + 10); + index |= (*(__IO uint16_t *) (BmpAddress + 12)) << 16; + size = (size - index)/2; + BmpAddress += index; + /* Set GRAM write direction and BGR = 1 */ + /* I/D=00 (Horizontal : decrement, Vertical : decrement) */ + /* AM=1 (address is updated in vertical writing direction) */ + if(LCD_ReadReg(0x00) == LCD_HX8347D) + { + LCD_WriteReg(LCD_REG_22, 0x68); + } + else + { + LCD_WriteReg(LCD_REG_3, 0x1008); + } + + LCD_WriteRAM_Prepare(); + + for(index = 0; index < size; index++) + { + LCD_WriteRAM(*(__IO uint16_t *)BmpAddress); + BmpAddress += 2; + } + + /* Set GRAM write direction and BGR = 1 */ + /* I/D = 01 (Horizontal : increment, Vertical : decrement) */ + /* AM = 1 (address is updated in vertical writing direction) */ + if(LCD_ReadReg(0x00) == LCD_HX8347D) + { + LCD_WriteReg(LCD_REG_22, 0x28); + } + else + { + LCD_WriteReg(LCD_REG_3, 0x1018); + LCD_SetCursor(0,0); + } +} + +/** + * @brief Displays a full rectangle. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @param Height: rectangle height. + * @param Width: rectangle width. + * @retval None + */ +void LCD_DrawFullRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height) +{ + LCD_SetTextColor(TextColor); + + LCD_DrawLine(Xpos, Ypos, Width, LCD_DIR_HORIZONTAL); + LCD_DrawLine((Xpos + Height), Ypos, Width, LCD_DIR_HORIZONTAL); + + LCD_DrawLine(Xpos, Ypos, Height, LCD_DIR_VERTICAL); + LCD_DrawLine(Xpos, (Ypos - Width + 1), Height, LCD_DIR_VERTICAL); + + Width -= 2; + Height--; + Ypos--; + + LCD_SetTextColor(BackColor); + + while(Height--) + { + LCD_DrawLine(++Xpos, Ypos, Width, LCD_DIR_HORIZONTAL); + } + + LCD_SetTextColor(TextColor); +} + +/** + * @brief Displays a full circle. + * @param Xpos: specifies the X position. + * @param Ypos: specifies the Y position. + * @param Radius + * @retval None + */ +void LCD_DrawFullCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius) +{ + int32_t D; /* Decision Variable */ + uint32_t CurX;/* Current X Value */ + uint32_t CurY;/* Current Y Value */ + + D = 3 - (Radius << 1); + + CurX = 0; + CurY = Radius; + + LCD_SetTextColor(BackColor); + + while (CurX <= CurY) + { + if(CurY > 0) + { + LCD_DrawLine(Xpos - CurX, Ypos + CurY, 2*CurY, LCD_DIR_HORIZONTAL); + LCD_DrawLine(Xpos + CurX, Ypos + CurY, 2*CurY, LCD_DIR_HORIZONTAL); + } + + if(CurX > 0) + { + LCD_DrawLine(Xpos - CurY, Ypos + CurX, 2*CurX, LCD_DIR_HORIZONTAL); + LCD_DrawLine(Xpos + CurY, Ypos + CurX, 2*CurX, LCD_DIR_HORIZONTAL); + } + if (D < 0) + { + D += (CurX << 2) + 6; + } + else + { + D += ((CurX - CurY) << 2) + 10; + CurY--; + } + CurX++; + } + + LCD_SetTextColor(TextColor); + LCD_DrawCircle(Xpos, Ypos, Radius); +} + +/** + * @brief Displays an uni line (between two points). + * @param x1: specifies the point 1 x position. + * @param y1: specifies the point 1 y position. + * @param x2: specifies the point 2 x position. + * @param y2: specifies the point 2 y position. + * @retval None + */ +void LCD_DrawUniLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) +{ + int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0, + yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0, + curpixel = 0; + + deltax = ABS(x2 - x1); /* The difference between the x's */ + deltay = ABS(y2 - y1); /* The difference between the y's */ + x = x1; /* Start x off at the first pixel */ + y = y1; /* Start y off at the first pixel */ + + if (x2 >= x1) /* The x-values are increasing */ + { + xinc1 = 1; + xinc2 = 1; + } + else /* The x-values are decreasing */ + { + xinc1 = -1; + xinc2 = -1; + } + + if (y2 >= y1) /* The y-values are increasing */ + { + yinc1 = 1; + yinc2 = 1; + } + else /* The y-values are decreasing */ + { + yinc1 = -1; + yinc2 = -1; + } + + if (deltax >= deltay) /* There is at least one x-value for every y-value */ + { + xinc1 = 0; /* Don't change the x when numerator >= denominator */ + yinc2 = 0; /* Don't change the y for every iteration */ + den = deltax; + num = deltax / 2; + numadd = deltay; + numpixels = deltax; /* There are more x-values than y-values */ + } + else /* There is at least one y-value for every x-value */ + { + xinc2 = 0; /* Don't change the x for every iteration */ + yinc1 = 0; /* Don't change the y when numerator >= denominator */ + den = deltay; + num = deltay / 2; + numadd = deltax; + numpixels = deltay; /* There are more y-values than x-values */ + } + + for (curpixel = 0; curpixel <= numpixels; curpixel++) + { + PutPixel(x, y); /* Draw the current pixel */ + num += numadd; /* Increase the numerator by the top of the fraction */ + if (num >= den) /* Check if numerator >= denominator */ + { + num -= den; /* Calculate the new numerator value */ + x += xinc1; /* Change the x as appropriate */ + y += yinc1; /* Change the y as appropriate */ + } + x += xinc2; /* Change the x as appropriate */ + y += yinc2; /* Change the y as appropriate */ + } +} + +/** + * @brief Displays an poly-line (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @retval None + */ +void LCD_PolyLine(pPoint Points, uint16_t PointCount) +{ + int16_t X = 0, Y = 0; + + if(PointCount < 2) + { + return; + } + + while(--PointCount) + { + X = Points->X; + Y = Points->Y; + Points++; + LCD_DrawUniLine(X, Y, Points->X, Points->Y); + } +} + +/** + * @brief Displays an relative poly-line (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @param Closed: specifies if the draw is closed or not. + * 1: closed, 0 : not closed. + * @retval None + */ +static void LCD_PolyLineRelativeClosed(pPoint Points, uint16_t PointCount, uint16_t Closed) +{ + int16_t X = 0, Y = 0; + pPoint First = Points; + + if(PointCount < 2) + { + return; + } + X = Points->X; + Y = Points->Y; + while(--PointCount) + { + Points++; + LCD_DrawUniLine(X, Y, X + Points->X, Y + Points->Y); + X = X + Points->X; + Y = Y + Points->Y; + } + if(Closed) + { + LCD_DrawUniLine(First->X, First->Y, X, Y); + } +} + +/** + * @brief Displays a closed poly-line (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @retval None + */ +void LCD_ClosedPolyLine(pPoint Points, uint16_t PointCount) +{ + LCD_PolyLine(Points, PointCount); + LCD_DrawUniLine(Points->X, Points->Y, (Points+PointCount-1)->X, (Points+PointCount-1)->Y); +} + +/** + * @brief Displays a relative poly-line (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @retval None + */ +void LCD_PolyLineRelative(pPoint Points, uint16_t PointCount) +{ + LCD_PolyLineRelativeClosed(Points, PointCount, 0); +} + +/** + * @brief Displays a closed relative poly-line (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @retval None + */ +void LCD_ClosedPolyLineRelative(pPoint Points, uint16_t PointCount) +{ + LCD_PolyLineRelativeClosed(Points, PointCount, 1); +} + +/** + * @brief Displays a full poly-line (between many points). + * @param Points: pointer to the points array. + * @param PointCount: Number of points. + * @retval None + */ +void LCD_FillPolyLine(pPoint Points, uint16_t PointCount) +{ + /* public-domain code by Darel Rex Finley, 2007 */ + uint16_t nodes = 0, nodeX[MAX_POLY_CORNERS], pixelX = 0, pixelY = 0, i = 0, + j = 0, swap = 0; + uint16_t IMAGE_LEFT = 0, IMAGE_RIGHT = 0, IMAGE_TOP = 0, IMAGE_BOTTOM = 0; + + IMAGE_LEFT = IMAGE_RIGHT = Points->X; + IMAGE_TOP= IMAGE_BOTTOM = Points->Y; + + for(i = 1; i < PointCount; i++) + { + pixelX = POLY_X(i); + if(pixelX < IMAGE_LEFT) + { + IMAGE_LEFT = pixelX; + } + if(pixelX > IMAGE_RIGHT) + { + IMAGE_RIGHT = pixelX; + } + + pixelY = POLY_Y(i); + if(pixelY < IMAGE_TOP) + { + IMAGE_TOP = pixelY; + } + if(pixelY > IMAGE_BOTTOM) + { + IMAGE_BOTTOM = pixelY; + } + } + + LCD_SetTextColor(BackColor); + + /* Loop through the rows of the image. */ + for (pixelY = IMAGE_TOP; pixelY < IMAGE_BOTTOM; pixelY++) + { + /* Build a list of nodes. */ + nodes = 0; j = PointCount-1; + + for (i = 0; i < PointCount; i++) + { + if (((POLY_Y(i)<(double) pixelY) && (POLY_Y(j)>=(double) pixelY)) || \ + ((POLY_Y(j)<(double) pixelY) && (POLY_Y(i)>=(double) pixelY))) + { + nodeX[nodes++]=(int) (POLY_X(i)+((pixelY-POLY_Y(i))*(POLY_X(j)-POLY_X(i)))/(POLY_Y(j)-POLY_Y(i))); + } + j = i; + } + + /* Sort the nodes, via a simple "Bubble" sort. */ + i = 0; + while (i < nodes-1) + { + if (nodeX[i]>nodeX[i+1]) + { + swap = nodeX[i]; + nodeX[i] = nodeX[i+1]; + nodeX[i+1] = swap; + if(i) + { + i--; + } + } + else + { + i++; + } + } + + /* Fill the pixels between node pairs. */ + for (i = 0; i < nodes; i+=2) + { + if(nodeX[i] >= IMAGE_RIGHT) + { + break; + } + if(nodeX[i+1] > IMAGE_LEFT) + { + if (nodeX[i] < IMAGE_LEFT) + { + nodeX[i]=IMAGE_LEFT; + } + if(nodeX[i+1] > IMAGE_RIGHT) + { + nodeX[i+1] = IMAGE_RIGHT; + } + LCD_SetTextColor(BackColor); + LCD_DrawLine(pixelY, nodeX[i+1], nodeX[i+1] - nodeX[i], LCD_DIR_HORIZONTAL); + LCD_SetTextColor(TextColor); + PutPixel(pixelY, nodeX[i+1]); + PutPixel(pixelY, nodeX[i]); + /* for (j=nodeX[i]; jLCD_REG = LCD_Reg; + /* Write 16-bit Reg */ + LCD->LCD_RAM = LCD_RegValue; +} + +/** + * @brief Reads the selected LCD Register. + * @param LCD_Reg: address of the selected register. + * @retval LCD Register Value. + */ +uint16_t LCD_ReadReg(uint8_t LCD_Reg) +{ + /* Write 16-bit Index (then Read Reg) */ + LCD->LCD_REG = LCD_Reg; + /* Read 16-bit Reg */ + return (LCD->LCD_RAM); +} + +/** + * @brief Prepare to write to the LCD RAM. + * @param None + * @retval None + */ +void LCD_WriteRAM_Prepare(void) +{ + LCD->LCD_REG = LCD_REG_34; +} + +/** + * @brief Writes to the LCD RAM. + * @param RGB_Code: the pixel color in RGB mode (5-6-5). + * @retval None + */ +void LCD_WriteRAM(uint16_t RGB_Code) +{ + /* Write 16-bit GRAM Reg */ + LCD->LCD_RAM = RGB_Code; +} + +/** + * @brief Reads the LCD RAM. + * @param None + * @retval LCD RAM Value. + */ +uint16_t LCD_ReadRAM(void) +{ + /* Write 16-bit Index (then Read Reg) */ + LCD->LCD_REG = LCD_REG_34; /* Select GRAM Reg */ + /* Read 16-bit Reg */ + return LCD->LCD_RAM; +} + +/** + * @brief Power on the LCD. + * @param None + * @retval None + */ +void LCD_PowerOn(void) +{ + if(LCD_ID == LCD_HX8347D) + { + /* Power on setting */ + LCD_WriteReg(LCD_REG_24, 0x36); /* Display frame rate:75Hz(2.85MHz X 117%) */ + LCD_WriteReg(LCD_REG_25, 0x01); /* Internal oscillator start to oscillate */ + LCD_WriteReg(LCD_REG_1,0x00); + LCD_WriteReg(LCD_REG_31, 0x88); /* Step-up Circuit 1 on,open abnormal power-off monitor */ + _delay_(6); + LCD_WriteReg(LCD_REG_31, 0x80); /* Step-up Circuit 1 off */ + _delay_(6); + LCD_WriteReg(LCD_REG_31, 0x90); /* VCOML voltage can output to negative voltage, (1.0V ~ VCL+0.5V) */ + _delay_(6); + LCD_WriteReg(LCD_REG_31, 0xD0); /* Step-up Circuit 2 on */ + _delay_(6); + + LCD_WriteReg(LCD_REG_23, 0x05); /* COLMOD control */ + } + else + { + /* Power On sequence ---------------------------------------------------------*/ + LCD_WriteReg(LCD_REG_16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + LCD_WriteReg(LCD_REG_17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ + LCD_WriteReg(LCD_REG_18, 0x0000); /* VREG1OUT voltage */ + LCD_WriteReg(LCD_REG_19, 0x0000); /* VDV[4:0] for VCOM amplitude*/ + _delay_(20); /* Dis-charge capacitor power voltage (200ms) */ + LCD_WriteReg(LCD_REG_16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + LCD_WriteReg(LCD_REG_17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */ + _delay_(5); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_18, 0x0139); /* VREG1OUT voltage */ + _delay_(5); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_19, 0x1d00); /* VDV[4:0] for VCOM amplitude */ + LCD_WriteReg(LCD_REG_41, 0x0013); /* VCM[4:0] for VCOMH */ + _delay_(5); /* Delay 50 ms */ + LCD_WriteReg(LCD_REG_7, 0x0173); /* 262K color and display ON */ + } +} + +/** + * @brief Enables the Display. + * @param None + * @retval None + */ +void LCD_DisplayOn(void) +{ + if(LCD_ID == LCD_HX8347D) + { + LCD_WriteReg(LCD_REG_40, 0x38); + _delay_(6); + LCD_WriteReg(LCD_REG_40, 0x3C); + } + else + { + /* Display On */ + LCD_WriteReg(LCD_REG_7, 0x0173); /* 262K color and display ON */ + } +} + +/** + * @brief Disables the Display. + * @param None + * @retval None + */ +void LCD_DisplayOff(void) +{ + if(LCD_ID == LCD_HX8347D) + { + LCD_WriteReg(LCD_REG_40, 0x38); + _delay_(6); + LCD_WriteReg(LCD_REG_40, 0x04); + } + else + { + /* Display Off */ + LCD_WriteReg(LCD_REG_7, 0x0); + } +} + +/** + * @brief Configures LCD Control lines (FSMC Pins) in alternate function mode. + * @param None + * @retval None + */ +void LCD_CtrlLinesConfig(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + /* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | + RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG | + RCC_APB2Periph_AFIO, ENABLE); + /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14), + PD.10(D15), PD.14(D0), PD.15(D1) as alternate function push pull */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | + GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | + GPIO_Pin_15; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOD, &GPIO_InitStructure); + /* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10), + PE.14(D11), PE.15(D12) as alternate function push pull */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | + GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | + GPIO_Pin_15; + GPIO_Init(GPIOE, &GPIO_InitStructure); + /* Set PF.00(A0 (RS)) as alternate function push pull */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_Init(GPIOF, &GPIO_InitStructure); + /* Set PG.12(NE4 (LCD/CS)) as alternate function push pull - CE3(LCD /CS) */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; + GPIO_Init(GPIOG, &GPIO_InitStructure); +} + +/** + * @brief Configures the Parallel interface (FSMC) for LCD(Parallel mode) + * @param None + * @retval None + */ +void LCD_FSMCConfig(void) +{ + FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; + FSMC_NORSRAMTimingInitTypeDef p; + /*-- FSMC Configuration -----------------------------------------------------*/ + /*----------------------- SRAM Bank 4 ---------------------------------------*/ + /* FSMC_Bank1_NORSRAM4 configuration */ + p.FSMC_AddressSetupTime = 1; + p.FSMC_AddressHoldTime = 0; + p.FSMC_DataSetupTime = 2; + p.FSMC_BusTurnAroundDuration = 0; + p.FSMC_CLKDivision = 0; + p.FSMC_DataLatency = 0; + p.FSMC_AccessMode = FSMC_AccessMode_A; + /* Color LCD configuration + LCD configured as follow: + - Data/Address MUX = Disable + - Memory Type = SRAM + - Data Width = 16bit + - Write Operation = Enable + - Extended Mode = Enable + - Asynchronous Wait = Disable */ + FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4; + FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; + FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; + FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + /* BANK 4 (of NOR/SRAM Bank 1~4) is enabled */ + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); +} + +/** + * @brief Displays a pixel. + * @param x: pixel x. + * @param y: pixel y. + * @retval None + */ +static void PutPixel(int16_t x, int16_t y) +{ + if(x < 0 || x > 239 || y < 0 || y > 319) + { + return; + } + LCD_DrawLine(x, y, 1, LCD_DIR_HORIZONTAL); +} + +#ifndef USE_Delay +/** + * @brief Inserts a delay time. + * @param nCount: specifies the delay time length. + * @retval None + */ +static void delay(vu32 nCount) +{ + vu32 index = 0; + for(index = (100000 * nCount); index != 0; index--) + { + } +} +#endif /* USE_Delay */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_lcd.h b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_lcd.h new file mode 100644 index 0000000..12a2f59 --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_lcd.h @@ -0,0 +1,385 @@ +/** + ****************************************************************************** + * @file stm3210e_eval_lcd.h + * @author MCD Application Team + * @version V5.1.0 + * @date 18-January-2013 + * @brief This file contains all the functions prototypes for the stm3210e_eval_lcd + * firmware driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM3210E_EVAL_LCD_H +#define __STM3210E_EVAL_LCD_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm3210e_eval.h" +#include "../Common/fonts.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL_LCD + * @{ + */ + +/** @defgroup STM3210E_EVAL_LCD_Exported_Types + * @{ + */ +typedef struct +{ + int16_t X; + int16_t Y; +} Point, * pPoint; +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_LCD_Exported_Constants + * @{ + */ + +/** + * @brief Uncomment the line below if you want to use user defined Delay function + * (for precise timing), otherwise default _delay_ function defined within + * this driver is used (less precise timing). + */ +/* #define USE_Delay */ + +#ifdef USE_Delay +#include "main.h" + #define _delay_ Delay /* !< User can provide more timing precise _delay_ function + (with 10ms time base), using SysTick for example */ +#else + #define _delay_ delay /* !< Default _delay_ function with less precise timing */ +#endif + +/** + * @brief LCD Registers + */ +#define LCD_REG_0 0x00 +#define LCD_REG_1 0x01 +#define LCD_REG_2 0x02 +#define LCD_REG_3 0x03 +#define LCD_REG_4 0x04 +#define LCD_REG_5 0x05 +#define LCD_REG_6 0x06 +#define LCD_REG_7 0x07 +#define LCD_REG_8 0x08 +#define LCD_REG_9 0x09 +#define LCD_REG_10 0x0A +#define LCD_REG_12 0x0C +#define LCD_REG_13 0x0D +#define LCD_REG_14 0x0E +#define LCD_REG_15 0x0F +#define LCD_REG_16 0x10 +#define LCD_REG_17 0x11 +#define LCD_REG_18 0x12 +#define LCD_REG_19 0x13 +#define LCD_REG_20 0x14 +#define LCD_REG_21 0x15 +#define LCD_REG_22 0x16 +#define LCD_REG_23 0x17 +#define LCD_REG_24 0x18 +#define LCD_REG_25 0x19 +#define LCD_REG_26 0x1A +#define LCD_REG_27 0x1B +#define LCD_REG_28 0x1C +#define LCD_REG_29 0x1D +#define LCD_REG_30 0x1E +#define LCD_REG_31 0x1F +#define LCD_REG_32 0x20 +#define LCD_REG_33 0x21 +#define LCD_REG_34 0x22 +#define LCD_REG_35 0x23 +#define LCD_REG_36 0x24 +#define LCD_REG_37 0x25 +#define LCD_REG_39 0x27 +#define LCD_REG_40 0x28 +#define LCD_REG_41 0x29 +#define LCD_REG_43 0x2B +#define LCD_REG_45 0x2D +#define LCD_REG_48 0x30 +#define LCD_REG_49 0x31 +#define LCD_REG_50 0x32 +#define LCD_REG_51 0x33 +#define LCD_REG_52 0x34 +#define LCD_REG_53 0x35 +#define LCD_REG_54 0x36 +#define LCD_REG_55 0x37 +#define LCD_REG_56 0x38 +#define LCD_REG_57 0x39 +#define LCD_REG_58 0x3A +#define LCD_REG_59 0x3B +#define LCD_REG_60 0x3C +#define LCD_REG_61 0x3D +#define LCD_REG_62 0x3E +#define LCD_REG_63 0x3F +#define LCD_REG_64 0x40 +#define LCD_REG_65 0x41 +#define LCD_REG_66 0x42 +#define LCD_REG_67 0x43 +#define LCD_REG_68 0x44 +#define LCD_REG_69 0x45 +#define LCD_REG_70 0x46 +#define LCD_REG_71 0x47 +#define LCD_REG_72 0x48 +#define LCD_REG_73 0x49 +#define LCD_REG_74 0x4A +#define LCD_REG_75 0x4B +#define LCD_REG_76 0x4C +#define LCD_REG_77 0x4D +#define LCD_REG_78 0x4E +#define LCD_REG_79 0x4F +#define LCD_REG_80 0x50 +#define LCD_REG_81 0x51 +#define LCD_REG_82 0x52 +#define LCD_REG_83 0x53 +#define LCD_REG_84 0x54 +#define LCD_REG_85 0x55 +#define LCD_REG_86 0x56 +#define LCD_REG_87 0x57 +#define LCD_REG_88 0x58 +#define LCD_REG_89 0x59 +#define LCD_REG_90 0x5A +#define LCD_REG_91 0x5B +#define LCD_REG_92 0x5C +#define LCD_REG_93 0x5D +#define LCD_REG_96 0x60 +#define LCD_REG_97 0x61 +#define LCD_REG_106 0x6A +#define LCD_REG_118 0x76 +#define LCD_REG_128 0x80 +#define LCD_REG_129 0x81 +#define LCD_REG_130 0x82 +#define LCD_REG_131 0x83 +#define LCD_REG_132 0x84 +#define LCD_REG_133 0x85 +#define LCD_REG_134 0x86 +#define LCD_REG_135 0x87 +#define LCD_REG_136 0x88 +#define LCD_REG_137 0x89 +#define LCD_REG_139 0x8B +#define LCD_REG_140 0x8C +#define LCD_REG_141 0x8D +#define LCD_REG_143 0x8F +#define LCD_REG_144 0x90 +#define LCD_REG_145 0x91 +#define LCD_REG_146 0x92 +#define LCD_REG_147 0x93 +#define LCD_REG_148 0x94 +#define LCD_REG_149 0x95 +#define LCD_REG_150 0x96 +#define LCD_REG_151 0x97 +#define LCD_REG_152 0x98 +#define LCD_REG_153 0x99 +#define LCD_REG_154 0x9A +#define LCD_REG_157 0x9D +#define LCD_REG_192 0xC0 +#define LCD_REG_193 0xC1 +#define LCD_REG_229 0xE5 +#define LCD_REG_232 0xE8 +#define LCD_REG_233 0xE9 +#define LCD_REG_234 0xEA +#define LCD_REG_235 0xEB +#define LCD_REG_236 0xEC +#define LCD_REG_237 0xED +#define LCD_REG_241 0xF1 +#define LCD_REG_242 0xF2 + +/** + * @brief LCD color + */ +#define LCD_COLOR_WHITE 0xFFFF +#define LCD_COLOR_BLACK 0x0000 +#define LCD_COLOR_GREY 0xF7DE +#define LCD_COLOR_BLUE 0x001F +#define LCD_COLOR_BLUE2 0x051F +#define LCD_COLOR_RED 0xF800 +#define LCD_COLOR_MAGENTA 0xF81F +#define LCD_COLOR_GREEN 0x07E0 +#define LCD_COLOR_CYAN 0x7FFF +#define LCD_COLOR_YELLOW 0xFFE0 + +/** + * @brief LCD Lines depending on the chosen fonts. + */ +#define LCD_LINE_0 LINE(0) +#define LCD_LINE_1 LINE(1) +#define LCD_LINE_2 LINE(2) +#define LCD_LINE_3 LINE(3) +#define LCD_LINE_4 LINE(4) +#define LCD_LINE_5 LINE(5) +#define LCD_LINE_6 LINE(6) +#define LCD_LINE_7 LINE(7) +#define LCD_LINE_8 LINE(8) +#define LCD_LINE_9 LINE(9) +#define LCD_LINE_10 LINE(10) +#define LCD_LINE_11 LINE(11) +#define LCD_LINE_12 LINE(12) +#define LCD_LINE_13 LINE(13) +#define LCD_LINE_14 LINE(14) +#define LCD_LINE_15 LINE(15) +#define LCD_LINE_16 LINE(16) +#define LCD_LINE_17 LINE(17) +#define LCD_LINE_18 LINE(18) +#define LCD_LINE_19 LINE(19) +#define LCD_LINE_20 LINE(20) +#define LCD_LINE_21 LINE(21) +#define LCD_LINE_22 LINE(22) +#define LCD_LINE_23 LINE(23) +#define LCD_LINE_24 LINE(24) +#define LCD_LINE_25 LINE(25) +#define LCD_LINE_26 LINE(26) +#define LCD_LINE_27 LINE(27) +#define LCD_LINE_28 LINE(28) +#define LCD_LINE_29 LINE(29) + +/** + * @brief LCD default font + */ +#define LCD_DEFAULT_FONT Font16x24 + +/** + * @brief LCD Direction + */ +#define LCD_DIR_HORIZONTAL 0x0000 +#define LCD_DIR_VERTICAL 0x0001 + +/** + * @brief LCD Size (Width and Height) + */ +#define LCD_PIXEL_WIDTH 0x0140 +#define LCD_PIXEL_HEIGHT 0x00F0 + +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_LCD_Exported_Macros + * @{ + */ +#define ASSEMBLE_RGB(R, G, B) ((((R)& 0xF8) << 8) | (((G) & 0xFC) << 3) | (((B) & 0xF8) >> 3)) +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_LCD_Exported_Functions + * @{ + */ +/** @defgroup + * @{ + */ +void LCD_DeInit(void); +void STM3210E_LCD_Init(void); +void LCD_SetColors(__IO uint16_t _TextColor, __IO uint16_t _BackColor); +void LCD_GetColors(__IO uint16_t *_TextColor, __IO uint16_t *_BackColor); +void LCD_SetTextColor(__IO uint16_t Color); +void LCD_SetBackColor(__IO uint16_t Color); +void LCD_ClearLine(uint16_t Line); +void LCD_Clear(uint16_t Color); +void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos); +void LCD_DrawChar(uint16_t Xpos, uint16_t Ypos, const uint16_t *c); +void LCD_DisplayChar(uint16_t Line, uint16_t Column, uint8_t Ascii); +void LCD_SetFont(sFONT *fonts); +sFONT *LCD_GetFont(void); +void LCD_DisplayStringLine(uint16_t Line, uint8_t *ptr); +void LCD_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint8_t Height, uint16_t Width); +void LCD_WindowModeDisable(void); +void LCD_DrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction); +void LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint8_t Height, uint16_t Width); +void LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius); +void LCD_DrawMonoPict(const uint32_t *Pict); +void LCD_WriteBMP(uint32_t BmpAddress); +void LCD_DrawUniLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); +void LCD_DrawFullRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height); +void LCD_DrawFullCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius); +void LCD_PolyLine(pPoint Points, uint16_t PointCount); +void LCD_PolyLineRelative(pPoint Points, uint16_t PointCount); +void LCD_ClosedPolyLine(pPoint Points, uint16_t PointCount); +void LCD_ClosedPolyLineRelative(pPoint Points, uint16_t PointCount); +void LCD_FillPolyLine(pPoint Points, uint16_t PointCount); +/** + * @} + */ + +/** @defgroup + * @{ + */ +void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue); +uint16_t LCD_ReadReg(uint8_t LCD_Reg); +void LCD_WriteRAM_Prepare(void); +void LCD_WriteRAM(uint16_t RGB_Code); +uint16_t LCD_ReadRAM(void); +void LCD_PowerOn(void); +void LCD_DisplayOn(void); +void LCD_DisplayOff(void); +/** + * @} + */ + +/** @defgroup + * @{ + */ +void LCD_CtrlLinesConfig(void); +void LCD_FSMCConfig(void); +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +#endif /* __STM3210E_EVAL_LCD_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_spi_flash.c b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_spi_flash.c new file mode 100644 index 0000000..5ac740f --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_spi_flash.c @@ -0,0 +1,546 @@ +/** + ****************************************************************************** + * @file stm3210e_eval_spi_flash.c + * @author MCD Application Team + * @version V5.1.0 + * @date 18-January-2013 + * @brief This file provides a set of functions needed to manage the SPI M25Pxxx + * FLASH memory mounted on STM3210E-EVAL board. + * It implements a high level communication layer for read and write + * from/to this memory. The needed STM32 hardware resources (SPI and + * GPIO) are defined in stm3210e_eval.h file, and the initialization is + * performed in sFLASH_LowLevel_Init() function declared in stm3210e_eval.c + * file. + * You can easily tailor this driver to any other development board, + * by just adapting the defines for hardware resources and + * sFLASH_LowLevel_Init() function. + * + * +-----------------------------------------------------------+ + * | Pin assignment | + * +-----------------------------+---------------+-------------+ + * | STM32 SPI Pins | sFLASH | Pin | + * +-----------------------------+---------------+-------------+ + * | sFLASH_CS_PIN | ChipSelect(/S)| 1 | + * | sFLASH_SPI_MISO_PIN / MISO | DataOut(Q) | 2 | + * | | VCC | 3 (3.3 V)| + * | | GND | 4 (0 V) | + * | sFLASH_SPI_MOSI_PIN / MOSI | DataIn(D) | 5 | + * | sFLASH_SPI_SCK_PIN / SCLK | Clock(C) | 6 | + * | | VCC | 7 (3.3 V)| + * | | VCC | 8 (3.3 V)| + * +-----------------------------+---------------+-------------+ + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm3210e_eval_spi_flash.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL_SPI_FLASH + * @brief This file includes the M25Pxxx SPI FLASH driver of STM3210E-EVAL board. + * @{ + */ + +/** @defgroup STM3210E_EVAL_SPI_FLASH_Private_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_SPI_FLASH_Private_Defines + * @{ + */ +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_SPI_FLASH_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_SPI_FLASH_Private_Variables + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_SPI_FLASH_Private_Function_Prototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup STM3210E_EVAL_SPI_FLASH_Private_Functions + * @{ + */ + +/** + * @brief DeInitializes the peripherals used by the SPI FLASH driver. + * @param None + * @retval None + */ +void sFLASH_DeInit(void) +{ + sFLASH_LowLevel_DeInit(); +} + +/** + * @brief Initializes the peripherals used by the SPI FLASH driver. + * @param None + * @retval None + */ +void sFLASH_Init(void) +{ + SPI_InitTypeDef SPI_InitStructure; + + sFLASH_LowLevel_Init(); + + /*!< Deselect the FLASH: Chip Select high */ + sFLASH_CS_HIGH(); + + /*!< SPI configuration */ + SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; + SPI_InitStructure.SPI_Mode = SPI_Mode_Master; + SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; + SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; + SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; + SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; +#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) + SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; +#else + SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; +#endif + + SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; + SPI_InitStructure.SPI_CRCPolynomial = 7; + SPI_Init(sFLASH_SPI, &SPI_InitStructure); + + /*!< Enable the sFLASH_SPI */ + SPI_Cmd(sFLASH_SPI, ENABLE); +} + +/** + * @brief Erases the specified FLASH sector. + * @param SectorAddr: address of the sector to erase. + * @retval None + */ +void sFLASH_EraseSector(uint32_t SectorAddr) +{ + /*!< Send write enable instruction */ + sFLASH_WriteEnable(); + + /*!< Sector Erase */ + /*!< Select the FLASH: Chip Select low */ + sFLASH_CS_LOW(); + /*!< Send Sector Erase instruction */ + sFLASH_SendByte(sFLASH_CMD_SE); + /*!< Send SectorAddr high nibble address byte */ + sFLASH_SendByte((SectorAddr & 0xFF0000) >> 16); + /*!< Send SectorAddr medium nibble address byte */ + sFLASH_SendByte((SectorAddr & 0xFF00) >> 8); + /*!< Send SectorAddr low nibble address byte */ + sFLASH_SendByte(SectorAddr & 0xFF); + /*!< Deselect the FLASH: Chip Select high */ + sFLASH_CS_HIGH(); + + /*!< Wait the end of Flash writing */ + sFLASH_WaitForWriteEnd(); +} + +/** + * @brief Erases the entire FLASH. + * @param None + * @retval None + */ +void sFLASH_EraseBulk(void) +{ + /*!< Send write enable instruction */ + sFLASH_WriteEnable(); + + /*!< Bulk Erase */ + /*!< Select the FLASH: Chip Select low */ + sFLASH_CS_LOW(); + /*!< Send Bulk Erase instruction */ + sFLASH_SendByte(sFLASH_CMD_BE); + /*!< Deselect the FLASH: Chip Select high */ + sFLASH_CS_HIGH(); + + /*!< Wait the end of Flash writing */ + sFLASH_WaitForWriteEnd(); +} + +/** + * @brief Writes more than one byte to the FLASH with a single WRITE cycle + * (Page WRITE sequence). + * @note The number of byte can't exceed the FLASH page size. + * @param pBuffer: pointer to the buffer containing the data to be written + * to the FLASH. + * @param WriteAddr: FLASH's internal address to write to. + * @param NumByteToWrite: number of bytes to write to the FLASH, must be equal + * or less than "sFLASH_PAGESIZE" value. + * @retval None + */ +void sFLASH_WritePage(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) +{ + /*!< Enable the write access to the FLASH */ + sFLASH_WriteEnable(); + + /*!< Select the FLASH: Chip Select low */ + sFLASH_CS_LOW(); + /*!< Send "Write to Memory " instruction */ + sFLASH_SendByte(sFLASH_CMD_WRITE); + /*!< Send WriteAddr high nibble address byte to write to */ + sFLASH_SendByte((WriteAddr & 0xFF0000) >> 16); + /*!< Send WriteAddr medium nibble address byte to write to */ + sFLASH_SendByte((WriteAddr & 0xFF00) >> 8); + /*!< Send WriteAddr low nibble address byte to write to */ + sFLASH_SendByte(WriteAddr & 0xFF); + + /*!< while there is data to be written on the FLASH */ + while (NumByteToWrite--) + { + /*!< Send the current byte */ + sFLASH_SendByte(*pBuffer); + /*!< Point on the next byte to be written */ + pBuffer++; + } + + /*!< Deselect the FLASH: Chip Select high */ + sFLASH_CS_HIGH(); + + /*!< Wait the end of Flash writing */ + sFLASH_WaitForWriteEnd(); +} + +/** + * @brief Writes block of data to the FLASH. In this function, the number of + * WRITE cycles are reduced, using Page WRITE sequence. + * @param pBuffer: pointer to the buffer containing the data to be written + * to the FLASH. + * @param WriteAddr: FLASH's internal address to write to. + * @param NumByteToWrite: number of bytes to write to the FLASH. + * @retval None + */ +void sFLASH_WriteBuffer(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) +{ + uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; + + Addr = WriteAddr % sFLASH_SPI_PAGESIZE; + count = sFLASH_SPI_PAGESIZE - Addr; + NumOfPage = NumByteToWrite / sFLASH_SPI_PAGESIZE; + NumOfSingle = NumByteToWrite % sFLASH_SPI_PAGESIZE; + + if (Addr == 0) /*!< WriteAddr is sFLASH_PAGESIZE aligned */ + { + if (NumOfPage == 0) /*!< NumByteToWrite < sFLASH_PAGESIZE */ + { + sFLASH_WritePage(pBuffer, WriteAddr, NumByteToWrite); + } + else /*!< NumByteToWrite > sFLASH_PAGESIZE */ + { + while (NumOfPage--) + { + sFLASH_WritePage(pBuffer, WriteAddr, sFLASH_SPI_PAGESIZE); + WriteAddr += sFLASH_SPI_PAGESIZE; + pBuffer += sFLASH_SPI_PAGESIZE; + } + + sFLASH_WritePage(pBuffer, WriteAddr, NumOfSingle); + } + } + else /*!< WriteAddr is not sFLASH_PAGESIZE aligned */ + { + if (NumOfPage == 0) /*!< NumByteToWrite < sFLASH_PAGESIZE */ + { + if (NumOfSingle > count) /*!< (NumByteToWrite + WriteAddr) > sFLASH_PAGESIZE */ + { + temp = NumOfSingle - count; + + sFLASH_WritePage(pBuffer, WriteAddr, count); + WriteAddr += count; + pBuffer += count; + + sFLASH_WritePage(pBuffer, WriteAddr, temp); + } + else + { + sFLASH_WritePage(pBuffer, WriteAddr, NumByteToWrite); + } + } + else /*!< NumByteToWrite > sFLASH_PAGESIZE */ + { + NumByteToWrite -= count; + NumOfPage = NumByteToWrite / sFLASH_SPI_PAGESIZE; + NumOfSingle = NumByteToWrite % sFLASH_SPI_PAGESIZE; + + sFLASH_WritePage(pBuffer, WriteAddr, count); + WriteAddr += count; + pBuffer += count; + + while (NumOfPage--) + { + sFLASH_WritePage(pBuffer, WriteAddr, sFLASH_SPI_PAGESIZE); + WriteAddr += sFLASH_SPI_PAGESIZE; + pBuffer += sFLASH_SPI_PAGESIZE; + } + + if (NumOfSingle != 0) + { + sFLASH_WritePage(pBuffer, WriteAddr, NumOfSingle); + } + } + } +} + +/** + * @brief Reads a block of data from the FLASH. + * @param pBuffer: pointer to the buffer that receives the data read from the FLASH. + * @param ReadAddr: FLASH's internal address to read from. + * @param NumByteToRead: number of bytes to read from the FLASH. + * @retval None + */ +void sFLASH_ReadBuffer(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) +{ + /*!< Select the FLASH: Chip Select low */ + sFLASH_CS_LOW(); + + /*!< Send "Read from Memory " instruction */ + sFLASH_SendByte(sFLASH_CMD_READ); + + /*!< Send ReadAddr high nibble address byte to read from */ + sFLASH_SendByte((ReadAddr & 0xFF0000) >> 16); + /*!< Send ReadAddr medium nibble address byte to read from */ + sFLASH_SendByte((ReadAddr& 0xFF00) >> 8); + /*!< Send ReadAddr low nibble address byte to read from */ + sFLASH_SendByte(ReadAddr & 0xFF); + + while (NumByteToRead--) /*!< while there is data to be read */ + { + /*!< Read a byte from the FLASH */ + *pBuffer = sFLASH_SendByte(sFLASH_DUMMY_BYTE); + /*!< Point to the next location where the byte read will be saved */ + pBuffer++; + } + + /*!< Deselect the FLASH: Chip Select high */ + sFLASH_CS_HIGH(); +} + +/** + * @brief Reads FLASH identification. + * @param None + * @retval FLASH identification + */ +uint32_t sFLASH_ReadID(void) +{ + uint32_t Temp = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0; + + /*!< Select the FLASH: Chip Select low */ + sFLASH_CS_LOW(); + + /*!< Send "RDID " instruction */ + sFLASH_SendByte(0x9F); + + /*!< Read a byte from the FLASH */ + Temp0 = sFLASH_SendByte(sFLASH_DUMMY_BYTE); + + /*!< Read a byte from the FLASH */ + Temp1 = sFLASH_SendByte(sFLASH_DUMMY_BYTE); + + /*!< Read a byte from the FLASH */ + Temp2 = sFLASH_SendByte(sFLASH_DUMMY_BYTE); + + /*!< Deselect the FLASH: Chip Select high */ + sFLASH_CS_HIGH(); + + Temp = (Temp0 << 16) | (Temp1 << 8) | Temp2; + + return Temp; +} + +/** + * @brief Initiates a read data byte (READ) sequence from the Flash. + * This is done by driving the /CS line low to select the device, then the READ + * instruction is transmitted followed by 3 bytes address. This function exit + * and keep the /CS line low, so the Flash still being selected. With this + * technique the whole content of the Flash is read with a single READ instruction. + * @param ReadAddr: FLASH's internal address to read from. + * @retval None + */ +void sFLASH_StartReadSequence(uint32_t ReadAddr) +{ + /*!< Select the FLASH: Chip Select low */ + sFLASH_CS_LOW(); + + /*!< Send "Read from Memory " instruction */ + sFLASH_SendByte(sFLASH_CMD_READ); + + /*!< Send the 24-bit address of the address to read from -------------------*/ + /*!< Send ReadAddr high nibble address byte */ + sFLASH_SendByte((ReadAddr & 0xFF0000) >> 16); + /*!< Send ReadAddr medium nibble address byte */ + sFLASH_SendByte((ReadAddr& 0xFF00) >> 8); + /*!< Send ReadAddr low nibble address byte */ + sFLASH_SendByte(ReadAddr & 0xFF); +} + +/** + * @brief Reads a byte from the SPI Flash. + * @note This function must be used only if the Start_Read_Sequence function + * has been previously called. + * @param None + * @retval Byte Read from the SPI Flash. + */ +uint8_t sFLASH_ReadByte(void) +{ + return (sFLASH_SendByte(sFLASH_DUMMY_BYTE)); +} + +/** + * @brief Sends a byte through the SPI interface and return the byte received + * from the SPI bus. + * @param byte: byte to send. + * @retval The value of the received byte. + */ +uint8_t sFLASH_SendByte(uint8_t byte) +{ + /*!< Loop while DR register in not emplty */ + while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_TXE) == RESET); + + /*!< Send byte through the SPI1 peripheral */ + SPI_I2S_SendData(sFLASH_SPI, byte); + + /*!< Wait to receive a byte */ + while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_RXNE) == RESET); + + /*!< Return the byte read from the SPI bus */ + return SPI_I2S_ReceiveData(sFLASH_SPI); +} + +/** + * @brief Sends a Half Word through the SPI interface and return the Half Word + * received from the SPI bus. + * @param HalfWord: Half Word to send. + * @retval The value of the received Half Word. + */ +uint16_t sFLASH_SendHalfWord(uint16_t HalfWord) +{ + /*!< Loop while DR register in not emplty */ + while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_TXE) == RESET); + + /*!< Send Half Word through the sFLASH peripheral */ + SPI_I2S_SendData(sFLASH_SPI, HalfWord); + + /*!< Wait to receive a Half Word */ + while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_RXNE) == RESET); + + /*!< Return the Half Word read from the SPI bus */ + return SPI_I2S_ReceiveData(sFLASH_SPI); +} + +/** + * @brief Enables the write access to the FLASH. + * @param None + * @retval None + */ +void sFLASH_WriteEnable(void) +{ + /*!< Select the FLASH: Chip Select low */ + sFLASH_CS_LOW(); + + /*!< Send "Write Enable" instruction */ + sFLASH_SendByte(sFLASH_CMD_WREN); + + /*!< Deselect the FLASH: Chip Select high */ + sFLASH_CS_HIGH(); +} + +/** + * @brief Polls the status of the Write In Progress (WIP) flag in the FLASH's + * status register and loop until write opertaion has completed. + * @param None + * @retval None + */ +void sFLASH_WaitForWriteEnd(void) +{ + uint8_t flashstatus = 0; + + /*!< Select the FLASH: Chip Select low */ + sFLASH_CS_LOW(); + + /*!< Send "Read Status Register" instruction */ + sFLASH_SendByte(sFLASH_CMD_RDSR); + + /*!< Loop as long as the memory is busy with a write cycle */ + do + { + /*!< Send a dummy byte to generate the clock needed by the FLASH + and put the value of the status register in FLASH_Status variable */ + flashstatus = sFLASH_SendByte(sFLASH_DUMMY_BYTE); + + } + while ((flashstatus & sFLASH_WIP_FLAG) == SET); /* Write in progress */ + + /*!< Deselect the FLASH: Chip Select high */ + sFLASH_CS_HIGH(); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_spi_flash.h b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_spi_flash.h new file mode 100644 index 0000000..764e472 --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Utilities/STM32_EVAL/STM3210E_EVAL/stm3210e_eval_spi_flash.h @@ -0,0 +1,157 @@ +/** + ****************************************************************************** + * @file stm3210e_eval_spi_flash.h + * @author MCD Application Team + * @version V5.1.0 + * @date 18-January-2013 + * @brief This file contains all the functions prototypes for the + * stm3210e_eval_spi_flash firmware driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM3210E_EVAL_SPI_FLASH_H +#define __STM3210E_EVAL_SPI_FLASH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm3210e_eval.h" + +/** @addtogroup Utilities + * @{ + */ + +/** @addtogroup STM32_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL + * @{ + */ + +/** @addtogroup STM3210E_EVAL_SPI_FLASH + * @{ + */ + +/** @defgroup STM3210E_EVAL_SPI_FLASH_Exported_Types + * @{ + */ +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_SPI_FLASH_Exported_Constants + * @{ + */ +/** + * @brief M25P SPI Flash supported commands + */ +#define sFLASH_CMD_WRITE 0x02 /*!< Write to Memory instruction */ +#define sFLASH_CMD_WRSR 0x01 /*!< Write Status Register instruction */ +#define sFLASH_CMD_WREN 0x06 /*!< Write enable instruction */ +#define sFLASH_CMD_READ 0x03 /*!< Read from Memory instruction */ +#define sFLASH_CMD_RDSR 0x05 /*!< Read Status Register instruction */ +#define sFLASH_CMD_RDID 0x9F /*!< Read identification */ +#define sFLASH_CMD_SE 0xD8 /*!< Sector Erase instruction */ +#define sFLASH_CMD_BE 0xC7 /*!< Bulk Erase instruction */ + +#define sFLASH_WIP_FLAG 0x01 /*!< Write In Progress (WIP) flag */ + +#define sFLASH_DUMMY_BYTE 0xA5 +#define sFLASH_SPI_PAGESIZE 0x100 + +#define sFLASH_M25P128_ID 0x202018 +#define sFLASH_M25P64_ID 0x202017 + +/** + * @} + */ + +/** @defgroup STM3210E_EVAL_SPI_FLASH_Exported_Macros + * @{ + */ +/** + * @brief Select sFLASH: Chip Select pin low + */ +#define sFLASH_CS_LOW() GPIO_ResetBits(sFLASH_CS_GPIO_PORT, sFLASH_CS_PIN) +/** + * @brief Deselect sFLASH: Chip Select pin high + */ +#define sFLASH_CS_HIGH() GPIO_SetBits(sFLASH_CS_GPIO_PORT, sFLASH_CS_PIN) +/** + * @} + */ + + + +/** @defgroup STM3210E_EVAL_SPI_FLASH_Exported_Functions + * @{ + */ +/** + * @brief High layer functions + */ +void sFLASH_DeInit(void); +void sFLASH_Init(void); +void sFLASH_EraseSector(uint32_t SectorAddr); +void sFLASH_EraseBulk(void); +void sFLASH_WritePage(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); +void sFLASH_WriteBuffer(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); +void sFLASH_ReadBuffer(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead); +uint32_t sFLASH_ReadID(void); +void sFLASH_StartReadSequence(uint32_t ReadAddr); + +/** + * @brief Low layer functions + */ +uint8_t sFLASH_ReadByte(void); +uint8_t sFLASH_SendByte(uint8_t byte); +uint16_t sFLASH_SendHalfWord(uint16_t HalfWord); +void sFLASH_WriteEnable(void); +void sFLASH_WaitForWriteEnd(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM3210E_EVAL_SPI_FLASH_H */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ -- cgit v1.2.3