[FL-1558] Technical Debt: console, bootloader, targets, stdglue, etc... (#590)
* ApiHal: console abstraction, change uart baud rate to 230400. Bootloader: drop F5. Furi: prevent thread local output to serial console in stdglue. * ApiHal: take control over system initialization, reorder some subsystems in a hope of fixing USB issues. * Main: cleanup dead code. ISR: take care of HSECSS by our self. USB: leave clock configuration alone. * F6 cube: switch RCC to LL. * Cli: rollback return behavior.
This commit is contained in:
		
							parent
							
								
									0dc4081b85
								
							
						
					
					
						commit
						f25d000d53
					
				| @ -155,8 +155,6 @@ static void cli_execute_command(Cli* cli, CliCommand* command, string_t args) { | ||||
|             // Execute command
 | ||||
|             command->callback(cli, args, command->context); | ||||
|             loader_unlock(loader); | ||||
|             // Clear line
 | ||||
|             cli_reset(cli); | ||||
|         } else { | ||||
|             printf("Other application is running, close it first"); | ||||
|         } | ||||
| @ -164,8 +162,6 @@ static void cli_execute_command(Cli* cli, CliCommand* command, string_t args) { | ||||
|     } else { | ||||
|         // Execute command
 | ||||
|         command->callback(cli, args, command->context); | ||||
|         // Clear line
 | ||||
|         cli_reset(cli); | ||||
|     } | ||||
| 
 | ||||
|     if(!(command->flags & CliCommandFlagInsomniaSafe)) { | ||||
| @ -212,6 +208,7 @@ static void cli_handle_enter(Cli* cli) { | ||||
|     } | ||||
|     furi_check(osMutexRelease(cli->mutex) == osOK); | ||||
| 
 | ||||
|     cli_reset(cli); | ||||
|     cli_prompt(cli); | ||||
| 
 | ||||
|     // Cleanup command and args
 | ||||
|  | ||||
| @ -1,137 +0,0 @@ | ||||
| #include <api-hal-i2c.h> | ||||
| 
 | ||||
| #include <stm32wbxx_ll_bus.h> | ||||
| #include <stm32wbxx_ll_i2c.h> | ||||
| #include <stm32wbxx_ll_rcc.h> | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
| #include <stm32wbxx_ll_cortex.h> | ||||
| 
 | ||||
| void api_hal_i2c_init() { | ||||
|     LL_I2C_InitTypeDef I2C_InitStruct = {0}; | ||||
|     LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
| 
 | ||||
|     LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); | ||||
| 
 | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); | ||||
|     GPIO_InitStruct.Pin = POWER_I2C_SCL_Pin | POWER_I2C_SDA_Pin; | ||||
|     GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; | ||||
|     GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; | ||||
|     GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; | ||||
|     GPIO_InitStruct.Alternate = LL_GPIO_AF_4; | ||||
|     LL_GPIO_Init(GPIOA, &GPIO_InitStruct); | ||||
| 
 | ||||
|     LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1); | ||||
| 
 | ||||
|     I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C; | ||||
|     I2C_InitStruct.Timing = POWER_I2C_TIMINGS; | ||||
|     I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; | ||||
|     I2C_InitStruct.DigitalFilter = 0; | ||||
|     I2C_InitStruct.OwnAddress1 = 0; | ||||
|     I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK; | ||||
|     I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; | ||||
|     LL_I2C_Init(I2C1, &I2C_InitStruct); | ||||
|     LL_I2C_EnableAutoEndMode(I2C1); | ||||
|     LL_I2C_SetOwnAddress2(I2C1, 0, LL_I2C_OWNADDRESS2_NOMASK); | ||||
|     LL_I2C_DisableOwnAddress2(I2C1); | ||||
|     LL_I2C_DisableGeneralCall(I2C1); | ||||
|     LL_I2C_EnableClockStretching(I2C1); | ||||
| } | ||||
| 
 | ||||
