# HG changeset patch # User JeanDo # Date 1513298720 -3600 # Node ID e65d01b6a17ea0e76c7fc46041b295cdb237894f # Parent 89a87ddc2e470fddbeb7392f20f3559b7fd2044f MOVE files for other applications diff -r 89a87ddc2e47 -r e65d01b6a17e .hgsubstate --- a/.hgsubstate Wed Dec 13 18:23:00 2017 +0100 +++ b/.hgsubstate Fri Dec 15 01:45:20 2017 +0100 @@ -1,3 +1,3 @@ -ecedf94caf7ee0aa654b7675dfca4c2047ef4331 Common -1a59cc1a9674ef64f9ca32c5691727def66f9c83 Discovery +e501ab2a9b3c9c17be7ede397fbfc6904fc09be0 Common +3a82df4793fe804f6b2891441e2a0bea30a9c336 Discovery 14a446c4e560520adf6261cb68411284a3a964ab Small_CPU diff -r 89a87ddc2e47 -r e65d01b6a17e BootLoader/Inc/base_bootloader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Inc/base_bootloader.h Fri Dec 15 01:45:20 2017 +0100 @@ -0,0 +1,101 @@ +/** + ****************************************************************************** + * @file LTDC/LTDC_Display_2Layers/Inc/main.h + * @author MCD Application Team + * @version V1.0.1 + * @date 26-February-2014 + * @brief Header for main.c module + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef BASE_BOOTLOADER_H +#define BASE_BOOTLOADER_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" +#include "tStructure.h" +#include "settings.h" +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* Exported macro ------------------------------------------------------------*/ + +#define TOP_LAYER 1 +#define BACKGRD_LAYER 0 + +#define SURFMODE 1 +#define DIVEMODE 2 + +typedef enum +{ + ST_Boot = 0, + ST_Surface, + ST_Dive, + ST_Menu, + ST_END +} SState; + +typedef enum +{ + ACTION_IDLE_TICK = 0, + ACTION_IDLE_SECOND, + ACTION_MODE_CHANGE, + ACTION_TIMEOUT, + ACTION_BUTTON_CUSTOM, + ACTION_BUTTON_BACK, + ACTION_BUTTON_NEXT, + ACTION_BUTTON_ENTER, + ACTION_BUTTON_ENTER_FINAL, + ACTION_END +} SAction; + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +uint32_t get_globalState(void); +void set_globalState(uint32_t newID); +void get_globalStateList(SStateList *output); +void set_globalState_Menu_Page(uint8_t page); +void set_globalState_Menu_Line(uint8_t line); +void get_idSpecificStateList(uint32_t id, SStateList *output); +void delayMicros(uint32_t micros); +void get_RTC_DateTime(RTC_DateTypeDef * sdatestructureget, RTC_TimeTypeDef * stimestructureget); +void set_RTC_DateTime(RTC_DateTypeDef * sdatestructure, RTC_TimeTypeDef * stimestructure); +uint8_t get_globalMode(void); +void set_globalMode(uint8_t newMode); +void set_globalState_Log_Page(uint8_t pageIsLine); +void set_globalState_Base(void); + +void set_returnFromComm(void); + +#endif /* BASE_BOOTLOADER_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff -r 89a87ddc2e47 -r e65d01b6a17e BootLoader/Inc/tInfoBootloader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Inc/tInfoBootloader.h Fri Dec 15 01:45:20 2017 +0100 @@ -0,0 +1,46 @@ +/** + ****************************************************************************** + * @file tInfoBootloader.h - bootloader only - + * @author heinrichs/weikamp, Christian Weikamp + * @version V0.0.1 + * @date 08-Aug-2014 + * @brief Header file communication with PC + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 heinrichs weikamp

+ * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef TINFO_BOOTLOADER_H +#define TINFO_BOOTLOADER_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include +/** @addtogroup Base + * @{ + */ + +/* Exported variables --------------------------------------------------------*/ + + +/* Exported functions --------------------------------------------------------*/ + +void tInfoBootloader_init(void); +void tInfo_newpage(const char * text); +void tInfo_write(const char * text); +void tInfo_button_text(const char *text_left, const char *text_mid, const char *text_right); + +#ifdef __cplusplus +} +#endif + +#endif /* TINFO_BOOTLOADER_H */ + +/************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ diff -r 89a87ddc2e47 -r e65d01b6a17e BootLoader/Src/base_bootlader.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Src/base_bootlader.c Fri Dec 15 01:45:20 2017 +0100 @@ -0,0 +1,1507 @@ +/** + ****************************************************************************** + * @copyright heinrichs weikamp + * @file base_bootlader.c + * @author heinrichs/weikamp, Christian Weikamp + * @date 26-February-2014 + * @version V1.0.4 + * @since 09-Jan-2016 + * @brief The beginning of it all. main() is part of this. + * + Do the inits for hardware + * + check for button press or update process reset trigger + * + Do the inits for sub-systems like menu, dive screen etc. + * + Start IRQs + * + Start MainTasks not in IRQs + * @bug + * @warning + @verbatim + + ============================================================================== + ##### bootloader specific ##### + ============================================================================== + + 151130 chsw sleep on button3 + (MX_tell_reset_logik_alles_ok() + DataEX_call() in endlos loop) + + ============================================================================== + ##### bootloader specific ##### + ============================================================================== + + Bootloader info is set right here in this file. + The location is 0x0800A000 instead of 0x08050000 (firmware) + + on system reset (Menu Start Bootloader in firmware) the update process + is started automatically if no button is pressed + + if the right button is pressed the bootloader menu is started + + after update process (with update or empty) cleaning of EEPROM is started + afterwards the watchdog reset starts without activating the update process + + bluetooth chip is started in tComm on start of the mini bootloader firmware + + SMALLCPU_CSB_PIN must be re-set to 0 to communicate with small CPU / CPU2 / RTE + + for RealTerm to send file / firmware, Delays has to be increased to 0 + + RTE update / SPI1 with DMA gave IBUSERR, now it is working fine :-) 150828 + ============================================================================== + from standard firmware, parts might be invalid here: + ============================================================================== + ##### IRQs ##### + ============================================================================== + [..] The IRQs are very important and most functions should only run there. + + PreemptPriority are as follows + (#) 2 (low) sprintf _only_ here. Don't use in maintask or anywhere else. + Called by Buttons und Timer3 + Timer3 is 1/10 second + (#) 1 (mid) anything that should work while in IRQ2 like HalDelay(), VSYNC + and DMA2D Transfer Complete for housekeepingFrame(); + (#) 0 (high) _very very short_ interrupts like The HAL hardware part for + spi, uart, i2c. + + SubPriority within PreemptPriority give the order to execute. + Introduced 30.Oct.14 as it used by several HAL examples. + Three levelAmbients are available (2 low,1 mid,0 high) + + The STM32F4 has 4bits for IRQ levelAmbients, divided 2/2 in this code + with the NVIC_PRIORITYGROUP_2 setting. + + ============================================================================== + ##### MainTask ##### + ============================================================================== + [..] For everthing slow without importance to be 'in time'. + Like VPM and Buehlmann. + No sprintf and probably no GFX_SetFramesTopBottom() stuff neither. + If sprintf is called while sprintf is executed it blows up everything. + + ============================================================================== + ##### Frames / the external SDRAM ##### + ============================================================================== + [..] The SDRAM is handled by getFrame() and releaseFrame(). + Each frame with 800*480*2 Bytes. + Be carefull to release every frame + otherwise there will be a memory leakage over time. + housekeepingFrame() in the MainTask takes care of cleaning the frames. + All frames are filled with 0x00. This will be transparent with color of + CLUT_Font020 (is CLUT 0) if the alpha is set for a 16bit pair. + housekeepingFrame() delays the cleaning of frames still used as screen + buffer to prevent flickering. + + ============================================================================== + ##### Display ##### + ============================================================================== + [..] There is a Top layer, Bottom layer and background color. + All are perfectly alpha-blended by hardware. + + (#) top layer has 800x480 option function calls only + as it is not used for cursors here + (#) bottom layer has free size and start option to be used + for cursors (or sprites in the future ;-) + (#) background only black in the moment. + ToDo: Could be anything else for warnings etc. + if needed + + [..] Frame updates, switching and cursors is done with + + (#) GFX_SetFramesTopBottom() and the subset + GFX_SetFrameTop() + GFX_SetFrameBottom() + Those do not change anything on the display but give commands to.. + (#) GFX_change_LTDC() The only place that changes the pointer. + This prevents erratic behaviour if several changes + are made within one refresh rate of the screen. + Is called in IRQ by PD4 and HAL_GPIO_EXTI_IRQHandler + from VSYNC signal. + + [..] Content + + (#) Colors by LookupTable only. This could be modified by + system settings in the future. (gfx_color.h/.c) + + (#) Text by text_multilinguage.h/.c with one char + necessary only starting from '\x80' + with automatic language switch by + selected_language in SSettings + see openEdit_Language() in tMenuEditSystem.c + Therefore there are differnent functions + for example: + write_label_fix() for single char multilanguage + write_label_var() for strings that could include + multilanguage as well + see GFX_write_string() to get an overview of the controls + as well as the command list in gfx_engine.h + There is no clear before writing, text overlay is always on. + Many options to have LargeFont.SmallFont for numbers etc. + + ============================================================================== + ##### Update, DualBoot and build-in FLASH memory usage ##### + ============================================================================== + [..] Boot0 pin, Boot1/PB2 pin and BFB2 software bit control the behaviour. + PB2 should be tied to GND. + Boot0 == VDD -> bootloader on start, otherwise boot from Bank1 or Bank2 + depending on BFB2. + Bank2 contains the Fonts and should contain a proper test code in future + Bank1 is the main code (Bank1 is 1 MB too, usage as of Oct. 14 is 200 KB) + [..] Bootloader should be either UART or USB (on FS pins _only_) + USB HS to FS like on the Eval board does not work. + [..] Bootloader for the smaller CPU2 is implemented via the SPI used for DMA copy. + + ============================================================================== + ##### Connection to CPU2 (STM32F411 as of Oct.14 ##### + ============================================================================== + [..] Connected via SPI and DMA for every purpose. + two entire arrays are transfered for data security reasons + with respect to master (STM32F429) might interrupt internal + data copy in CPU2 (like hi byte, low byte, etc.). + [..] The entire life data is calculated in CPU2. Like tissues, CNS,... + Therefore the main unit is _not_ necessarily a Real Time system. + Simulation on the main unit can be executed without disrupting life data. + [..] SPI is triggered and timed by calling DataEX_call() in data_exchange_main.c + DataEX_copy_to_LifeData() does the transfer from buffer to variables used. + + ============================================================================== + ##### Menu, MenuEdit, Info ##### + ============================================================================== + [..] tMenu.c, tMenuEdit.c and tInfo.c is the system used. + logbook is part of Info not Menu. + The Info Menu is accessed by button 'Back' + The regular Menu is accessed by button 'Enter' + [..] Menu content is kept in frame memory for fast access. + There is no need to build pages if the 'Enter' button is pressed. + This is in contrast to MenuEdit pages. + [..] Button control for new pages (and pages in general) have to implemented + in tMenu.c, tMenuEdit.c or tInfo.c + + [..] ToDo (Oct. 14) Timeout for menus via Timer3 / IRQ 2 + + ============================================================================== + ##### specials ##### + ============================================================================== + [..] There was code for vector graphics from great demos + (peridiummmm and jupiter) that can be fitted again + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stdio.h" +#include // for memcopy + +#include "stm32f4xx_hal.h" +#include "stm32f4xx_hal_rcc.h" +#include "stm32f4xx_hal_flash_ex.h" +#include "stm32f4xx_hal_wwdg.h" + +#include "ostc.h" +#include "base_bootloader.h" +#include "display.h" +#include "gfx_engine.h" +#include "externLogbookFlash.h" +#include "tComm.h" +#include "tStructure.h" +#include "tInfoBootloader.h" + +#include "firmwareEraseProgram.h" +#include "firmwareJumpToApplication.h" + +#include "data_exchange_main.h" + +/** @addtogroup OSTC 4 + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define BUFFER_SIZE ((uint32_t)0x00177000) +#define WRITE_READ_ADDR ((uint32_t)0x0000) +#define REFRESH_COUNT ((uint32_t)0x0569) /* SDRAM refresh counter (90Mhz SD clock) */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + uint8_t returnFromCommCleanUpRequest = 0; + +const SFirmwareData FirmwareData __attribute__((at(0x08000000 + 0x0000A000))) = { + .firmwareVersion16to32bit.ub.first = 1, + .firmwareVersion16to32bit.ub.second = 0, + .firmwareVersion16to32bit.ub.third = 1, + .firmwareVersion16to32bit.ub.betaFlag = 1, + + /* 4 bytes with trailing 0 */ + .signature = "cw", + + .release_year = 16, + .release_month = 4, + .release_day = 8, + .release_sub = 0, + + /* max 48 with trailing 0 */ + //release_info ="12345678901234567890123456789012345678901" + .release_info ="tComm with all", + + /* for safety reasons and coming functions*/ + .dummy[0] = 0, + .dummy[1] = 0, + .dummy[2] = 0xEE, /* the magic byte */ + .dummy[3] = 0xFF +}; + + +const SHardwareData HardwareData __attribute__((at(HARDWAREDATA_ADDRESS))) = { + + // first 52 bytes + .primarySerial = 0xFFFF, + .primaryLicence = 0xFF, + .revision8bit = 0xFF, + .production_year = 0xFF, + .production_month = 0xFF, + .production_day = 0xFF, + .production_bluetooth_name_set = 0xFF, + + .production_info = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, + + // other 12 bytes (64 in total) + .secondarySerial = 0xFFFF, + .secondaryLicence = 0xFF, + .secondaryReason8bit = 0xFF, + .secondary_year = 0xFF, + .secondary_month = 0xFF, + .secondary_day = 0xFF, + .secondary_bluetooth_name_set = 0xFF, + .secondary_info = {0xFF,0xFF,0xFF,0xFF} +}; + + +RTC_HandleTypeDef RtcHandle; +TIM_HandleTypeDef TimHandle; /* used in stm32f4xx_it.c too */ +TIM_HandleTypeDef TimBacklightHandle; /* used in stm32f4xx_it.c too */ + +uint32_t time_before; +uint32_t time_between; +uint32_t time_after; + +/* SDRAM handler declaration */ +SDRAM_HandleTypeDef hsdram; +FMC_SDRAM_TimingTypeDef SDRAM_Timing; +FMC_SDRAM_CommandTypeDef command; + +FLASH_OBProgramInitTypeDef OBInit; +FLASH_AdvOBProgramInitTypeDef AdvOBInit; + + +/* Private variables with external access ------------------------------------*/ + +uint32_t globalStateID = 0; +uint8_t globalModeID = SURFMODE; +uint32_t time_without_button_pressed_deciseconds = 0; +uint8_t bootToBootloader = 0; + +/* Private function prototypes -----------------------------------------------*/ + +//static void LCD_ToggleFramebuffer(GFX_DrawCfgTypeDef *hconfig); +//static void LCD_Config(GFX_DrawCfgTypeDef *hconfig); +static void SystemClock_Config(void); +static void Error_Handler(void); + +static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command); +static void SDRAM_Config(void); +//static void DualBoot(void); +static void EXTILine_Buttons_Config(void); +//static void RTC_init(void); +static void TIM_init(void); +static void TIM_BACKLIGHT_init(void); +//static void TIM_BACKLIGHT_adjust(void); +static void gotoSleep(void); +uint8_t checkResetForFirmwareUpdate(void); +void DeleteResetToFirmwareUpdateRegister(void); +void reset_to_firmware_using_Watchdog(void); +void reset_to_update_using_system_reset(void); + +//static void DualBootToBootloader(void); + +/* ITM Trace-------- ---------------------------------------------------------*/ +/* +#define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) +#define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) +#define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) + +#define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) +#define TRCENA 0x01000000 + +struct __FILE { int handle; }; +FILE __stdout; +FILE __stdin; + +int fputc(int ch, FILE *f) { + if (DEMCR & TRCENA) { + while (ITM_Port32(0) == 0); + ITM_Port8(0) = ch; + } + return(ch); +} +*/ + +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief Main program + * @param None + * @retval None + */ + +void GPIO_test_I2C_lines(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + __GPIOA_CLK_ENABLE(); + __GPIOG_CLK_ENABLE(); + GPIO_InitStructure.Pin = GPIO_PIN_7; + GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStructure.Pull = GPIO_PULLUP; + GPIO_InitStructure.Speed = GPIO_SPEED_LOW; + HAL_GPIO_Init(GPIOG, &GPIO_InitStructure); + GPIO_InitStructure.Pin = GPIO_PIN_3; + HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); + + while(1) + { + HAL_GPIO_WritePin(GPIOG,GPIO_PIN_7,GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET); + HAL_Delay(10); + HAL_GPIO_WritePin(GPIOG,GPIO_PIN_7,GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET); + HAL_Delay(10); + } +} + + +int main(void) +{ + +/* + HAL_Init(); + SystemClock_Config(); +GPIO_test_I2C_lines(); +*/ + uint32_t pLayerInvisible; + uint32_t firmware_load_result; + uint8_t magicbyte = 0; + uint8_t callForUpdate; + uint8_t status = 0; + char textVersion[32]; + uint8_t ptr; + uint32_t pOffset; + + set_globalState(StBoot0); + + HAL_Init(); + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); + + /* feedback for the user + * aber sehr unsch�n beim Warmstart + * da das letzte Bild noch lange nachleuchtet */ +// MX_GPIO_Backlight_max_static_only_Init(); + + + /* button press is only 40 to 50 us low */ + MX_GPIO_One_Button_only_Init(); + + uint32_t i = 500000; + + callForUpdate = __HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST); + + if(callForUpdate) + { + i = 0; + } + else + if( (firmware_MainCodeIsProgammed() == 0) + || (hardwareDataGetPointer()->primarySerial == 0xFFFF) + || (hardwareDataGetPointer()->production_bluetooth_name_set == 0xFF)) + { + i = 1; + } + else + { + while(MX_GPIO_Read_The_One_Button() && i) + { + i--; + __NOP(); + } + if(i) + { + i = 200000; + while(!MX_GPIO_Read_The_One_Button() && i) + { + i--; + __NOP(); + } + if(i) + { + i = 200000; + while(MX_GPIO_Read_The_One_Button() && i) + { + i--; + __NOP(); + } + if(i) + { + i = 200000; + while(!MX_GPIO_Read_The_One_Button() && i) + { + i--; + __NOP(); + } + if(i) + { + i = 200000; + while(MX_GPIO_Read_The_One_Button() && i) + { + i--; + __NOP(); + } + } + } + } + } + } + + if((i == 0) && (callForUpdate == 0)) + firmware_JumpTo_Application(); + + SystemClock_Config(); + + MX_GPIO_Init(); + MX_Bluetooth_PowerOn(); + MX_SPI_Init(); + SDRAM_Config(); + HAL_Delay(100); + + GFX_init1_no_DMA(&pLayerInvisible, 2); + + TIM_BACKLIGHT_init(); + +// ----------------------------- + + display_power_on__1_of_2__pre_RGB(); + GFX_LTDC_Init(); + GFX_LTDC_LayerDefaultInit(TOP_LAYER, pLayerInvisible); + GFX_LTDC_LayerDefaultInit(BACKGRD_LAYER, pLayerInvisible); + GFX_SetFramesTopBottom(pLayerInvisible,pLayerInvisible,480); + HAL_Delay(20); + display_power_on__2_of_2__post_RGB(); + +// ----------------------------- + GFX_change_LTDC(); + GFX_hwBackgroundOn(); + GFX_change_LTDC(); +// ----------------------------- + tInfoBootloader_init(); +// ----------------------------- + if(i == 0) + { + tInfo_newpage("load firmware data"); + uint8_t* pBuffer = (uint8_t*)((uint32_t)0xD0000000); /* blocked via GFX_init1_no_DMA */ + firmware_load_result = ext_flash_read_firmware(pBuffer,768000, &magicbyte); + + if((firmware_load_result > 0) && (firmware_load_result < 768000) && (magicbyte == 0xEE)) + { + ptr = ext_flash_read_firmware_version(textVersion); + textVersion[ptr++] = 'f'; + textVersion[ptr++] = 'o'; + textVersion[ptr++] = 'u'; + textVersion[ptr++] = 'n'; + textVersion[ptr++] = 'd'; + textVersion[ptr] = 0; + + tInfo_newpage(textVersion); + tInfo_write("erase flash"); + status = firmware_eraseFlashMemory(); + if(status != HAL_OK) + { + tInfo_newpage("error. try again."); + status = firmware_eraseFlashMemory(); + if(status != HAL_OK) + { + tInfo_newpage("error. skip update."); + HAL_Delay(1000); + } + } + if(status == HAL_OK) + { + tInfo_write("programm flash"); + status = firmware_programFlashMemory(pBuffer,firmware_load_result); + if(status != HAL_OK) + { + tInfo_newpage("error. try again."); + status = firmware_programFlashMemory(pBuffer,firmware_load_result); + if(status != HAL_OK) + { + tInfo_newpage("error. skip update."); + HAL_Delay(1000); + } + } + } + } + } + + /* here comes the variable upper firmware loader */ + if((i == 0) && (status == HAL_OK)) + { + tInfo_newpage("load firmware2 data"); + uint8_t* pBuffer = (uint8_t*)((uint32_t)0xD0000000); /* blocked via GFX_init1_no_DMA */ + firmware_load_result = ext_flash_read_firmware2(&pOffset, pBuffer,768000*2,0,0); + + if((firmware_load_result > 0) && (firmware_load_result + pOffset <= 1024000)) + { + ptr = 0; + ptr += gfx_number_to_string(7,0,&textVersion[ptr],firmware_load_result); + textVersion[ptr++] = ' '; + textVersion[ptr++] = 'b'; + textVersion[ptr++] = 'y'; + textVersion[ptr++] = 't'; + textVersion[ptr++] = 'e'; + textVersion[ptr++] = 's'; + textVersion[ptr++] = ' '; + textVersion[ptr++] = 'w'; + textVersion[ptr++] = 'i'; + textVersion[ptr++] = 't'; + textVersion[ptr++] = 'h'; + textVersion[ptr++] = ' '; + ptr += gfx_number_to_string(7,0,&textVersion[ptr],pOffset); + textVersion[ptr++] = ' '; + textVersion[ptr++] = 'o'; + textVersion[ptr++] = 'f'; + textVersion[ptr++] = 'f'; + textVersion[ptr++] = 's'; + textVersion[ptr++] = 'e'; + textVersion[ptr++] = 't'; + textVersion[ptr] = 0; + tInfo_newpage(textVersion); + + ptr = 0; + textVersion[ptr++] = 'f'; + textVersion[ptr++] = 'o'; + textVersion[ptr++] = 'u'; + textVersion[ptr++] = 'n'; + textVersion[ptr++] = 'd'; + textVersion[ptr] = 0; + + tInfo_write(textVersion); + tInfo_write("erase flash"); + status = firmware2_variable_upperpart_eraseFlashMemory(firmware_load_result,pOffset); + if(status != HAL_OK) + { + tInfo_newpage("error. try again."); + status = firmware2_variable_upperpart_eraseFlashMemory(firmware_load_result,pOffset); + if(status != HAL_OK) + { + tInfo_newpage("error. skip update."); + HAL_Delay(1000); + } + } + if(status == HAL_OK) + { + tInfo_write("programm flash"); + status = firmware2_variable_upperpart_programFlashMemory(firmware_load_result,pOffset,pBuffer,firmware_load_result,0); + if(status != HAL_OK) + { + tInfo_newpage("error. try again."); + status = firmware2_variable_upperpart_programFlashMemory(firmware_load_result,pOffset,pBuffer,firmware_load_result,0); + if(status != HAL_OK) + { + tInfo_newpage("error. skip update."); + HAL_Delay(1000); + } + } + } + } + } + + if((i == 0) && (status == HAL_OK)) + { + tInfo_newpage("Done."); + tInfo_write("Cleaning."); + ext_flash_erase_firmware_if_not_empty(); + ext_flash_erase_firmware2_if_not_empty(); + tInfo_write("Reset device."); + reset_to_firmware_using_Watchdog(); + } + + ptr = 0; + textVersion[ptr++] = '\021'; + textVersion[ptr++] = 's'; + textVersion[ptr++] = 'e'; + textVersion[ptr++] = 'r'; + textVersion[ptr++] = 'i'; + textVersion[ptr++] = 'a'; + textVersion[ptr++] = 'l'; + textVersion[ptr++] = ' '; + if(HardwareData.primarySerial == 0xFFFF) + { + textVersion[ptr++] = 'n'; + textVersion[ptr++] = 'o'; + textVersion[ptr++] = 't'; + textVersion[ptr++] = ' '; + textVersion[ptr++] = 's'; + textVersion[ptr++] = 'e'; + textVersion[ptr++] = 't'; + } + else if(HardwareData.secondarySerial == 0xFFFF) + { + textVersion[ptr++] = '#'; + ptr += gfx_number_to_string(5,1,&textVersion[ptr],HardwareData.primarySerial); + } + else + { + textVersion[ptr++] = '#'; + ptr += gfx_number_to_string(5,1,&textVersion[ptr],HardwareData.secondarySerial); + textVersion[ptr++] = ' '; + textVersion[ptr++] = '('; + ptr += gfx_number_to_string(5,1,&textVersion[ptr],HardwareData.primarySerial); + textVersion[ptr++] = ')'; + } + textVersion[ptr++] = '\020'; + textVersion[ptr] = 0; + + tInfo_button_text("Exit","","Sleep"); + tInfo_newpage("Bootloader 160602"); + tInfo_write("start bluetooth"); + tInfo_write(""); + tInfo_write(textVersion); + tInfo_write(""); + + TIM_init(); + MX_UART_Init(); + MX_Bluetooth_PowerOn(); + tComm_Set_Bluetooth_Name(0); + + tComm_init(); + set_globalState_Base(); + + GFX_start_VSYNC_IRQ(); + + EXTILine_Buttons_Config(); +/* + uint8_t* pBuffer1 = (uint8_t*)getFrame(20); + firmware_load_result = ext_flash_read_firmware(pBuffer1,768000); + + if((firmware_load_result > 0) && (firmware_load_result < 768000)) + { + firmware_eraseFlashMemory(); + firmware_programFlashMemory(pBuffer1,firmware_load_result); + // not for testing + //ext_flash_erase_firmware_if_not_empty(); + reset_to_firmware_using_Watchdog(); + } +*/ + while(1) + { +// if(bootToBootloader) +// DualBootToBootloader(); + + if(bootToBootloader) + reset_to_update_using_system_reset(); + + tComm_control(); // will stop while loop if tComm Mode started until exit from UART + }; +} + + +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + + SStateList status; + + get_globalStateList(&status); + + switch(status.base) + { + default: +// TIM_BACKLIGHT_adjust(); + break; + } + + if(returnFromCommCleanUpRequest) + { + tComm_exit(); + returnFromCommCleanUpRequest = 0; + GFX_hwBackgroundOn(); + tInfo_button_text("Exit","","Sleep"); + tInfo_newpage("bluetooth disonnected"); + tInfo_write(""); + tInfo_write(""); + tInfo_write(""); + tInfo_write(""); + } + + get_globalStateList(&status); + + switch(status.base) + { + case BaseComm: + if(get_globalState() == StUART_STANDARD) + tComm_refresh(); + break; + default: + break; + } +} + +void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) +{ + uint8_t action; + SStateList status; + static uint8_t counterToPreventSleep = 0; + if(GPIO_Pin == VSYNC_IRQ_PIN) // rechts, unten + { + GFX_change_LTDC(); + housekeepingFrame(); + if(counterToPreventSleep < 250) + counterToPreventSleep++; + else + if(counterToPreventSleep != 255) + { + counterToPreventSleep = 255; + } + + return; + } + + time_without_button_pressed_deciseconds = 0; + + if(GFX_logoStatus() != 0) + return; + + if(GPIO_Pin == BUTTON_BACK_PIN) // links + action = ACTION_BUTTON_BACK; + else + if(GPIO_Pin == BUTTON_ENTER_PIN) // mitte + action = ACTION_BUTTON_ENTER; + else + if(GPIO_Pin == BUTTON_NEXT_PIN) // rechts + action = ACTION_BUTTON_NEXT; +#ifdef BUTTON_CUSTOM_PIN + else + if(GPIO_Pin == BUTTON_CUSTOM_PIN) // extra + action = ACTION_BUTTON_CUSTOM; +#endif + else + action = 0; + get_globalStateList(&status); + + switch(status.base) + { + case BaseComm: + if(action == ACTION_BUTTON_BACK) + { + reset_to_firmware_using_Watchdog(); + } + break; + + default: + if((action == ACTION_BUTTON_NEXT) && (counterToPreventSleep == 255) && (get_globalState() == StS)) + { + while(1) + { + MX_tell_reset_logik_alles_ok(); + DataEX_call(); + HAL_Delay(100); + } + } + else + if(action == ACTION_BUTTON_BACK) + { + reset_to_firmware_using_Watchdog(); + } + else + if(action == ACTION_BUTTON_CUSTOM) + { + if(get_globalState() == StS) + gotoSleep(); + } + else + if(action == ACTION_BUTTON_ENTER) + { + reset_to_update_using_system_reset(); + } + break; + } +} + + +void gotoSleep(void) +{ + ext_flash_erase_firmware_if_not_empty(); + set_globalState(StStop); +} + +// ----------------------------- + + +void MainBootLoaderInit(void) +{ + void (*SysMemBootJump)(void); + SysMemBootJump=(void (*)(void)) (*((uint32_t *) 0x1fff0004)); + + // DMA, SPI, UART, TIM, ExtIRQ, graphics DMA, LTDC + + HAL_RCC_DeInit(); + SysTick->CTRL = 0; + SysTick->LOAD = 0; + SysTick->VAL = 0; + + __set_PRIMASK(1); + + __set_MSP(0x20002318); + SysMemBootJump(); +} + +uint32_t get_globalState(void) +{ + return globalStateID; +} + +void get_globalStateList(SStateList *output) +{ + output->base = (uint8_t)((globalStateID >> 28) & 0x0F); + output->page = (uint8_t)((globalStateID >> 24) & 0x0F); + output->line = (uint8_t)((globalStateID >> 16) & 0xFF); + output->field = (uint8_t)((globalStateID >> 8) & 0xFF); + output->mode = (uint8_t)((globalStateID ) & 0xFF); +} + +void get_idSpecificStateList(uint32_t id, SStateList *output) +{ + output->base = (uint8_t)((id >> 28) & 0x0F); + output->page = (uint8_t)((id >> 24) & 0x0F); + output->line = (uint8_t)((id >> 16) & 0xFF); + output->field = (uint8_t)((id >> 8) & 0xFF); + output->mode = (uint8_t)((id ) & 0xFF); +} + +void set_globalState_Base(void) +{ + set_globalState(StS); +} + +void set_globalState_Menu_Page(uint8_t page) +{ + globalStateID = ((BaseMenu << 28) + (page << 24)); +} + +void set_globalState_Log_Page(uint8_t pageIsLine) +{ + globalStateID = StILOGLIST + (pageIsLine << 16); +} + + +void set_globalState_Menu_Line(uint8_t line) +{ + globalStateID = ((globalStateID & MaskLineFieldDigit) + (line << 16)); +} + + +void set_globalState(uint32_t newID) +{ + globalStateID = newID; +} + + + +void delayMicros(uint32_t micros) +{ + micros = micros * (168/4) - 10; + while(micros--); +} + + +void get_RTC_DateTime(RTC_DateTypeDef * sdatestructureget, RTC_TimeTypeDef * stimestructureget) +{ + /* Get the RTC current Time */ + if(sdatestructureget) + HAL_RTC_GetTime(&RtcHandle, stimestructureget, FORMAT_BIN); + /* Get the RTC current Date */ + if(stimestructureget) + HAL_RTC_GetDate(&RtcHandle, sdatestructureget, FORMAT_BIN); +} + + +void set_RTC_DateTime(RTC_DateTypeDef * sdatestructure, RTC_TimeTypeDef * stimestructure) +{ + if(sdatestructure) + if(HAL_RTC_SetDate(&RtcHandle,sdatestructure,FORMAT_BCD) != HAL_OK) + { + /* Initialization Error */ + Error_Handler(); + } + + if(stimestructure) + if(HAL_RTC_SetTime(&RtcHandle,stimestructure,FORMAT_BCD) != HAL_OK) + { + /* Initialization Error */ + Error_Handler(); + } +} + +static void TIM_init(void) +{ + uint16_t uwPrescalerValue = 0; + + uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / 10000) - 1; + + /* Set TIMx instance */ + TimHandle.Instance = TIMx; + + /* Initialize TIM3 peripheral as follows: + + Period = 10000 - 1 + + Prescaler = ((SystemCoreClock/2)/10000) - 1 + + ClockDivision = 0 + + Counter direction = Up + */ + TimHandle.Init.Period = 1000 - 1; + TimHandle.Init.Prescaler = uwPrescalerValue; + TimHandle.Init.ClockDivision = 0; + TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; + if(HAL_TIM_Base_Init(&TimHandle) != HAL_OK) + { + /* Initialization Error */ + Error_Handler(); + } + + /*##-2- Start the TIM Base generation in interrupt mode ####################*/ + /* Start Channel1 */ + if(HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK) + { + /* Starting Error */ + Error_Handler(); + } +} + +#ifndef TIM_BACKLIGHT +/* +static void TIM_BACKLIGHT_adjust(void) +{ +} +*/ +static void TIM_BACKLIGHT_init(void) +{ +} +#else +/* +static void TIM_BACKLIGHT_adjust(void) +{ + + TIM_OC_InitTypeDef sConfig; + sConfig.OCMode = TIM_OCMODE_PWM1; + sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfig.OCFastMode = TIM_OCFAST_DISABLE; + sConfig.Pulse = 600; + + HAL_TIM_PWM_ConfigChannel(&TimBacklightHandle, &sConfig, TIM_BACKLIGHT_CHANNEL); + HAL_TIM_PWM_Start(&TimBacklightHandle, TIM_BACKLIGHT_CHANNEL); +} +*/ +static void TIM_BACKLIGHT_init(void) +{ + uint32_t uwPrescalerValue = 0; + TIM_OC_InitTypeDef sConfig; + + uwPrescalerValue = (uint32_t) ((SystemCoreClock /2) / 18000000) - 1; + + TimBacklightHandle.Instance = TIM_BACKLIGHT; + + // Initialize TIM3 peripheral as follows: 30 kHz + + TimBacklightHandle.Init.Period = 600 - 1; + TimBacklightHandle.Init.Prescaler = uwPrescalerValue; + TimBacklightHandle.Init.ClockDivision = 0; + TimBacklightHandle.Init.CounterMode = TIM_COUNTERMODE_UP; + HAL_TIM_PWM_Init(&TimBacklightHandle); + + sConfig.OCMode = TIM_OCMODE_PWM1; + sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfig.OCFastMode = TIM_OCFAST_DISABLE; + sConfig.Pulse = 50 * 6; + + HAL_TIM_PWM_ConfigChannel(&TimBacklightHandle, &sConfig, TIM_BACKLIGHT_CHANNEL); + HAL_TIM_PWM_Start(&TimBacklightHandle, TIM_BACKLIGHT_CHANNEL); +} +#endif + + /* Configure RTC prescaler and RTC data registers */ + /* RTC configured as follow: + - Hour Format = Format 24 + - Asynch Prediv = Value according to source clock + - Synch Prediv = Value according to source clock + - OutPut = Output Disable + - OutPutPolarity = High Polarity + - OutPutType = Open Drain */ + /*#define RTC_ASYNCH_PREDIV 0x7F LSE as RTC clock */ + /*LSE: #define RTC_SYNCH_PREDIV 0x00FF LSE as RTC clock */ + /*LSI: #define RTC_SYNCH_PREDIV 0x0130 LSI as RTC clock */ +/* +static void RTC_init(void) +{ + RtcHandle.Instance = RTC; + + + RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24; + RtcHandle.Init.AsynchPrediv = 0x7F; + RtcHandle.Init.SynchPrediv = 0x0130; + RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE; + RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + + if(HAL_RTC_Init(&RtcHandle) != HAL_OK) + { + Error_Handler(); + } +} +*/ + +static void EXTILine_Buttons_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + BUTTON_ENTER_GPIO_ENABLE(); + BUTTON_NEXT_GPIO_ENABLE(); + BUTTON_BACK_GPIO_ENABLE(); + + /* Configure pin as weak PULLUP input */ + /* buttons */ + GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING; + GPIO_InitStructure.Pull = GPIO_NOPULL; + GPIO_InitStructure.Speed = GPIO_SPEED_LOW; + + GPIO_InitStructure.Pin = BUTTON_ENTER_PIN; + HAL_GPIO_Init(BUTTON_ENTER_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = BUTTON_NEXT_PIN; + HAL_GPIO_Init(BUTTON_NEXT_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = BUTTON_BACK_PIN; + HAL_GPIO_Init(BUTTON_BACK_GPIO_PORT, &GPIO_InitStructure); + + /* Enable and set EXTI Line0 Interrupt to the lowest priority */ + HAL_NVIC_SetPriority(BUTTON_ENTER_EXTI_IRQn, 2, 0); + HAL_NVIC_SetPriority(BUTTON_NEXT_EXTI_IRQn, 2, 0); + HAL_NVIC_SetPriority(BUTTON_BACK_EXTI_IRQn, 2, 0); + HAL_NVIC_EnableIRQ(BUTTON_ENTER_EXTI_IRQn); + HAL_NVIC_EnableIRQ(BUTTON_NEXT_EXTI_IRQn); + HAL_NVIC_EnableIRQ(BUTTON_BACK_EXTI_IRQn); + +#ifdef BUTTON_CUSTOM_PIN + BUTTON_CUSTOM_GPIO_ENABLE(); + GPIO_InitStructure.Pin = BUTTON_CUSTOM_PIN; + HAL_GPIO_Init(BUTTON_CUSTOM_GPIO_PORT, &GPIO_InitStructure); + HAL_NVIC_SetPriority(BUTTON_CUSTOM_EXTI_IRQn, 2, 0); + HAL_NVIC_EnableIRQ(BUTTON_CUSTOM_EXTI_IRQn); +#endif +} + + +/** + * @brief System Clock Configuration + * The system Clock is configured as follow : + * System Clock source = PLL (HSE) + * SYSCLK(Hz) = 180000000 + * HCLK(Hz) = 180000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 4 + * APB2 Prescaler = 2 + * HSE Frequency(Hz) = 8000000 + * PLL_M = 8 + * PLL_N = 360 + * PLL_P = 2 + * PLL_Q = 7 + * VDD(V) = 3.3 + * Main regulator output voltage = Scale1 mode + * Flash Latency(WS) = 5 + * The LTDC Clock is configured as follow : + * PLLSAIN = 192 + * PLLSAIR = 4 + * PLLSAIDivR = 8 + * @param None + * @retval None + */ +static void SystemClock_Config(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; + + /* Enable Power Control clock */ + __PWR_CLK_ENABLE(); + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /*##-1- System Clock Configuration #########################################*/ + /* Enable HSE Oscillator and activate PLL with HSE as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336;//360; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + HAL_RCC_OscConfig(&RCC_OscInitStruct); + +// HAL_PWREx_ActivateOverDrive(); +HAL_PWREx_DeactivateOverDrive(); + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 + clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_8);//FLASH_LATENCY_5); + + /*##-2- LTDC Clock Configuration ###########################################*/ + /* LCD clock configuration */ + /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ + /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/4 = 48 Mhz */ + /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDIVR_8 = 48/8 = 6 Mhz */ + + /* neu: 8MHz/8*300/5/8 = 7,5 MHz = 19,5 Hz bei 800 x 480 */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; + PeriphClkInitStruct.PLLSAI.PLLSAIN = 300;//192; + PeriphClkInitStruct.PLLSAI.PLLSAIR = 5;//4; + PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_8;//RCC_PLLSAIDIVR_4;// RCC_PLLSAIDIVR_2; // RCC_PLLSAIDIVR_8 + HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); +} + + +/** + * @brief This function is executed in case of error occurrence. + * @param None + * @retval None + */ +static void Error_Handler(void) +{ + /* Turn LED3 on */ +// BSP_LED_On(LED3); + while(1) + { + } +} + +/** + * @brief Perform the SDRAM exernal memory inialization sequence + * @param hsdram: SDRAM handle + * @param Command: Pointer to SDRAM command structure + * @retval None + */ +static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command) +{ + __IO uint32_t tmpmrd =0; + /* Step 3: Configure a clock configuration enable command */ + Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; + Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; + Command->AutoRefreshNumber = 1; + Command->ModeRegisterDefinition = 0; + + /* Send the command */ + HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); + + /* Step 4: Insert 100 ms delay */ + HAL_Delay(100); + + /* Step 5: Configure a PALL (precharge all) command */ + Command->CommandMode = FMC_SDRAM_CMD_PALL; + Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; + Command->AutoRefreshNumber = 1; + Command->ModeRegisterDefinition = 0; + + /* Send the command */ + HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); + + /* Step 6 : Configure a Auto-Refresh command */ + Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; + Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; + Command->AutoRefreshNumber = 4; + Command->ModeRegisterDefinition = 0; + + /* Send the command */ + HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); + + /* Step 7: Program the external memory mode register */ + tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2 | + SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | + SDRAM_MODEREG_CAS_LATENCY_3 | + SDRAM_MODEREG_OPERATING_MODE_STANDARD | + SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; + + Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE; + Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; + Command->AutoRefreshNumber = 1; + Command->ModeRegisterDefinition = tmpmrd; + + /* Send the command */ + HAL_SDRAM_SendCommand(hsdram, Command, 0x1000); + + /* Step 8: Set the refresh rate counter */ + /* (15.62 us x Freq) - 20 */ + /* neu: (8 us x Freq) - 20 */ + /* Set the device refresh counter */ + HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT); +} + +/* +static void DualBoot(void) +{ + // Set BFB2 bit to enable boot from Flash Bank2 + // Allow Access to Flash control registers and user Falsh + HAL_FLASH_Unlock(); + + // Allow Access to option bytes sector + HAL_FLASH_OB_Unlock(); + + // Get the Dual boot configuration status + AdvOBInit.OptionType = OBEX_BOOTCONFIG; + HAL_FLASHEx_AdvOBGetConfig(&AdvOBInit); + + // Enable/Disable dual boot feature + if (((AdvOBInit.BootConfig) & (FLASH_OPTCR_BFB2)) == FLASH_OPTCR_BFB2) + { + AdvOBInit.BootConfig = OB_DUAL_BOOT_DISABLE; + HAL_FLASHEx_AdvOBProgram (&AdvOBInit); + } + else + { + AdvOBInit.BootConfig = OB_DUAL_BOOT_ENABLE; + HAL_FLASHEx_AdvOBProgram (&AdvOBInit); + } + + // Start the Option Bytes programming process + if (HAL_FLASH_OB_Launch() != HAL_OK) + { + // User can add here some code to deal with this error + while (1) + { + } + } + // Prevent Access to option bytes sector + HAL_FLASH_OB_Lock(); + + // Disable the Flash option control register access (recommended to protect + // the option Bytes against possible unwanted operations) + HAL_FLASH_Lock(); + + // Initiates a system reset request to reset the MCU + reset_to_firmware_using_Watchdog(); +} +*/ +/** + ****************************************************************************** + ****************************************************************************** + ****************************************************************************** + */ + + +/** + * @brief DMA2D configuration. + * @note This function Configure tha DMA2D peripheral : + * 1) Configure the transfer mode : memory to memory W/ pixel format conversion + * 2) Configure the output color mode as ARGB4444 + * 3) Configure the output memory address at SRAM memory + * 4) Configure the data size : 320x120 (pixels) + * 5) Configure the input color mode as ARGB8888 + * 6) Configure the input memory address at FLASH memory + * @retval + * None + */ + +static void SDRAM_Config(void) +{ + /*##-1- Configure the SDRAM device #########################################*/ + /* SDRAM device configuration */ + hsdram.Instance = FMC_SDRAM_DEVICE; + + /* Timing configuration for 90 Mhz of SD clock frequency (180Mhz/2) */ + /* TMRD: 2 Clock cycles */ + SDRAM_Timing.LoadToActiveDelay = 2; + /* TXSR: min=70ns (6x11.90ns) */ + SDRAM_Timing.ExitSelfRefreshDelay = 7; + /* TRAS: min=42ns (4x11.90ns) max=120k (ns) */ + SDRAM_Timing.SelfRefreshTime = 4; + /* TRC: min=63 (6x11.90ns) */ + SDRAM_Timing.RowCycleDelay = 7; + /* TWR: 2 Clock cycles */ + SDRAM_Timing.WriteRecoveryTime = 2; + /* TRP: 15ns => 2x11.90ns */ + SDRAM_Timing.RPDelay = 2; + /* TRCD: 15ns => 2x11.90ns */ + SDRAM_Timing.RCDDelay = 2; + + hsdram.Init.SDBank = FMC_SDRAM_BANK2; + hsdram.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9; + hsdram.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13; + hsdram.Init.MemoryDataWidth = SDRAM_MEMORY_WIDTH; + hsdram.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; + hsdram.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3; + hsdram.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; + hsdram.Init.SDClockPeriod = SDCLOCK_PERIOD; + hsdram.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE; + hsdram.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; + + /* Initialize the SDRAM controller */ + if(HAL_SDRAM_Init(&hsdram, &SDRAM_Timing) != HAL_OK) + { + /* Initialization Error */ + Error_Handler(); + } + + /* Program the SDRAM external device */ + SDRAM_Initialization_Sequence(&hsdram, &command); +} + + +uint8_t checkResetForFirmwareUpdate(void) +{ + uint32_t backupRegisterContent; + + RTC_HandleTypeDef RtcHandle; + RtcHandle.Instance = RTC; + backupRegisterContent = HAL_RTCEx_BKUPRead(&RtcHandle,RTC_BKP_DR0); + + if(backupRegisterContent == 0x12345678) + return 1; + else + return 0; +} + +void DeleteResetToFirmwareUpdateRegister(void) +{ + RTC_HandleTypeDef RtcHandle; + RtcHandle.Instance = RTC; + __HAL_RTC_WRITEPROTECTION_DISABLE(&RtcHandle); + HAL_RTCEx_BKUPWrite(&RtcHandle,RTC_BKP_DR0,0x00); + __HAL_RTC_WRITEPROTECTION_ENABLE(&RtcHandle); +} + +#ifdef USE_FULL_ASSERT + +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t* file, uint32_t line) +{ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + + /* Infinite loop */ + while (1) + { + } +} +#endif + +/* +static void DualBootToBootloader(void) +{ + // Set BFB2 bit to enable boot from Flash Bank2 + // Allow Access to Flash control registers and user Falsh + HAL_FLASH_Unlock(); + + // Allow Access to option bytes sector + HAL_FLASH_OB_Unlock(); + + // Get the Dual boot configuration status + AdvOBInit.OptionType = OPTIONBYTE_BOOTCONFIG; + HAL_FLASHEx_AdvOBGetConfig(&AdvOBInit); + + // Enable/Disable dual boot feature + if (((AdvOBInit.BootConfig) & (FLASH_OPTCR_BFB2)) == FLASH_OPTCR_BFB2) + { + AdvOBInit.BootConfig = OB_DUAL_BOOT_DISABLE; + HAL_FLASHEx_AdvOBProgram (&AdvOBInit); + if (HAL_FLASH_OB_Launch() != HAL_OK) + { + while (1) + { + } + } + } + else + { + + AdvOBInit.BootConfig = OB_DUAL_BOOT_ENABLE; + HAL_FLASHEx_AdvOBProgram (&AdvOBInit); + if (HAL_FLASH_OB_Launch() != HAL_OK) + { + while (1) + { + } + } + } + + // Prevent Access to option bytes sector + HAL_FLASH_OB_Lock(); + + / Disable the Flash option control register access (recommended to protect + // the option Bytes against possible unwanted operations) + HAL_FLASH_Lock(); + + // Initiates a system reset request to reset the MCU + reset_to_firmware_using_Watchdog(); +} +*/ + +void reset_to_update_using_system_reset(void) +{ + __HAL_RCC_CLEAR_RESET_FLAGS(); + HAL_NVIC_SystemReset(); +} + +void reset_to_firmware_using_Watchdog(void) +{ + __HAL_RCC_CLEAR_RESET_FLAGS(); + __HAL_RCC_WWDG_CLK_ENABLE(); + + WWDG_HandleTypeDef WwdgHandle; + WwdgHandle.Instance = WWDG; + + WwdgHandle.Init.Prescaler = WWDG_PRESCALER_8; + WwdgHandle.Init.Window = 80; + WwdgHandle.Init.Counter = 127; + + HAL_WWDG_Init(&WwdgHandle); + HAL_WWDG_Start(&WwdgHandle); + while(1); +} + + +void set_returnFromComm(void) +{ + returnFromCommCleanUpRequest = 1; +} + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ diff -r 89a87ddc2e47 -r e65d01b6a17e BootLoader/Src/settings_bootloader.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Src/settings_bootloader.c Fri Dec 15 01:45:20 2017 +0100 @@ -0,0 +1,47 @@ +/** + ****************************************************************************** + * @copyright heinrichs weikamp + * @file settings_bootloader.c + * @author heinrichs/weikamp, Christian Weikamp + * @date 21-March-2016 + * @version V1.0.1 + * @since 24-Oct-2016 + * @brief mini version for firmwareDataGetPointer() etc. + * 1.0.1 getLicence() included + ****************************************************************************** + */ + + +/* Includes ------------------------------------------------------------------*/ +#include +#include "settings.h" + + +/* always at 0x8080000, do not move -> bootloader access */ +const SFirmwareData* firmwareDataGetPointer(void) +{ + return (const SFirmwareData*)(0x08040000 + 0x00010000); +} + + +void getActualRTEandFONTversion(uint8_t *RTEhigh, uint8_t *RTElow, uint8_t *FONThigh, uint8_t *FONTlow) +{ + if(RTEhigh && RTElow) + { + *RTEhigh = 0; + *RTElow = 0; + } + if(FONThigh && FONTlow) + { + *FONThigh = *(uint8_t *)0x08132000; + *FONTlow = *(uint8_t *)0x08132001; + } +} + + +uint8_t getLicence(void) +{ +//return 0xFF; +//return LICENCEBONEX; + return hardwareDataGetPointer()->primaryLicence; +} diff -r 89a87ddc2e47 -r e65d01b6a17e BootLoader/Src/tInfoBootloader.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BootLoader/Src/tInfoBootloader.c Fri Dec 15 01:45:20 2017 +0100 @@ -0,0 +1,123 @@ +/** + ****************************************************************************** + * @file tInfoBootloader.c + * @author heinrichs/weikamp, Christian Weikamp + * @version V0.0.1 + * @date 08-May-2015 + * @brief Write something on the screen in between steps + * + @verbatim + ============================================================================== + ##### How to use ##### + ============================================================================== + * a little bit of text (DMA is not running for fast clean) + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2015 heinrichs weikamp

+ * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include +#include "base_bootloader.h" +#include "ostc.h" +#include "tInfoBootloader.h" +#include "gfx_engine.h" +#include "gfx_colors.h" +/* Exported variables --------------------------------------------------------*/ + +/* Private variables ---------------------------------------------------------*/ + + GFX_DrawCfgScreen tIBscreen; + GFX_DrawCfgWindow tIBwindow; + uint8_t line = 1; + + char textButtonLeft[30] = { 0 }; + char textButtonMid[31] = { 0 }; + char textButtonRight[31] = { 0 }; + +/* Private types -------------------------------------------------------------*/ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ + +void tInfoBootloader_init(void) +{ + tIBscreen.FBStartAdress = 0; + tIBscreen.ImageHeight = 480; + tIBscreen.ImageWidth = 800; + tIBscreen.LayerIndex = 1; + + tIBwindow.Image = &tIBscreen; + tIBwindow.WindowNumberOfTextLines = 6; + tIBwindow.WindowLineSpacing = 65; + tIBwindow.WindowTab = 400; + tIBwindow.WindowX0 = 20; + tIBwindow.WindowX1 = 779; + tIBwindow.WindowY0 = 0; + tIBwindow.WindowY1 = 799; + + line = 1; +} + + +void tInfo_button_text(const char *text_left, const char *text_mid, const char *text_right) +{ + if(text_left) + strncpy(textButtonLeft,text_left,30); + if(text_mid) + { + textButtonMid[0] = '\001'; + strncpy(&textButtonMid[1],text_mid,30); + } + if(text_right) + { + textButtonRight[0] = '\002'; + strncpy(&textButtonRight[1],text_right,30); + } +} + + +void tInfo_newpage(const char *text) +{ + uint32_t backup = tIBscreen.FBStartAdress; + + tIBscreen.FBStartAdress = getFrame(18); + line = 1; + if(text) + GFX_write_string(&FontT48, &tIBwindow, text,line); + line++; + + if(*textButtonLeft) + write_content_simple(&tIBscreen, 0, 800, 480-24, &FontT24,textButtonLeft,CLUT_ButtonSurfaceScreen); + if(*textButtonMid) + write_content_simple(&tIBscreen, 0, 800, 480-24, &FontT24,textButtonMid,CLUT_ButtonSurfaceScreen); + if(*textButtonRight) + write_content_simple(&tIBscreen, 0, 800, 480-24, &FontT24,textButtonRight,CLUT_ButtonSurfaceScreen); + + GFX_SetFrameTop(tIBscreen.FBStartAdress); + GFX_change_LTDC(); + + if(backup != 0) + releaseFrame(18,backup); +} + + +void tInfo_write(const char *text) +{ + if((line > 6) || (tIBscreen.FBStartAdress == 0)) + tInfo_newpage(text); + else + { + if(text) + GFX_write_string(&FontT48, &tIBwindow, text,line); + line++; + + } +} + +/* Private functions ---------------------------------------------------------*/ diff -r 89a87ddc2e47 -r e65d01b6a17e OtherSources/base_upperRegion.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OtherSources/base_upperRegion.c Fri Dec 15 01:45:20 2017 +0100 @@ -0,0 +1,129 @@ +/** + ****************************************************************************** + * @copyright heinrichs weikamp + * @file base_upperRegion.c + * @author heinrichs/weikamp, Christian Weikamp + * @date 31-August-2015 + * @version V0.0.3 + * @since 03-Dez-2016 + * @brief The beginning of it all. main() is part of this. + * @bug + * @warning + @verbatim + ============================================================================== + ##### New characters in fonts ##### + ============================================================================== + [..] Use font_tmore.c and add line to corresponding font like font_t54c + Don't forget to adjust the length of the font in the last line starting + const tFont ..... + + [..] last char vor der großen Lücke, Stand 160217 + image_data_FontT24_0x002b[364] + __attribute__((at( START_T24_FONT + (1647 * 28) ))), START_T24_FONT (0x08142F00 - MINUS_BANK) + + -> frei ab 0x0814E490 + geht dann weiter mit image_data_ostc_fuer_Tauchcomputer_240px + sind ca. 120 kByte frei! + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stdio.h" +#include // for memcopy + +#include "stm32f4xx_hal.h" +#include "gfx_engine.h" + +/* HINT chsw 160114 + * using Jef Driesen dctool.exe I found out that from 150K to 230K there is only '0's!!! + */ + +#define VARIABLE_UPPER_REGION +//#define FIXED_UPPER_REGION + +#ifdef VARIABLE_UPPER_REGION +//static const uint8_t image_data_HelloWorld[] __attribute__((at(0x08132000 ))) = "Hello World "; + +typedef struct +{ + uint8_t versionFirst; + uint8_t versionSecond; + uint8_t versionNOTUSED; + uint8_t versionBeta; + uint8_t signature[4]; + uint8_t release_year; + uint8_t release_month; + uint8_t release_day; + uint8_t release_sub; + char release_info[48]; + char dummy[4]; +} SHelloWorldData; + +static const SHelloWorldData FirmwareData __attribute__((at(0x08132000))) = { + + .versionFirst = 0, + .versionSecond = 9, + .versionNOTUSED = 0, + .versionBeta = 0, + + /* 4 bytes with trailing 0 */ + .signature = "cw", + + .release_year = 16, + .release_month = 1, + .release_day = 13, + .release_sub = 0, + + /* max 48 with trailing 0 */ + //release_info ="12345678901234567890123456789012345678901" + .release_info ="", + + /* for safety reasons and coming functions */ + .dummy[0] = 0, + .dummy[1] = 0, + .dummy[2] = 0xF0, /* the magic byte for fonts*/ + .dummy[3] = 0xFF +}; +static const uint8_t image_data_end_of_header[] __attribute__((at(0x0813217e - 5 ))) = "chsw"; + + +// at the moment 09. Sept. 2015, font_T144_plus is the first code starting at 0x0813217e +#include "font_T144_plus.c" // 0x0813217e, max. 69 kB +#include "font_T24.c" // 0x08142F00 max. 47 kB +// grosse Lücke von 120 kB +#include "image_ostc.c" // 0x0816BAD2 +#include "font_T84.c" // 0x08170000 +#include "font_T54.c" // 0x081762EE +#include "font_T105.c" // 0x0817bd00 +// der letzte Font ist T42, dahinter ist Platz von 0x081aa5a0 (Stand 151214) bis 0x081DFFFF +#include "font_T42.c" // 0x0818f9c0 +// starts at BASE_TMORE = 0x081aa5a0, defined in fontT_config.h +#include "font_Tmore.c" // 0x081aa5a0 + + +// im regulären unteren Speicher +// for checked / unchecked only at the moment +//#include "font_awe48.c" +//#include "battery2_complete.c" +#endif + +// starts at 0x081E0000 +#ifdef FIXED_UPPER_REGION +#include "font_T48_plus.c" +#include "image_heinrichs_weikamp.c" /* with no fixed region color lookup table */ +#endif + + +int main(void) //__attribute__((at(0x08000000))) +{ +} + + +/************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ diff -r 89a87ddc2e47 -r e65d01b6a17e OtherSources/data_central_mini.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OtherSources/data_central_mini.c Fri Dec 15 01:45:20 2017 +0100 @@ -0,0 +1,224 @@ +/** + ****************************************************************************** + * @copyright heinrichs weikamp + * @file data_central_mini.c - bootloader only - + * @author heinrichs/weikamp, Christian Weikamp + * @date 10-November-2014 + * @version V1.0.3 + * @since 10-Nov-2014 + * @brief + * @bug + * @warning + @verbatim + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2015 heinrichs weikamp

+ * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include +#include "data_central.h" +#include "stm32f4xx_hal.h" +#include "crcmodel.h" + +void translateDate(uint32_t datetmpreg, RTC_DateTypeDef *sDate) +{ + datetmpreg = (uint32_t)(datetmpreg & RTC_DR_RESERVED_MASK); + + /* Fill the structure fields with the read parameters */ + sDate->Year = (uint8_t)((datetmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16); + sDate->Month = (uint8_t)((datetmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8); + sDate->Date = (uint8_t)(datetmpreg & (RTC_DR_DT | RTC_DR_DU)); + sDate->WeekDay = (uint8_t)((datetmpreg & (RTC_DR_WDU)) >> 13); + + /* Convert the date structure parameters to Binary format */ + sDate->Year = (uint8_t)RTC_Bcd2ToByte(sDate->Year); + sDate->Month = (uint8_t)RTC_Bcd2ToByte(sDate->Month); + sDate->Date = (uint8_t)RTC_Bcd2ToByte(sDate->Date); +} + +void translateTime(uint32_t tmpreg, RTC_TimeTypeDef *sTime) +{ + tmpreg = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK); + + /* Fill the structure fields with the read parameters */ + sTime->Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16); + sTime->Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8); + sTime->Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU)); + sTime->TimeFormat = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16); + + /* Convert the time structure parameters to Binary format */ + sTime->Hours = (uint8_t)RTC_Bcd2ToByte(sTime->Hours); + sTime->Minutes = (uint8_t)RTC_Bcd2ToByte(sTime->Minutes); + sTime->Seconds = (uint8_t)RTC_Bcd2ToByte(sTime->Seconds); + sTime->SubSeconds = 0; +} + + +/* This is derived from crc32b but does table lookup. First the table +itself is calculated, if it has not yet been set up. +Not counting the table setup (which would probably be a separate +function), when compiled to Cyclops with GCC, this function executes in +7 + 13n instructions, where n is the number of bytes in the input +message. It should be doable in 4 + 9n instructions. In any case, two +of the 13 or 9 instrucions are load byte. + This is Figure 14-7 in the text. */ + +/* http://www.hackersdelight.org/ i guess ;-) *chsw */ + +uint32_t crc32c_checksum(uint8_t* message, uint16_t length, uint8_t* message2, uint16_t length2) { + int i, j; + uint32_t byte, crc, mask; + static unsigned int table[256] = {0}; + + /* Set up the table, if necessary. */ + if (table[1] == 0) { + for (byte = 0; byte <= 255; byte++) { + crc = byte; + for (j = 7; j >= 0; j--) { // Do eight times. + mask = -(crc & 1); + crc = (crc >> 1) ^ (0xEDB88320 & mask); + } + table[byte] = crc; + } + } + + /* Through with table setup, now calculate the CRC. */ + i = 0; + crc = 0xFFFFFFFF; + while (length--) { + byte = message[i]; + crc = (crc >> 8) ^ table[(crc ^ byte) & 0xFF]; + i = i + 1; + } + if(length2) + { + i = 0; + while (length2--) { + byte = message2[i]; + crc = (crc >> 8) ^ table[(crc ^ byte) & 0xFF]; + i = i + 1; + } + } + return ~crc; +} + + +uint32_t CRC_CalcBlockCRC_moreThan768000(uint32_t *buffer1, uint32_t *buffer2, uint32_t words) +{ + cm_t crc_model; + uint32_t word_to_do; + uint8_t byte_to_do; + int i; + + // Values for the STM32F generator. + + crc_model.cm_width = 32; // 32-bit CRC + crc_model.cm_poly = 0x04C11DB7; // CRC-32 polynomial + crc_model.cm_init = 0xFFFFFFFF; // CRC initialized to 1's + crc_model.cm_refin = FALSE; // CRC calculated MSB first + crc_model.cm_refot = FALSE; // Final result is not bit-reversed + crc_model.cm_xorot = 0x00000000; // Final result XOR'ed with this + + cm_ini(&crc_model); + + while (words--) + { + // The STM32F10x hardware does 32-bit words at a time!!! + if(words > (768000/4)) + word_to_do = *buffer2++; + else + word_to_do = *buffer1++; + + // Do all bytes in the 32-bit word. + + for (i = 0; i < sizeof(word_to_do); i++) + { + // We calculate a *byte* at a time. If the CRC is MSB first we + // do the next MS byte and vica-versa. + + if (crc_model.cm_refin == FALSE) + { + // MSB first. Do the next MS byte. + + byte_to_do = (uint8_t) ((word_to_do & 0xFF000000) >> 24); + word_to_do <<= 8; + } + else + { + // LSB first. Do the next LS byte. + + byte_to_do = (uint8_t) (word_to_do & 0x000000FF); + word_to_do >>= 8; + } + + cm_nxt(&crc_model, byte_to_do); + } + } + + // Return the final result. + + return (cm_crc(&crc_model)); +} + + +uint32_t CRC_CalcBlockCRC(uint32_t *buffer, uint32_t words) +{ + cm_t crc_model; + uint32_t word_to_do; + uint8_t byte_to_do; + int i; + + // Values for the STM32F generator. + + crc_model.cm_width = 32; // 32-bit CRC + crc_model.cm_poly = 0x04C11DB7; // CRC-32 polynomial + crc_model.cm_init = 0xFFFFFFFF; // CRC initialized to 1's + crc_model.cm_refin = FALSE; // CRC calculated MSB first + crc_model.cm_refot = FALSE; // Final result is not bit-reversed + crc_model.cm_xorot = 0x00000000; // Final result XOR'ed with this + + cm_ini(&crc_model); + + while (words--) + { + // The STM32F10x hardware does 32-bit words at a time!!! + + word_to_do = *buffer++; + + // Do all bytes in the 32-bit word. + + for (i = 0; i < sizeof(word_to_do); i++) + { + // We calculate a *byte* at a time. If the CRC is MSB first we + // do the next MS byte and vica-versa. + + if (crc_model.cm_refin == FALSE) + { + // MSB first. Do the next MS byte. + + byte_to_do = (uint8_t) ((word_to_do & 0xFF000000) >> 24); + word_to_do <<= 8; + } + else + { + // LSB first. Do the next LS byte. + + byte_to_do = (uint8_t) (word_to_do & 0x000000FF); + word_to_do >>= 8; + } + + cm_nxt(&crc_model, byte_to_do); + } + } + + // Return the final result. + + return (cm_crc(&crc_model)); +} + diff -r 89a87ddc2e47 -r e65d01b6a17e OtherSources/data_exchange_main_mini.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OtherSources/data_exchange_main_mini.c Fri Dec 15 01:45:20 2017 +0100 @@ -0,0 +1,130 @@ +/** + ****************************************************************************** + * @file data_exchange_main.c + * @author heinrichs/weikamp, Christian Weikamp + * @date 13-Oct-2014 + * @version V0.0.2 + * @since 27-May-2015 + + * @brief Communication with the second CPU == RTE system + * + @verbatim + ============================================================================== + ##### How to use ##### + ============================================================================== + + ============================================================================== + ##### Device Data ##### + ============================================================================== + + main CPU always sends the device data info that it has at the moment + + on start it is INT32_MIN, INT32_MAX and 0 + as initialized in data_central.c variable declaration + + second small CPU gets request to send its device data + + on receiption the data is merged with the data in externLogbookFlash, + stored on the externLogbookFlash and from now on send to small CPU + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 heinrichs weikamp

+ * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include // for memcopy +#include "stm32f4xx_hal.h" +#include "stdio.h" +#include "ostc.h" +#include "data_central.h" +#include "data_exchange_main.h" +#include "base.h" +#include "externLogbookFlash.h" + + +/* Expoted variables --------------------------------------------------------*/ + +/* Private variables ---------------------------------------------------------*/ + +SDataReceiveFromMaster dataOut; +SDataExchangeSlaveToMaster dataIn; + +uint8_t data_old__lost_connection_to_slave_counter_temp = 0; +/* Private types -------------------------------------------------------------*/ + +uint8_t DataEX_check_header_and_footer_ok(void); +void DataEX_control_connection_while_asking_for_sleep(void); + +/* Exported functions --------------------------------------------------------*/ + +uint8_t DataEX_call(void) +{ + DataEX_control_connection_while_asking_for_sleep(); + + for(int i=0;i= 3) + { + data_old__lost_connection_to_slave_counter_temp = 0; + } + else + { + HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_RESET); + } + + HAL_SPI_TransmitReceive_DMA(&cpu2DmaSpi, (uint8_t *)&dataOut, (uint8_t *)&dataIn, EXCHANGE_BUFFERSIZE+1); + return 1; +} + + +void DataEX_control_connection_while_asking_for_sleep(void) +{ + if(!DataEX_check_header_and_footer_ok()) + { + data_old__lost_connection_to_slave_counter_temp += 1; + } +} + +uint8_t DataEX_check_header_and_footer_ok(void) +{ + if(dataIn.header.checkCode[0] != 0xA1) + return 0; + if(dataIn.header.checkCode[1] != 0xA2) + return 0; + if(dataIn.header.checkCode[2] != 0xA3) + return 0; + if(dataIn.header.checkCode[3] != 0xA4) + return 0; + if(dataIn.footer.checkCode[0] != 0xE1) + return 0; + if(dataIn.footer.checkCode[1] != 0xE2) + return 0; + if(dataIn.footer.checkCode[2] != 0xE3) + return 0; + if(dataIn.footer.checkCode[3] != 0xE4) + return 0; + + return 1; +} + diff -r 89a87ddc2e47 -r e65d01b6a17e OtherSources/firmwareEraseProgram.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OtherSources/firmwareEraseProgram.c Fri Dec 15 01:45:20 2017 +0100 @@ -0,0 +1,571 @@ +/** + ****************************************************************************** + * @file firmwareEraseProgram.c + * @author heinrichs/weikamp, Christian Weikamp + * @version V0.0.1 + * @date 05-May-2015 + * @version V0.0.1 + * @since 05-May-2015 + * @brief erase and program the STM32F4xx internal FLASH memory + * + @verbatim + ============================================================================== + ##### How to use ##### + ============================================================================== + ADDR_FLASH_SECTOR_0 to/with ADDR_FLASH_SECTOR_5 (256KB) is used for this bootloader + + ADDR_FLASH_SECTOR_23 is blocked and used for Font T48 and image_heinrichs_weikamp + Font T24 for button text is not blocked / protected + other fonts should not be used here + + + ============================================================================== + ##### From AN2557 ##### + STM32F10xxx In-Application programming CD00161640.pdf 2010 + ============================================================================== +User program conditions +The user application to be loaded into the Flash memory using IAP should be built with +these configuration settings: +1. Set the program load address at 0x08003000, using your toolchain linker file +2. Relocate the vector table at address 0x08003000, using the +"NVIC_SetVectorTable"function or the VECT_TAB_OFFSET definition inside the +"system_stm32f10x.c" + +can be found here system_stm32f4xx.c + + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2015 heinrichs weikamp

+ * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" +#include "stdio.h" +#include "firmwareEraseProgram.h" +#include "settings.h" // to access SHardwareData + +/* Exported variables --------------------------------------------------------*/ + +/* Private types -------------------------------------------------------------*/ + +/* Base address of the Flash sectors Bank 1 */ +#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */ +#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbytes */ + +/* Base address of the Flash sectors Bank 2 */ +#define ADDR_FLASH_SECTOR_12 ((uint32_t)0x08100000) /* Base @ of Sector 0, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_13 ((uint32_t)0x08104000) /* Base @ of Sector 1, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_14 ((uint32_t)0x08108000) /* Base @ of Sector 2, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_15 ((uint32_t)0x0810C000) /* Base @ of Sector 3, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_16 ((uint32_t)0x08110000) /* Base @ of Sector 4, 64 Kbytes */ +#define ADDR_FLASH_SECTOR_17 ((uint32_t)0x08120000) /* Base @ of Sector 5, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_18 ((uint32_t)0x08140000) /* Base @ of Sector 6, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_19 ((uint32_t)0x08160000) /* Base @ of Sector 7, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_20 ((uint32_t)0x08180000) /* Base @ of Sector 8, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_21 ((uint32_t)0x081A0000) /* Base @ of Sector 9, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_22 ((uint32_t)0x081C0000) /* Base @ of Sector 10, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_23 ((uint32_t)0x081E0000) /* Base @ of Sector 11, 128 Kbytes */ + +#define SECTOR_SIZE_128KB ((uint32_t)0x00020000) + +#define FLASH_FW_START_ADDR ADDR_FLASH_SECTOR_6 +#define FLASH_FW_END_ADDR (ADDR_FLASH_SECTOR_12 - 1) + +#define FLASH_FW2_START_ADDR ADDR_FLASH_SECTOR_12 +#define FLASH_FW2_END_ADDR (ADDR_FLASH_SECTOR_22 + SECTOR_SIZE_128KB - 1) + +/* Private variables ---------------------------------------------------------*/ + +static FLASH_EraseInitTypeDef EraseInitStruct; /*Variable used for Erase procedure*/ + +uint32_t FirstSector = 0, NbOfSectors = 0, Address = 0; +uint32_t SectorError = 0; +__IO uint32_t data32 = 0 , MemoryProgramStatus = 0; + + + +/* Private function prototypes -----------------------------------------------*/ +//static void firmware_Error_Handler(HAL_StatusTypeDef reason); +static uint32_t GetSector(uint32_t Address); +uint8_t hardware_programm_sub(uint8_t *buffer64, uint8_t length, uint32_t startAddress); + +/* Exported functions --------------------------------------------------------*/ + +const SHardwareData* hardwareDataGetPointer(void) +{ + return (SHardwareData*)HARDWAREDATA_ADDRESS; +} + +uint8_t hardware_programmPrimaryBluetoothNameSet(void) +{ + uint8_t data = 0xF0; + return hardware_programm_sub(&data, 1, HARDWAREDATA_ADDRESS + 7); +} + + +uint8_t hardware_programmSecondaryBluetoothNameSet(void) +{ + uint8_t data = 0xF0; + return hardware_programm_sub(&data, 1, HARDWAREDATA_ADDRESS + 52 + 7); +} + + +uint8_t hardware_programmProductionData(uint8_t *buffer52) +{ + buffer52[7] = 0xFF;// production_bluetooth_name_set + return hardware_programm_sub(buffer52, 52, HARDWAREDATA_ADDRESS);// check base_bootloader.c of OSTC4bootloader code and settings.h +} + + +uint8_t hardware_programmSecondarySerial(uint8_t *buffer12) +{ + buffer12[7] = 0xFF;// secondary_bluetooth_name_set + return hardware_programm_sub(buffer12, 12, HARDWAREDATA_ADDRESS + 52); +} + + +uint8_t hardware_programm_sub(uint8_t *buffer, uint8_t length, uint32_t startAddress) +{ + HAL_StatusTypeDef answer; + + uint32_t ptr = 0; + uint8_t data8; + + // test empty + Address = startAddress; + for(int i=0;i FLASH_FW2_END_ADDR) + endAddress = FLASH_FW2_END_ADDR; + + FirstSector = GetSector(startAddress); + NbOfSectors = GetSector(endAddress) - FirstSector + 1; + + EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; + EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_1; + EraseInitStruct.Sector = FirstSector; + EraseInitStruct.NbSectors = NbOfSectors; + + return HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError); +} + + +uint8_t firmware2_variable_upperpart_programFlashMemory(uint32_t length, uint32_t offset, uint8_t *pBuffer1, uint32_t pBuffer1Size, uint8_t *pBuffer2) +{ + HAL_StatusTypeDef answer; + uint32_t ptr = 0; + uint32_t length1, length2; + + if((pBuffer2) && (length > pBuffer1Size)) + { + length1 = pBuffer1Size; + length2 = length - length1; + } + else + { + length1 = length; + length2 = 0; + } + + Address = FLASH_FW2_START_ADDR + offset; + + ptr = 0; + while ((Address <= FLASH_FW2_END_ADDR) && (ptr < length1)) + { + answer = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, pBuffer1[ptr]); + if (answer == HAL_OK) + { + Address = Address + 1; + ptr++; + } + else + { + return answer; + } + } + ptr = 0; + while ((Address <= FLASH_FW2_END_ADDR) && (ptr < length2)) + { + answer = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, pBuffer2[ptr]); + if (answer == HAL_OK) + { + Address = Address + 1; + ptr++; + } + else + { + return answer; + } + } + HAL_FLASH_Lock(); + + Address = FLASH_FW2_START_ADDR + offset;; + MemoryProgramStatus = 0x0; + + ptr = 0; + while ((Address <= FLASH_FW2_END_ADDR) && (ptr < length1)) + { + data32 = *(__IO uint8_t*)Address; + + if (data32 != pBuffer1[ptr]) + { + MemoryProgramStatus++; + } + + Address = Address + 1; + ptr++; + } + ptr = 0; + while ((Address <= FLASH_FW2_END_ADDR) && (ptr < length2)) + { + data32 = *(__IO uint8_t*)Address; + + if (data32 != pBuffer2[ptr]) + { + MemoryProgramStatus++; + } + + Address = Address + 1; + ptr++; + } + + if (MemoryProgramStatus == 0) + { + return HAL_OK; + } + else + { + return 0xEE; + } +} + +uint8_t firmware_eraseFlashMemory(void) +{ +// HAL_StatusTypeDef answer; + /* Unlock the Flash to enable the flash control register access *************/ + HAL_FLASH_Unlock(); + + /* Erase the user Flash area + (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/ + + /* Get the 1st sector to erase */ + FirstSector = GetSector(FLASH_FW_START_ADDR); + /* Get the number of sector to erase from 1st sector*/ + NbOfSectors = GetSector(FLASH_FW_END_ADDR) - FirstSector + 1; + + /* Fill EraseInit structure*/ + EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; + EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_1; + EraseInitStruct.Sector = FirstSector; + EraseInitStruct.NbSectors = NbOfSectors; + + /* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache, + you have to make sure that these data are rewritten before they are accessed during code + execution. If this cannot be done safely, it is recommended to flush the caches by setting the + DCRST and ICRST bits in the FLASH_CR register. */ + return HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError); +} + +uint8_t firmware_programFlashMemory(uint8_t *pBuffer1, uint32_t length1)//, uint8_t *pBuffer2, uint32_t length2) +{ + HAL_StatusTypeDef answer; + + /* Program the user Flash area word by word + (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/ + + uint32_t ptr = 0; + + Address = FLASH_FW_START_ADDR; + + ptr = 0; + while ((Address <= FLASH_FW_END_ADDR) && (ptr < length1)) + { + answer = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, pBuffer1[ptr]); + if (answer == HAL_OK) +// if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, DATA_32) == HAL_OK) + { + Address = Address + 1;//4; + ptr++; + } + else + { + return answer; + } + } + /* same for pBuffer2 + ptr = 0; + while ((Address < FLASH_FW_END_ADDR) && (ptr < length2)) + { + + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, pBuffer2[ptr]) == HAL_OK) + { + Address = Address + 1; + ptr++; + } + else + { + firmware_Error_Handler(); + } + } +*/ + /* Lock the Flash to disable the flash control register access (recommended + to protect the FLASH memory against possible unwanted operation) *********/ + HAL_FLASH_Lock(); + + /* Check if the programmed data is OK + MemoryProgramStatus = 0: data programmed correctly + MemoryProgramStatus != 0: number of words not programmed correctly ******/ + Address = FLASH_FW_START_ADDR; + MemoryProgramStatus = 0x0; + + ptr = 0; + while ((Address <= FLASH_FW_END_ADDR) && (ptr < length1)) + { + data32 = *(__IO uint8_t*)Address; + + if (data32 != pBuffer1[ptr]) + { + MemoryProgramStatus++; + } + + Address = Address + 1;//4; + ptr++; + } + /* same for pBuffer2 + ptr = 0; + while ((Address < FLASH_FW_END_ADDR) && (ptr < length2)) + { + data32 = *(__IO uint32_t*)Address; + + if (data32 != pBuffer2[ptr]) + { + MemoryProgramStatus++; + } + + Address = Address + 1;//4; + ptr++; + } +*/ + /* Check if there is an issue to program data */ + if (MemoryProgramStatus == 0) + { + return HAL_OK; + /* No error detected. Switch on LED3 */ + } + else + { + return 0xEE; + } + + +} + +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief Gets the sector of a given address + * @param None + * @retval The sector of a given address + */ +static uint32_t GetSector(uint32_t Address) +{ + uint32_t sector = 0; + + if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0)) + { + sector = FLASH_SECTOR_0; + } + else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1)) + { + sector = FLASH_SECTOR_1; + } + else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2)) + { + sector = FLASH_SECTOR_2; + } + else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3)) + { + sector = FLASH_SECTOR_3; + } + else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4)) + { + sector = FLASH_SECTOR_4; + } + else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5)) + { + sector = FLASH_SECTOR_5; + } + else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6)) + { + sector = FLASH_SECTOR_6; + } + else if((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7)) + { + sector = FLASH_SECTOR_7; + } + else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8)) + { + sector = FLASH_SECTOR_8; + } + else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9)) + { + sector = FLASH_SECTOR_9; + } + else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10)) + { + sector = FLASH_SECTOR_10; + } + else if((Address < ADDR_FLASH_SECTOR_12) && (Address >= ADDR_FLASH_SECTOR_11)) + { + sector = FLASH_SECTOR_11; + } + else if((Address < ADDR_FLASH_SECTOR_13) && (Address >= ADDR_FLASH_SECTOR_12)) + { + sector = FLASH_SECTOR_12; + } + else if((Address < ADDR_FLASH_SECTOR_14) && (Address >= ADDR_FLASH_SECTOR_13)) + { + sector = FLASH_SECTOR_13; + } + else if((Address < ADDR_FLASH_SECTOR_15) && (Address >= ADDR_FLASH_SECTOR_14)) + { + sector = FLASH_SECTOR_14; + } + else if((Address < ADDR_FLASH_SECTOR_16) && (Address >= ADDR_FLASH_SECTOR_15)) + { + sector = FLASH_SECTOR_15; + } + else if((Address < ADDR_FLASH_SECTOR_17) && (Address >= ADDR_FLASH_SECTOR_16)) + { + sector = FLASH_SECTOR_16; + } + else if((Address < ADDR_FLASH_SECTOR_18) && (Address >= ADDR_FLASH_SECTOR_17)) + { + sector = FLASH_SECTOR_17; + } + else if((Address < ADDR_FLASH_SECTOR_19) && (Address >= ADDR_FLASH_SECTOR_18)) + { + sector = FLASH_SECTOR_18; + } + else if((Address < ADDR_FLASH_SECTOR_20) && (Address >= ADDR_FLASH_SECTOR_19)) + { + sector = FLASH_SECTOR_19; + } + else if((Address < ADDR_FLASH_SECTOR_21) && (Address >= ADDR_FLASH_SECTOR_20)) + { + sector = FLASH_SECTOR_20; + } + else if((Address < ADDR_FLASH_SECTOR_22) && (Address >= ADDR_FLASH_SECTOR_21)) + { + sector = FLASH_SECTOR_21; + } + else if((Address < ADDR_FLASH_SECTOR_23) && (Address >= ADDR_FLASH_SECTOR_22)) + { + sector = FLASH_SECTOR_22; + } + else/*(Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_23))*/ + { + sector = FLASH_SECTOR_23; + } + + return sector; +} + +/* +static void firmware_Error_Handler(HAL_StatusTypeDef reason) +{ + static HAL_StatusTypeDef last_reason = HAL_OK; + + last_reason = reason; + while(1) + { + } +} +*/ diff -r 89a87ddc2e47 -r e65d01b6a17e OtherSources/stm32f4xx_hal_msp.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OtherSources/stm32f4xx_hal_msp.c Fri Dec 15 01:45:20 2017 +0100 @@ -0,0 +1,47 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_msp.c + * @author heinrichs/weikamp, Christian Weikamp + * @date 05-Dec-2014 + * @version V0.0.1 + * @since 05-Dec-2014 + * @brief loader for the hardware specific stm32f4xx_hal_msp.c + * + @verbatim + ============================================================================== + ##### How to use ##### + ============================================================================== + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 heinrichs weikamp

+ * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ + +#include "ostc.h" + +#ifdef OSTC_ON_DISCOVERY_HARDWARE + #include "stm32f4xx_hal_msp_discovery.c" +#else + #include "stm32f4xx_hal_msp_hw1.c" +#endif + +/* Exported variables --------------------------------------------------------*/ + +/* Private types -------------------------------------------------------------*/ + +/* Private variables ---------------------------------------------------------*/ + +/* Private variables with external access via get_xxx() function -------------*/ + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ + +/************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ diff -r 89a87ddc2e47 -r e65d01b6a17e OtherSources/stm32f4xx_hal_msp_hw2.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OtherSources/stm32f4xx_hal_msp_hw2.c Fri Dec 15 01:45:20 2017 +0100 @@ -0,0 +1,889 @@ +/** + ****************************************************************************** + * File Name : stm32f4xx_hal_msp.c + * Date : 04/12/2014 15:39:26 + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * + * COPYRIGHT(c) 2014 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" +#include "ostc.h" + + +DMA_HandleTypeDef hdma_spi1_tx; + +DMA_HandleTypeDef hdma_spi1_rx; + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + /* USER CODE END MspInit 0 */ + + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); + + /* System interrupt init*/ + /** SysTick_IRQn interrupt configuration + * use 1 by Christian + */ + HAL_NVIC_SetPriority(SysTick_IRQn, 1, 0); + + /* USER CODE BEGIN MspInit 1 */ + /* always set priority right */ + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); + /* USER CODE END MspInit 1 */ +} + +void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* hdma2d) +{ + + if(hdma2d->Instance==DMA2D) + { + /* USER CODE BEGIN DMA2D_MspInit 0 */ + + /* USER CODE END DMA2D_MspInit 0 */ + /* Peripheral clock enable */ + __DMA2D_CLK_ENABLE(); + /* USER CODE BEGIN DMA2D_MspInit 1 */ + HAL_NVIC_SetPriority(DMA2D_IRQn, 1, 2); + HAL_NVIC_EnableIRQ(DMA2D_IRQn); + /* USER CODE END DMA2D_MspInit 1 */ + } + +} + +void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef* hdma2d) +{ + + if(hdma2d->Instance==DMA2D) + { + /* USER CODE BEGIN DMA2D_MspDeInit 0 */ + + /* USER CODE END DMA2D_MspDeInit 0 */ + /* Peripheral clock disable */ + __DMA2D_CLK_DISABLE(); + /* USER CODE BEGIN DMA2D_MspDeInit 1 */ + __DMA2D_RELEASE_RESET(); + /* USER CODE END DMA2D_MspDeInit 1 */ + } + +} + +void HAL_LTDC_MspInit(LTDC_HandleTypeDef* hltdc) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(hltdc->Instance==LTDC) + { + /* USER CODE BEGIN LTDC_MspInit 0 */ + __GPIOE_CLK_ENABLE(); + __GPIOF_CLK_ENABLE(); + __GPIOG_CLK_ENABLE(); + __GPIOH_CLK_ENABLE(); + __GPIOI_CLK_ENABLE(); + + /* USER CODE END LTDC_MspInit 0 */ + /* Peripheral clock enable */ + __LTDC_CLK_ENABLE(); + + /**LTDC GPIO Configuration + PE4 ------> LTDC_B0 + PE5 ------> LTDC_G0 + PE6 ------> LTDC_G1 + PI9 ------> LTDC_VSYNC + PI10 ------> LTDC_HSYNC + PF10 ------> LTDC_DE + PH2 ------> LTDC_R0 + PH3 ------> LTDC_R1 + PH8 ------> LTDC_R2 + PH9 ------> LTDC_R3 + PH10 ------> LTDC_R4 + PH11 ------> LTDC_R5 + PH12 ------> LTDC_R6 + PG6 ------> LTDC_R7 + PG7 ------> LTDC_CLK + PH13 ------> LTDC_G2 + PH14 ------> LTDC_G3 + PH15 ------> LTDC_G4 + PI0 ------> LTDC_G5 + PI1 ------> LTDC_G6 + PI2 ------> LTDC_G7 + PG10 ------> LTDC_B2 + PG11 ------> LTDC_B3 + PG12 ------> LTDC_B1 + PI4 ------> LTDC_B4 + PI5 ------> LTDC_B5 + PI6 ------> LTDC_B6 + PI7 ------> LTDC_B7 + */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = GPIO_AF14_LTDC; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_0|GPIO_PIN_1 + |GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6 + |GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = GPIO_AF14_LTDC; + HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = GPIO_AF14_LTDC; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|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_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = GPIO_AF14_LTDC; + HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = GPIO_AF14_LTDC; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + /* USER CODE BEGIN LTDC_MspInit 1 */ + + /* USER CODE END LTDC_MspInit 1 */ + } + +} + +void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc) +{ + + if(hltdc->Instance==LTDC) + { + /* USER CODE BEGIN LTDC_MspDeInit 0 */ + + /* USER CODE END LTDC_MspDeInit 0 */ + /* Peripheral clock disable */ + __LTDC_CLK_DISABLE(); + + /**LTDC GPIO Configuration + PE4 ------> LTDC_B0 + PE5 ------> LTDC_G0 + PE6 ------> LTDC_G1 + PI9 ------> LTDC_VSYNC + PI10 ------> LTDC_HSYNC + PF10 ------> LTDC_DE + PH2 ------> LTDC_R0 + PH3 ------> LTDC_R1 + PH8 ------> LTDC_R2 + PH9 ------> LTDC_R3 + PH10 ------> LTDC_R4 + PH11 ------> LTDC_R5 + PH12 ------> LTDC_R6 + PG6 ------> LTDC_R7 + PG7 ------> LTDC_CLK + PH13 ------> LTDC_G2 + PH14 ------> LTDC_G3 + PH15 ------> LTDC_G4 + PI0 ------> LTDC_G5 + PI1 ------> LTDC_G6 + PI2 ------> LTDC_G7 + PG10 ------> LTDC_B2 + PG11 ------> LTDC_B3 + PG12 ------> LTDC_B1 + PI4 ------> LTDC_B4 + PI5 ------> LTDC_B5 + PI6 ------> LTDC_B6 + PI7 ------> LTDC_B7 + */ + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOI, GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_0|GPIO_PIN_1 + |GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6 + |GPIO_PIN_7); + + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_10); + + HAL_GPIO_DeInit(GPIOH, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_8|GPIO_PIN_9 + |GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13 + |GPIO_PIN_14|GPIO_PIN_15); + + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12); + + /* USER CODE BEGIN LTDC_MspDeInit 1 */ + __LTDC_RELEASE_RESET(); + + /* USER CODE END LTDC_MspDeInit 1 */ + } + +} + +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + __GPIOA_CLK_ENABLE(); + __GPIOB_CLK_ENABLE(); + __DMA2_CLK_ENABLE(); + + /* USER CODE END SPI1_MspInit 0 */ + /* Peripheral clock enable */ + __SPI1_CLK_ENABLE(); + + /**SPI1 GPIO Configuration + alt: PA4 ------> SPI1_NSS, jetzt soft + PA5 ------> SPI1_SCK + alt: PA6 ------> SPI1_MISO + neu: PB4 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ +// GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;//GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + GPIO_InitStruct.Pin = GPIO_PIN_4; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* Peripheral DMA init*/ + + hdma_spi1_tx.Instance = DMA2_Stream3; + hdma_spi1_tx.Init.Channel = DMA_CHANNEL_3; + hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE; + hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_spi1_tx.Init.Mode = DMA_NORMAL; + hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW; + hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; +/* by christian */ +hdma_spi1_tx.Init.MemBurst = DMA_MBURST_INC4; +hdma_spi1_tx.Init.PeriphBurst = DMA_PBURST_INC4; + HAL_DMA_Init(&hdma_spi1_tx); + + __HAL_LINKDMA(hspi,hdmatx,hdma_spi1_tx); + + hdma_spi1_rx.Instance = DMA2_Stream0; + hdma_spi1_rx.Init.Channel = DMA_CHANNEL_3; + hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_spi1_rx.Init.Mode = DMA_NORMAL; + hdma_spi1_rx.Init.Priority = DMA_PRIORITY_HIGH; + hdma_spi1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; +/* by christian */ +hdma_spi1_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + +hdma_spi1_rx.Init.MemBurst = DMA_MBURST_INC4; +hdma_spi1_rx.Init.PeriphBurst = DMA_PBURST_INC4; + HAL_DMA_Init(&hdma_spi1_rx); + + __HAL_LINKDMA(hspi, hdmarx, hdma_spi1_rx); + + /*##-4- Configure the NVIC for DMA #########################################*/ + /* NVIC configuration for DMA transfer complete interrupt (SPI1_TX) */ + HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 1); + HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); + + + /* NVIC configuration for DMA transfer complete interrupt (SPI1_RX) */ + HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); + + } + else if(hspi->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspInit 0 */ + __GPIOB_CLK_ENABLE(); + + /* USER CODE END SPI2_MspInit 0 */ + /* Peripheral clock enable */ + __SPI2_CLK_ENABLE(); + + /**SPI2 GPIO Configuration + PB13 ------> SPI2_SCK + PB14 ------> SPI2_MISO + PB15 ------> SPI2_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ + } + else if(hspi->Instance==SPI5) + { + /* USER CODE BEGIN SPI5_MspInit 0 */ + __GPIOF_CLK_ENABLE(); + + /* USER CODE END SPI5_MspInit 0 */ + /* Peripheral clock enable */ + __SPI5_CLK_ENABLE(); + + /**SPI5 GPIO Configuration + PF7 ------> SPI5_SCK + PF8 ------> SPI5_MISO + PF9 ------> SPI5_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;//GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI5; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI5_MspInit 1 */ + + /* USER CODE END SPI5_MspInit 1 */ + } + +} + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + __SPI1_FORCE_RESET(); + __SPI1_RELEASE_RESET(); + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA4 ------> SPI1_NSS + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + + /* Peripheral DMA DeInit*/ + HAL_DMA_DeInit(hspi->hdmatx); + HAL_DMA_DeInit(hspi->hdmarx); + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } + else if(hspi->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspDeInit 0 */ + + /* USER CODE END SPI2_MspDeInit 0 */ + /* Peripheral clock disable */ + __SPI2_CLK_DISABLE(); + + /**SPI2 GPIO Configuration + PB13 ------> SPI2_SCK + PB14 ------> SPI2_MISO + PB15 ------> SPI2_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); + + /* USER CODE BEGIN SPI2_MspDeInit 1 */ + + /* USER CODE END SPI2_MspDeInit 1 */ + } + else if(hspi->Instance==SPI5) + { + /* USER CODE BEGIN SPI5_MspDeInit 0 */ + __SPI5_FORCE_RESET(); + __SPI5_RELEASE_RESET(); + + /* USER CODE END SPI5_MspDeInit 0 */ + /* Peripheral clock disable */ + __SPI5_CLK_DISABLE(); + + /**SPI5 GPIO Configuration + PF7 ------> SPI5_SCK + PF8 ------> SPI5_MISO + PF9 ------> SPI5_MOSI + */ + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9); + + /* USER CODE BEGIN SPI5_MspDeInit 1 */ + + /* USER CODE END SPI5_MspDeInit 1 */ + } + +} + +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm) +{ + GPIO_InitTypeDef GPIO_InitStruct; + if(htim_pwm->Instance==TIM_BACKLIGHT) + { + TIM_BACKLIGHT_GPIO_ENABLE(); + TIM_BACKLIGHT_CLK_ENABLE(); + + GPIO_InitStruct.Pin = TIM_BACKLIGHT_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = GPIO_AF2_TIM3; + HAL_GPIO_Init(TIM_BACKLIGHT_GPIO_PORT, &GPIO_InitStruct); + } + +} + +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIMx) + { + TIMx_CLK_ENABLE(); + + HAL_NVIC_SetPriority(TIMx_IRQn, 2, 1); + HAL_NVIC_EnableIRQ(TIMx_IRQn); + } + if(htim_base->Instance==TIM7) + { + __TIM7_CLK_ENABLE(); + + HAL_NVIC_SetPriority(TIM7_IRQn, 2, 0); + HAL_NVIC_EnableIRQ(TIM7_IRQn); + } +} + +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm) +{ + + if(htim_pwm->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspDeInit 0 */ + + /* USER CODE END TIM2_MspDeInit 0 */ + /* Peripheral clock disable */ + __TIM2_CLK_DISABLE(); + + /**TIM2 GPIO Configuration + PA15 ------> TIM2_CH1 + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_15); + + /* USER CODE BEGIN TIM2_MspDeInit 1 */ + + /* USER CODE END TIM2_MspDeInit 1 */ + } + +} + +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) +{ + + if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspDeInit 0 */ + + /* USER CODE END TIM3_MspDeInit 0 */ + /* Peripheral clock disable */ + __TIM3_CLK_DISABLE(); + + /**TIM3 GPIO Configuration + PC7 ------> TIM3_CH2 + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_7); + + /* USER CODE BEGIN TIM3_MspDeInit 1 */ + + /* USER CODE END TIM3_MspDeInit 1 */ + } + +} + +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspInit 0 */ + __GPIOA_CLK_ENABLE(); + + /* USER CODE END USART1_MspInit 0 */ + /* Peripheral clock enable */ + __USART1_CLK_ENABLE(); + + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + PA11 ------> USART1_CTS + PA12 ------> USART1_RTS + */ +#ifdef USARTx_CTS_PIN + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12; +#else + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; +#endif + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST;//GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + HAL_NVIC_SetPriority(USART1_IRQn, 0, 1); + HAL_NVIC_EnableIRQ(USART1_IRQn); + } +#ifdef USART_IR_HUD + else if(huart->Instance==USART_IR_HUD) /* USART2 */ + { + USART_IR_HUD_CLK_ENABLE(); + USART_IR_HUD_TX_GPIO_CLK_ENABLE(); + USART_IR_HUD_RX_GPIO_CLK_ENABLE(); + + /**USART2 GPIO Configuration + PD5 ------> USART2_TX + PD6 ------> USART2_RX + */ + + GPIO_InitStruct.Pin = USART_IR_HUD_TX_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = USART_IR_HUD_TX_AF; + HAL_GPIO_Init(USART_IR_HUD_TX_GPIO_PORT, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = USART_IR_HUD_RX_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = USART_IR_HUD_RX_AF; + HAL_GPIO_Init(USART_IR_HUD_RX_GPIO_PORT, &GPIO_InitStruct); + + HAL_NVIC_SetPriority(USART_IR_HUD_IRQn, 0, 1); + HAL_NVIC_EnableIRQ(USART_IR_HUD_IRQn); + } +#endif + else if(huart->Instance==USART3) + { + /* USER CODE BEGIN USART3_MspInit 0 */ + + /* USER CODE END USART3_MspInit 0 */ + /* Peripheral clock enable */ + __USART3_CLK_ENABLE(); + + /**USART3 GPIO Configuration + PC10 ------> USART3_TX + PC11 ------> USART3_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + GPIO_InitStruct.Alternate = GPIO_AF7_USART3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN USART3_MspInit 1 */ + + /* USER CODE END USART3_MspInit 1 */ + } + +} + +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspDeInit 0 */ + + /* USER CODE END USART1_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_NVIC_DisableIRQ(USART1_IRQn); + __USART1_CLK_DISABLE(); + + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ +#ifdef USARTx_CTS_PIN + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12); +#else + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); +#endif + + /* USER CODE BEGIN USART1_MspDeInit 1 */ + + /* USER CODE END USART1_MspDeInit 1 */ + } + else if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PD5 ------> USART2_TX + PD6 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_5|GPIO_PIN_6); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + else if(huart->Instance==USART3) + { + /* USER CODE BEGIN USART3_MspDeInit 0 */ + + /* USER CODE END USART3_MspDeInit 0 */ + /* Peripheral clock disable */ + __USART3_CLK_DISABLE(); + + /**USART3 GPIO Configuration + PC10 ------> USART3_TX + PC11 ------> USART3_RX + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11); + + /* USER CODE BEGIN USART3_MspDeInit 1 */ + + /* USER CODE END USART3_MspDeInit 1 */ + } + +} + +static int FMC_Initialized = 0; + +static void HAL_FMC_MspInit(void){ + GPIO_InitTypeDef GPIO_InitStruct; + if (FMC_Initialized) { + return; + } + FMC_Initialized = 1; + /* Peripheral clock enable */ + /* by christian */ + __GPIOC_CLK_ENABLE(); + __GPIOD_CLK_ENABLE(); + __GPIOE_CLK_ENABLE(); + __GPIOF_CLK_ENABLE(); + __GPIOG_CLK_ENABLE(); + __GPIOH_CLK_ENABLE(); + + __FMC_CLK_ENABLE(); + + /** FMC GPIO Configuration + PF0 ------> FMC_A0 + PF1 ------> FMC_A1 + PF2 ------> FMC_A2 + PF3 ------> FMC_A3 + PF4 ------> FMC_A4 + PF5 ------> FMC_A5 + PC0 ------> FMC_SDNWE + PF11 ------> FMC_SDNRAS + PF12 ------> FMC_A6 + PF13 ------> FMC_A7 + PF14 ------> FMC_A8 + PF15 ------> FMC_A9 + PG0 ------> FMC_A10 + PG1 ------> FMC_A11 + PE7 ------> FMC_D4 + PE8 ------> FMC_D5 + PE9 ------> FMC_D6 + PE10 ------> FMC_D7 + PE11 ------> FMC_D8 + PE12 ------> FMC_D9 + PE13 ------> FMC_D10 + PE14 ------> FMC_D11 + PE15 ------> FMC_D12 + PH6 ------> FMC_SDNE1 neu + PH7 ------> FMC_SDCKE1 neu + PD8 ------> FMC_D13 + PD9 ------> FMC_D14 + PD10 ------> FMC_D15 + PD14 ------> FMC_D0 + PD15 ------> FMC_D1 + PG2 ------> FMC_A12 + PG4 ------> FMC_BA0 + PG5 ------> FMC_BA1 + PG8 ------> FMC_SDCLK + PD0 ------> FMC_D2 + PD1 ------> FMC_D3 + PG15 ------> FMC_SDNCAS + PE0 ------> FMC_NBL0 + PE1 ------> FMC_NBL1 + */ + + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + GPIO_InitStruct.Alternate = GPIO_AF12_FMC; + + + GPIO_InitStruct.Pin = GPIO_PIN_0; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14 + |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + GPIO_InitStruct.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_PIN_0|GPIO_PIN_1; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12 + |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4 + |GPIO_PIN_5|GPIO_PIN_8|GPIO_PIN_15; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; + HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); + + +} + +void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef* hsdram){ + HAL_FMC_MspInit(); +} + +static int FMC_DeInitialized = 0; + +static void HAL_FMC_MspDeInit(void){ + if (FMC_DeInitialized) { + return; + } + FMC_DeInitialized = 1; + /* Peripheral clock enable */ + __FMC_CLK_DISABLE(); + + /** FMC GPIO Configuration + PF0 ------> FMC_A0 + PF1 ------> FMC_A1 + PF2 ------> FMC_A2 + PF3 ------> FMC_A3 + PF4 ------> FMC_A4 + PF5 ------> FMC_A5 + PC0 ------> FMC_SDNWE + PF11 ------> FMC_SDNRAS + PF12 ------> FMC_A6 + PF13 ------> FMC_A7 + PF14 ------> FMC_A8 + PF15 ------> FMC_A9 + PG0 ------> FMC_A10 + PG1 ------> FMC_A11 + PE7 ------> FMC_D4 + PE8 ------> FMC_D5 + PE9 ------> FMC_D6 + PE10 ------> FMC_D7 + PE11 ------> FMC_D8 + PE12 ------> FMC_D9 + PE13 ------> FMC_D10 + PE14 ------> FMC_D11 + PE15 ------> FMC_D12 + PH6 ------> FMC_SDNE1 + PH7 ------> FMC_SDCKE1 + PD8 ------> FMC_D13 + PD9 ------> FMC_D14 + PD10 ------> FMC_D15 + PD14 ------> FMC_D0 + PD15 ------> FMC_D1 + PG2 ------> FMC_A12 + PG4 ------> FMC_BA0 + PG5 ------> FMC_BA1 + PG8 ------> FMC_SDCLK + PD0 ------> FMC_D2 + PD1 ------> FMC_D3 + PG15 ------> FMC_SDNCAS + PE0 ------> FMC_NBL0 + PE1 ------> FMC_NBL1 + */ + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12 + |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); + + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0); + + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4 + |GPIO_PIN_5|GPIO_PIN_8|GPIO_PIN_15); + + HAL_GPIO_DeInit(GPIOE, 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_PIN_0|GPIO_PIN_1); + + HAL_GPIO_DeInit(GPIOH, GPIO_PIN_6|GPIO_PIN_7); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14 + |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1); + +} + +void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef* hsdram){ + HAL_FMC_MspDeInit(); +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/