diff --git a/misc/stm32f1_test_project/.cproject b/misc/stm32f1_test_project/.cproject deleted file mode 100644 index d076456279..0000000000 --- a/misc/stm32f1_test_project/.cproject +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/misc/stm32f1_test_project/.project b/misc/stm32f1_test_project/.project deleted file mode 100644 index f2e335f0e0..0000000000 --- a/misc/stm32f1_test_project/.project +++ /dev/null @@ -1,43 +0,0 @@ - - - ARMCM3-STM32F103RB-NUCLEO - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - - - board - 2 - CHIBIOS/boards/ST_NUCLEO_F103RB - - - os - 2 - CHIBIOS/os - - - test - 2 - CHIBIOS/test - - - diff --git a/misc/stm32f1_test_project/Makefile b/misc/stm32f1_test_project/Makefile deleted file mode 100644 index 66be62d566..0000000000 --- a/misc/stm32f1_test_project/Makefile +++ /dev/null @@ -1,198 +0,0 @@ -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -O0 -g -ggdb -fomit-frame-pointer -falign-functions=16 -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -fno-rtti -fno-exceptions -ffast-math -funsafe-math-optimizations -fno-threadsafe-statics -fno-use-cxa-atexit - USE_CPPOPT += -std=c++2a -endif - -# Enable this if you want the linker to remove unused code and data. -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO). -ifeq ($(USE_LTO),) - USE_LTO = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# If enabled, this option makes the build process faster by not compiling -# modules not used in the current configuration. -ifeq ($(USE_SMART_BUILD),) - #USE_SMART_BUILD = yes -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Stack size to be allocated to the Cortex-M process stack. This stack is -# the stack used by the main() thread. -ifeq ($(USE_PROCESS_STACKSIZE),) - USE_PROCESS_STACKSIZE = 0x400 -endif - -# Stack size to the allocated to the Cortex-M main/exceptions stack. This -# stack is used for processing interrupts and exceptions. -ifeq ($(USE_EXCEPTIONS_STACKSIZE),) - USE_EXCEPTIONS_STACKSIZE = 0x400 -endif - -# Enables the use of FPU (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = no -endif - -# FPU-related options. -ifeq ($(USE_FPU_OPT),) - USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, target, sources and paths -# - -# Define project name here -PROJECT = ch - -# Target settings. -MCU = cortex-m3 - -# Imported source files and paths. -CHIBIOS = ../../firmware/ChibiOS -CONFDIR := ./cfg -BUILDDIR := ./build -DEPDIR := ./.dep - -ifeq ("$(wildcard $(CHIBIOS)/os/license/license.mk)","") -# submodules probably aren't checked out, complain to the user about it! -# make is not happy about newly checked out module for some reason but next invocation would work -$(error Please run 'git submodule update --init --recursive' before trying to build!) -endif - -# Licensing files. -include $(CHIBIOS)/os/license/license.mk -# Startup files. -include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f1xx.mk -# HAL-OSAL files (optional). -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS)/os/hal/ports/STM32/STM32F1xx/platform.mk -include $(CHIBIOS)/os/hal/boards/OLIMEX_STM32_P103/board.mk -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk -# RTOS files (optional). -include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Auto-build files in ./source recursively. -include $(CHIBIOS)/tools/mk/autobuild.mk -# Other files (optional). -include $(CHIBIOS)/os/hal/lib/complex/mfs/hal_mfs.mk -include $(CHIBIOS)/os/hal/lib/streams/streams.mk - -# Define linker script file here -LDSCRIPT= $(STARTUPLD)/STM32F103xB.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(ALLCSRC) - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = $(ALLCPPSRC) \ - main.cpp \ - spi.cpp \ - can.cpp \ - persistence.cpp \ - uart.cpp - -# List ASM source files here. -ASMSRC = $(ALLASMSRC) - -# List ASM with preprocessor source files here. -ASMXSRC = $(ALLXASMSRC) - -# Inclusion directories. -INCDIR = $(CONFDIR) $(ALLINC) - -# Define C warning options here. -CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes - -# Define C++ warning options here. -CPPWARN = -Wall -Wextra -Wundef - -# -# Project, target, sources and paths -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user section -############################################################################## - -############################################################################## -# Common rules -# - -RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk -include $(RULESPATH)/arm-none-eabi.mk -include $(RULESPATH)/rules.mk - -# -# Common rules -############################################################################## - -############################################################################## -# Custom rules -# - -# -# Custom rules -############################################################################## diff --git a/misc/stm32f1_test_project/STM32F103xB.ld b/misc/stm32f1_test_project/STM32F103xB.ld deleted file mode 100644 index 920036334f..0000000000 --- a/misc/stm32f1_test_project/STM32F103xB.ld +++ /dev/null @@ -1,85 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/* - * ST32F103xB memory setup. - */ -MEMORY -{ - flash0 (rx) : org = 0x08000000, len = 60k - flash1 (rx) : org = 0x00000000, len = 0 - flash2 (rx) : org = 0x00000000, len = 0 - flash3 (rx) : org = 0x00000000, len = 0 - flash4 (rx) : org = 0x00000000, len = 0 - flash5 (rx) : org = 0x00000000, len = 0 - flash6 (rx) : org = 0x00000000, len = 0 - flash7 (rx) : org = 0x00000000, len = 0 - ram0 (wx) : org = 0x20000000, len = 20k - ram1 (wx) : org = 0x00000000, len = 0 - ram2 (wx) : org = 0x00000000, len = 0 - ram3 (wx) : org = 0x00000000, len = 0 - ram4 (wx) : org = 0x00000000, len = 0 - ram5 (wx) : org = 0x00000000, len = 0 - ram6 (wx) : org = 0x00000000, len = 0 - ram7 (wx) : org = 0x00000000, len = 0 -} - -/* For each data/text section two region are defined, a virtual region - and a load region (_LMA suffix).*/ - -/* Flash region to be used for exception vectors.*/ -REGION_ALIAS("VECTORS_FLASH", flash0); -REGION_ALIAS("VECTORS_FLASH_LMA", flash0); - -/* Flash region to be used for constructors and destructors.*/ -REGION_ALIAS("XTORS_FLASH", flash0); -REGION_ALIAS("XTORS_FLASH_LMA", flash0); - -/* Flash region to be used for code text.*/ -REGION_ALIAS("TEXT_FLASH", flash0); -REGION_ALIAS("TEXT_FLASH_LMA", flash0); - -/* Flash region to be used for read only data.*/ -REGION_ALIAS("RODATA_FLASH", flash0); -REGION_ALIAS("RODATA_FLASH_LMA", flash0); - -/* Flash region to be used for various.*/ -REGION_ALIAS("VARIOUS_FLASH", flash0); -REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); - -/* Flash region to be used for RAM(n) initialization data.*/ -REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); - -/* RAM region to be used for Main stack. This stack accommodates the processing - of all exceptions and interrupts.*/ -REGION_ALIAS("MAIN_STACK_RAM", ram0); - -/* RAM region to be used for the process stack. This is the stack used by - the main() function.*/ -REGION_ALIAS("PROCESS_STACK_RAM", ram0); - -/* RAM region to be used for data segment.*/ -REGION_ALIAS("DATA_RAM", ram0); -REGION_ALIAS("DATA_RAM_LMA", flash0); - -/* RAM region to be used for BSS segment.*/ -REGION_ALIAS("BSS_RAM", ram0); - -/* RAM region to be used for the default heap.*/ -REGION_ALIAS("HEAP_RAM", ram0); - -/* Generic rules inclusion.*/ -INCLUDE rules.ld diff --git a/misc/stm32f1_test_project/can.cpp b/misc/stm32f1_test_project/can.cpp deleted file mode 100644 index 8c47d17117..0000000000 --- a/misc/stm32f1_test_project/can.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include "can.h" -#include "hal.h" - -#include -#include - -const CANConfig canConfig500 = -{ - CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP, - /* - Settings from https://forum.chibios.org/viewtopic.php?t=2990 - For 36MHz http://www.bittiming.can-wiki.info/ does not give that option :( Subtract '1' for register values - */ - CAN_BTR_SJW(0) | CAN_BTR_BRP(5) | CAN_BTR_TS1(5) | CAN_BTR_TS2(4), -}; - - -#define SWAP_UINT16(x) (((x) << 8) | ((x) >> 8)) - -void SendSomething() -{ - auto baseAddress = 0x156; - - { - CANTxFrame m_frame; - - m_frame.IDE = CAN_IDE_STD; - m_frame.EID = 0; - m_frame.SID = baseAddress; - m_frame.RTR = CAN_RTR_DATA; - m_frame.DLC = 8; - memset(m_frame.data8, 0, sizeof(m_frame.data8)); - m_frame.data8[3] = 0x33; - m_frame.data8[6] = 0x66; - - canTransmitTimeout(&CAND1, CAN_ANY_MAILBOX, &m_frame, TIME_IMMEDIATE); - } - -} - -static THD_WORKING_AREA(waCanTxThread, 256); -void CanTxThread(void*) -{ - while(1) { - SendSomething(); - - chThdSleepMilliseconds(10); - } -} - -static THD_WORKING_AREA(waCanRxThread, 256); -void CanRxThread(void*) -{ - while(1) - { - CANRxFrame frame; - msg_t msg = canReceiveTimeout(&CAND1, CAN_ANY_MAILBOX, &frame, TIME_INFINITE); - - // Ignore non-ok results... - if (msg != MSG_OK) - { - continue; - } - - // Ignore std frames, only listen to ext - if (frame.IDE != CAN_IDE_EXT) - { - continue; - } - - } -} - -void InitCan() { - canStart(&CAND1, &canConfig500); - // CAN TX - palSetPadMode(GPIOA,12, PAL_MODE_STM32_ALTERNATE_PUSHPULL ); - // CAN RX - palSetPadMode(GPIOA,11, PAL_MODE_INPUT_PULLUP ); - - chThdCreateStatic(waCanTxThread, sizeof(waCanTxThread), NORMALPRIO, CanTxThread, nullptr); - chThdCreateStatic(waCanRxThread, sizeof(waCanRxThread), NORMALPRIO - 4, CanRxThread, nullptr); -} diff --git a/misc/stm32f1_test_project/can.h b/misc/stm32f1_test_project/can.h deleted file mode 100644 index d195c7d441..0000000000 --- a/misc/stm32f1_test_project/can.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -void InitCan(); diff --git a/misc/stm32f1_test_project/chconf.h b/misc/stm32f1_test_project/chconf.h deleted file mode 100644 index 44131fb1aa..0000000000 --- a/misc/stm32f1_test_project/chconf.h +++ /dev/null @@ -1,756 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file rt/templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef CHCONF_H -#define CHCONF_H - -#define _CHIBIOS_RT_CONF_ -#define _CHIBIOS_RT_CONF_VER_6_1_ - -/*===========================================================================*/ -/** - * @name System timers settings - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System time counter resolution. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_ST_RESOLUTION) -#define CH_CFG_ST_RESOLUTION 16 -#endif - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_CFG_ST_FREQUENCY) -#define CH_CFG_ST_FREQUENCY 2000 -#endif - -/** - * @brief Time intervals data size. - * @note Allowed values are 16, 32 or 64 bits. - */ -#if !defined(CH_CFG_INTERVALS_SIZE) -#define CH_CFG_INTERVALS_SIZE 32 -#endif - -/** - * @brief Time types data size. - * @note Allowed values are 16 or 32 bits. - */ -#if !defined(CH_CFG_TIME_TYPES_SIZE) -#define CH_CFG_TIME_TYPES_SIZE 32 -#endif - -/** - * @brief Time delta constant for the tick-less mode. - * @note If this value is zero then the system uses the classic - * periodic tick. This value represents the minimum number - * of ticks that is safe to specify in a timeout directive. - * The value one is not valid, timeouts are rounded up to - * this value. - */ -#if !defined(CH_CFG_ST_TIMEDELTA) -#define CH_CFG_ST_TIMEDELTA 2 -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - * @note The round robin preemption is not supported in tickless mode and - * must be set to zero in that case. - */ -#if !defined(CH_CFG_TIME_QUANTUM) -#define CH_CFG_TIME_QUANTUM 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread. The application @p main() - * function becomes the idle thread and must implement an - * infinite loop. - */ -#if !defined(CH_CFG_NO_IDLE_THREAD) -#define CH_CFG_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_OPTIMIZE_SPEED) -#define CH_CFG_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Time Measurement APIs. - * @details If enabled then the time measurement APIs are included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_TM) -#define CH_CFG_USE_TM TRUE -#endif - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_REGISTRY) -#define CH_CFG_USE_REGISTRY TRUE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_WAITEXIT) -#define CH_CFG_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_SEMAPHORES) -#define CH_CFG_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) -#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MUTEXES) -#define CH_CFG_USE_MUTEXES TRUE -#endif - -/** - * @brief Enables recursive behavior on mutexes. - * @note Recursive mutexes are heavier and have an increased - * memory footprint. - * - * @note The default is @p FALSE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) -#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MUTEXES. - */ -#if !defined(CH_CFG_USE_CONDVARS) -#define CH_CFG_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_CONDVARS. - */ -#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) -#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_EVENTS) -#define CH_CFG_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_EVENTS. - */ -#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) -#define CH_CFG_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MESSAGES) -#define CH_CFG_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special - * requirements. - * @note Requires @p CH_CFG_USE_MESSAGES. - */ -#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) -#define CH_CFG_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_WAITEXIT. - * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. - */ -#if !defined(CH_CFG_USE_DYNAMIC) -#define CH_CFG_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name OSLIB options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_SEMAPHORES. - */ -#if !defined(CH_CFG_USE_MAILBOXES) -#define CH_CFG_USE_MAILBOXES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMCORE) -#define CH_CFG_USE_MEMCORE TRUE -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_CFG_USE_MEMCORE. - */ -#if !defined(CH_CFG_MEMCORE_SIZE) -#define CH_CFG_MEMCORE_SIZE 0 -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or - * @p CH_CFG_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_CFG_USE_HEAP) -#define CH_CFG_USE_HEAP TRUE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_MEMPOOLS) -#define CH_CFG_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Objects FIFOs APIs. - * @details If enabled then the objects FIFOs APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_FIFOS) -#define CH_CFG_USE_OBJ_FIFOS TRUE -#endif - -/** - * @brief Pipes APIs. - * @details If enabled then the pipes APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_PIPES) -#define CH_CFG_USE_PIPES TRUE -#endif - -/** - * @brief Objects Caches APIs. - * @details If enabled then the objects caches APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_OBJ_CACHES) -#define CH_CFG_USE_OBJ_CACHES TRUE -#endif - -/** - * @brief Delegate threads APIs. - * @details If enabled then the delegate threads APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_DELEGATES) -#define CH_CFG_USE_DELEGATES TRUE -#endif - -/** - * @brief Jobs Queues APIs. - * @details If enabled then the jobs queues APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_CFG_USE_JOBS) -#define CH_CFG_USE_JOBS TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Objects factory options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Objects Factory APIs. - * @details If enabled then the objects factory APIs are included in the - * kernel. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_CFG_USE_FACTORY) -#define CH_CFG_USE_FACTORY TRUE -#endif - -/** - * @brief Maximum length for object names. - * @details If the specified length is zero then the name is stored by - * pointer but this could have unintended side effects. - */ -#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) -#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 -#endif - -/** - * @brief Enables the registry of generic objects. - */ -#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) -#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE -#endif - -/** - * @brief Enables factory for generic buffers. - */ -#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) -#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE -#endif - -/** - * @brief Enables factory for semaphores. - */ -#if !defined(CH_CFG_FACTORY_SEMAPHORES) -#define CH_CFG_FACTORY_SEMAPHORES TRUE -#endif - -/** - * @brief Enables factory for mailboxes. - */ -#if !defined(CH_CFG_FACTORY_MAILBOXES) -#define CH_CFG_FACTORY_MAILBOXES TRUE -#endif - -/** - * @brief Enables factory for objects FIFOs. - */ -#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) -#define CH_CFG_FACTORY_OBJ_FIFOS TRUE -#endif - -/** - * @brief Enables factory for Pipes. - */ -#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) -#define CH_CFG_FACTORY_PIPES TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, kernel statistics. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_STATISTICS) -#define CH_DBG_STATISTICS FALSE -#endif - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) -#define CH_DBG_SYSTEM_STATE_CHECK FALSE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) -#define CH_DBG_ENABLE_CHECKS FALSE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) -#define CH_DBG_ENABLE_ASSERTS FALSE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the trace buffer is activated. - * - * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_MASK) -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED -#endif - -/** - * @brief Trace buffer entries. - * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is - * different from @p CH_DBG_TRACE_MASK_DISABLED. - */ -#if !defined(CH_DBG_TRACE_BUFFER_SIZE) -#define CH_DBG_TRACE_BUFFER_SIZE 128 -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) -#define CH_DBG_ENABLE_STACK_CHECK FALSE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) -#define CH_DBG_FILL_THREADS FALSE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p thread_t structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p FALSE. - * @note This debug option is not currently compatible with the - * tickless mode. - */ -#if !defined(CH_DBG_THREADS_PROFILING) -#define CH_DBG_THREADS_PROFILING FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System structure extension. - * @details User fields added to the end of the @p ch_system_t structure. - */ -#define CH_CFG_SYSTEM_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief System initialization hook. - * @details User initialization code added to the @p chSysInit() function - * just before interrupts are enabled globally. - */ -#define CH_CFG_SYSTEM_INIT_HOOK() { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p thread_t structure. - */ -#define CH_CFG_THREAD_EXTRA_FIELDS \ - /* Add threads custom fields here.*/ - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p _thread_init() function. - * - * @note It is invoked from within @p _thread_init() and implicitly from all - * the threads creation APIs. - */ -#define CH_CFG_THREAD_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ -} - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - */ -#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* Context switch code here.*/ \ -} - -/** - * @brief ISR enter hook. - */ -#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ - /* IRQ prologue code here.*/ \ -} - -/** - * @brief ISR exit hook. - */ -#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ - /* IRQ epilogue code here.*/ \ -} - -/** - * @brief Idle thread enter hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to activate a power saving mode. - */ -#define CH_CFG_IDLE_ENTER_HOOK() { \ - /* Idle-enter code here.*/ \ -} - -/** - * @brief Idle thread leave hook. - * @note This hook is invoked within a critical zone, no OS functions - * should be invoked from here. - * @note This macro can be used to deactivate a power saving mode. - */ -#define CH_CFG_IDLE_LEAVE_HOOK() { \ - /* Idle-leave code here.*/ \ -} - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#define CH_CFG_IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#define CH_CFG_SYSTEM_TICK_HOOK() { \ - /* System tick event code here.*/ \ -} - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ - /* System halt code here.*/ \ -} - -/** - * @brief Trace hook. - * @details This hook is invoked each time a new record is written in the - * trace buffer. - */ -#define CH_CFG_TRACE_HOOK(tep) { \ - /* Trace code here.*/ \ -} - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -#endif /* CHCONF_H */ - -/** @} */ diff --git a/misc/stm32f1_test_project/clean_build.bat b/misc/stm32f1_test_project/clean_build.bat deleted file mode 100644 index 6da1c07e8f..0000000000 --- a/misc/stm32f1_test_project/clean_build.bat +++ /dev/null @@ -1,7 +0,0 @@ -rem make, gcc, Windows and Cygwin combined have some issue with spaces or colons in paths, that's a workaround -rem that's more or less 'make clean' -rd /s /q .dep -rd /s /q build - -# that's 'make' with some extra utilities -compile.bat \ No newline at end of file diff --git a/misc/stm32f1_test_project/compile.bat b/misc/stm32f1_test_project/compile.bat deleted file mode 100644 index e23e089ae9..0000000000 --- a/misc/stm32f1_test_project/compile.bat +++ /dev/null @@ -1,8 +0,0 @@ - -rd /s /q .dep - -echo Starting compilation -rem the important piece -make -j12 - -call flash \ No newline at end of file diff --git a/misc/stm32f1_test_project/flash.bat b/misc/stm32f1_test_project/flash.bat deleted file mode 100644 index be3cb0f51f..0000000000 --- a/misc/stm32f1_test_project/flash.bat +++ /dev/null @@ -1 +0,0 @@ -st-link_cli -c SWD ur -P build\ch.hex -Rst -Run diff --git a/misc/stm32f1_test_project/halconf.h b/misc/stm32f1_test_project/halconf.h deleted file mode 100644 index 9e41a0034e..0000000000 --- a/misc/stm32f1_test_project/halconf.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef HALCONF_H -#define HALCONF_H - -#define _CHIBIOS_HAL_CONF_ -#define _CHIBIOS_HAL_CONF_VER_7_1_ - -#include "mcuconf.h" - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL TRUE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN TRUE -#endif - -/** - * @brief Enables the cryptographic subsystem. - */ -#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) -#define HAL_USE_CRY FALSE -#endif - -/** - * @brief Enables the DAC subsystem. - */ -#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) -#define HAL_USE_DAC FALSE -#endif - -/** - * @brief Enables the EFlash subsystem. - */ -#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) -#define HAL_USE_EFL TRUE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the I2S subsystem. - */ -#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) -#define HAL_USE_I2S FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI TRUE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SIO subsystem. - */ -#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) -#define HAL_USE_SIO FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI TRUE -#endif - -/** - * @brief Enables the TRNG subsystem. - */ -#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) -#define HAL_USE_TRNG FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART TRUE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/** - * @brief Enables the WDG subsystem. - */ -#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) -#define HAL_USE_WDG FALSE -#endif - -/** - * @brief Enables the WSPI subsystem. - */ -#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) -#define HAL_USE_WSPI FALSE -#endif - -/*===========================================================================*/ -/* PAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) -#define PAL_USE_CALLBACKS FALSE -#endif - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) -#define PAL_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/** - * @brief Enforces the driver to use direct callbacks rather than OSAL events. - */ -#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) -#define CAN_ENFORCE_USE_CALLBACKS FALSE -#endif - -/*===========================================================================*/ -/* CRY driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the SW fall-back of the cryptographic driver. - * @details When enabled, this option, activates a fall-back software - * implementation for algorithms not supported by the underlying - * hardware. - * @note Fall-back implementations may not be present for all algorithms. - */ -#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_USE_FALLBACK FALSE -#endif - -/** - * @brief Makes the driver forcibly use the fall-back implementations. - */ -#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) -#define HAL_CRY_ENFORCE_FALLBACK FALSE -#endif - -/*===========================================================================*/ -/* DAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) -#define DAC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define DAC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the zero-copy API. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE -#endif - -/** - * @brief OCR initialization constant for V20 cards. - */ -#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) -#define SDC_INIT_OCR_V20 0x50FF8000U -#endif - -/** - * @brief OCR initialization constant for non-V20 cards. - */ -#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) -#define SDC_INIT_OCR 0x80100000U -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 16 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SERIAL_USB driver related setting. */ -/*===========================================================================*/ - -/** - * @brief Serial over USB buffers size. - * @details Configuration parameter, the buffer size must be a multiple of - * the USB data endpoint maximum packet size. - * @note The default is 256 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_SIZE 256 -#endif - -/** - * @brief Serial over USB number of buffers. - * @note The default is 2 buffers. - */ -#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) -#define SERIAL_USB_BUFFERS_NUMBER 2 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables circular transfers APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) -#define SPI_USE_CIRCULAR FALSE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -/** - * @brief Handling method for SPI CS line. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) -#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD -#endif - -/*===========================================================================*/ -/* UART driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) -#define UART_USE_WAIT FALSE -#endif - -/** - * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define UART_USE_MUTUAL_EXCLUSION FALSE -#endif - -/*===========================================================================*/ -/* USB driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) -#define USB_USE_WAIT FALSE -#endif - -/*===========================================================================*/ -/* WSPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) -#define WSPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define WSPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* HALCONF_H */ - -/** @} */ diff --git a/misc/stm32f1_test_project/main.cpp b/misc/stm32f1_test_project/main.cpp deleted file mode 100644 index 27df9c016f..0000000000 --- a/misc/stm32f1_test_project/main.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ch.h" -#include "hal.h" -#include "uart.h" -#include "can.h" -#include "spi.h" -#include "persistence.h" - -#define BL_PORT GPIOC -#define BL_PIN 13 - -/* - * Red LED blinker thread, times are in milliseconds. - */ -static THD_WORKING_AREA(waThread1, 256); -static THD_FUNCTION(Thread1, arg) { - - (void)arg; - chRegSetThreadName("blinker"); - while (TRUE) { - palClearPad(BL_PORT, BL_PIN); - chThdSleepMilliseconds(30); - palSetPad(BL_PORT, BL_PIN); - chThdSleepMilliseconds(30); - } - return; -} - -/* - * Application entry point. - */ -int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ - halInit(); - chSysInit(); - - palSetPadMode(BL_PORT, BL_PIN, PAL_MODE_OUTPUT_PUSHPULL); - - /* - * Creates the blinker thread. - */ - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - - InitConfiguration(); - InitUart(); - InitCan(); - InitSpi(); - - /* - * Normal main() thread activity, in this demo it does nothing except - * sleeping in a loop and check the button state. - */ - while (TRUE) { -// if (!palReadPad(GPIOC, GPIOC_BUTTON)) -// TestThread(&SD2); - chThdSleepMilliseconds(500); - } -} diff --git a/misc/stm32f1_test_project/mcuconf.h b/misc/stm32f1_test_project/mcuconf.h deleted file mode 100644 index 8800dac0a0..0000000000 --- a/misc/stm32f1_test_project/mcuconf.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef MCUCONF_H -#define MCUCONF_H - -#define STM32F103_MCUCONF - -/* - * STM32F103 drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 15...0 Lowest...Highest. - * - * DMA priorities: - * 0...3 Lowest...Highest. - */ - -/* - * HAL driver system settings. - */ -#define STM32_NO_INIT FALSE -#define STM32_HSI_ENABLED TRUE -#define STM32_LSI_ENABLED FALSE -#define STM32_HSE_ENABLED TRUE -#define STM32_LSE_ENABLED FALSE -#define STM32_SW STM32_SW_PLL -#define STM32_PLLSRC STM32_PLLSRC_HSE -#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1 -#define STM32_PLLMUL_VALUE 9 -#define STM32_HPRE STM32_HPRE_DIV1 -#define STM32_PPRE1 STM32_PPRE1_DIV2 -#define STM32_PPRE2 STM32_PPRE2_DIV2 -#define STM32_ADCPRE STM32_ADCPRE_DIV4 -#define STM32_USB_CLOCK_REQUIRED TRUE -#define STM32_USBPRE STM32_USBPRE_DIV1P5 -#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK -#define STM32_RTCSEL STM32_RTCSEL_HSEDIV -#define STM32_PVD_ENABLE FALSE -#define STM32_PLS STM32_PLS_LEV0 - -/* - * IRQ system settings. - */ -#define STM32_IRQ_EXTI0_PRIORITY 6 -#define STM32_IRQ_EXTI1_PRIORITY 6 -#define STM32_IRQ_EXTI2_PRIORITY 6 -#define STM32_IRQ_EXTI3_PRIORITY 6 -#define STM32_IRQ_EXTI4_PRIORITY 6 -#define STM32_IRQ_EXTI5_9_PRIORITY 6 -#define STM32_IRQ_EXTI10_15_PRIORITY 6 -#define STM32_IRQ_EXTI16_PRIORITY 6 -#define STM32_IRQ_EXTI17_PRIORITY 6 -#define STM32_IRQ_EXTI18_PRIORITY 6 -#define STM32_IRQ_EXTI19_PRIORITY 6 - -/* - * ADC driver system settings. - */ -#define STM32_ADC_USE_ADC1 FALSE -#define STM32_ADC_ADC1_DMA_PRIORITY 2 -#define STM32_ADC_ADC1_IRQ_PRIORITY 6 - -/* - * CAN driver system settings. - */ -#define STM32_CAN_USE_CAN1 TRUE -#define STM32_CAN_CAN1_IRQ_PRIORITY 11 - -/* - * GPT driver system settings. - */ -#define STM32_GPT_USE_TIM1 FALSE -#define STM32_GPT_USE_TIM2 FALSE -#define STM32_GPT_USE_TIM3 FALSE -#define STM32_GPT_USE_TIM4 FALSE -#define STM32_GPT_USE_TIM5 FALSE -#define STM32_GPT_USE_TIM8 FALSE -#define STM32_GPT_TIM1_IRQ_PRIORITY 7 -#define STM32_GPT_TIM2_IRQ_PRIORITY 7 -#define STM32_GPT_TIM3_IRQ_PRIORITY 7 -#define STM32_GPT_TIM4_IRQ_PRIORITY 7 -#define STM32_GPT_TIM5_IRQ_PRIORITY 7 -#define STM32_GPT_TIM8_IRQ_PRIORITY 7 - -/* - * I2C driver system settings. - */ -#define STM32_I2C_USE_I2C1 FALSE -#define STM32_I2C_USE_I2C2 FALSE -#define STM32_I2C_BUSY_TIMEOUT 50 -#define STM32_I2C_I2C1_IRQ_PRIORITY 5 -#define STM32_I2C_I2C2_IRQ_PRIORITY 5 -#define STM32_I2C_I2C1_DMA_PRIORITY 3 -#define STM32_I2C_I2C2_DMA_PRIORITY 3 -#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") - -/* - * ICU driver system settings. - */ -#define STM32_ICU_USE_TIM1 FALSE -#define STM32_ICU_USE_TIM2 FALSE -#define STM32_ICU_USE_TIM3 FALSE -#define STM32_ICU_USE_TIM4 FALSE -#define STM32_ICU_USE_TIM5 FALSE -#define STM32_ICU_USE_TIM8 FALSE -#define STM32_ICU_TIM1_IRQ_PRIORITY 7 -#define STM32_ICU_TIM2_IRQ_PRIORITY 7 -#define STM32_ICU_TIM3_IRQ_PRIORITY 7 -#define STM32_ICU_TIM4_IRQ_PRIORITY 7 -#define STM32_ICU_TIM5_IRQ_PRIORITY 7 -#define STM32_ICU_TIM8_IRQ_PRIORITY 7 - -/* - * PWM driver system settings. - */ -#define STM32_PWM_USE_ADVANCED FALSE -#define STM32_PWM_USE_TIM1 FALSE -#define STM32_PWM_USE_TIM2 FALSE -#define STM32_PWM_USE_TIM3 FALSE -#define STM32_PWM_USE_TIM4 FALSE -#define STM32_PWM_USE_TIM5 FALSE -#define STM32_PWM_USE_TIM8 FALSE -#define STM32_PWM_TIM1_IRQ_PRIORITY 7 -#define STM32_PWM_TIM2_IRQ_PRIORITY 7 -#define STM32_PWM_TIM3_IRQ_PRIORITY 7 -#define STM32_PWM_TIM4_IRQ_PRIORITY 7 -#define STM32_PWM_TIM5_IRQ_PRIORITY 7 -#define STM32_PWM_TIM8_IRQ_PRIORITY 7 - -/* - * RTC driver system settings. - */ -#define STM32_RTC_IRQ_PRIORITY 15 - -/* - * SERIAL driver system settings. - */ -#define STM32_SERIAL_USE_USART1 FALSE -#define STM32_SERIAL_USE_USART2 FALSE -#define STM32_SERIAL_USE_USART3 FALSE -#define STM32_SERIAL_USE_UART4 FALSE -#define STM32_SERIAL_USE_UART5 FALSE -#define STM32_SERIAL_USART1_PRIORITY 12 -#define STM32_SERIAL_USART2_PRIORITY 12 -#define STM32_SERIAL_USART3_PRIORITY 12 -#define STM32_SERIAL_UART4_PRIORITY 12 -#define STM32_SERIAL_UART5_PRIORITY 12 - -/* - * SPI driver system settings. - */ -#define STM32_SPI_USE_SPI1 FALSE -#define STM32_SPI_USE_SPI2 TRUE -#define STM32_SPI_USE_SPI3 FALSE -#define STM32_SPI_SPI1_DMA_PRIORITY 1 -#define STM32_SPI_SPI2_DMA_PRIORITY 1 -#define STM32_SPI_SPI3_DMA_PRIORITY 1 -#define STM32_SPI_SPI1_IRQ_PRIORITY 10 -#define STM32_SPI_SPI2_IRQ_PRIORITY 10 -#define STM32_SPI_SPI3_IRQ_PRIORITY 10 -#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") - -/* - * ST driver system settings. - */ -#define STM32_ST_IRQ_PRIORITY 8 -#define STM32_ST_USE_TIMER 2 - -/* - * UART driver system settings. - */ -#define STM32_UART_USE_USART1 TRUE -#define STM32_UART_USE_USART2 FALSE -#define STM32_UART_USE_USART3 FALSE -#define STM32_UART_USART1_IRQ_PRIORITY 12 -#define STM32_UART_USART2_IRQ_PRIORITY 12 -#define STM32_UART_USART3_IRQ_PRIORITY 12 -#define STM32_UART_USART1_DMA_PRIORITY 0 -#define STM32_UART_USART2_DMA_PRIORITY 0 -#define STM32_UART_USART3_DMA_PRIORITY 0 -#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") - -/* - * USB driver system settings. - */ -#define STM32_USB_USE_USB1 FALSE -#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE -#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 -#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 - -/* - * WDG driver system settings. - */ -#define STM32_WDG_USE_IWDG FALSE - -#endif /* MCUCONF_H */ diff --git a/misc/stm32f1_test_project/persistence.cpp b/misc/stm32f1_test_project/persistence.cpp deleted file mode 100644 index a133d368f0..0000000000 --- a/misc/stm32f1_test_project/persistence.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "hal.h" -#include "persistence.h" - -static const MFSConfig mfscfg_1k = { - .flashp = (BaseFlash *)&EFLD1, - .erased = 0xFFFFFFFFU, -// 1k page * 1 sector = 1024 - .bank_size = 1024U, - .bank0_start = 62U, - .bank0_sectors = 1U, - .bank1_start = 63U, - .bank1_sectors = 1U -}; - -static const MFSConfig mfscfg_2k = { - .flashp = (BaseFlash *)&EFLD1, - .erased = 0xFFFFFFFFU, - /* 256K flash device with 2K pages - * use last 8 pages for settings - * one bank is 8K */ -// 2k page * 4 sectors = 8096 - .bank_size = 8096U, - .bank0_start = 120U, - .bank0_sectors = 4U, - .bank1_start = 124U, - .bank1_sectors = 4U -}; - - -static MFSDriver mfs1; -TestConfiguration configuration; - -static uint8_t *GetConfigurationPtr() { - return (uint8_t *)&configuration; -} - -static size_t GetConfigurationSize() { - return sizeof(TestConfiguration); -} - -static bool isMfsOkIsh(mfs_error_t state) { - return state == MFS_NO_ERROR || state == MFS_WARN_REPAIR || state == MFS_WARN_GC; -} - -mfs_error_t flashState; - -int InitConfiguration() { - - /* Starting EFL driver.*/ - eflStart(&EFLD1, NULL); - - mfsObjectInit(&mfs1); - -#define FLASH_SIZE_IN_K_ADDRESS 0x1FFFF7E0 - int flashSize = (*(uint16_t*)FLASH_SIZE_IN_K_ADDRESS); - if (flashSize > 128) { - flashState = mfsStart(&mfs1, &mfscfg_2k); - } else { - flashState = mfsStart(&mfs1, &mfscfg_1k); - } - - size_t size = GetConfigurationSize(); - flashState = mfsReadRecord(&mfs1, MFS_CONFIGURATION_RECORD_ID, &size, GetConfigurationPtr()); - if (!isMfsOkIsh(flashState) || size != GetConfigurationSize() || !configuration.IsValid()) { - /* load defaults */ - configuration.resetToDefaults(); - } else { - configuration.rebootCounter++; - } - - return 0; -} - -void pokeConfiguration() { - configuration.updateCounter++; - flashState = mfsWriteRecord(&mfs1, MFS_CONFIGURATION_RECORD_ID, GetConfigurationSize(), GetConfigurationPtr()); -} \ No newline at end of file diff --git a/misc/stm32f1_test_project/persistence.h b/misc/stm32f1_test_project/persistence.h deleted file mode 100644 index 0b1ff41f1b..0000000000 --- a/misc/stm32f1_test_project/persistence.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "hal_mfs.h" - -#define PERSISTENCE_VERSION 41 - -#define MFS_CONFIGURATION_RECORD_ID 1 - -struct TestConfiguration { - void resetToDefaults() { - version = PERSISTENCE_VERSION; - updateCounter = 100; - rebootCounter = 10; - } - bool IsValid() const { - return version == PERSISTENCE_VERSION; - } - - int version; - int updateCounter; - int rebootCounter; -}; - -int InitConfiguration(); -void pokeConfiguration(); diff --git a/misc/stm32f1_test_project/readme.md b/misc/stm32f1_test_project/readme.md new file mode 100644 index 0000000000..f4bfc37bb9 --- /dev/null +++ b/misc/stm32f1_test_project/readme.md @@ -0,0 +1 @@ +We used to have stm32f1 reference ChibiOS project here, see https://github.com/rusefi/rusefi/tree/lts-2023_01 if you ever need it. diff --git a/misc/stm32f1_test_project/readme.txt b/misc/stm32f1_test_project/readme.txt deleted file mode 100644 index d6b39f878f..0000000000 --- a/misc/stm32f1_test_project/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ -***************************************************************************** -** ChibiOS/RT port for ARM-Cortex-M3 STM32F103. ** -***************************************************************************** - -** TARGET ** - -The demo runs on an ST_NUCLEO_F103RB board. - -** The Demo ** - -The demo flashes the board LED using a thread, by pressing the button located -on the board the test procedure is activated with output on the serial port -SD2 (USART2, mapped on USB virtual COM port). - -** Build Procedure ** - -The demo has been tested by using the free Codesourcery GCC-based toolchain -and YAGARTO. -Just modify the TRGT line in the makefile in order to use different GCC ports. - -** Notes ** - -Some files used by the demo are not part of ChibiOS/RT but are copyright of -ST Microelectronics and are licensed under a different license. -Also note that not all the files present in the ST library are distributed -with ChibiOS/RT, you can find the whole library on the ST web site: - - http://www.st.com diff --git a/misc/stm32f1_test_project/spi.cpp b/misc/stm32f1_test_project/spi.cpp deleted file mode 100644 index 491d85872f..0000000000 --- a/misc/stm32f1_test_project/spi.cpp +++ /dev/null @@ -1,30 +0,0 @@ - -#include "can.h" -#include "hal.h" -#include "spi.h" -#include - -#define SPI_CS_PORT GPIOA -#define SPI_CS_PIN 4 - -/* Low speed SPI configuration (281.250kHz, CPHA=0, CPOL=0, MSb first).*/ -static SPIConfig ls_spicfg = {false, NULL, SPI_CS_PORT, SPI_CS_PIN, - SPI_CR1_BR_2 | SPI_CR1_BR_1, - 0}; - -/* - * SPI TX and RX buffers. - */ -static uint8_t txbuf[512]; -static uint8_t rxbuf[512]; - -void InitSpi() { - /* - * SPI1 I/O pins setup. - */ - palSetPadMode(GPIOA, 5, PAL_MODE_STM32_ALTERNATE_PUSHPULL); /* SCK. */ - palSetPadMode(GPIOA, 6, PAL_MODE_STM32_ALTERNATE_PUSHPULL); /* MISO.*/ - palSetPadMode(GPIOA, 7, PAL_MODE_STM32_ALTERNATE_PUSHPULL); /* MOSI.*/ - palSetPadMode(SPI_CS_PORT, SPI_CS_PIN, PAL_MODE_OUTPUT_PUSHPULL); - palSetPad(SPI_CS_PORT, SPI_CS_PIN); -} \ No newline at end of file diff --git a/misc/stm32f1_test_project/spi.h b/misc/stm32f1_test_project/spi.h deleted file mode 100644 index 18fbbaedc5..0000000000 --- a/misc/stm32f1_test_project/spi.h +++ /dev/null @@ -1,2 +0,0 @@ - -void InitSpi(); diff --git a/misc/stm32f1_test_project/timer/event_queue.cpp b/misc/stm32f1_test_project/timer/event_queue.cpp deleted file mode 100644 index 2dc5655b18..0000000000 --- a/misc/stm32f1_test_project/timer/event_queue.cpp +++ /dev/null @@ -1,279 +0,0 @@ -/** - * @file event_queue.cpp - * This is a data structure which keeps track of all pending events - * Implemented as a linked list, which is fine since the number of - * pending events is pretty low - * todo: MAYBE migrate to a better data structure, but that's low priority - * - * this data structure is NOT thread safe - * - * @date Apr 17, 2014 - * @author Andrey Belomutskiy, (c) 2012-2020 - */ - -#include "pch.h" -#include "os_access.h" -#include "event_queue.h" -#include "efitime.h" -#include "os_util.h" - -#if EFI_UNIT_TEST -extern int timeNowUs; -extern bool verboseMode; -#endif /* EFI_UNIT_TEST */ - - -/** - * @return true if inserted into the head of the list - */ -bool EventQueue::insertTask(scheduling_s *scheduling, efitick_t timeX, action_s action) { - ScopePerf perf(PE::EventQueueInsertTask); - -#if EFI_UNIT_TEST - assertListIsSorted(); -#endif /* EFI_UNIT_TEST */ - efiAssert(CUSTOM_ERR_ASSERT, action.getCallback() != NULL, "NULL callback", false); - -// please note that simulator does not use this code at all - simulator uses signal_executor_sleep - - if (scheduling->action) { -#if EFI_UNIT_TEST - if (verboseMode) { - printf("Already scheduled was %d\r\n", (int)scheduling->momentX); - printf("Already scheduled now %d\r\n", (int)timeX); - } -#endif /* EFI_UNIT_TEST */ - return false; - } - - scheduling->momentX = timeX; - scheduling->action = action; - - if (head == NULL || timeX < head->momentX) { - // here we insert into head of the linked list - LL_PREPEND2(head, scheduling, nextScheduling_s); -#if EFI_UNIT_TEST - assertListIsSorted(); -#endif /* EFI_UNIT_TEST */ - return true; - } else { - // here we know we are not in the head of the list, let's find the position - linear search - scheduling_s *insertPosition = head; - while (insertPosition->nextScheduling_s != NULL && insertPosition->nextScheduling_s->momentX < timeX) { - insertPosition = insertPosition->nextScheduling_s; - } - - scheduling->nextScheduling_s = insertPosition->nextScheduling_s; - insertPosition->nextScheduling_s = scheduling; -#if EFI_UNIT_TEST - assertListIsSorted(); -#endif /* EFI_UNIT_TEST */ - return false; - } -} - -void EventQueue::remove(scheduling_s* scheduling) { -#if EFI_UNIT_TEST - assertListIsSorted(); -#endif /* EFI_UNIT_TEST */ - - // Special case: event isn't scheduled, so don't cancel it - if (!scheduling->action) { - return; - } - - // Special case: empty list, nothing to do - if (!head) { - return; - } - - // Special case: is the item to remove at the head? - if (scheduling == head) { - head = head->nextScheduling_s; - scheduling->nextScheduling_s = nullptr; - scheduling->action = {}; - } else { - auto prev = head; // keep track of the element before the one to remove, so we can link around it - auto current = prev->nextScheduling_s; - - // Find our element - while (current && current != scheduling) { - prev = current; - current = current->nextScheduling_s; - } - - // Walked off the end, this is an error since this *should* have been scheduled - if (!current) { - criticalError("EventQueue::remove didn't find element"); - return; - } - - efiAssertVoid(ObdCode::OBD_PCM_Processor_Fault, current == scheduling, "current not equal to scheduling"); - - // Link around the removed item - prev->nextScheduling_s = current->nextScheduling_s; - - // Clean the item to remove - current->nextScheduling_s = nullptr; - current->action = {}; - } - -#if EFI_UNIT_TEST - assertListIsSorted(); -#endif /* EFI_UNIT_TEST */ -} - -/** - * On this layer it does not matter which units are used - us, ms ot nt. - * - * This method is always invoked under a lock - * @return Get the timestamp of the soonest pending action, skipping all the actions in the past - */ -expected EventQueue::getNextEventTime(efitick_t nowX) const { - if (head != NULL) { - if (head->momentX <= nowX) { - /** - * We are here if action timestamp is in the past. We should rarely be here since this 'getNextEventTime()' is - * always invoked by 'scheduleTimerCallback' which is always invoked right after 'executeAllPendingActions' - but still, - * for events which are really close to each other we would end up here. - * - * looks like we end up here after 'writeconfig' (which freezes the firmware) - we are late - * for the next scheduled event - */ - return nowX + lateDelay; - } else { - return head->momentX; - } - } - - return unexpected; -} - -/** - * See also maxPrecisionCallbackDuration for total hw callback time - */ -uint32_t maxEventCallbackDuration = 0; - -/** - * Invoke all pending actions prior to specified timestamp - * @return number of executed actions - */ -int EventQueue::executeAll(efitick_t now) { - ScopePerf perf(PE::EventQueueExecuteAll); - - int executionCounter = 0; - -#if EFI_UNIT_TEST - assertListIsSorted(); -#endif - - bool didExecute; - do { - didExecute = executeOne(now); - executionCounter += didExecute ? 1 : 0; - } while (didExecute); - - return executionCounter; -} - -bool EventQueue::executeOne(efitick_t now) { - // Read the head every time - a previously executed event could - // have inserted something new at the head - scheduling_s* current = head; - - // Queue is empty - bail - if (!current) { - return false; - } - - // If the next event is far in the future, we'll reschedule - // and execute it next time. - // We do this when the next event is close enough that the overhead of - // resetting the timer and scheduling an new interrupt is greater than just - // waiting for the time to arrive. On current CPUs, this is reasonable to set - // around 10 microseconds. - if (current->momentX > now + lateDelay) { - return false; - } - - // near future - spin wait for the event to happen and avoid the - // overhead of rescheduling the timer. - // yes, that's a busy wait but that's what we need here - while (current->momentX > getTimeNowNt()) { - UNIT_TEST_BUSY_WAIT_CALLBACK(); - } - - // step the head forward, unlink this element, clear scheduled flag - head = current->nextScheduling_s; - current->nextScheduling_s = nullptr; - - // Grab the action but clear it in the event so we can reschedule from the action's execution - auto action = current->action; - current->action = {}; - -#if EFI_UNIT_TEST - printf("QUEUE: execute current=%d param=%d\r\n", (uintptr_t)current, (uintptr_t)action.getArgument()); -#endif - - // Execute the current element - { - ScopePerf perf2(PE::EventQueueExecuteCallback); - action.execute(); - } - -#if EFI_UNIT_TEST - // (tests only) Ensure we didn't break anything - assertListIsSorted(); -#endif - - return true; -} - -int EventQueue::size(void) const { - scheduling_s *tmp; - int result; - LL_COUNT2(head, tmp, result, nextScheduling_s); - return result; -} - -void EventQueue::assertListIsSorted() const { - scheduling_s *current = head; - while (current != NULL && current->nextScheduling_s != NULL) { - efiAssertVoid(ObdCode::CUSTOM_ERR_6623, current->momentX <= current->nextScheduling_s->momentX, "list order"); - current = current->nextScheduling_s; - } -} - -scheduling_s * EventQueue::getHead() { - return head; -} - -// todo: reduce code duplication with another 'getElementAtIndexForUnitText' -scheduling_s *EventQueue::getElementAtIndexForUnitText(int index) { - scheduling_s * current; - - LL_FOREACH2(head, current, nextScheduling_s) - { - if (index == 0) - return current; - index--; - } - - return NULL; -} - -void EventQueue::clear(void) { - // Flush the queue, resetting all scheduling_s as though we'd executed them - while(head) { - auto x = head; - // link next element to head - head = x->nextScheduling_s; - - // Reset this element - x->momentX = 0; - x->nextScheduling_s = nullptr; - x->action = {}; - } - - head = nullptr; -} diff --git a/misc/stm32f1_test_project/timer/event_queue.h b/misc/stm32f1_test_project/timer/event_queue.h deleted file mode 100644 index edaa8a95dd..0000000000 --- a/misc/stm32f1_test_project/timer/event_queue.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * @file event_queue.h - * - * @date Apr 17, 2014 - * @author Andrey Belomutskiy, (c) 2012-2020 - */ - -#include "scheduler.h" -#include "utlist.h" -#include "expected.h" - -#pragma once - -#define QUEUE_LENGTH_LIMIT 1000 - -// templates do not accept field names so we use a macro here -#define assertNotInListMethodBody(T, head, element, field) \ - /* this code is just to validate state, no functional load*/ \ - T * current; \ - int counter = 0; \ - LL_FOREACH2(head, current, field) { \ - if (++counter > QUEUE_LENGTH_LIMIT) { \ - firmwareError(ObdCode::CUSTOM_ERR_LOOPED_QUEUE, "Looped queue?"); \ - return false; \ - } \ - if (current == element) { \ - /** \ - * for example, this might happen in case of sudden RPM change if event \ - * was not scheduled by angle but was scheduled by time. In case of scheduling \ - * by time with slow RPM the whole next fast revolution might be within the wait period \ - */ \ - warning(ObdCode::CUSTOM_RE_ADDING_INTO_EXECUTION_QUEUE, "re-adding element into event_queue"); \ - return true; \ - } \ - } \ - return false; - - -/** - * Execution sorted linked list - */ -class EventQueue { -public: - // See comment in EventQueue::executeAll for info about lateDelay - it sets the - // time gap between events for which we will wait instead of rescheduling the next - // event in a group of events near one another. - EventQueue(efitick_t lateDelay = 0) : lateDelay(lateDelay) {} - - /** - * O(size) - linear search in sorted linked list - */ - bool insertTask(scheduling_s *scheduling, efitick_t timeX, action_s action); - void remove(scheduling_s* scheduling); - - int executeAll(efitick_t now); - bool executeOne(v now); - - expected getNextEventTime(efitick_t nowX) const; - void clear(void); - int size(void) const; - scheduling_s *getElementAtIndexForUnitText(int index); - scheduling_s * getHead(); - void assertListIsSorted() const; -private: - /** - * this list is sorted - */ - scheduling_s *head = nullptr; - const efitick_t lateDelay; -}; - diff --git a/misc/stm32f1_test_project/timer/microsecond_timer.cpp b/misc/stm32f1_test_project/timer/microsecond_timer.cpp deleted file mode 100644 index b28494311a..0000000000 --- a/misc/stm32f1_test_project/timer/microsecond_timer.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/** - * @file microsecond_timer.cpp - * - * Here we have a 1MHz timer dedicated to event scheduling. We are using one of the 32-bit timers here, - * so this timer can schedule events up to 4B/100M ~ 4000 seconds ~ 1 hour from current time. - * - * GPT5 timer clock: 84000000Hz - * If only it was a better multiplier of 2 (84000000 = 328125 * 256) - * - * @date Apr 14, 2014 - * @author Andrey Belomutskiy, (c) 2012-2020 - */ - -#include "pch.h" -#include "microsecond_timer.h" -#include "port_microsecond_timer.h" - -#if EFI_PROD_CODE - -#include "periodic_task.h" - -// Just in case we have a mechanism to validate that hardware timer is clocked right and all the -// conversions between wall clock and hardware frequencies are done right -// delay in milliseconds -#define TEST_CALLBACK_DELAY 10 -// if hardware timer is 20% off we throw a critical error and call it a day -// maybe this threshold should be 5%? 10%? -#define TIMER_PRECISION_THRESHOLD 0.2 - -/** - * Maximum duration of complete timer callback, all pending events together - * See also 'maxEventCallbackDuration' for maximum duration of one event - */ -uint32_t maxPrecisionCallbackDuration = 0; - -static efitick_t lastSetTimerTimeNt; -static bool isTimerPending = false; - -static int timerCallbackCounter = 0; -static int timerRestartCounter = 0; - -static const char * msg; - -static int timerFreezeCounter = 0; -static int setHwTimerCounter = 0; -static bool hwStarted = false; - -/** - * sets the alarm to the specified number of microseconds from now. - * This function should be invoked under kernel lock which would disable interrupts. - */ -void setHardwareSchedulerTimer(efitick_t nowNt, efitick_t setTimeNt) { - efiAssertVoid(ObdCode::OBD_PCM_Processor_Fault, hwStarted, "HW.started"); - - // How many ticks in the future is this event? - auto timeDeltaNt = setTimeNt - nowNt; - - setHwTimerCounter++; - - /** - * #259 BUG error: not positive deltaTimeNt - * Once in a while we night get an interrupt where we do not expect it - */ - if (timeDeltaNt <= 0) { - timerFreezeCounter++; - warning(ObdCode::CUSTOM_OBD_LOCAL_FREEZE, "local freeze cnt=%d", timerFreezeCounter); - } - - // We need the timer to fire after we return - 1 doesn't work as it may actually schedule in the past - if (timeDeltaNt < US2NT(2)) { - timeDeltaNt = US2NT(2); - } - - if (timeDeltaNt >= TOO_FAR_INTO_FUTURE_NT) { - // we are trying to set callback for too far into the future. This does not look right at all - firmwareError(ObdCode::CUSTOM_ERR_TIMER_OVERFLOW, "setHardwareSchedulerTimer() too far: %d", timeDeltaNt); - return; - } - - // Skip scheduling if there's a firmware error active - if (hasFirmwareError()) { - return; - } - - // Do the actual hardware-specific timer set operation - portSetHardwareSchedulerTimer(nowNt, setTimeNt); - - lastSetTimerTimeNt = getTimeNowNt(); - isTimerPending = true; - timerRestartCounter++; -} - -void globalTimerCallback(); - -void portMicrosecondTimerCallback() { - timerCallbackCounter++; - isTimerPending = false; - - uint32_t before = getTimeNowLowerNt(); - globalTimerCallback(); - uint32_t precisionCallbackDuration = getTimeNowLowerNt() - before; - if (precisionCallbackDuration > maxPrecisionCallbackDuration) { - maxPrecisionCallbackDuration = precisionCallbackDuration; - } -} - -class MicrosecondTimerWatchdogController : public PeriodicTimerController { - void PeriodicTask() override { - efitick_t nowNt = getTimeNowNt(); - if (nowNt >= lastSetTimerTimeNt + 2 * CORE_CLOCK) { - firmwareError(ObdCode::CUSTOM_ERR_SCHEDULING_ERROR, "watchdog: no events since %d", lastSetTimerTimeNt); - return; - } - - msg = isTimerPending ? "No_cb too long" : "Timer not awhile"; - // 2 seconds of inactivity would not look right - efiAssertVoid(ObdCode::CUSTOM_TIMER_WATCHDOG, nowNt < lastSetTimerTimeNt + 2 * CORE_CLOCK, msg); - } - - int getPeriodMs() override { - return 500; - } -}; - -static MicrosecondTimerWatchdogController watchdogControllerInstance; - -static scheduling_s watchDogBuddy; - -static void watchDogBuddyCallback(void*) { - /** - * the purpose of this periodic activity is to make watchdogControllerInstance - * watchdog happy by ensuring that we have scheduler activity even in case of very broken configuration - * without any PWM or input pins - */ - engine->executor.scheduleForLater(&watchDogBuddy, MS2US(1000), watchDogBuddyCallback); -} - -static volatile bool testSchedulingHappened = false; -static efitimems_t testSchedulingStart; - -static void timerValidationCallback(void*) { - testSchedulingHappened = true; - efitimems_t actualTimeSinceScheduling = (currentTimeMillis() - testSchedulingStart); - - if (absI(actualTimeSinceScheduling - TEST_CALLBACK_DELAY) > TEST_CALLBACK_DELAY * TIMER_PRECISION_THRESHOLD) { - firmwareError(ObdCode::CUSTOM_ERR_TIMER_TEST_CALLBACK_WRONG_TIME, "hwTimer broken precision: %ld ms", actualTimeSinceScheduling); - } -} - -/** - * This method would validate that hardware timer callbacks happen with some reasonable precision - * helps to make sure our GPT hardware settings are somewhat right - */ -static void validateHardwareTimer() { - if (hasFirmwareError()) { - return; - } - testSchedulingStart = currentTimeMillis(); - - // to save RAM let's use 'watchDogBuddy' here once before we enable watchdog - engine->executor.scheduleForLater(&watchDogBuddy, MS2US(TEST_CALLBACK_DELAY), timerValidationCallback); - - chThdSleepMilliseconds(TEST_CALLBACK_DELAY + 2); - if (!testSchedulingHappened) { - firmwareError(ObdCode::CUSTOM_ERR_TIMER_TEST_CALLBACK_NOT_HAPPENED, "hwTimer not alive"); - } -} - -void initMicrosecondTimer() { - portInitMicrosecondTimer(); - - hwStarted = true; - - lastSetTimerTimeNt = getTimeNowNt(); - - validateHardwareTimer(); - - watchDogBuddyCallback(NULL); -#if EFI_EMULATE_POSITION_SENSORS - watchdogControllerInstance.start(); -#endif /* EFI_EMULATE_POSITION_SENSORS */ -} - -#endif /* EFI_PROD_CODE */ diff --git a/misc/stm32f1_test_project/timer/microsecond_timer.h b/misc/stm32f1_test_project/timer/microsecond_timer.h deleted file mode 100644 index a763f0e1b6..0000000000 --- a/misc/stm32f1_test_project/timer/microsecond_timer.h +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @file microsecond_timer.h - * - * @date Apr 14, 2014 - * @author Andrey Belomutskiy, (c) 2012-2020 - */ - -#pragma once - -void initMicrosecondTimer(); -void setHardwareSchedulerTimer(efitick_t nowNt, efitick_t setTimeNt); - -#define TOO_FAR_INTO_FUTURE_US (10 * US_PER_SECOND) -#define TOO_FAR_INTO_FUTURE_NT US2NT(TOO_FAR_INTO_FUTURE_US) diff --git a/misc/stm32f1_test_project/timer/microsecond_timer_gpt.cpp b/misc/stm32f1_test_project/timer/microsecond_timer_gpt.cpp deleted file mode 100644 index 8ae73ee179..0000000000 --- a/misc/stm32f1_test_project/timer/microsecond_timer_gpt.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "pch.h" -#include "port_microsecond_timer.h" - -#if EFI_PROD_CODE && HAL_USE_GPT - -void portSetHardwareSchedulerTimer(efitick_t nowNt, efitick_t setTimeNt) { - int32_t deltaTimeUs = NT2US((int32_t)setTimeNt - (int32_t)nowNt); - - // If already set, reset the timer - if (GPTDEVICE.state == GPT_ONESHOT) { - gptStopTimerI(&GPTDEVICE); - } - - if (GPTDEVICE.state != GPT_READY) { - firmwareError(ObdCode::CUSTOM_HW_TIMER, "HW timer state %d", GPTDEVICE.state); - return; - } - - // Start the timer - gptStartOneShotI(&GPTDEVICE, deltaTimeUs); -} - -static void hwTimerCallback(GPTDriver*) { - portMicrosecondTimerCallback(); -} - -/* - * The specific 1MHz frequency is important here since 'setHardwareUsTimer' method takes microsecond parameter - * For any arbitrary frequency to work we would need an additional layer of conversion. - */ -static constexpr GPTConfig gpt5cfg = { 1000000, /* 1 MHz timer clock.*/ - hwTimerCallback, /* Timer callback.*/ -0, 0 }; - -void portInitMicrosecondTimer() { - gptStart(&GPTDEVICE, &gpt5cfg); - efiAssertVoid(ObdCode::CUSTOM_ERR_TIMER_STATE, GPTDEVICE.state == GPT_READY, "hw state"); -} - -#endif // EFI_PROD_CODE - -// This implementation just uses the generic port counter - this usually returns a count of CPU cycles since start -uint32_t getTimeNowLowerNt() { - return port_rt_get_counter_value(); -} diff --git a/misc/stm32f1_test_project/timer/port_microsecond_timer.h b/misc/stm32f1_test_project/timer/port_microsecond_timer.h deleted file mode 100644 index b688200ceb..0000000000 --- a/misc/stm32f1_test_project/timer/port_microsecond_timer.h +++ /dev/null @@ -1,13 +0,0 @@ -/** - * This file defines the API for the microsecond timer that a port needs to implement - * - * Do not call these functions directly, they should only be called by microsecond_timer.cpp - */ - -#pragma once - -void portInitMicrosecondTimer(); -void portSetHardwareSchedulerTimer(efitick_t nowNt, efitick_t setTimeNt); - -// The port should call this callback when the timer expires -void portMicrosecondTimerCallback(); diff --git a/misc/stm32f1_test_project/timer/pwm_generator_logic.cpp b/misc/stm32f1_test_project/timer/pwm_generator_logic.cpp deleted file mode 100644 index 6433a0d5e3..0000000000 --- a/misc/stm32f1_test_project/timer/pwm_generator_logic.cpp +++ /dev/null @@ -1,382 +0,0 @@ -/** - * @file pwm_generator_logic.cpp - * - * This PWM implementation keep track of when it would be the next time to toggle the signal. - * It constantly sets timer to that next toggle time, then sets the timer again from the callback, and so on. - * - * @date Mar 2, 2014 - * @author Andrey Belomutskiy, (c) 2012-2020 - */ - -#include "pch.h" -#include "os_access.h" - -#if EFI_PROD_CODE -#include "mpu_util.h" -#endif // EFI_PROD_CODE - -// 1% duty cycle -#define ZERO_PWM_THRESHOLD 0.01 - -SimplePwm::SimplePwm() -{ - seq.waveCount = 1; - seq.phaseCount = 2; -} - -SimplePwm::SimplePwm(const char *name) : SimplePwm() { - this->name = name; -} - -PwmConfig::PwmConfig() { - memset((void*)&scheduling, 0, sizeof(scheduling)); - memset((void*)&safe, 0, sizeof(safe)); - dbgNestingLevel = 0; - periodNt = NAN; - mode = PM_NORMAL; - memset(&outputPins, 0, sizeof(outputPins)); - pwmCycleCallback = nullptr; - stateChangeCallback = nullptr; - executor = nullptr; - name = "[noname]"; - arg = this; -} - -/** - * This method allows you to change duty cycle on the fly - * @param dutyCycle value between 0 and 1 - * See also setFrequency - */ -void SimplePwm::setSimplePwmDutyCycle(float dutyCycle) { - if (isStopRequested) { - // we are here in order to not change pin once PWM stop was requested - return; - } - if (cisnan(dutyCycle)) { - warning(ObdCode::CUSTOM_DUTY_INVALID, "%s spwd:dutyCycle %.2f", name, dutyCycle); - return; - } else if (dutyCycle < 0) { - warning(ObdCode::CUSTOM_DUTY_TOO_LOW, "%s dutyCycle too low %.2f", name, dutyCycle); - dutyCycle = 0; - } else if (dutyCycle > 1) { - warning(ObdCode::CUSTOM_PWM_DUTY_TOO_HIGH, "%s duty too high %.2f", name, dutyCycle); - dutyCycle = 1; - } - -#if EFI_PROD_CODE - if (hardPwm) { - hardPwm->setDuty(dutyCycle); - return; - } -#endif - - // Handle zero and full duty cycle. This will cause the PWM output to behave like a plain digital output. - if (dutyCycle == 0.0f && stateChangeCallback) { - // Manually fire falling edge - stateChangeCallback(0, arg); - } else if (dutyCycle == 1.0f && stateChangeCallback) { - // Manually fire rising edge - stateChangeCallback(1, arg); - } - - if (dutyCycle < ZERO_PWM_THRESHOLD) { - mode = PM_ZERO; - } else if (dutyCycle > FULL_PWM_THRESHOLD) { - mode = PM_FULL; - } else { - mode = PM_NORMAL; - seq.setSwitchTime(0, dutyCycle); - } -} - -/** - * returns absolute timestamp of state change - */ -static efitick_t getNextSwitchTimeNt(PwmConfig *state) { - efiAssert(CUSTOM_ERR_ASSERT, state->safe.phaseIndex < PWM_PHASE_MAX_COUNT, "phaseIndex range", 0); - int iteration = state->safe.iteration; - // we handle PM_ZERO and PM_FULL separately - float switchTime = state->mode == PM_NORMAL ? state->multiChannelStateSequence->getSwitchTime(state->safe.phaseIndex) : 1; - float periodNt = state->safe.periodNt; -#if DEBUG_PWM - efiPrintf("iteration=%d switchTime=%.2f period=%.2f", iteration, switchTime, period); -#endif /* DEBUG_PWM */ - - /** - * Once 'iteration' gets relatively high, we might lose calculation precision here. - * This is addressed by iterationLimit below, using any many cycles as possible without overflowing timeToSwitchNt - */ - uint32_t timeToSwitchNt = (uint32_t)((iteration + switchTime) * periodNt); - -#if DEBUG_PWM - efiPrintf("start=%d timeToSwitch=%d", state->safe.start, timeToSwitch); -#endif /* DEBUG_PWM */ - return state->safe.startNt + timeToSwitchNt; -} - -void PwmConfig::setFrequency(float frequency) { - if (cisnan(frequency)) { - // explicit code just to be sure - periodNt = NAN; - return; - } - /** - * see #handleCycleStart() - * 'periodNt' is below 10 seconds here so we use 32 bit type for performance reasons - */ - periodNt = USF2NT(frequency2periodUs(frequency)); -} - -void PwmConfig::stop() { - isStopRequested = true; -} - -void PwmConfig::handleCycleStart() { - if (safe.phaseIndex != 0) { - // https://github.com/rusefi/rusefi/issues/1030 - firmwareError(ObdCode::CUSTOM_PWM_CYCLE_START, "handleCycleStart %d", safe.phaseIndex); - return; - } - - if (pwmCycleCallback != NULL) { - pwmCycleCallback(this); - } - // Compute the maximum number of iterations without overflowing a uint32_t worth of timestamp - uint32_t iterationLimit = (0xFFFFFFFF / periodNt) - 2; - - efiAssertVoid(ObdCode::CUSTOM_ERR_6580, periodNt != 0, "period not initialized"); - efiAssertVoid(ObdCode::CUSTOM_ERR_6580, iterationLimit > 0, "iterationLimit invalid"); - if (forceCycleStart || safe.periodNt != periodNt || safe.iteration == iterationLimit) { - /** - * period length has changed - we need to reset internal state - */ - safe.startNt = getTimeNowNt(); - safe.iteration = 0; - safe.periodNt = periodNt; - - forceCycleStart = false; -#if DEBUG_PWM - efiPrintf("state reset start=%d iteration=%d", state->safe.start, state->safe.iteration); -#endif - } -} - -/** - * @return Next time for signal toggle - */ -efitick_t PwmConfig::togglePwmState() { - if (isStopRequested) { - return 0; - } - -#if DEBUG_PWM - efiPrintf("togglePwmState phaseIndex=%d iteration=%d", safe.phaseIndex, safe.iteration); - efiPrintf("period=%.2f safe.period=%.2f", period, safe.periodNt); -#endif - - if (cisnan(periodNt)) { - /** - * NaN period means PWM is paused, we also set the pin low - */ - stateChangeCallback(0, arg); - return getTimeNowNt() + MS2NT(NAN_FREQUENCY_SLEEP_PERIOD_MS); - } - if (mode != PM_NORMAL) { - // in case of ZERO or FULL we are always at starting index - safe.phaseIndex = 0; - } - - if (safe.phaseIndex == 0) { - handleCycleStart(); - } - - /** - * Here is where the 'business logic' - the actual pin state change is happening - */ - int cbStateIndex; - if (mode == PM_NORMAL) { - // callback state index is offset by one. todo: why? can we simplify this? - cbStateIndex = safe.phaseIndex == 0 ? multiChannelStateSequence->phaseCount - 1 : safe.phaseIndex - 1; - } else if (mode == PM_ZERO) { - cbStateIndex = 0; - } else { - cbStateIndex = 1; - } - - { - ScopePerf perf(PE::PwmConfigStateChangeCallback); - stateChangeCallback(cbStateIndex, arg); - } - - efitick_t nextSwitchTimeNt = getNextSwitchTimeNt(this); -#if DEBUG_PWM - efiPrintf("%s: nextSwitchTime %d", state->name, nextSwitchTime); -#endif /* DEBUG_PWM */ - - // If we're very far behind schedule, restart the cycle fresh to avoid scheduling a huge pile of events all at once - // This can happen during config write or debugging where CPU is halted for multiple seconds - bool isVeryBehindSchedule = nextSwitchTimeNt < getTimeNowNt() - MS2NT(10); - - safe.phaseIndex++; - if (isVeryBehindSchedule || safe.phaseIndex == multiChannelStateSequence->phaseCount || mode != PM_NORMAL) { - safe.phaseIndex = 0; // restart - safe.iteration++; - - if (isVeryBehindSchedule) { - forceCycleStart = true; - } - } -#if EFI_UNIT_TEST - printf("PWM: nextSwitchTimeNt=%d phaseIndex=%d iteration=%d\r\n", nextSwitchTimeNt, - safe.phaseIndex, - safe.iteration); -#endif /* EFI_UNIT_TEST */ - return nextSwitchTimeNt; -} - -/** - * Main PWM loop: toggle pin & schedule next invocation - * - * First invocation happens on application thread - */ -static void timerCallback(PwmConfig *state) { - ScopePerf perf(PE::PwmGeneratorCallback); - - state->dbgNestingLevel++; - efiAssertVoid(ObdCode::CUSTOM_ERR_6581, state->dbgNestingLevel < 25, "PWM nesting issue"); - - efitick_t switchTimeNt = state->togglePwmState(); - if (switchTimeNt == 0) { - // we are here when PWM gets stopped - return; - } - if (state->executor == nullptr) { - firmwareError(ObdCode::CUSTOM_NULL_EXECUTOR, "exec on %s", state->name); - return; - } - - state->executor->scheduleByTimestampNt(state->name, &state->scheduling, switchTimeNt, { timerCallback, state }); - state->dbgNestingLevel--; -} - -/** - * Incoming parameters are potentially just values on current stack, so we have to copy - * into our own permanent storage, right? - */ -void copyPwmParameters(PwmConfig *state, MultiChannelStateSequence const * seq) { - state->multiChannelStateSequence = seq; - if (state->mode == PM_NORMAL) { - state->multiChannelStateSequence->checkSwitchTimes(1); - } -} - -/** - * this method also starts the timer cycle - * See also startSimplePwm - */ -void PwmConfig::weComplexInit(const char *msg, ExecutorInterface *executor, - MultiChannelStateSequence const * seq, - pwm_cycle_callback *pwmCycleCallback, pwm_gen_callback *stateChangeCallback) { - UNUSED(msg); - this->executor = executor; - isStopRequested = false; - - efiAssertVoid(ObdCode::CUSTOM_ERR_6582, periodNt != 0, "period is not initialized"); - if (seq->phaseCount == 0) { - firmwareError(ObdCode::CUSTOM_ERR_PWM_1, "signal length cannot be zero"); - return; - } - if (seq->phaseCount > PWM_PHASE_MAX_COUNT) { - firmwareError(ObdCode::CUSTOM_ERR_PWM_2, "too many phases in PWM"); - return; - } - efiAssertVoid(ObdCode::CUSTOM_ERR_6583, seq->waveCount > 0, "waveCount should be positive"); - - this->pwmCycleCallback = pwmCycleCallback; - this->stateChangeCallback = stateChangeCallback; - - copyPwmParameters(this, seq); - - safe.phaseIndex = 0; - safe.periodNt = -1; - safe.iteration = -1; - - // let's start the indefinite callback loop of PWM generation - timerCallback(this); -} - -void startSimplePwm(SimplePwm *state, const char *msg, ExecutorInterface *executor, - OutputPin *output, float frequency, float dutyCycle) { - efiAssertVoid(ObdCode::CUSTOM_ERR_PWM_STATE_ASSERT, state != NULL, "state"); - efiAssertVoid(ObdCode::CUSTOM_ERR_PWM_DUTY_ASSERT, dutyCycle >= 0 && dutyCycle <= 1, "dutyCycle"); - if (frequency < 1) { - warning(ObdCode::CUSTOM_OBD_LOW_FREQUENCY, "low frequency %.2f %s", frequency, msg); - return; - } - - state->seq.setSwitchTime(0, dutyCycle); - state->seq.setSwitchTime(1, 1); - state->seq.setChannelState(0, 0, TriggerValue::FALL); - state->seq.setChannelState(0, 1, TriggerValue::RISE); - - state->outputPins[0] = output; - - state->setFrequency(frequency); - state->setSimplePwmDutyCycle(dutyCycle); - state->weComplexInit(msg, executor, &state->seq, NULL, (pwm_gen_callback*)applyPinState); -} - -void startSimplePwmExt(SimplePwm *state, const char *msg, - ExecutorInterface *executor, - brain_pin_e brainPin, OutputPin *output, float frequency, - float dutyCycle) { - - output->initPin(msg, brainPin); - - startSimplePwm(state, msg, executor, output, frequency, dutyCycle); -} - -/** - * @param dutyCycle value between 0 and 1 - */ -void startSimplePwmHard(SimplePwm *state, const char *msg, - ExecutorInterface *executor, - brain_pin_e brainPin, OutputPin *output, float frequency, - float dutyCycle) { -#if EFI_PROD_CODE && HAL_USE_PWM - auto hardPwm = hardware_pwm::tryInitPin(msg, brainPin, frequency, dutyCycle); - - if (hardPwm) { - state->hardPwm = hardPwm; - } else { -#endif - startSimplePwmExt(state, msg, executor, brainPin, output, frequency, dutyCycle); -#if EFI_PROD_CODE && HAL_USE_PWM - } -#endif -} - -/** - * This method controls the actual hardware pins - * - * This method takes ~350 ticks. - */ -void applyPinState(int stateIndex, PwmConfig *state) /* pwm_gen_callback */ { -#if EFI_PROD_CODE - if (!engine->isPwmEnabled) { - for (int channelIndex = 0; channelIndex < state->multiChannelStateSequence->waveCount; channelIndex++) { - OutputPin *output = state->outputPins[channelIndex]; - output->setValue(0); - } - return; - } -#endif // EFI_PROD_CODE - - efiAssertVoid(ObdCode::CUSTOM_ERR_6663, stateIndex < PWM_PHASE_MAX_COUNT, "invalid stateIndex"); - efiAssertVoid(ObdCode::CUSTOM_ERR_6664, state->multiChannelStateSequence->waveCount <= PWM_PHASE_MAX_WAVE_PER_PWM, "invalid waveCount"); - for (int channelIndex = 0; channelIndex < state->multiChannelStateSequence->waveCount; channelIndex++) { - OutputPin *output = state->outputPins[channelIndex]; - int value = state->multiChannelStateSequence->getChannelState(channelIndex, stateIndex); - output->setValue(value); - } -} diff --git a/misc/stm32f1_test_project/timer/pwm_generator_logic.h b/misc/stm32f1_test_project/timer/pwm_generator_logic.h deleted file mode 100644 index cc8cbb8ed0..0000000000 --- a/misc/stm32f1_test_project/timer/pwm_generator_logic.h +++ /dev/null @@ -1,160 +0,0 @@ -/** - * @file pwm_generator_logic.h - * - * @date Mar 2, 2014 - * @author Andrey Belomutskiy, (c) 2012-2020 - */ - -#pragma once - -#include "state_sequence.h" -#include "global.h" -#include "scheduler.h" -#include "efi_gpio.h" - -#define PERCENT_TO_DUTY(x) (x) * 0.01 - -#define NAN_FREQUENCY_SLEEP_PERIOD_MS 100 - -// 99% duty cycle -#define FULL_PWM_THRESHOLD 0.99 - -typedef struct { - /** - * a copy so that all phases are executed on the same period, even if another thread - * would be adjusting PWM parameters - */ - float periodNt; - /** - * Iteration counter - */ - int iteration; - /** - * Start time of current iteration - */ - efitick_t startNt; - int phaseIndex; -} pwm_config_safe_state_s; - -class PwmConfig; - -typedef void (pwm_cycle_callback)(PwmConfig *state); -typedef void (pwm_gen_callback)(int stateIndex, void *arg); - -typedef enum { - PM_ZERO, - PM_NORMAL, - PM_FULL -} pwm_mode_e; - -/** - * @brief Multi-channel software PWM output configuration - */ -class PwmConfig { -public: - PwmConfig(); - void *arg = nullptr; - - void weComplexInit(const char *msg, - ExecutorInterface *executor, - MultiChannelStateSequence const * seq, - pwm_cycle_callback *pwmCycleCallback, - pwm_gen_callback *callback); - - ExecutorInterface *executor; - - /** - * We need to handle zero duty cycle and 100% duty cycle in a special way - */ - pwm_mode_e mode; - bool isStopRequested = false; - - /** - * @param use NAN frequency to pause PWM - */ - void setFrequency(float frequency); - - void handleCycleStart(); - const char *name; - - // todo: 'outputPins' should be extracted away from here since technically one can want PWM scheduler without actual pin output - OutputPin *outputPins[PWM_PHASE_MAX_WAVE_PER_PWM]; - MultiChannelStateSequence const * multiChannelStateSequence = nullptr; - efitick_t togglePwmState(); - void stop(); - - int dbgNestingLevel; - - scheduling_s scheduling; - - pwm_config_safe_state_s safe; - - /** - * this callback is invoked before each wave generation cycle - */ - pwm_cycle_callback *pwmCycleCallback; - - /** - * this main callback is invoked when it's time to switch level on any of the output channels - */ - pwm_gen_callback *stateChangeCallback = nullptr; -private: - /** - * float value of PWM period - * PWM generation is not happening while this value is NAN - */ - float periodNt; - - // Set if we are very far behind schedule and need to reset back to the beginning of a cycle to find our way - bool forceCycleStart = true; -}; - -struct hardware_pwm; - -struct IPwm { - virtual void setSimplePwmDutyCycle(float dutyCycle) = 0; -}; - -class SimplePwm : public PwmConfig, public IPwm { -public: - SimplePwm(); - explicit SimplePwm(const char *name); - void setSimplePwmDutyCycle(float dutyCycle) override; - MultiChannelStateSequenceWithData<2> seq; - hardware_pwm* hardPwm = nullptr; -}; - -/** - * default implementation of pwm_gen_callback which simply toggles the pins - * - */ -void applyPinState(int stateIndex, PwmConfig* state) /* pwm_gen_callback */; - -/** - * Start a one-channel software PWM driver. - * - * This method should be called after scheduling layer is started by initSignalExecutor() - */ -void startSimplePwm(SimplePwm *state, const char *msg, - ExecutorInterface *executor, - OutputPin *output, - float frequency, float dutyCycle); - -/** - * initialize GPIO pin and start a one-channel software PWM driver. - * - * This method should be called after scheduling layer is started by initSignalExecutor() - */ -void startSimplePwmExt(SimplePwm *state, - const char *msg, - ExecutorInterface *executor, - brain_pin_e brainPin, OutputPin *output, - float frequency, float dutyCycle); - -void startSimplePwmHard(SimplePwm *state, const char *msg, - ExecutorInterface *executor, - brain_pin_e brainPin, OutputPin *output, float frequency, - float dutyCycle); - -void copyPwmParameters(PwmConfig *state, MultiChannelStateSequence const * seq); - diff --git a/misc/stm32f1_test_project/timer/scheduler.cpp b/misc/stm32f1_test_project/timer/scheduler.cpp deleted file mode 100644 index 981a7ba9dc..0000000000 --- a/misc/stm32f1_test_project/timer/scheduler.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @file scheduler.h - * - * @date October 1, 2020 - */ -#include "pch.h" - -#include "scheduler.h" - -void action_s::execute() { - efiAssertVoid(ObdCode::CUSTOM_ERR_ASSERT, callback != NULL, "callback==null1"); - callback(param); -} - -schfunc_t action_s::getCallback() const { - return callback; -} - -void * action_s::getArgument() const { - return param; -} diff --git a/misc/stm32f1_test_project/timer/scheduler.h b/misc/stm32f1_test_project/timer/scheduler.h deleted file mode 100644 index 1fb73713f4..0000000000 --- a/misc/stm32f1_test_project/timer/scheduler.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @file scheduler.h - * - * @date May 18, 2014 - * @author Andrey Belomutskiy, (c) 2012-2020 - */ -#pragma once - -typedef void (*schfunc_t)(void *); - -class action_s { -public: - // Default constructor constructs null action (ie, implicit bool conversion returns false) - action_s() = default; - - // Allow implicit conversion from schfunc_t to action_s - action_s(schfunc_t callback) : action_s(callback, nullptr) { } - action_s(schfunc_t callback, void *param) : callback(callback), param(param) { } - - // Allow any function that takes a single pointer parameter, so long as param is also of the same pointer type. - // This constructor means you shouldn't ever have to cast to schfunc_t on your own. - template - action_s(void (*callback)(TArg*), TArg* param) : callback((schfunc_t)callback), param(param) { } - - void execute(); - schfunc_t getCallback() const; - void * getArgument() const; - - operator bool() const { - return callback != nullptr; - } - -private: - schfunc_t callback = nullptr; - void *param = nullptr; -}; - -/** - * This structure holds information about an event scheduled in the future: when to execute what callback with what parameters - */ -#pragma pack(push, 4) -struct scheduling_s { -#if EFI_SIGNAL_EXECUTOR_SLEEP - virtual_timer_t timer; -#endif /* EFI_SIGNAL_EXECUTOR_SLEEP */ - - /** - * timestamp represented as 64-bit value of ticks since MCU start - */ - volatile efitick_t momentX = 0; - - /** - * Scheduler implementation uses a sorted linked list of these scheduling records. - */ - scheduling_s *nextScheduling_s = nullptr; - - action_s action; -}; -#pragma pack(pop) - -struct ExecutorInterface { - /** - * see also scheduleByAngle - */ - virtual void scheduleByTimestamp(const char *msg, scheduling_s *scheduling, efitimeus_t timeUs, action_s action) = 0; - virtual void scheduleByTimestampNt(const char *msg, scheduling_s *scheduling, efitick_t timeNt, action_s action) = 0; - virtual void scheduleForLater(scheduling_s *scheduling, int delayUs, action_s action) = 0; - virtual void cancel(scheduling_s* scheduling) = 0; -}; diff --git a/misc/stm32f1_test_project/timer/single_timer_executor.cpp b/misc/stm32f1_test_project/timer/single_timer_executor.cpp deleted file mode 100644 index 0956ba76c5..0000000000 --- a/misc/stm32f1_test_project/timer/single_timer_executor.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/** - * @file SingleTimerExecutor.cpp - * - * This class combines the powers of a 1MHz hardware timer from microsecond_timer.cpp - * and pending events queue event_queue.cpp - * - * As of version 2.6.x, ChibiOS tick-based kernel is not capable of scheduling events - * with the level of precision we need, and realistically it should not. - * - * Update: actually newer ChibiOS has tickless mode and what we have here is pretty much the same thing :) - * open question if rusEfi should simply migrate to ChibiOS tickless scheduling (which would increase coupling with ChibiOS) - * - * See https://rusefi.com/forum/viewtopic.php?f=5&t=373&start=360#p30895 - * for some performance data: with 'debug' firmware we spend about 5% of CPU in TIM5 handler which seem to be executed - * about 1500 times a second - * - * http://sourceforge.net/p/rusefi/tickets/24/ - * - * @date: Apr 18, 2014 - * @author Andrey Belomutskiy, (c) 2012-2020 - */ - -#include "pch.h" - -#include "os_access.h" -#include "single_timer_executor.h" -#include "efitime.h" - -#if EFI_SIGNAL_EXECUTOR_ONE_TIMER - -#include "microsecond_timer.h" -#include "os_util.h" - -uint32_t hwSetTimerDuration; - -void globalTimerCallback() { - efiAssertVoid(ObdCode::CUSTOM_ERR_6624, hasLotsOfRemainingStack(), "lowstck#2y"); - - ___engine.executor.onTimerCallback(); -} - -SingleTimerExecutor::SingleTimerExecutor() - // 8us is roughly the cost of the interrupt + overhead of a single timer event - : queue(US2NT(8)) -{ -} - -void SingleTimerExecutor::scheduleForLater(scheduling_s *scheduling, int delayUs, action_s action) { - scheduleByTimestamp("scheduleForLater", scheduling, getTimeNowUs() + delayUs, action); -} - -/** - * @brief Schedule an event at specific delay after now - * - * Invokes event callback after the specified amount of time. - * callback would be executed either on ISR thread or current thread if we would need to execute right away - * - * @param [in, out] scheduling Data structure to keep this event in the collection. - * @param [in] delayUs the number of microseconds before the output signal immediate output if delay is zero. - * @param [in] dwell the number of ticks of output duration. - */ -void SingleTimerExecutor::scheduleByTimestamp(const char *msg, scheduling_s *scheduling, efitimeus_t timeUs, action_s action) { - scheduleByTimestampNt(msg, scheduling, US2NT(timeUs), action); -} - -void SingleTimerExecutor::scheduleByTimestampNt(const char *msg, scheduling_s* scheduling, efitick_t nt, action_s action) { - ScopePerf perf(PE::SingleTimerExecutorScheduleByTimestamp); - -#if EFI_ENABLE_ASSERTS - int32_t deltaTimeNt = (int32_t)nt - getTimeNowLowerNt(); - - if (deltaTimeNt >= TOO_FAR_INTO_FUTURE_NT) { - // we are trying to set callback for too far into the future. This does not look right at all - firmwareError(ObdCode::CUSTOM_ERR_TASK_TIMER_OVERFLOW, "scheduleByTimestampNt() too far: %d %s", deltaTimeNt, msg); - return; - } -#endif - - scheduleCounter++; - - // Lock for queue insertion - we may already be locked, but that's ok - chibios_rt::CriticalSectionLocker csl; - - bool needToResetTimer = queue.insertTask(scheduling, nt, action); - if (!reentrantFlag) { - executeAllPendingActions(); - if (needToResetTimer) { - scheduleTimerCallback(); - } - } -} - -void SingleTimerExecutor::cancel(scheduling_s* scheduling) { - // Lock for queue removal - we may already be locked, but that's ok - chibios_rt::CriticalSectionLocker csl; - - queue.remove(scheduling); -} - -void SingleTimerExecutor::onTimerCallback() { - timerCallbackCounter++; - - chibios_rt::CriticalSectionLocker csl; - - executeAllPendingActions(); - scheduleTimerCallback(); -} - -/* - * this private method is executed under lock - */ -void SingleTimerExecutor::executeAllPendingActions() { - ScopePerf perf(PE::SingleTimerExecutorDoExecute); - - executeAllPendingActionsInvocationCounter++; - /** - * Let's execute actions we should execute at this point. - * reentrantFlag takes care of the use case where the actions we are executing are scheduling - * further invocations - */ - reentrantFlag = true; - - /** - * in real life it could be that while we executing listeners time passes and it's already time to execute - * next listeners. - * TODO: add a counter & figure out a limit of iterations? - */ - - // starts at -1 because do..while will run a minimum of once - executeCounter = -1; - - bool didExecute; - do { - efitick_t nowNt = getTimeNowNt(); - didExecute = queue.executeOne(nowNt); - - // if we're stuck in a loop executing lots of events, panic! - if (executeCounter++ == 500) { - firmwareError(ObdCode::CUSTOM_ERR_LOCK_ISSUE, "Maximum scheduling run length exceeded - CPU load too high"); - } - - } while (didExecute); - - maxExecuteCounter = maxI(maxExecuteCounter, executeCounter); - - if (!isLocked()) { - firmwareError(ObdCode::CUSTOM_ERR_LOCK_ISSUE, "Someone has stolen my lock"); - return; - } - reentrantFlag = false; -} - -/** - * This method is always invoked under a lock - */ -void SingleTimerExecutor::scheduleTimerCallback() { - ScopePerf perf(PE::SingleTimerExecutorScheduleTimerCallback); - - /** - * Let's grab fresh time value - */ - efitick_t nowNt = getTimeNowNt(); - expected nextEventTimeNt = queue.getNextEventTime(nowNt); - - if (!nextEventTimeNt) { - return; // no pending events in the queue - } - - efiAssertVoid(ObdCode::CUSTOM_ERR_6625, nextEventTimeNt.Value > nowNt, "setTimer constraint"); - - setHardwareSchedulerTimer(nowNt, nextEventTimeNt.Value); -} - -void initSingleTimerExecutorHardware() { - initMicrosecondTimer(); -} - -void executorStatistics() { - if (engineConfiguration->debugMode == DBG_EXECUTOR) { -#if EFI_TUNER_STUDIO - engine->outputChannels.debugIntField1 = ___engine.executor.timerCallbackCounter; - engine->outputChannels.debugIntField2 = ___engine.executor.executeAllPendingActionsInvocationCounter; - engine->outputChannels.debugIntField3 = ___engine.executor.scheduleCounter; - engine->outputChannels.debugIntField4 = ___engine.executor.executeCounter; - engine->outputChannels.debugIntField5 = ___engine.executor.maxExecuteCounter; -#endif /* EFI_TUNER_STUDIO */ - } -} - -#endif /* EFI_SIGNAL_EXECUTOR_ONE_TIMER */ - diff --git a/misc/stm32f1_test_project/timer/single_timer_executor.h b/misc/stm32f1_test_project/timer/single_timer_executor.h deleted file mode 100644 index 0b7d6b85a9..0000000000 --- a/misc/stm32f1_test_project/timer/single_timer_executor.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @file single_timer_executor.h - * - * @date: Apr 18, 2014 - * @author Andrey Belomutskiy, (c) 2012-2020 - */ - -#pragma once - -#include "scheduler.h" -#include "event_queue.h" - -class SingleTimerExecutor final : public ExecutorInterface { -public: - SingleTimerExecutor(); - void scheduleByTimestamp(const char *msg, scheduling_s *scheduling, efitimeus_t timeUs, action_s action) override; - void scheduleByTimestampNt(const char *msg, scheduling_s *scheduling, efitick_t timeNt, action_s action) override; - void scheduleForLater(scheduling_s *scheduling, int delayUs, action_s action) override; - void cancel(scheduling_s* scheduling) override; - - void onTimerCallback(); - int timerCallbackCounter = 0; - int scheduleCounter = 0; - int maxExecuteCounter = 0; - int executeCounter; - int executeAllPendingActionsInvocationCounter = 0; -private: - EventQueue queue; - bool reentrantFlag = false; - void executeAllPendingActions(); - void scheduleTimerCallback(); -}; - -void initSingleTimerExecutorHardware(); -void executorStatistics(); - diff --git a/misc/stm32f1_test_project/uart.cpp b/misc/stm32f1_test_project/uart.cpp deleted file mode 100644 index d9568a2c48..0000000000 --- a/misc/stm32f1_test_project/uart.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "ch.h" -#include "hal.h" -#include "chprintf.h" - -#include "uart.h" -#include "persistence.h" - -static const UARTConfig uartCfg = -{ - .txend1_cb = nullptr, - .txend2_cb = nullptr, - .rxend_cb = nullptr, - .rxchar_cb = nullptr, - .rxerr_cb = nullptr, - .timeout_cb = nullptr, - -#ifdef STM32F0XX - .timeout = 0, -#endif - - .speed = 115200, - .cr1 = 0, - .cr2 = 0, - .cr3 = 0, - .rxhalf_cb = nullptr, -}; - -static char printBuffer[200]; - -extern TestConfiguration configuration; -extern mfs_error_t flashState; - -static THD_WORKING_AREA(waUartThread, 256); -static void UartThread(void*) -{ - while (true) { - size_t writeCount = chsnprintf(printBuffer, 200, "%d.%03d\twrites=%d\treboots=%d\r\n", 0, (int)flashState, configuration.updateCounter, configuration.rebootCounter); - uartStartSend(&UARTD1, writeCount, printBuffer); - - pokeConfiguration(); - - chThdSleepMilliseconds(200); - } -} - -void InitUart() -{ - // stm32 TX/UART1 - dongle RX often White - palSetPadMode(GPIOA, 9, PAL_MODE_STM32_ALTERNATE_PUSHPULL ); - // stm32 RX/UART1 - dongle TX often Green - palSetPadMode(GPIOA,10, PAL_MODE_INPUT_PULLUP ); - - uartStart(&UARTD1, &uartCfg); - - chThdCreateStatic(waUartThread, sizeof(waUartThread), NORMALPRIO, UartThread, nullptr); -} diff --git a/misc/stm32f1_test_project/uart.h b/misc/stm32f1_test_project/uart.h deleted file mode 100644 index 42637f4a01..0000000000 --- a/misc/stm32f1_test_project/uart.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -void InitUart();