| bool api_hal_i2c_tx( | ||||
|     I2C_TypeDef* instance, | ||||
|     uint8_t address, | ||||
|     const uint8_t* data, | ||||
|     uint8_t size, | ||||
|     uint32_t timeout) { | ||||
|     uint32_t time_left = timeout; | ||||
|     bool ret = true; | ||||
| 
 | ||||
|     while(LL_I2C_IsActiveFlag_BUSY(instance)) | ||||
|         ; | ||||
| 
 | ||||
|     LL_I2C_HandleTransfer( | ||||
|         instance, | ||||
|         address, | ||||
|         LL_I2C_ADDRSLAVE_7BIT, | ||||
|         size, | ||||
|         LL_I2C_MODE_AUTOEND, | ||||
|         LL_I2C_GENERATE_START_WRITE); | ||||
| 
 | ||||
|     while(!LL_I2C_IsActiveFlag_STOP(instance) || size > 0) { | ||||
|         if(LL_I2C_IsActiveFlag_TXIS(instance)) { | ||||
|             LL_I2C_TransmitData8(instance, (*data)); | ||||
|             data++; | ||||
|             size--; | ||||
|             time_left = timeout; | ||||
|         } | ||||
| 
 | ||||
|         if(LL_SYSTICK_IsActiveCounterFlag()) { | ||||
|             if(--time_left == 0) { | ||||
|                 ret = false; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     LL_I2C_ClearFlag_STOP(instance); | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| bool api_hal_i2c_rx( | ||||
|     I2C_TypeDef* instance, | ||||
|     uint8_t address, | ||||
|     uint8_t* data, | ||||
|     uint8_t size, | ||||
|     uint32_t timeout) { | ||||
|     uint32_t time_left = timeout; | ||||
|     bool ret = true; | ||||
| 
 | ||||
|     while(LL_I2C_IsActiveFlag_BUSY(instance)) | ||||
|         ; | ||||
| 
 | ||||
|     LL_I2C_HandleTransfer( | ||||
|         instance, | ||||
|         address, | ||||
|         LL_I2C_ADDRSLAVE_7BIT, | ||||
|         size, | ||||
|         LL_I2C_MODE_AUTOEND, | ||||
|         LL_I2C_GENERATE_START_READ); | ||||
| 
 | ||||
|     while(!LL_I2C_IsActiveFlag_STOP(instance) || size > 0) { | ||||
|         if(LL_I2C_IsActiveFlag_RXNE(instance)) { | ||||
|             *data = LL_I2C_ReceiveData8(instance); | ||||
|             data++; | ||||
|             size--; | ||||
|             time_left = timeout; | ||||
|         } | ||||
| 
 | ||||
|         if(LL_SYSTICK_IsActiveCounterFlag()) { | ||||
|             if(--time_left == 0) { | ||||
|                 ret = false; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     LL_I2C_ClearFlag_STOP(instance); | ||||
| 
 | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| bool api_hal_i2c_trx( | ||||
|     I2C_TypeDef* instance, | ||||
|     uint8_t address, | ||||
|     const uint8_t* tx_data, | ||||
|     uint8_t tx_size, | ||||
|     uint8_t* rx_data, | ||||
|     uint8_t rx_size, | ||||
|     uint32_t timeout) { | ||||
|     if(api_hal_i2c_tx(instance, address, tx_data, tx_size, timeout) && | ||||
|        api_hal_i2c_rx(instance, address, rx_data, rx_size, timeout)) { | ||||
|         return true; | ||||
|     } else { | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| @ -1,43 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| #include <api-hal-resources.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| void api_hal_i2c_init(); | ||||
| 
 | ||||
| bool api_hal_i2c_tx( | ||||
|     I2C_TypeDef* instance, | ||||
|     const uint8_t address, | ||||
|     const uint8_t* data, | ||||
|     const uint8_t size, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| bool api_hal_i2c_rx( | ||||
|     I2C_TypeDef* instance, | ||||
|     const uint8_t address, | ||||
|     uint8_t* data, | ||||
|     const uint8_t size, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| bool api_hal_i2c_trx( | ||||
|     I2C_TypeDef* instance, | ||||
|     const uint8_t address, | ||||
|     const uint8_t* tx_data, | ||||
|     const uint8_t tx_size, | ||||
|     uint8_t* rx_data, | ||||
|     const uint8_t rx_size, | ||||
|     uint32_t timeout); | ||||
| 
 | ||||
| #define with_api_hal_i2c(type, pointer, function_body)        \ | ||||
|     {                                                         \ | ||||
|         *pointer = ({ type __fn__ function_body __fn__; })(); \ | ||||
|     } | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,43 +0,0 @@ | ||||
| #include <api-hal-light.h> | ||||
| #include <lp5562.h> | ||||
| 
 | ||||
| #define LED_CURRENT_RED 50 | ||||
| #define LED_CURRENT_GREEN 50 | ||||
| #define LED_CURRENT_BLUE 50 | ||||
| #define LED_CURRENT_WHITE 150 | ||||
| 
 | ||||
| void api_hal_light_init() { | ||||
|     lp5562_reset(); | ||||
| 
 | ||||
|     lp5562_set_channel_current(LP5562ChannelRed, LED_CURRENT_RED); | ||||
|     lp5562_set_channel_current(LP5562ChannelGreen, LED_CURRENT_GREEN); | ||||
|     lp5562_set_channel_current(LP5562ChannelBlue, LED_CURRENT_BLUE); | ||||
|     lp5562_set_channel_current(LP5562ChannelWhite, LED_CURRENT_WHITE); | ||||
| 
 | ||||
|     lp5562_set_channel_value(LP5562ChannelRed, 0x00); | ||||
|     lp5562_set_channel_value(LP5562ChannelGreen, 0x00); | ||||
|     lp5562_set_channel_value(LP5562ChannelBlue, 0x00); | ||||
|     lp5562_set_channel_value(LP5562ChannelWhite, 0x00); | ||||
| 
 | ||||
|     lp5562_enable(); | ||||
|     lp5562_configure(); | ||||
| } | ||||
| 
 | ||||
| void api_hal_light_set(Light light, uint8_t value) { | ||||
|     switch(light) { | ||||
|     case LightRed: | ||||
|         lp5562_set_channel_value(LP5562ChannelRed, value); | ||||
|         break; | ||||
|     case LightGreen: | ||||
|         lp5562_set_channel_value(LP5562ChannelGreen, value); | ||||
|         break; | ||||
|     case LightBlue: | ||||
|         lp5562_set_channel_value(LP5562ChannelBlue, value); | ||||
|         break; | ||||
|     case LightBacklight: | ||||
|         lp5562_set_channel_value(LP5562ChannelWhite, value); | ||||
|         break; | ||||
|     default: | ||||
|         break; | ||||
|     } | ||||
| } | ||||
| @ -1,17 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stdbool.h> | ||||
| #include <stdint.h> | ||||
| #include <api-hal-resources.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| void api_hal_light_init(); | ||||
| 
 | ||||
| void api_hal_light_set(Light light, uint8_t value); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,42 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stm32wbxx.h> | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| #define POWER_I2C_SCL_Pin LL_GPIO_PIN_9 | ||||
| #define POWER_I2C_SCL_GPIO_Port GPIOA | ||||
| #define POWER_I2C_SDA_Pin LL_GPIO_PIN_10 | ||||
| #define POWER_I2C_SDA_GPIO_Port GPIOA | ||||
| 
 | ||||
| #define POWER_I2C I2C1 | ||||
| /* Timing register value is computed with the STM32CubeMX Tool,
 | ||||
|   * Fast Mode @100kHz with I2CCLK = 64 MHz, | ||||
|   * rise time = 0ns, fall time = 0ns | ||||
|   */ | ||||
| #define POWER_I2C_TIMINGS 0x10707DBC | ||||
| 
 | ||||
| /* Input Keys */ | ||||
| typedef enum { | ||||
|     InputKeyUp, | ||||
|     InputKeyDown, | ||||
|     InputKeyRight, | ||||
|     InputKeyLeft, | ||||
|     InputKeyOk, | ||||
|     InputKeyBack, | ||||
| } InputKey; | ||||
| 
 | ||||
| /* Light */ | ||||
| typedef enum { | ||||
|     LightRed, | ||||
|     LightGreen, | ||||
|     LightBlue, | ||||
|     LightBacklight, | ||||
| } Light; | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -1,6 +0,0 @@ | ||||
| #include <api-hal.h> | ||||
| 
 | ||||
| void api_hal_init() { | ||||
|     api_hal_i2c_init(); | ||||
|     api_hal_light_init(); | ||||
| } | ||||
| @ -1,6 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <api-hal-i2c.h> | ||||
| #include <api-hal-light.h> | ||||
| 
 | ||||
| void api_hal_init(); | ||||
| @ -1,187 +0,0 @@ | ||||
| /** | ||||
| ***************************************************************************** | ||||
| ** | ||||
| **  File        : stm32wb55xx_flash_cm4.ld | ||||
| ** | ||||
| **  Abstract    : System Workbench Minimal System calls file | ||||
| ** | ||||
| ** 		          For more information about which c-functions | ||||
| **                need which of these lowlevel functions | ||||
| **                please consult the Newlib libc-manual | ||||
| ** | ||||
| **  Environment : System Workbench for MCU | ||||
| ** | ||||
| **  Distribution: The file is distributed “as is,” without any warranty | ||||
| **                of any kind. | ||||
| ** | ||||
| ***************************************************************************** | ||||
| ** | ||||
| ** <h2><center>© COPYRIGHT(c) 2019 Ac6</center></h2> | ||||
| ** | ||||
| ** Redistribution and use in source and binary forms, with or without modification, | ||||
| ** are permitted provided that the following conditions are met: | ||||
| **   1. Redistributions of source code must retain the above copyright notice, | ||||
| **      this list of conditions and the following disclaimer. | ||||
| **   2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| **      this list of conditions and the following disclaimer in the documentation | ||||
| **      and/or other materials provided with the distribution. | ||||
| **   3. Neither the name of Ac6 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. | ||||
| ** | ||||
| ***************************************************************************** | ||||
| */ | ||||
| 
 | ||||
| /* Entry Point */ | ||||
| ENTRY(Reset_Handler) | ||||
| 
 | ||||
| /* Highest address of the user mode stack */ | ||||
| _estack = 0x20030000;    /* end of RAM */ | ||||
| /* Generate a link error if heap and stack don't fit into RAM */ | ||||
| _Min_Heap_Size = 0x200;      /* required amount of heap  */ | ||||
| _Min_Stack_Size = 0x400; /* required amount of stack */ | ||||
| 
 | ||||
| /* Specify the memory areas */ | ||||
| MEMORY | ||||
| { | ||||
| FLASH (rx)                 : ORIGIN = 0x08000000, LENGTH = 32K | ||||
| RAM1 (xrw)                 : ORIGIN = 0x20000004, LENGTH = 0x2FFFC | ||||
| RAM_SHARED (xrw)           : ORIGIN = 0x20030000, LENGTH = 10K | ||||
| } | ||||
| 
 | ||||
| /* Define output sections */ | ||||
| SECTIONS | ||||
| { | ||||
|   /* The startup code goes first into FLASH */ | ||||
|   .isr_vector : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     KEEP(*(.isr_vector)) /* Startup code */ | ||||
|     . = ALIGN(4); | ||||
|   } >FLASH | ||||
| 
 | ||||
|   /* The program code and other data goes into FLASH */ | ||||
|   .text : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     *(.text)           /* .text sections (code) */ | ||||
|     *(.text*)          /* .text* sections (code) */ | ||||
|     *(.glue_7)         /* glue arm to thumb code */ | ||||
|     *(.glue_7t)        /* glue thumb to arm code */ | ||||
|     *(.eh_frame) | ||||
| 
 | ||||
|     KEEP (*(.init)) | ||||
|     KEEP (*(.fini)) | ||||
| 
 | ||||
|     . = ALIGN(4); | ||||
|     _etext = .;        /* define a global symbols at end of code */ | ||||
|   } >FLASH | ||||
| 
 | ||||
|   /* Constant data goes into FLASH */ | ||||
|   .rodata : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     *(.rodata)         /* .rodata sections (constants, strings, etc.) */ | ||||
|     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */ | ||||
|     . = ALIGN(4); | ||||
|   } >FLASH | ||||
| 
 | ||||
|   .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH | ||||
|   .ARM : { | ||||
|     __exidx_start = .; | ||||
|     *(.ARM.exidx*) | ||||
|     __exidx_end = .; | ||||
|   } >FLASH | ||||
| 
 | ||||
|   .preinit_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array*)) | ||||
|     PROVIDE_HIDDEN (__preinit_array_end = .); | ||||
|   } >FLASH | ||||
|   .init_array : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__init_array_start = .); | ||||
|     KEEP (*(SORT(.init_array.*))) | ||||
|     KEEP (*(.init_array*)) | ||||
|     PROVIDE_HIDDEN (__init_array_end = .); | ||||
|   } >FLASH | ||||
|   .fini_array : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__fini_array_start = .); | ||||
|     KEEP (*(SORT(.fini_array.*))) | ||||
|     KEEP (*(.fini_array*)) | ||||
|     PROVIDE_HIDDEN (__fini_array_end = .); | ||||
|   } >FLASH | ||||
| 
 | ||||
|   /* used by the startup to initialize data */ | ||||
|   _sidata = LOADADDR(.data); | ||||
| 
 | ||||
|   /* Initialized data sections goes into RAM, load LMA copy after code */ | ||||
|   .data :  | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     _sdata = .;        /* create a global symbol at data start */ | ||||
|     *(.data)           /* .data sections */ | ||||
|     *(.data*)          /* .data* sections */ | ||||
| 
 | ||||
|     . = ALIGN(4); | ||||
|     _edata = .;        /* define a global symbol at data end */ | ||||
|   } >RAM1 AT> FLASH | ||||
| 
 | ||||
|    | ||||
|   /* Uninitialized data section */ | ||||
|   . = ALIGN(4); | ||||
|   .bss : | ||||
|   { | ||||
|     /* This is used by the startup in order to initialize the .bss secion */ | ||||
|     _sbss = .;         /* define a global symbol at bss start */ | ||||
|     __bss_start__ = _sbss; | ||||
|     *(.bss) | ||||
|     *(.bss*) | ||||
|     *(COMMON) | ||||
| 
 | ||||
|     . = ALIGN(4); | ||||
|     _ebss = .;         /* define a global symbol at bss end */ | ||||
|     __bss_end__ = _ebss; | ||||
|   } >RAM1 | ||||
| 
 | ||||
|   /* User_heap_stack section, used to check that there is enough RAM left */ | ||||
|   ._user_heap_stack : | ||||
|   { | ||||
|     . = ALIGN(8); | ||||
|     PROVIDE ( end = . ); | ||||
|     PROVIDE ( _end = . ); | ||||
|     . = . + _Min_Heap_Size; | ||||
|     . = . + _Min_Stack_Size; | ||||
|     . = ALIGN(8); | ||||
|   } >RAM1 | ||||
| 
 | ||||
|    | ||||
| 
 | ||||
|   /* Remove information from the standard libraries */ | ||||
|   /DISCARD/ : | ||||
|   { | ||||
|     libc.a ( * ) | ||||
|     libm.a ( * ) | ||||
|     libgcc.a ( * ) | ||||
|   } | ||||
| 
 | ||||
|   .ARM.attributes 0       : { *(.ARM.attributes) } | ||||
|    MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED | ||||
|    MB_MEM1 (NOLOAD)       : { *(MB_MEM1) } >RAM_SHARED | ||||
|    MB_MEM2 (NOLOAD)       : { _sMB_MEM2 = . ; *(MB_MEM2) ; _eMB_MEM2 = . ; } >RAM_SHARED | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -1,178 +0,0 @@ | ||||
| #include <target.h> | ||||
| #include <stm32wbxx.h> | ||||
| #include <stm32wbxx_ll_system.h> | ||||
| #include <stm32wbxx_ll_bus.h> | ||||
| #include <stm32wbxx_ll_utils.h> | ||||
| #include <stm32wbxx_ll_rcc.h> | ||||
| #include <stm32wbxx_ll_rtc.h> | ||||
| #include <stm32wbxx_ll_pwr.h> | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
| #include <stm32wbxx_hal_flash.h> | ||||
| 
 | ||||
| #include <version.h> | ||||
| #include <api-hal.h> | ||||
| 
 | ||||
| // Boot request enum
 | ||||
| #define BOOT_REQUEST_TAINTED 0x00000000 | ||||
| #define BOOT_REQUEST_CLEAN 0xDADEDADE | ||||
| #define BOOT_REQUEST_DFU 0xDF00B000 | ||||
| // Boot to DFU pin
 | ||||
| #define BOOT_DFU_PORT GPIOB | ||||
| #define BOOT_DFU_PIN LL_GPIO_PIN_11 | ||||
| // USB pins
 | ||||
| #define BOOT_USB_PORT GPIOA | ||||
| #define BOOT_USB_DM_PIN LL_GPIO_PIN_11 | ||||
| #define BOOT_USB_DP_PIN LL_GPIO_PIN_12 | ||||
| #define BOOT_USB_PIN (BOOT_USB_DM_PIN | BOOT_USB_DP_PIN) | ||||
| 
 | ||||
| #define RTC_CLOCK_IS_READY() (LL_RCC_LSE_IsReady() && LL_RCC_LSI1_IsReady()) | ||||
| 
 | ||||
| void target_led_control(char* c) { | ||||
|     api_hal_light_set(LightRed, 0x00); | ||||
|     api_hal_light_set(LightGreen, 0x00); | ||||
|     api_hal_light_set(LightBlue, 0x00); | ||||
|     do { | ||||
|         if(*c == 'R') { | ||||
|             api_hal_light_set(LightRed, 0xFF); | ||||
|         } else if(*c == 'G') { | ||||
|             api_hal_light_set(LightGreen, 0xFF); | ||||
|         } else if(*c == 'B') { | ||||
|             api_hal_light_set(LightBlue, 0xFF); | ||||
|         } else if(*c == '.') { | ||||
|             LL_mDelay(125); | ||||
|             api_hal_light_set(LightRed, 0x00); | ||||
|             api_hal_light_set(LightGreen, 0x00); | ||||
|             api_hal_light_set(LightBlue, 0x00); | ||||
|             LL_mDelay(125); | ||||
|         } else if(*c == '-') { | ||||
|             LL_mDelay(250); | ||||
|             api_hal_light_set(LightRed, 0x00); | ||||
|             api_hal_light_set(LightGreen, 0x00); | ||||
|             api_hal_light_set(LightBlue, 0x00); | ||||
|             LL_mDelay(250); | ||||
|         } else if(*c == '|') { | ||||
|             api_hal_light_set(LightRed, 0x00); | ||||
|             api_hal_light_set(LightGreen, 0x00); | ||||
|             api_hal_light_set(LightBlue, 0x00); | ||||
|         } | ||||
|         c++; | ||||
|     } while(*c != 0); | ||||
| } | ||||
| 
 | ||||
| void clock_init() { | ||||
|     LL_Init1msTick(4000000); | ||||
|     LL_SetSystemCoreClock(4000000); | ||||
| } | ||||
| 
 | ||||
| void gpio_init() { | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); | ||||
|     // USB D+
 | ||||
|     LL_GPIO_SetPinMode(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_MODE_OUTPUT); | ||||
|     LL_GPIO_SetPinSpeed(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_SPEED_FREQ_VERY_HIGH); | ||||
|     LL_GPIO_SetPinOutputType(BOOT_USB_PORT, BOOT_USB_DP_PIN, LL_GPIO_OUTPUT_OPENDRAIN); | ||||
|     // USB D-
 | ||||
|     LL_GPIO_SetPinMode(BOOT_USB_PORT, BOOT_USB_DM_PIN, LL_GPIO_MODE_OUTPUT); | ||||
|     LL_GPIO_SetPinSpeed(BOOT_USB_PORT, BOOT_USB_DM_PIN, LL_GPIO_SPEED_FREQ_VERY_HIGH); | ||||
|     LL_GPIO_SetPinOutputType(BOOT_USB_PORT, BOOT_USB_DM_PIN, LL_GPIO_OUTPUT_OPENDRAIN); | ||||
|     // Button: back
 | ||||
|     LL_GPIO_SetPinMode(BOOT_DFU_PORT, BOOT_DFU_PIN, LL_GPIO_MODE_INPUT); | ||||
|     LL_GPIO_SetPinPull(BOOT_DFU_PORT, BOOT_DFU_PIN, LL_GPIO_PULL_UP); | ||||
| } | ||||
| 
 | ||||
| void rtc_init() { | ||||
|     // LSE and RTC
 | ||||
|     LL_PWR_EnableBkUpAccess(); | ||||
|     if(!RTC_CLOCK_IS_READY()) { | ||||
|         // Start LSI1 needed for CSS
 | ||||
|         LL_RCC_LSI1_Enable(); | ||||
|         // Try to start LSE normal way
 | ||||
|         LL_RCC_LSE_SetDriveCapability(LL_RCC_LSEDRIVE_MEDIUMLOW); | ||||
|         LL_RCC_LSE_Enable(); | ||||
|         uint32_t c = 0; | ||||
|         while(!RTC_CLOCK_IS_READY() && c < 200) { | ||||
|             LL_mDelay(10); | ||||
|             c++; | ||||
|         } | ||||
|         // Plan B: reset backup domain
 | ||||
|         if(!RTC_CLOCK_IS_READY()) { | ||||
|             target_led_control("-R.R.R."); | ||||
|             LL_RCC_ForceBackupDomainReset(); | ||||
|             LL_RCC_ReleaseBackupDomainReset(); | ||||
|             NVIC_SystemReset(); | ||||
|         } | ||||
|         // Set RTC domain clock to LSE
 | ||||
|         LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE); | ||||
|         // Enable LSE CSS
 | ||||
|         LL_RCC_LSE_EnableCSS(); | ||||
|     } | ||||
|     // Enable clocking
 | ||||
|     LL_RCC_EnableRTC(); | ||||
|     LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_RTCAPB); | ||||
| } | ||||
| 
 | ||||
| void version_save(void) { | ||||
|     LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR1, (uint32_t)version_get()); | ||||
| } | ||||
| 
 | ||||
| void usb_wire_reset() { | ||||
|     LL_GPIO_ResetOutputPin(BOOT_USB_PORT, BOOT_USB_PIN); | ||||
|     LL_mDelay(10); | ||||
|     LL_GPIO_SetOutputPin(BOOT_USB_PORT, BOOT_USB_PIN); | ||||
| } | ||||
| 
 | ||||
| void target_init() { | ||||
|     clock_init(); | ||||
|     gpio_init(); | ||||
|     api_hal_init(); | ||||
|     target_led_control("RGB"); | ||||
|     rtc_init(); | ||||
|     version_save(); | ||||
|     usb_wire_reset(); | ||||
| 
 | ||||
|     // Errata 2.2.9, Flash OPTVERR flag is always set after system reset
 | ||||
|     __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); | ||||
| } | ||||
| 
 | ||||
| int target_is_dfu_requested() { | ||||
|     if(LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR0) == BOOT_REQUEST_TAINTED) { | ||||
|         // Default system state is tainted
 | ||||
|         // We must ensure that MCU is cleanly booted
 | ||||
|         LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, BOOT_REQUEST_CLEAN); | ||||
|         NVIC_SystemReset(); | ||||
|     } else if(LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR0) == BOOT_REQUEST_DFU) { | ||||
|         return 1; | ||||
|     } | ||||
|     LL_mDelay(100); | ||||
|     if(!LL_GPIO_IsInputPinSet(BOOT_DFU_PORT, BOOT_DFU_PIN)) { | ||||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| void target_switch(void* offset) { | ||||
|     asm volatile("ldr    r3, [%0]    \n" | ||||
|                  "msr    msp, r3     \n" | ||||
|                  "ldr    r3, [%1]    \n" | ||||
|                  "mov    pc, r3      \n" | ||||
|                  : | ||||
|                  : "r"(offset), "r"(offset + 0x4) | ||||
|                  : "r3"); | ||||
| } | ||||
| 
 | ||||
| void target_switch2dfu() { | ||||
|     target_led_control("B"); | ||||
|     // Mark system as tainted, it will be soon
 | ||||
|     LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, BOOT_REQUEST_TAINTED); | ||||
|     // Remap memory to system bootloader
 | ||||
|     LL_SYSCFG_SetRemapMemory(LL_SYSCFG_REMAP_SYSTEMFLASH); | ||||
|     target_switch(0x0); | ||||
| } | ||||
| 
 | ||||
| void target_switch2os() { | ||||
|     target_led_control("G"); | ||||
|     SCB->VTOR = OS_OFFSET; | ||||
|     target_switch((void*)(BOOT_ADDRESS + OS_OFFSET)); | ||||
| } | ||||
| @ -1,48 +0,0 @@ | ||||
| TOOLCHAIN = arm | ||||
| 
 | ||||
| BOOT_ADDRESS	= 0x08000000 | ||||
| FW_ADDRESS		= 0x08008000 | ||||
| OS_OFFSET		= 0x00008000 | ||||
| FLASH_ADDRESS	= 0x08000000 | ||||
| 
 | ||||
| OPENOCD_OPTS	= -f interface/stlink.cfg -c "transport select hla_swd" -f ../debug/stm32wbx.cfg -c "init" | ||||
| BOOT_CFLAGS		= -DBOOT_ADDRESS=$(BOOT_ADDRESS) -DFW_ADDRESS=$(FW_ADDRESS) -DOS_OFFSET=$(OS_OFFSET) | ||||
| MCU_FLAGS		= -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard | ||||
| 
 | ||||
| CFLAGS			+= $(MCU_FLAGS) $(BOOT_CFLAGS) -DSTM32WB55xx -Wall -fdata-sections -ffunction-sections | ||||
| LDFLAGS			+= $(MCU_FLAGS) -specs=nosys.specs -specs=nano.specs  | ||||
| 
 | ||||
| CUBE_DIR		= ../lib/STM32CubeWB | ||||
| 
 | ||||
| # ST HAL
 | ||||
| CFLAGS			+=  -DUSE_FULL_LL_DRIVER | ||||
| ASM_SOURCES		+= $(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32WBxx/Source/Templates/gcc/startup_stm32wb55xx_cm4.s | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32WBxx/Source/Templates/system_stm32wbxx.c | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_utils.c | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_gpio.c | ||||
| C_SOURCES		+= $(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_i2c.c | ||||
| 
 | ||||
| CFLAGS			+= -I$(CUBE_DIR)/Drivers/CMSIS/Include | ||||
| CFLAGS			+= -I$(CUBE_DIR)/Drivers/CMSIS/Device/ST/STM32WBxx/Include | ||||
| CFLAGS			+= -I$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Inc | ||||
| 
 | ||||
| LDFLAGS			+= -T$(TARGET_DIR)/stm32wb55xx_flash_cm4.ld | ||||
| 
 | ||||
| # Drivers
 | ||||
| DRIVERS_DIR		= ../lib/drivers | ||||
| CFLAGS			+= -I$(DRIVERS_DIR) | ||||
| C_SOURCES		+= $(DRIVERS_DIR)/lp5562.c | ||||
| 
 | ||||
| # API-HAL
 | ||||
| CFLAGS			+= -I$(TARGET_DIR)/api-hal | ||||
| C_SOURCES		+= $(wildcard $(TARGET_DIR)/api-hal/*.c) | ||||
| 
 | ||||
| # Version generation
 | ||||
| CFLAGS			+= -I../lib/version | ||||
| C_SOURCES		+= ../lib/version/version.c | ||||
| 
 | ||||
| ASM_SOURCES		+= $(wildcard $(TARGET_DIR)/*.s) | ||||
| C_SOURCES		+= $(wildcard $(TARGET_DIR)/*.c) | ||||
| CPP_SOURCES		+= $(wildcard $(TARGET_DIR)/*.cpp) | ||||
| 
 | ||||
| SVD_FILE = ../debug/STM32WB55_CM4.svd | ||||
| @ -2,15 +2,8 @@ | ||||
| #include "check.h" | ||||
| #include "memmgr.h" | ||||
| 
 | ||||
| #include <main.h> | ||||
| #include <cmsis_os2.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <api-hal.h> | ||||
| #include <m-dict.h> | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
| 
 | ||||
| extern UART_HandleTypeDef DEBUG_UART; | ||||
| 
 | ||||
| DICT_DEF2( | ||||
|     FuriStdglueCallbackDict, | ||||
| @ -29,6 +22,7 @@ static FuriStdglue* furi_stdglue = NULL; | ||||
| 
 | ||||
| static ssize_t stdout_write(void* _cookie, const char* data, size_t size) { | ||||
|     furi_assert(furi_stdglue); | ||||
|     bool consumed = false; | ||||
|     osKernelState_t state = osKernelGetState(); | ||||
|     osThreadId_t thread_id = osThreadGetId(); | ||||
|     if(state == osKernelRunning && thread_id && | ||||
| @ -50,6 +44,7 @@ static ssize_t stdout_write(void* _cookie, const char* data, size_t size) { | ||||
|             FuriStdglueCallbackDict_get(furi_stdglue->thread_outputs, (uint32_t)thread_id); | ||||
|         if(callback_ptr) { | ||||
|             (*callback_ptr)(_cookie, data, size); | ||||
|             consumed = true; | ||||
|         } | ||||
|         furi_check(osMutexRelease(furi_stdglue->mutex) == osOK); | ||||
|     } | ||||
| @ -63,7 +58,7 @@ static ssize_t stdout_write(void* _cookie, const char* data, size_t size) { | ||||
|         return 0; | ||||
|     } | ||||
|     // Debug uart
 | ||||
|     HAL_UART_Transmit(&DEBUG_UART, (uint8_t*)data, (uint16_t)size, HAL_MAX_DELAY); | ||||
|     if(!consumed) api_hal_console_tx((const uint8_t*)data, size); | ||||
|     // All data consumed
 | ||||
|     return size; | ||||
| } | ||||
|  | ||||
| @ -6,6 +6,7 @@ template <unsigned int N> struct STOP_EXTERNING_ME {}; | ||||
| 
 | ||||
| #include "api-hal-boot.h" | ||||
| #include "api-hal-clock.h" | ||||
| #include "api-hal-console.h" | ||||
| #include "api-hal-os.h" | ||||
| #include "api-hal-i2c.h" | ||||
| #include "api-hal-resources.h" | ||||
|  | ||||
| @ -1,52 +0,0 @@ | ||||
| /**
 | ||||
|   ****************************************************************************** | ||||
|   * @file    usart.h | ||||
|   * @brief   This file contains all the function prototypes for | ||||
|   *          the usart.c file | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
| /* Define to prevent recursive inclusion -------------------------------------*/ | ||||
| #ifndef __USART_H__ | ||||
| #define __USART_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "main.h" | ||||
| 
 | ||||
| /* USER CODE BEGIN Includes */ | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern UART_HandleTypeDef huart1; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
| 
 | ||||
| void MX_USART1_UART_Init(void); | ||||
| 
 | ||||
| /* USER CODE BEGIN Prototypes */ | ||||
| 
 | ||||
| /* USER CODE END Prototypes */ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __USART_H__ */ | ||||
| 
 | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @ -1,73 +1,17 @@ | ||||
| #include "main.h" | ||||
| 
 | ||||
| #include "cmsis_os2.h" | ||||
| #include "adc.h" | ||||
| #include "aes.h" | ||||
| #include "comp.h" | ||||
| #include "crc.h" | ||||
| #include "pka.h" | ||||
| #include "rf.h" | ||||
| #include "rng.h" | ||||
| #include "rtc.h" | ||||
| #include "spi.h" | ||||
| #include "tim.h" | ||||
| #include "usart.h" | ||||
| #include "usb_device.h" | ||||
| #include "gpio.h" | ||||
| #include "fatfs/fatfs.h" | ||||
| 
 | ||||
| #include <furi.h> | ||||
| #include <api-hal.h> | ||||
| #include <flipper.h> | ||||
| 
 | ||||
| void SystemClock_Config(void); | ||||
| void MX_FREERTOS_Init(void); | ||||
| 
 | ||||
| int main(void) { | ||||
|     // Initialize FURI layer
 | ||||
|     furi_init(); | ||||
| 
 | ||||
|     // Initialize ST HAL hardware
 | ||||
|     // Initialize ST HAL
 | ||||
|     HAL_Init(); | ||||
|     SystemClock_Config(); | ||||
| 
 | ||||
|     // USB must be initialized as soon as possible
 | ||||
|     MX_USB_Device_Init(); | ||||
|     FURI_LOG_I("HAL", "USB OK"); | ||||
| 
 | ||||
|     // Initialise the rest of HAL
 | ||||
|     MX_USART1_UART_Init(); | ||||
|     FURI_LOG_I("HAL", "USART OK"); | ||||
|     MX_RTC_Init(); | ||||
|     FURI_LOG_I("HAL", "RTC OK"); | ||||
|     MX_GPIO_Init(); | ||||
|     FURI_LOG_I("HAL", "GPIO OK"); | ||||
|     MX_ADC1_Init(); | ||||
|     FURI_LOG_I("HAL", "ADC1 OK"); | ||||
|     MX_SPI1_Init(); | ||||
|     FURI_LOG_I("HAL", "SPI1 OK"); | ||||
|     MX_SPI2_Init(); | ||||
|     FURI_LOG_I("HAL", "SPI2 OK"); | ||||
|     MX_TIM1_Init(); | ||||
|     FURI_LOG_I("HAL", "TIM1 OK"); | ||||
|     MX_TIM2_Init(); | ||||
|     FURI_LOG_I("HAL", "TIM2 OK"); | ||||
|     MX_TIM16_Init(); | ||||
|     FURI_LOG_I("HAL", "TIM16 OK"); | ||||
|     MX_COMP1_Init(); | ||||
|     FURI_LOG_I("HAL", "COMP1 OK"); | ||||
|     MX_RF_Init(); | ||||
|     FURI_LOG_I("HAL", "RF OK"); | ||||
|     MX_PKA_Init(); | ||||
|     FURI_LOG_I("HAL", "PKA OK"); | ||||
|     MX_RNG_Init(); | ||||
|     FURI_LOG_I("HAL", "RNG OK"); | ||||
|     MX_AES1_Init(); | ||||
|     FURI_LOG_I("HAL", "AES1 OK"); | ||||
|     MX_AES2_Init(); | ||||
|     FURI_LOG_I("HAL", "AES2 OK"); | ||||
|     MX_CRC_Init(); | ||||
|     FURI_LOG_I("HAL", "CRC OK"); | ||||
| 
 | ||||
|     // Flipper API HAL
 | ||||
|     api_hal_init(); | ||||
| @ -75,91 +19,20 @@ int main(void) { | ||||
|     // 3rd party
 | ||||
|     MX_FATFS_Init(); | ||||
|     FURI_LOG_I("HAL", "FATFS OK"); | ||||
| 
 | ||||
|     // CMSIS initialization
 | ||||
|     osKernelInitialize(); | ||||
|     FURI_LOG_I("HAL", "KERNEL OK"); | ||||
| 
 | ||||
|     // Init flipper
 | ||||
|     flipper_init(); | ||||
| 
 | ||||
|     // Start kernel
 | ||||
|     osKernelStart(); | ||||
| 
 | ||||
|     while (1) {} | ||||
| } | ||||
| 
 | ||||
| void SystemClock_Config(void) | ||||
| { | ||||
|     RCC_OscInitTypeDef RCC_OscInitStruct = {0}; | ||||
|     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; | ||||
|     RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; | ||||
| 
 | ||||
|     HAL_PWR_EnableBkUpAccess(); | ||||
| 
 | ||||
|     __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_MEDIUMLOW); | ||||
|     __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); | ||||
|     LL_RCC_HSE_SetCapacitorTuning(0x18); | ||||
| 
 | ||||
|     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE | ||||
|                                        | RCC_OSCILLATORTYPE_LSI1 | RCC_OSCILLATORTYPE_LSE; | ||||
|     RCC_OscInitStruct.HSIState = RCC_HSI_ON; | ||||
|     RCC_OscInitStruct.HSEState = RCC_HSE_ON; | ||||
|     RCC_OscInitStruct.LSIState = RCC_LSI_ON; | ||||
|     RCC_OscInitStruct.LSEState = RCC_LSE_ON; | ||||
|     RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; | ||||
|     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | ||||
|     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; | ||||
|     RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2; | ||||
|     RCC_OscInitStruct.PLL.PLLN = 8; | ||||
|     RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; | ||||
|     RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; | ||||
|     RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; | ||||
|     if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|      | ||||
|     RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2 | ||||
|                                                             |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK | ||||
|                                                             |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; | ||||
|     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | ||||
|     RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | ||||
|     RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; | ||||
|     RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; | ||||
|     RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV2; | ||||
|     RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1; | ||||
| 
 | ||||
|     if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| 
 | ||||
|     PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP | ||||
|                                                             |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1 | ||||
|                                                             |RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_CLK48SEL | ||||
|                                                             |RCC_PERIPHCLK_USB|RCC_PERIPHCLK_RNG | ||||
|                                                             |RCC_PERIPHCLK_ADC; | ||||
|     PeriphClkInitStruct.PLLSAI1.PLLN = 6; | ||||
|     PeriphClkInitStruct.PLLSAI1.PLLP = RCC_PLLP_DIV2; | ||||
|     PeriphClkInitStruct.PLLSAI1.PLLQ = RCC_PLLQ_DIV2; | ||||
|     PeriphClkInitStruct.PLLSAI1.PLLR = RCC_PLLR_DIV2; | ||||
|     PeriphClkInitStruct.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_USBCLK|RCC_PLLSAI1_ADCCLK; | ||||
|     PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; | ||||
|     PeriphClkInitStruct.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1; | ||||
|     PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1; | ||||
|     PeriphClkInitStruct.RngClockSelection = RCC_RNGCLKSOURCE_CLK48; | ||||
|     PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1; | ||||
|     PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; | ||||
|     PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE; | ||||
|     PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE; | ||||
|     PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1; | ||||
|     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| 
 | ||||
|     // CSS for HSE
 | ||||
|     HAL_RCC_EnableCSS(); | ||||
|     // CSS for LSE
 | ||||
|     HAL_RCCEx_EnableLSECSS(); | ||||
|     HAL_RCCEx_EnableLSECSS_IT(); | ||||
| } | ||||
| 
 | ||||
| void Error_Handler(void) { | ||||
|     asm("bkpt 1"); | ||||
|     while(1) {} | ||||
|  | ||||
| @ -17,7 +17,10 @@ extern void HW_IPCC_Tx_Handler(); | ||||
| extern void HW_IPCC_Rx_Handler(); | ||||
| 
 | ||||
| void NMI_Handler(void) { | ||||
|     HAL_RCC_NMI_IRQHandler(); | ||||
|     if (LL_RCC_IsActiveFlag_HSECSS()) { | ||||
|         LL_RCC_ClearFlag_HSECSS(); | ||||
|         NVIC_SystemReset(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void HardFault_Handler(void) { | ||||
| @ -50,11 +53,14 @@ void SysTick_Handler(void) { | ||||
| } | ||||
| 
 | ||||
| void TAMP_STAMP_LSECSS_IRQHandler(void) { | ||||
|     if (!LL_RCC_LSE_IsReady()) { | ||||
|         // TODO: notify user about issue with LSE
 | ||||
|         LL_RCC_ForceBackupDomainReset(); | ||||
|         LL_RCC_ReleaseBackupDomainReset(); | ||||
|         NVIC_SystemReset(); | ||||
|     if (LL_RCC_IsActiveFlag_LSECSS()) { | ||||
|         LL_RCC_ClearFlag_LSECSS(); | ||||
|         if (!LL_RCC_LSE_IsReady()) { | ||||
|             // TODO: notify user about issue with LSE
 | ||||
|             LL_RCC_ForceBackupDomainReset(); | ||||
|             LL_RCC_ReleaseBackupDomainReset(); | ||||
|             NVIC_SystemReset(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,55 +0,0 @@ | ||||
| #include "usart.h" | ||||
| 
 | ||||
| UART_HandleTypeDef huart1; | ||||
| 
 | ||||
| void MX_USART1_UART_Init(void) { | ||||
|     huart1.Instance = USART1; | ||||
|     huart1.Init.BaudRate = 115200; | ||||
|     huart1.Init.WordLength = UART_WORDLENGTH_8B; | ||||
|     huart1.Init.StopBits = UART_STOPBITS_1; | ||||
|     huart1.Init.Parity = UART_PARITY_NONE; | ||||
|     huart1.Init.Mode = UART_MODE_TX_RX; | ||||
|     huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; | ||||
|     huart1.Init.OverSampling = UART_OVERSAMPLING_16; | ||||
|     huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; | ||||
|     huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1; | ||||
|     huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; | ||||
| 
 | ||||
|     if (HAL_UART_Init(&huart1) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| 
 | ||||
|     if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| 
 | ||||
|     if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| 
 | ||||
|     if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { | ||||
|     GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
|     if(uartHandle->Instance==USART1) { | ||||
| 
 | ||||
|         __HAL_RCC_USART1_CLK_ENABLE(); | ||||
|         __HAL_RCC_GPIOB_CLK_ENABLE(); | ||||
|         GPIO_InitStruct.Pin = USART1_TX_Pin|USART1_RX_Pin; | ||||
|         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|         GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|         GPIO_InitStruct.Alternate = GPIO_AF7_USART1; | ||||
|         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) { | ||||
|     if(uartHandle->Instance==USART1) { | ||||
|         __HAL_RCC_USART1_CLK_DISABLE(); | ||||
|         HAL_GPIO_DeInit(GPIOB, USART1_TX_Pin|USART1_RX_Pin); | ||||
|     } | ||||
| } | ||||
| @ -60,7 +60,6 @@ static USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status); | ||||
| static void SystemClockConfig_Resume(void); | ||||
| 
 | ||||
| /* USER CODE END 1 */ | ||||
| extern void SystemClock_Config(void); | ||||
| 
 | ||||
| /*******************************************************************************
 | ||||
|                        LL Driver Callbacks (PCD -> USB Device Library) | ||||
| @ -774,7 +773,6 @@ void USBD_static_free(void *p) | ||||
|   */ | ||||
| static void SystemClockConfig_Resume(void) | ||||
| { | ||||
|   SystemClock_Config(); | ||||
| } | ||||
| /* USER CODE END 5 */ | ||||
| 
 | ||||
|  | ||||
| @ -1,14 +1,112 @@ | ||||
| #include <api-hal-clock.h> | ||||
| 
 | ||||
| #include <main.h> | ||||
| #include <stm32wbxx_ll_pwr.h> | ||||
| #include <stm32wbxx_ll_rcc.h> | ||||
| #include <stm32wbxx_ll_utils.h> | ||||
| 
 | ||||
| void api_hal_clock_init() { | ||||
|     // AHB
 | ||||
|     LL_FLASH_SetLatency(LL_FLASH_LATENCY_3); | ||||
|     while(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_3); | ||||
| 
 | ||||
|     /* HSE configuration and activation */ | ||||
|     LL_RCC_HSE_SetCapacitorTuning(0x18); | ||||
|     LL_RCC_HSE_Enable(); | ||||
|     while(LL_RCC_HSE_IsReady() != 1) ; | ||||
| 
 | ||||
|     /* HSI configuration and activation */ | ||||
|     LL_RCC_HSI_Enable(); | ||||
|     while(LL_RCC_HSI_IsReady() != 1)  | ||||
| 
 | ||||
|     /* LSE configuration and activation */ | ||||
|     LL_PWR_EnableBkUpAccess(); | ||||
|     LL_RCC_LSE_SetDriveCapability(LL_RCC_LSEDRIVE_MEDIUMLOW); | ||||
|     LL_RCC_LSE_Enable(); | ||||
|     while(LL_RCC_LSE_IsReady() != 1) ; | ||||
| 
 | ||||
|     LL_RCC_HSE_EnableCSS(); | ||||
|     LL_RCC_EnableIT_LSECSS(); | ||||
|     LL_RCC_LSE_EnableCSS(); | ||||
| 
 | ||||
|     /* Main PLL configuration and activation */ | ||||
|     LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_2, 8, LL_RCC_PLLR_DIV_2); | ||||
|     LL_RCC_PLL_Enable(); | ||||
|     LL_RCC_PLL_EnableDomain_SYS(); | ||||
|     while(LL_RCC_PLL_IsReady() != 1); | ||||
| 
 | ||||
|     LL_RCC_PLLSAI1_ConfigDomain_48M(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_2, 6, LL_RCC_PLLSAI1Q_DIV_2); | ||||
|     LL_RCC_PLLSAI1_ConfigDomain_ADC(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_2, 6, LL_RCC_PLLSAI1R_DIV_2); | ||||
|     LL_RCC_PLLSAI1_Enable(); | ||||
|     LL_RCC_PLLSAI1_EnableDomain_48M(); | ||||
|     LL_RCC_PLLSAI1_EnableDomain_ADC(); | ||||
|     while(LL_RCC_PLLSAI1_IsReady() != 1); | ||||
| 
 | ||||
|     /* Sysclk activation on the main PLL */ | ||||
|     /* Set CPU1 prescaler*/ | ||||
|     LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); | ||||
| 
 | ||||
|     /* Set CPU2 prescaler*/ | ||||
|     LL_C2_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); | ||||
| 
 | ||||
|     LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); | ||||
|     while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL); | ||||
| 
 | ||||
|     /* Set AHB SHARED prescaler*/ | ||||
|     LL_RCC_SetAHB4Prescaler(LL_RCC_SYSCLK_DIV_1); | ||||
| 
 | ||||
|     /* Set APB1 prescaler*/ | ||||
|     LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); | ||||
| 
 | ||||
|     /* Set APB2 prescaler*/ | ||||
|     LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); | ||||
| 
 | ||||
|     /* Disable MSI */ | ||||
|     LL_RCC_MSI_Disable(); | ||||
|     while(LL_RCC_MSI_IsReady() != 0); | ||||
| 
 | ||||
|     /* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */ | ||||
|     LL_SetSystemCoreClock(64000000); | ||||
| 
 | ||||
|     /* Update the time base */ | ||||
|     if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK) | ||||
|     { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| 
 | ||||
|     if(LL_RCC_GetRTCClockSource() != LL_RCC_RTC_CLKSOURCE_LSE) { | ||||
|         LL_RCC_ForceBackupDomainReset(); | ||||
|         LL_RCC_ReleaseBackupDomainReset(); | ||||
|         LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE); | ||||
|     } | ||||
| 
 | ||||
|     LL_RCC_EnableRTC(); | ||||
| 
 | ||||
|     LL_RCC_SetUSARTClockSource(LL_RCC_USART1_CLKSOURCE_PCLK2); | ||||
|     LL_RCC_SetADCClockSource(LL_RCC_ADC_CLKSOURCE_PLLSAI1); | ||||
|     LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); | ||||
|     LL_RCC_SetRNGClockSource(LL_RCC_RNG_CLKSOURCE_CLK48); | ||||
|     LL_RCC_SetUSBClockSource(LL_RCC_USB_CLKSOURCE_PLLSAI1); | ||||
|     LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSE); | ||||
|     LL_RCC_SetSMPSPrescaler(LL_RCC_SMPS_DIV_1); | ||||
|     LL_RCC_SetRFWKPClockSource(LL_RCC_RFWKP_CLKSOURCE_LSE); | ||||
| 
 | ||||
|     // AHB1
 | ||||
|     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMAMUX1); | ||||
|     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1); | ||||
| 
 | ||||
|     // APB
 | ||||
|     // AHB2
 | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOE); | ||||
|     LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH); | ||||
| 
 | ||||
|     // APB1
 | ||||
|     LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2); | ||||
| 
 | ||||
|     // APB2
 | ||||
|     LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); | ||||
| } | ||||
| 
 | ||||
| void api_hal_clock_switch_to_hsi() { | ||||
|  | ||||
							
								
								
									
										54
									
								
								firmware/targets/f6/api-hal/api-hal-console.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								firmware/targets/f6/api-hal/api-hal-console.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| #include <api-hal-console.h> | ||||
| 
 | ||||
| #include <stdbool.h> | ||||
| #include <stm32wbxx_ll_gpio.h> | ||||
| #include <stm32wbxx_ll_usart.h> | ||||
| 
 | ||||
| volatile bool api_hal_console_alive = false; | ||||
| 
 | ||||
| void api_hal_console_init() { | ||||
|     LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
|     GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7; | ||||
|     GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; | ||||
|     GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; | ||||
|     GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; | ||||
|     GPIO_InitStruct.Alternate = LL_GPIO_AF_7; | ||||
|     LL_GPIO_Init(GPIOB, &GPIO_InitStruct); | ||||
| 
 | ||||
|     LL_USART_InitTypeDef USART_InitStruct = {0}; | ||||
|     USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; | ||||
|     USART_InitStruct.BaudRate = 230400; | ||||
|     USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; | ||||
|     USART_InitStruct.StopBits = LL_USART_STOPBITS_1; | ||||
|     USART_InitStruct.Parity = LL_USART_PARITY_NONE; | ||||
|     USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX; | ||||
|     USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; | ||||
|     USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; | ||||
|     LL_USART_Init(USART1, &USART_InitStruct); | ||||
|     LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_2); | ||||
|     LL_USART_EnableFIFO(USART1); | ||||
|     LL_USART_ConfigAsyncMode(USART1); | ||||
| 
 | ||||
|     LL_USART_Enable(USART1); | ||||
| 
 | ||||
|     while(!LL_USART_IsActiveFlag_TEACK(USART1)) ; | ||||
|     api_hal_console_alive = true; | ||||
| } | ||||
| 
 | ||||
| void api_hal_console_tx(const uint8_t* buffer, size_t buffer_size) { | ||||
|     if (!api_hal_console_alive) | ||||
|         return; | ||||
| 
 | ||||
|     while(buffer_size > 0) { | ||||
|         while (!LL_USART_IsActiveFlag_TXE(USART1)); | ||||
| 
 | ||||
|         LL_USART_TransmitData8(USART1, *buffer); | ||||
| 
 | ||||
|         buffer++; | ||||
|         buffer_size--; | ||||
|     } | ||||
| 
 | ||||
|     /* Wait for TC flag to be raised for last char */ | ||||
|     while (!LL_USART_IsActiveFlag_TC(USART1)); | ||||
| } | ||||
							
								
								
									
										16
									
								
								firmware/targets/f6/api-hal/api-hal-console.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								firmware/targets/f6/api-hal/api-hal-console.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <stddef.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| void api_hal_console_init(); | ||||
| 
 | ||||
| void api_hal_console_tx(const uint8_t* buffer, size_t buffer_size); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| @ -66,6 +66,7 @@ void HAL_RCC_CSSCallback(void) { | ||||
| } | ||||
| 
 | ||||
| void api_hal_power_init() { | ||||
|     LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1); | ||||
|     LL_PWR_SMPS_SetMode(LL_PWR_SMPS_STEP_DOWN); | ||||
|     bq27220_init(&cedv); | ||||
|     bq25896_init(); | ||||
|  | ||||
| @ -52,3 +52,5 @@ const GpioPin gpio_rfid_data_in = {.port = RFID_RF_IN_GPIO_Port, .pin = RFID_RF_ | ||||
| const GpioPin gpio_irda_rx = {.port = IR_RX_GPIO_Port, .pin = IR_RX_Pin}; | ||||
| const GpioPin gpio_irda_tx = {.port = IR_TX_GPIO_Port, .pin = IR_TX_Pin}; | ||||
| 
 | ||||
| const GpioPin gpio_usart_tx = {.port = USART1_TX_Port, .pin = USART1_TX_Pin}; | ||||
| const GpioPin gpio_usart_rx = {.port = USART1_RX_Port, .pin = USART1_RX_Pin}; | ||||
|  | ||||
| @ -89,6 +89,9 @@ extern const GpioPin gpio_rfid_data_in; | ||||
| extern const GpioPin gpio_irda_rx; | ||||
| extern const GpioPin gpio_irda_tx; | ||||
| 
 | ||||
| extern const GpioPin gpio_usart_tx; | ||||
| extern const GpioPin gpio_usart_rx; | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @ -1,24 +1,78 @@ | ||||
| #include <api-hal.h> | ||||
| 
 | ||||
| #include <adc.h> | ||||
| #include <aes.h> | ||||
| #include <comp.h> | ||||
| #include <crc.h> | ||||
| #include <pka.h> | ||||
| #include <rf.h> | ||||
| #include <rng.h> | ||||
| #include <rtc.h> | ||||
| #include <spi.h> | ||||
| #include <tim.h> | ||||
| #include <usb_device.h> | ||||
| #include <gpio.h> | ||||
| 
 | ||||
| void api_hal_init() { | ||||
|     api_hal_boot_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "BOOT OK"); | ||||
|     api_hal_clock_init(); | ||||
|     api_hal_console_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "CLOCK and CONSOLE OK"); | ||||
|     api_hal_interrupt_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "INTERRUPT OK"); | ||||
|     api_hal_clock_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "CLOCK OK"); | ||||
|     api_hal_version_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "VERSION OK"); | ||||
|     api_hal_delay_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "DELAY OK"); | ||||
|     api_hal_os_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "OS OK"); | ||||
|     api_hal_vcp_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "VCP OK"); | ||||
| 
 | ||||
|     MX_GPIO_Init(); | ||||
|     FURI_LOG_I("HAL", "GPIO OK"); | ||||
| 
 | ||||
|     MX_RTC_Init(); | ||||
|     FURI_LOG_I("HAL", "RTC OK"); | ||||
|     api_hal_boot_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "BOOT OK"); | ||||
|     api_hal_version_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "VERSION OK"); | ||||
|      | ||||
|     MX_ADC1_Init(); | ||||
|     FURI_LOG_I("HAL", "ADC1 OK"); | ||||
| 
 | ||||
|     MX_SPI1_Init(); | ||||
|     FURI_LOG_I("HAL", "SPI1 OK"); | ||||
|     MX_SPI2_Init(); | ||||
|     FURI_LOG_I("HAL", "SPI2 OK"); | ||||
|     api_hal_spi_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "SPI OK"); | ||||
| 
 | ||||
|     MX_TIM1_Init(); | ||||
|     FURI_LOG_I("HAL", "TIM1 OK"); | ||||
|     MX_TIM2_Init(); | ||||
|     FURI_LOG_I("HAL", "TIM2 OK"); | ||||
|     MX_TIM16_Init(); | ||||
|     FURI_LOG_I("HAL", "TIM16 OK"); | ||||
|     MX_COMP1_Init(); | ||||
|     FURI_LOG_I("HAL", "COMP1 OK"); | ||||
|     MX_RF_Init(); | ||||
|     FURI_LOG_I("HAL", "RF OK"); | ||||
|     MX_PKA_Init(); | ||||
|     FURI_LOG_I("HAL", "PKA OK"); | ||||
|     MX_RNG_Init(); | ||||
|     FURI_LOG_I("HAL", "RNG OK"); | ||||
|     MX_AES1_Init(); | ||||
|     FURI_LOG_I("HAL", "AES1 OK"); | ||||
|     MX_AES2_Init(); | ||||
|     FURI_LOG_I("HAL", "AES2 OK"); | ||||
|     MX_CRC_Init(); | ||||
|     FURI_LOG_I("HAL", "CRC OK"); | ||||
| 
 | ||||
|     // VCP + USB
 | ||||
|     api_hal_vcp_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "VCP OK"); | ||||
|     MX_USB_Device_Init(); | ||||
|     FURI_LOG_I("HAL", "USB OK"); | ||||
| 
 | ||||
|     api_hal_i2c_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "I2C OK"); | ||||
| 
 | ||||
|     // High Level
 | ||||
|     api_hal_power_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "POWER OK"); | ||||
|     api_hal_light_init(); | ||||
| @ -27,4 +81,8 @@ void api_hal_init() { | ||||
|     FURI_LOG_I("FURI_HAL", "VIBRO OK"); | ||||
|     api_hal_subghz_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "SUBGHZ OK"); | ||||
| 
 | ||||
|     // FreeRTOS glue
 | ||||
|     api_hal_os_init(); | ||||
|     FURI_LOG_I("FURI_HAL", "OS OK"); | ||||
| } | ||||
|  | ||||
| @ -27,6 +27,7 @@ | ||||
| #include "shci.h" | ||||
| #include "tl.h" | ||||
| #include "dbg_trace.h" | ||||
| #include <api-hal.h> | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| @ -53,24 +54,11 @@ typedef PACKED_STRUCT | ||||
| #define BLE_DTB_CFG     0 | ||||
| /* USER CODE END PD */ | ||||
| 
 | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PM */ | ||||
| /* USER CODE END PM */ | ||||
| 
 | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN PV */ | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_TracesConfig_t APPD_TracesConfig={0, 0, 0, 0}; | ||||
| PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_GeneralConfig_t APPD_GeneralConfig={BLE_DTB_CFG, {0, 0, 0}}; | ||||
| 
 | ||||
| #ifdef CFG_DEBUG_TRACE_UART | ||||
| #if(CFG_HW_LPUART1_ENABLED == 1) | ||||
| extern void MX_LPUART1_UART_Init(void); | ||||
| #endif | ||||
| #if(CFG_HW_USART1_ENABLED == 1) | ||||
| extern void MX_USART1_UART_Init(void); | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT | ||||
|  * It provides timing information on the CPU2 activity. | ||||
| @ -366,36 +354,12 @@ static void APPD_BleDtbCfg( void ) | ||||
| #if(CFG_DEBUG_TRACE != 0) | ||||
| void DbgOutputInit( void ) | ||||
| { | ||||
| /* USER CODE BEGIN DbgOutputInit */ | ||||
| #ifdef CFG_DEBUG_TRACE_UART | ||||
| if (CFG_DEBUG_TRACE_UART == hw_lpuart1) | ||||
| { | ||||
| #if(CFG_HW_LPUART1_ENABLED == 1) | ||||
|     MX_LPUART1_UART_Init(); | ||||
| #endif | ||||
| } | ||||
| else if (CFG_DEBUG_TRACE_UART == hw_uart1) | ||||
| { | ||||
| #if(CFG_HW_USART1_ENABLED == 1) | ||||
|     MX_USART1_UART_Init(); | ||||
| #endif | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /* USER CODE END DbgOutputInit */ | ||||
|   return; | ||||
| } | ||||
| 
 | ||||
| extern UART_HandleTypeDef DEBUG_UART; | ||||
| 
 | ||||
| void DbgOutputTraces(  uint8_t *p_data, uint16_t size, void (*cb)(void) ) | ||||
| { | ||||
| /* USER CODE END DbgOutputTraces */ | ||||
|   // HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
 | ||||
|   HAL_UART_Transmit(&DEBUG_UART, (uint8_t*)p_data, (uint16_t)size, HAL_MAX_DELAY); | ||||
|   api_hal_console_tx(p_data, size); | ||||
|   cb(); | ||||
| /* USER CODE END DbgOutputTraces */ | ||||
|   return; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
|  | ||||
| @ -34,8 +34,6 @@ extern "C" { | ||||
| #include "dbg_trace.h" | ||||
| #include "hw_if.h" | ||||
| 
 | ||||
| extern UART_HandleTypeDef DEBUG_UART; | ||||
| 
 | ||||
| /**
 | ||||
|  * Enable or Disable traces | ||||
|  * The raw data output is the hci binary packet format as specified by the BT specification * | ||||
| @ -68,7 +66,7 @@ extern UART_HandleTypeDef DEBUG_UART; | ||||
| #endif | ||||
| 
 | ||||
| #if (TL_SHCI_CMD_DBG_RAW_EN != 0) | ||||
| #define TL_SHCI_CMD_DBG_RAW(_PDATA_, _SIZE_)  HAL_UART_Transmit(&DEBUG_UART, (uint8_t*)_PDATA_, _SIZE_, (~0)) | ||||
| #define TL_SHCI_CMD_DBG_RAW(_PDATA_, _SIZE_)  api_hal_console_tx(_PDATA_, _SIZE_) | ||||
| #else | ||||
| #define TL_SHCI_CMD_DBG_RAW(...) | ||||
| #endif | ||||
| @ -82,7 +80,7 @@ extern UART_HandleTypeDef DEBUG_UART; | ||||
| #endif | ||||
| 
 | ||||
| #if (TL_SHCI_EVT_DBG_RAW_EN != 0) | ||||
| #define TL_SHCI_EVT_DBG_RAW(_PDATA_, _SIZE_)  HAL_UART_Transmit(&DEBUG_UART, (uint8_t*)_PDATA_, _SIZE_, (~0)) | ||||
| #define TL_SHCI_EVT_DBG_RAW(_PDATA_, _SIZE_)  api_hal_console_tx(_PDATA_, _SIZE_) | ||||
| #else | ||||
| #define TL_SHCI_EVT_DBG_RAW(...) | ||||
| #endif | ||||
| @ -99,7 +97,7 @@ extern UART_HandleTypeDef DEBUG_UART; | ||||
| #endif | ||||
| 
 | ||||
| #if (TL_HCI_CMD_DBG_RAW_EN != 0) | ||||
| #define TL_HCI_CMD_DBG_RAW(_PDATA_, _SIZE_)  HAL_UART_Transmit(&DEBUG_UART, (uint8_t*)_PDATA_, _SIZE_, (~0)) | ||||
| #define TL_HCI_CMD_DBG_RAW(_PDATA_, _SIZE_)  api_hal_console_tx(_PDATA_, _SIZE_) | ||||
| #else | ||||
| #define TL_HCI_CMD_DBG_RAW(...) | ||||
| #endif | ||||
| @ -113,7 +111,7 @@ extern UART_HandleTypeDef DEBUG_UART; | ||||
| #endif | ||||
| 
 | ||||
| #if (TL_HCI_EVT_DBG_RAW_EN != 0) | ||||
| #define TL_HCI_EVT_DBG_RAW(_PDATA_, _SIZE_)  HAL_UART_Transmit(&DEBUG_UART, (uint8_t*)_PDATA_, _SIZE_, (~0)) | ||||
| #define TL_HCI_EVT_DBG_RAW(_PDATA_, _SIZE_)  api_hal_console_tx(_PDATA_, _SIZE_) | ||||
| #else | ||||
| #define TL_HCI_EVT_DBG_RAW(...) | ||||
| #endif | ||||
|  | ||||
| @ -31,16 +31,17 @@ extern "C" { | ||||
| #include "stm32wbxx_hal.h" | ||||
| #include "stm32wbxx.h" | ||||
| #include "stm32wbxx_ll_i2c.h" | ||||
| #include "stm32wbxx_ll_bus.h" | ||||
| #include "stm32wbxx_ll_cortex.h" | ||||
| #include "stm32wbxx_ll_crs.h" | ||||
| #include "stm32wbxx_ll_rcc.h" | ||||
| #include "stm32wbxx_ll_bus.h" | ||||
| #include "stm32wbxx_ll_system.h" | ||||
| #include "stm32wbxx_ll_exti.h" | ||||
| #include "stm32wbxx_ll_cortex.h" | ||||
| #include "stm32wbxx_ll_utils.h" | ||||
| #include "stm32wbxx_ll_pwr.h" | ||||
| #include "stm32wbxx_ll_gpio.h" | ||||
| #include "stm32wbxx_ll_dma.h" | ||||
| 
 | ||||
| #include "stm32wbxx_ll_exti.h" | ||||
| #include "stm32wbxx_ll_usart.h" | ||||
| #include "stm32wbxx_ll_gpio.h" | ||||
| 
 | ||||
| /* Private includes ----------------------------------------------------------*/ | ||||
| /* USER CODE BEGIN Includes */ | ||||
|  | ||||
| @ -55,7 +55,7 @@ | ||||
| #define HAL_SPI_MODULE_ENABLED | ||||
| #define HAL_TIM_MODULE_ENABLED | ||||
| /*#define HAL_TSC_MODULE_ENABLED   */ | ||||
| #define HAL_UART_MODULE_ENABLED | ||||
| /*#define HAL_UART_MODULE_ENABLED   */ | ||||
| /*#define HAL_USART_MODULE_ENABLED   */ | ||||
| /*#define HAL_WWDG_MODULE_ENABLED   */ | ||||
| #define HAL_EXTI_MODULE_ENABLED | ||||
|  | ||||
| @ -31,8 +31,6 @@ extern "C" { | ||||
| 
 | ||||
| /* USER CODE END Includes */ | ||||
| 
 | ||||
| extern UART_HandleTypeDef huart1; | ||||
| 
 | ||||
| /* USER CODE BEGIN Private defines */ | ||||
| 
 | ||||
| /* USER CODE END Private defines */ | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| ##########################################################################################################################
 | ||||
| # File automatically-generated by tool: [projectgenerator] version: [3.11.2] date: [Sun May 16 12:24:45 MSK 2021]
 | ||||
| # File automatically-generated by tool: [projectgenerator] version: [3.13.0-B3] date: [Tue Jul 20 02:23:07 MSK 2021]
 | ||||
| ##########################################################################################################################
 | ||||
| 
 | ||||
| # ------------------------------------------------
 | ||||
| @ -94,8 +94,8 @@ Src/stm32wbxx_hal_msp.c \ | ||||
| /Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_spi_ex.c \ | ||||
| /Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c \ | ||||
| /Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c \ | ||||
| /Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c \ | ||||
| /Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c \ | ||||
| /Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usart.c \ | ||||
| /Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_rcc.c \ | ||||
| Src/system_stm32wbxx.c \ | ||||
| /Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Middlewares/Third_Party/FreeRTOS/Source/croutine.c \ | ||||
| /Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c \ | ||||
| @ -178,7 +178,6 @@ C_INCLUDES =  \ | ||||
| -I/Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Middlewares/ST/STM32_USB_Device_Library/Core/Inc \ | ||||
| -I/Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc \ | ||||
| -I/Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Drivers/CMSIS/Device/ST/STM32WBxx/Include \ | ||||
| -I/Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Drivers/CMSIS/Include \ | ||||
| -I/Users/aku/STM32Cube/Repository/STM32Cube_FW_WB_V1.10.1/Drivers/CMSIS/Include | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -105,7 +105,6 @@ int main(void) | ||||
|   MX_RTC_Init(); | ||||
|   MX_SPI1_Init(); | ||||
|   MX_SPI2_Init(); | ||||
|   MX_USART1_UART_Init(); | ||||
|   MX_USB_Device_Init(); | ||||
|   MX_TIM1_Init(); | ||||
|   MX_TIM2_Init(); | ||||
| @ -117,6 +116,7 @@ int main(void) | ||||
|   MX_AES1_Init(); | ||||
|   MX_AES2_Init(); | ||||
|   MX_CRC_Init(); | ||||
|   MX_USART1_UART_Init(); | ||||
|   /* USER CODE BEGIN 2 */ | ||||
| 
 | ||||
|   /* USER CODE END 2 */ | ||||
| @ -145,87 +145,106 @@ int main(void) | ||||
|   */ | ||||
| void SystemClock_Config(void) | ||||
| { | ||||
|   RCC_OscInitTypeDef RCC_OscInitStruct = {0}; | ||||
|   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; | ||||
|   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; | ||||
|   LL_FLASH_SetLatency(LL_FLASH_LATENCY_3); | ||||
|   while(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_3) | ||||
|   { | ||||
|   } | ||||
| 
 | ||||
|   /** Configure LSE Drive Capability
 | ||||
|   */ | ||||
|   HAL_PWR_EnableBkUpAccess(); | ||||
|   __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_MEDIUMLOW); | ||||
|   /** Configure the main internal regulator output voltage
 | ||||
|   */ | ||||
|   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); | ||||
|   /** Initializes the RCC Oscillators according to the specified parameters
 | ||||
|   * in the RCC_OscInitTypeDef structure. | ||||
|   */ | ||||
|   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE | ||||
|                               |RCC_OSCILLATORTYPE_LSE; | ||||
|   RCC_OscInitStruct.HSEState = RCC_HSE_ON; | ||||
|   RCC_OscInitStruct.LSEState = RCC_LSE_ON; | ||||
|   RCC_OscInitStruct.HSIState = RCC_HSI_ON; | ||||
|   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; | ||||
|   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | ||||
|   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; | ||||
|   RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2; | ||||
|   RCC_OscInitStruct.PLL.PLLN = 8; | ||||
|   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; | ||||
|   RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; | ||||
|   RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; | ||||
|   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) | ||||
|   /* HSE configuration and activation */ | ||||
|   LL_RCC_HSE_Enable(); | ||||
|   while(LL_RCC_HSE_IsReady() != 1) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|   } | ||||
|   /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
 | ||||
|   */ | ||||
|   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2 | ||||
|                               |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK | ||||
|                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; | ||||
|   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | ||||
|   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | ||||
|   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; | ||||
|   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; | ||||
|   RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV2; | ||||
|   RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1; | ||||
| 
 | ||||
|   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK) | ||||
|   /* HSI configuration and activation */ | ||||
|   LL_RCC_HSI_Enable(); | ||||
|   while(LL_RCC_HSI_IsReady() != 1) | ||||
|   { | ||||
|   } | ||||
| 
 | ||||
|   LL_PWR_EnableBkUpAccess(); | ||||
|   LL_RCC_LSE_SetDriveCapability(LL_RCC_LSEDRIVE_MEDIUMLOW); | ||||
|   LL_RCC_LSE_Enable(); | ||||
| 
 | ||||
|   /* Wait till LSE is ready */ | ||||
|   while(LL_RCC_LSE_IsReady() != 1) | ||||
|   { | ||||
|   } | ||||
| 
 | ||||
|   LL_RCC_HSE_EnableCSS(); | ||||
|   LL_RCC_LSE_EnableCSS(); | ||||
|   /* Main PLL configuration and activation */ | ||||
|   LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_2, 8, LL_RCC_PLLR_DIV_2); | ||||
|   LL_RCC_PLL_Enable(); | ||||
|   LL_RCC_PLL_EnableDomain_SYS(); | ||||
|   while(LL_RCC_PLL_IsReady() != 1) | ||||
|   { | ||||
|   } | ||||
| 
 | ||||
|   LL_RCC_PLLSAI1_ConfigDomain_48M(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_2, 6, LL_RCC_PLLSAI1Q_DIV_2); | ||||
|   LL_RCC_PLLSAI1_ConfigDomain_ADC(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_2, 6, LL_RCC_PLLSAI1R_DIV_2); | ||||
|   LL_RCC_PLLSAI1_Enable(); | ||||
|   LL_RCC_PLLSAI1_EnableDomain_48M(); | ||||
|   LL_RCC_PLLSAI1_EnableDomain_ADC(); | ||||
| 
 | ||||
|   /* Wait till PLLSAI1 is ready */ | ||||
|   while(LL_RCC_PLLSAI1_IsReady() != 1) | ||||
|   { | ||||
|   } | ||||
| 
 | ||||
|   /* Sysclk activation on the main PLL */ | ||||
|   /* Set CPU1 prescaler*/ | ||||
|   LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); | ||||
| 
 | ||||
|   /* Set CPU2 prescaler*/ | ||||
|   LL_C2_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); | ||||
| 
 | ||||
|   LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); | ||||
|   while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) | ||||
|   { | ||||
|   } | ||||
| 
 | ||||
|   /* Set AHB SHARED prescaler*/ | ||||
|   LL_RCC_SetAHB4Prescaler(LL_RCC_SYSCLK_DIV_1); | ||||
| 
 | ||||
|   /* Set APB1 prescaler*/ | ||||
|   LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); | ||||
| 
 | ||||
|   /* Set APB2 prescaler*/ | ||||
|   LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); | ||||
| 
 | ||||
|   /* Disable MSI */ | ||||
|   LL_RCC_MSI_Disable(); | ||||
|   while(LL_RCC_MSI_IsReady() != 0) | ||||
|   { | ||||
|   } | ||||
| 
 | ||||
|   /* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */ | ||||
|   LL_SetSystemCoreClock(64000000); | ||||
| 
 | ||||
|    /* Update the time base */ | ||||
|   if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|   } | ||||
|   /** Initializes the peripherals clocks
 | ||||
|   */ | ||||
|   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP | ||||
|                               |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1 | ||||
|                               |RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_CLK48SEL | ||||
|                               |RCC_PERIPHCLK_USB|RCC_PERIPHCLK_RNG | ||||
|                               |RCC_PERIPHCLK_ADC; | ||||
|   PeriphClkInitStruct.PLLSAI1.PLLN = 6; | ||||
|   PeriphClkInitStruct.PLLSAI1.PLLP = RCC_PLLP_DIV2; | ||||
|   PeriphClkInitStruct.PLLSAI1.PLLQ = RCC_PLLQ_DIV2; | ||||
|   PeriphClkInitStruct.PLLSAI1.PLLR = RCC_PLLR_DIV2; | ||||
|   PeriphClkInitStruct.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_USBCLK|RCC_PLLSAI1_ADCCLK; | ||||
|   PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; | ||||
|   PeriphClkInitStruct.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1; | ||||
|   PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1; | ||||
|   PeriphClkInitStruct.RngClockSelection = RCC_RNGCLKSOURCE_CLK48; | ||||
|   PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1; | ||||
|   PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; | ||||
|   PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE; | ||||
|   PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE; | ||||
|   PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1; | ||||
|   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) | ||||
|   if(LL_RCC_GetRTCClockSource() != LL_RCC_RTC_CLKSOURCE_LSE) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|     LL_RCC_ForceBackupDomainReset(); | ||||
|     LL_RCC_ReleaseBackupDomainReset(); | ||||
|     LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE); | ||||
|   } | ||||
|   LL_RCC_EnableRTC(); | ||||
|   LL_RCC_SetUSARTClockSource(LL_RCC_USART1_CLKSOURCE_PCLK2); | ||||
|   LL_RCC_SetADCClockSource(LL_RCC_ADC_CLKSOURCE_PLLSAI1); | ||||
|   LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); | ||||
|   LL_RCC_SetRNGClockSource(LL_RCC_RNG_CLKSOURCE_CLK48); | ||||
|   LL_RCC_SetUSBClockSource(LL_RCC_USB_CLKSOURCE_PLLSAI1); | ||||
|   LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSE); | ||||
|   LL_RCC_SetSMPSPrescaler(LL_RCC_SMPS_DIV_1); | ||||
|   LL_RCC_SetRFWKPClockSource(LL_RCC_RFWKP_CLKSOURCE_LSE); | ||||
|   /* USER CODE BEGIN Smps */ | ||||
| 
 | ||||
|   /* USER CODE END Smps */ | ||||
|   /** Enables the Clock Security System
 | ||||
|   */ | ||||
|   HAL_RCC_EnableCSS(); | ||||
|   /** Enables the Clock Security System
 | ||||
|   */ | ||||
|   HAL_RCCEx_EnableLSECSS(); | ||||
| } | ||||
| 
 | ||||
| /* USER CODE BEGIN 4 */ | ||||
|  | ||||
| @ -79,7 +79,6 @@ void NMI_Handler(void) | ||||
|   /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ | ||||
| 
 | ||||
|   /* USER CODE END NonMaskableInt_IRQn 0 */ | ||||
|   HAL_RCC_NMI_IRQHandler(); | ||||
|   /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ | ||||
|   while (1) | ||||
|   { | ||||
|  | ||||
| @ -24,96 +24,59 @@ | ||||
| 
 | ||||
| /* USER CODE END 0 */ | ||||
| 
 | ||||
| UART_HandleTypeDef huart1; | ||||
| 
 | ||||
| /* USART1 init function */ | ||||
| 
 | ||||
| void MX_USART1_UART_Init(void) | ||||
| { | ||||
|   LL_USART_InitTypeDef USART_InitStruct = {0}; | ||||
| 
 | ||||
|   huart1.Instance = USART1; | ||||
|   huart1.Init.BaudRate = 115200; | ||||
|   huart1.Init.WordLength = UART_WORDLENGTH_8B; | ||||
|   huart1.Init.StopBits = UART_STOPBITS_1; | ||||
|   huart1.Init.Parity = UART_PARITY_NONE; | ||||
|   huart1.Init.Mode = UART_MODE_TX_RX; | ||||
|   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; | ||||
|   huart1.Init.OverSampling = UART_OVERSAMPLING_16; | ||||
|   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; | ||||
|   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1; | ||||
|   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; | ||||
|   if (HAL_UART_Init(&huart1) != HAL_OK) | ||||
|   LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
| 
 | ||||
|   /* Peripheral clock enable */ | ||||
|   LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); | ||||
| 
 | ||||
|   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); | ||||
|   /**USART1 GPIO Configuration
 | ||||
|   PB6   ------> USART1_TX | ||||
|   PB7   ------> USART1_RX | ||||
|   */ | ||||
|   GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7; | ||||
|   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; | ||||
|   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; | ||||
|   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; | ||||
|   GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; | ||||
|   GPIO_InitStruct.Alternate = LL_GPIO_AF_7; | ||||
|   LL_GPIO_Init(GPIOB, &GPIO_InitStruct); | ||||
| 
 | ||||
|   USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; | ||||
|   USART_InitStruct.BaudRate = 115200; | ||||
|   USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; | ||||
|   USART_InitStruct.StopBits = LL_USART_STOPBITS_1; | ||||
|   USART_InitStruct.Parity = LL_USART_PARITY_NONE; | ||||
|   USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX; | ||||
|   USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE; | ||||
|   USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; | ||||
|   LL_USART_Init(USART1, &USART_InitStruct); | ||||
|   LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8); | ||||
|   LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8); | ||||
|   LL_USART_DisableFIFO(USART1); | ||||
|   LL_USART_EnableAutoBaudRate(USART1); | ||||
|   LL_USART_SetAutoBaudRateMode(USART1, LL_USART_AUTOBAUD_DETECT_ON_STARTBIT); | ||||
|   LL_USART_ConfigAsyncMode(USART1); | ||||
| 
 | ||||
|   /* USER CODE BEGIN WKUPType USART1 */ | ||||
| 
 | ||||
|   /* USER CODE END WKUPType USART1 */ | ||||
| 
 | ||||
|   LL_USART_Enable(USART1); | ||||
| 
 | ||||
|   /* Polling USART1 initialisation */ | ||||
|   while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1)))) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|   } | ||||
|   if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|   } | ||||
|   if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|   } | ||||
|   if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|   } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) | ||||
| { | ||||
| 
 | ||||
|   GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
|   if(uartHandle->Instance==USART1) | ||||
|   { | ||||
|   /* USER CODE BEGIN USART1_MspInit 0 */ | ||||
| 
 | ||||
|   /* USER CODE END USART1_MspInit 0 */ | ||||
|     /* USART1 clock enable */ | ||||
|     __HAL_RCC_USART1_CLK_ENABLE(); | ||||
| 
 | ||||
|     __HAL_RCC_GPIOB_CLK_ENABLE(); | ||||
|     /**USART1 GPIO Configuration
 | ||||
|     PB6     ------> USART1_TX | ||||
|     PB7     ------> USART1_RX | ||||
|     */ | ||||
|     GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.Alternate = GPIO_AF7_USART1; | ||||
|     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); | ||||
| 
 | ||||
|   /* USER CODE BEGIN USART1_MspInit 1 */ | ||||
| 
 | ||||
|   /* USER CODE END USART1_MspInit 1 */ | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) | ||||
| { | ||||
| 
 | ||||
|   if(uartHandle->Instance==USART1) | ||||
|   { | ||||
|   /* USER CODE BEGIN USART1_MspDeInit 0 */ | ||||
| 
 | ||||
|   /* USER CODE END USART1_MspDeInit 0 */ | ||||
|     /* Peripheral clock disable */ | ||||
|     __HAL_RCC_USART1_CLK_DISABLE(); | ||||
| 
 | ||||
|     /**USART1 GPIO Configuration
 | ||||
|     PB6     ------> USART1_TX | ||||
|     PB7     ------> USART1_RX | ||||
|     */ | ||||
|     HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7); | ||||
| 
 | ||||
|   /* USER CODE BEGIN USART1_MspDeInit 1 */ | ||||
| 
 | ||||
|   /* USER CODE END USART1_MspDeInit 1 */ | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /* USER CODE BEGIN 1 */ | ||||
| 
 | ||||
| /* USER CODE END 1 */ | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -71,9 +71,6 @@ C_SOURCES		+= \ | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_spi_ex.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_lptim.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_adc.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_dma.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_gpio.c \
 | ||||
| @ -81,6 +78,8 @@ C_SOURCES		+= \ | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_rcc.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_tim.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_lptim.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usart.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_utils.c \
 | ||||
| 	$(CUBE_DIR)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c \
 | ||||
| 	$(CUBE_DIR)/Middlewares/Third_Party/FreeRTOS/Source/croutine.c \
 | ||||
| 	$(CUBE_DIR)/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c \
 | ||||
| @ -105,8 +104,7 @@ ASM_SOURCES += $(MXPROJECT_DIR)/startup_stm32wb55xx_cm4.s | ||||
| CFLAGS			+= \
 | ||||
| 	-DUSE_FULL_LL_DRIVER \
 | ||||
| 	-DUSE_HAL_DRIVER \
 | ||||
| 	-DHAVE_FREERTOS \
 | ||||
| 	-DDEBUG_UART=huart1 | ||||
| 	-DHAVE_FREERTOS | ||||
| 
 | ||||
| ifeq ($(NO_BOOTLOADER), 1) | ||||
| LDFLAGS			+= -T$(MXPROJECT_DIR)/stm32wb55xx_flash_cm4_no_boot.ld | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく