From aa400de844857079ffce9ea5c3ec3671275122b8 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 23 Jun 2021 11:55:19 +0200 Subject: [PATCH 01/51] Added PWM module skeleton Signed-off-by: bebenlebricolo --- Modules/Pwm/Tests/Stubs/config.h | 15 ++++ Modules/Pwm/inc/pwm.h | 145 +++++++++++++++++++++++++++++++ Modules/Pwm/src/pwm.c | 0 3 files changed, 160 insertions(+) create mode 100644 Modules/Pwm/Tests/Stubs/config.h create mode 100644 Modules/Pwm/inc/pwm.h create mode 100644 Modules/Pwm/src/pwm.c diff --git a/Modules/Pwm/Tests/Stubs/config.h b/Modules/Pwm/Tests/Stubs/config.h new file mode 100644 index 0000000..68ec881 --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/config.h @@ -0,0 +1,15 @@ +#ifndef CONFIG_STUB_HEADER +#define CONFIG_STUB_HEADER + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define PWM_MAX_INSTANCES 1U + +#ifdef __cplusplus +} +#endif + +#endif /* CONFIG_STUB_HEADER */ \ No newline at end of file diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h new file mode 100644 index 0000000..ca20c5d --- /dev/null +++ b/Modules/Pwm/inc/pwm.h @@ -0,0 +1,145 @@ +#ifndef PWM_HEADER +#define PWM_HEADER + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +#include "io.h" +#include "config.h" +#include "timebase.h" + +#ifndef PWM_MAX_INSTANCES +#define PWM_MAX_INSTANCES 1U +#warning "PWM_MAX_INSTANCES macro not defined in config.h, fallsback to 1U by default" +#endif + +/** + * @brief PWM module error types used to inform caller how operations performed. +*/ +typedef enum +{ + PWM_ERR_OK, /**< Operation succeeded, no issues */ + PWM_ERR_CONFIG, /**< Something is wrong with the configuration */ + PWM_ERR_TIMEBASE_ISSUE, /**< Software timebase has encountered some errors */ + PWM_ERR_TIMER_ISSUE /**< Timer drivers encountered some errors */ +} pwm_error_t; + +/** + * @brief defines the 2 types of pwm available in this pwm module + * They are mainly used to type the compile-time configuration's internal union +*/ +typedef enum +{ + PWM_TYPE_SOFTWARE_BASED, /**< A software based pwm is required (timebase polling) */ + PWM_TYPE_HARDWARE_BASED /**< Hardware based pwm uses the hardware timers of the chip */ +} pwm_type_t; + +/** + * @brief Compile-time configuration used to configure this Pwm module. + * Note that a union is used, so soft and hard configurations occupy the same memory space. +*/ +typedef struct +{ + pwm_type_t type; /**< Distinguishes the kind of PWM initialization steps we want to perform, either soft-based or hard-based */ + uint32_t frequency; /**< Initial frequency of this Pwm module instance */ + uint8_t duty_cycle; /**< Initial duty cycle of this Pwm module instance */ + union + { + struct + { + io_t io; /**< Io structure used by the software configuration (ties an io to the pwm module) */ + } soft; /**< Software based PWM configuration structure */ + + struct + { + timebase_timer_t targeted_timer; /**< Tells which kind of timer is targeted by this PWM instance */ + uint8_t timer_index; /**< Tells which timer we need to use for this PWM instance */ + } hard; /**< Hardware based PWM configuration structure */ + }; +} pwm_config_t; + +/** + * @brief initialises this pwm driver using the static configuration written in config.c + * @return pwm_error_t: + * PWM_ERR_OK : operation succeeded + * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors + * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors +*/ +pwm_error_t pwm_init(void); + +/** + * @brief processes data for the PWM module (essentially used for the software pwm) + * @return pwm_error_t: + * PWM_ERR_OK : operation succeeded + * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors + * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors +*/ +pwm_error_t pwm_process(void); + +/** + * @brief Starts a single PWM. Has no effect if the PWM is already started + * @return pwm_error_t: + * PWM_ERR_OK : operation succeeded + * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors + * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors +*/ +pwm_error_t pwm_start(const uint8_t index); + +/** + * @brief Starts all registered PWMs in a row + * @return pwm_error_t: + * PWM_ERR_OK : operation succeeded + * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors + * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors +*/ +pwm_error_t pwm_start_all(void); + +/** + * @brief Stops a single PWM. Has no effect if the PWM is already stopped + * @return pwm_error_t: + * PWM_ERR_OK : operation succeeded + * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors + * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors +*/ +pwm_error_t pwm_stop(const uint8_t index); + +/** + * @brief Stops all registered PWM instances in a row. + * @return pwm_error_t: + * PWM_ERR_OK : operation succeeded + * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors + * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors +*/ +pwm_error_t pwm_stop_all(void); + +/** + * @brief Sets the frequency of a single PWM instance + * @return pwm_error_t: + * PWM_ERR_OK : operation succeeded + * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors + * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors +*/ +pwm_error_t pwm_set_frequency(const uint8_t index, const uint32_t * frequency); + +/** + * @brief Sets the duty cycle for a single PWM instance + * @return pwm_error_t: + * PWM_ERR_OK : operation succeeded + * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors + * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors +*/ +pwm_error_t pwm_set_duty_cycle(const uint8_t index, const uint8_t duty_cycle); + + +extern pwm_config_t pwm_config[PWM_MAX_INSTANCES]; /**< Static compile-time configuration for this driver (usually symbol is created in a config.c file) */ + + +#ifdef __cplusplus +} +#endif + +#endif /* PWM_HEADER */ \ No newline at end of file diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c new file mode 100644 index 0000000..e69de29 From 3a945f4f5be7e09292cd680ae4abd9b404b18a19 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Tue, 19 Oct 2021 08:35:32 +0200 Subject: [PATCH 02/51] Uploading pending changes Signed-off-by: bebenlebricolo --- Modules/Pwm/Tests/Stubs/config.h | 3 +- Modules/Pwm/inc/pwm.h | 65 +++++++-------- Modules/Pwm/src/pwm.c | 133 +++++++++++++++++++++++++++++++ Tests/CMakeLists.txt | 8 +- 4 files changed, 172 insertions(+), 37 deletions(-) diff --git a/Modules/Pwm/Tests/Stubs/config.h b/Modules/Pwm/Tests/Stubs/config.h index 68ec881..3477d5a 100644 --- a/Modules/Pwm/Tests/Stubs/config.h +++ b/Modules/Pwm/Tests/Stubs/config.h @@ -6,7 +6,8 @@ extern "C" { #endif -#define PWM_MAX_INSTANCES 1U +#define PWM_MAX_HARD_INSTANCES 1U +#define PWM_MAX_SOFT_INSTANCES 1U #ifdef __cplusplus } diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index ca20c5d..f421265 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -12,9 +12,14 @@ extern "C" #include "config.h" #include "timebase.h" -#ifndef PWM_MAX_INSTANCES -#define PWM_MAX_INSTANCES 1U -#warning "PWM_MAX_INSTANCES macro not defined in config.h, fallsback to 1U by default" +#ifndef PWM_MAX_SOFT_INSTANCES +#define PWM_MAX_SOFT_INSTANCES 1U +#warning "PWM_MAX_SOFT_INSTANCES macro not defined in config.h, fallsback to 1U by default" +#endif + +#ifndef PWM_MAX_HARD_INSTANCES +#define PWM_MAX_HARD_INSTANCES 1U +#warning "PWM_MAX_HARD_INSTANCES macro not defined in config.h, fallsback to 1U by default" #endif /** @@ -22,21 +27,22 @@ extern "C" */ typedef enum { - PWM_ERR_OK, /**< Operation succeeded, no issues */ + PWM_ERR_OK = 0, /**< Operation succeeded, no issues */ PWM_ERR_CONFIG, /**< Something is wrong with the configuration */ PWM_ERR_TIMEBASE_ISSUE, /**< Software timebase has encountered some errors */ PWM_ERR_TIMER_ISSUE /**< Timer drivers encountered some errors */ } pwm_error_t; + /** - * @brief defines the 2 types of pwm available in this pwm module - * They are mainly used to type the compile-time configuration's internal union + * @brief Compile-time configuration used to configure this Pwm module. + * Note that a union is used, so soft and hard configurations occupy the same memory space. */ -typedef enum +typedef struct { - PWM_TYPE_SOFTWARE_BASED, /**< A software based pwm is required (timebase polling) */ - PWM_TYPE_HARDWARE_BASED /**< Hardware based pwm uses the hardware timers of the chip */ -} pwm_type_t; + timebase_timer_t targeted_timer; /**< Tells which kind of timer is targeted by this PWM instance */ + uint8_t timer_index; /**< Tells which timer we need to use for this PWM instance */ +} pwm_hard_static_config_t; /** * @brief Compile-time configuration used to configure this Pwm module. @@ -44,26 +50,19 @@ typedef enum */ typedef struct { - pwm_type_t type; /**< Distinguishes the kind of PWM initialization steps we want to perform, either soft-based or hard-based */ - uint32_t frequency; /**< Initial frequency of this Pwm module instance */ - uint8_t duty_cycle; /**< Initial duty cycle of this Pwm module instance */ - union - { - struct - { - io_t io; /**< Io structure used by the software configuration (ties an io to the pwm module) */ - } soft; /**< Software based PWM configuration structure */ - - struct - { - timebase_timer_t targeted_timer; /**< Tells which kind of timer is targeted by this PWM instance */ - uint8_t timer_index; /**< Tells which timer we need to use for this PWM instance */ - } hard; /**< Hardware based PWM configuration structure */ - }; -} pwm_config_t; + uint8_t io_index; /**< IO index from the Io lookup table @see static io configuration */ +} pwm_soft_static_config_t; + +typedef enum +{ + PWM_TYPE_SOFTWARE, + PWM_TYPE_HARDWARE +} pwm_type_t; /** * @brief initialises this pwm driver using the static configuration written in config.c + * Note : this functions does not take care about initialising other modules it depends on, this + * should be handled by application software before this function is called. * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors @@ -87,7 +86,7 @@ pwm_error_t pwm_process(void); * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ -pwm_error_t pwm_start(const uint8_t index); +pwm_error_t pwm_start(const pwm_type_t type, const uint8_t index); /** * @brief Starts all registered PWMs in a row @@ -105,7 +104,7 @@ pwm_error_t pwm_start_all(void); * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ -pwm_error_t pwm_stop(const uint8_t index); +pwm_error_t pwm_stop(const pwm_type_t type, const uint8_t index); /** * @brief Stops all registered PWM instances in a row. @@ -123,7 +122,7 @@ pwm_error_t pwm_stop_all(void); * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ -pwm_error_t pwm_set_frequency(const uint8_t index, const uint32_t * frequency); +pwm_error_t pwm_set_frequency(const pwm_type_t type, const uint8_t index, const uint32_t * frequency, const uint32_t * cpu_freq); /** * @brief Sets the duty cycle for a single PWM instance @@ -132,10 +131,12 @@ pwm_error_t pwm_set_frequency(const uint8_t index, const uint32_t * frequency); * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ -pwm_error_t pwm_set_duty_cycle(const uint8_t index, const uint8_t duty_cycle); +pwm_error_t pwm_set_duty_cycle(const pwm_type_t type, const uint8_t index, const uint8_t duty_cycle); -extern pwm_config_t pwm_config[PWM_MAX_INSTANCES]; /**< Static compile-time configuration for this driver (usually symbol is created in a config.c file) */ +// Static configuration for both software based and hardware based pwms +extern pwm_hard_static_config_t pwm_hard_config[PWM_MAX_HARD_INSTANCES]; /**< Static compile-time configuration for this driver (usually symbol is created in a config.c file) */ +extern pwm_soft_static_config_t pwm_soft_config[PWM_MAX_SOFT_INSTANCES]; /**< Static compile-time configuration for this driver (usually symbol is created in a config.c file) */ #ifdef __cplusplus diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index e69de29..0314806 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -0,0 +1,133 @@ +#include "io.h" +#include "pwm.h" +#include "timebase.h" +#include "timer_8_bit.h" +#include "timer_16_bit.h" +#include "timer_8_bit_async.h" + +/** + * @brief Static storage for pwm configuration + * This is done this way to enhance the dynamic nature of PWMs, so that we can + * still override their config at anytime (especially frequencies and duty cycles, not) +*/ +static struct +{ + uint32_t frequency; /**< Initial frequency of this Pwm module instance */ + uint8_t duty_cycle; /**< Initial duty cycle of this Pwm module instance */ + + uint16_t last_tick; /**< Holds the last tick retrieved from timebase module */ + uint16_t start_tick; /**< Holds the start tick retrieved from timebase module */ +} soft_config[PWM_MAX_SOFT_INSTANCES] = {0}; + + +static pwm_error_t pwm_init_single_soft(const uint8_t index); +static pwm_error_t pwm_init_single_hard(const uint8_t index); + +pwm_error_t pwm_init(void) +{ + pwm_error_t err = PWM_ERR_OK; + for (uint8_t i = 0 ; i < PWM_MAX_HARD_INSTANCES ; i++) + { + err |= pwm_init_single_hard(i); + } + + for (uint8_t i = 0 ; i < PWM_MAX_SOFT_INSTANCES ; i++) + { + err |= pwm_init_single_soft(i); + } + + if (err != PWM_ERR_OK) + { + err = PWM_ERR_CONFIG; + } + + return err; +} + +static pwm_error_t pwm_init_single_hard(const uint8_t index) +{ + pwm_error_t ret = PWM_ERR_OK; + pwm_hard_static_config_t * config = &pwm_hard_config[index]; + timer_error_t timerr = TIMER_ERROR_OK; + + // Configuration varies accross the several timer drivers + switch(config->targeted_timer) + { + case TIMEBASE_TIMER_8_BIT: + { + timer_8_bit_config_t config; + //config.force_compare.force_comp_match_a + //timerr = timer_8_bit_stop(config->timer_index); + } + break; + + case TIMEBASE_TIMER_8_BIT_ASYNC: + timerr = timer_8_bit_async_stop(config->timer_index); + break; + + case TIMEBASE_TIMER_16_BIT: + timerr = timer_16_bit_stop(config->timer_index); + break; + + default: + ret = PWM_ERR_CONFIG; + break; + } + + if (TIMER_ERROR_OK != timerr) + { + ret = PWM_ERR_CONFIG; + } + + return ret; +} + +static pwm_error_t pwm_init_single_soft(const uint8_t index) +{ + pwm_error_t ret = PWM_ERR_OK; + io_write(pwm_soft_config[index].io_index, IO_STATE_LOW); + return ret; +} + +pwm_error_t pwm_set_frequency(const pwm_type_t type, const uint8_t index, const uint32_t * frequency, const uint32_t * cpu_freq) +{ + pwm_error_t ret = PWM_ERR_OK; + if (PWM_TYPE_HARDWARE == type) + { + timebase_config_t config; + timebase_error_t timerr = TIMEBASE_ERROR_OK; + uint16_t prescaler_val = 0; + uint16_t ocr_value = 0; + uint16_t accumulator = 0; + + config.cpu_freq = *cpu_freq; + config.custom_target_freq = *frequency; + config.timescale = TIMEBASE_TIMESCALE_CUSTOM; + timerr = timebase_compute_timer_parameters(&config, &prescaler_val, &ocr_value, &accumulator); + switch(pwm_hard_config[index].targeted_timer) + { + case TIMEBASE_TIMER_8_BIT: + //timerr = timer_8_bit_ + break; + + case TIMEBASE_TIMER_8_BIT_ASYNC: + timerr = timer_8_bit_async_stop(pwm_hard_config[index].timer_index); + break; + + case TIMEBASE_TIMER_16_BIT: + timerr = timer_16_bit_stop(pwm_hard_config[index].timer_index); + break; + + default: + ret = PWM_ERR_CONFIG; + break; + + } + } + else + { + soft_config[index].frequency = *frequency; + } + + return ret; +} diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index f7d6a2d..8e08de9 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -14,10 +14,10 @@ add_definitions( if(UNIX) set(AVR_INCLUDES /usr/avr/include) - set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -Wall -Wextra") - set(CMAKE_C_FLAGS_DEBUG "-O0 -g3 -Wall -Wextra") - set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -Wextra") - set(CMAKE_C_FLAGS_RELEASE "-O3 -Wall -Wextra") + set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -Wall -Wextra --coverage") + set(CMAKE_C_FLAGS_DEBUG "-O0 -g3 -Wall -Wextra --coverage") + set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -Wextra --coverage") + set(CMAKE_C_FLAGS_RELEASE "-O3 -Wall -Wextra --coverage") else() if (NOT DEFINED AVR_INCLUDES) message(FATAL_ERROR "AVR_INCLUDES variable not set, please provide the path to avr includes") From 7fffc70ba228bb344a0e87af76a83fee20cade65 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Tue, 19 Oct 2021 10:15:22 +0200 Subject: [PATCH 03/51] Moved core libraries under a single folder Signed-off-by: bebenlebricolo --- {Drivers => AvrAsyncSdk/Drivers}/Adc/CMakeLists.txt | 0 {Drivers => AvrAsyncSdk/Drivers}/Adc/Tests/CMakeLists.txt | 0 .../Drivers}/Adc/Tests/Stub/adc_register_stub.c | 0 .../Drivers}/Adc/Tests/Stub/adc_register_stub.h | 0 .../Drivers}/Adc/Tests/Stub/test_isr_wrapper.h | 0 {Drivers => AvrAsyncSdk/Drivers}/Adc/Tests/adc_driver_tests.cpp | 0 {Drivers => AvrAsyncSdk/Drivers}/Adc/Tests/adc_stack_tests.cpp | 0 {Drivers => AvrAsyncSdk/Drivers}/Adc/inc/adc.h | 0 {Drivers => AvrAsyncSdk/Drivers}/Adc/inc/adc_reg.h | 0 {Drivers => AvrAsyncSdk/Drivers}/Adc/private_inc/adc_stack.h | 0 {Drivers => AvrAsyncSdk/Drivers}/Adc/src/adc.c | 0 {Drivers => AvrAsyncSdk/Drivers}/Adc/src/adc_stack.c | 0 {Drivers => AvrAsyncSdk/Drivers}/CMakeLists.txt | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/CMakeLists.txt | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/Readme.md | 0 .../Drivers}/I2c/Examples/master_firmware/App/CMakeLists.txt | 0 .../Drivers}/I2c/Examples/master_firmware/App/inc/config.h | 0 .../Drivers}/I2c/Examples/master_firmware/App/inc/pin_mapping.h | 0 .../master_firmware/App/inc/targeted_slave_i2c_interface.h | 0 .../Drivers}/I2c/Examples/master_firmware/App/src/main.c | 0 .../Drivers}/I2c/Examples/master_firmware/CMakeLists.txt | 0 .../Drivers}/I2c/Examples/slave_firmware/App/CMakeLists.txt | 0 .../Drivers}/I2c/Examples/slave_firmware/App/inc/config.h | 0 .../I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h | 0 .../Drivers}/I2c/Examples/slave_firmware/App/inc/pin_mapping.h | 0 .../I2c/Examples/slave_firmware/App/src/i2c_slave_handler.c | 0 .../Drivers}/I2c/Examples/slave_firmware/App/src/main.c | 0 .../Drivers}/I2c/Examples/slave_firmware/CMakeLists.txt | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/Readme.md | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/CMakeLists.txt | 0 .../Drivers}/I2c/Tests/Stub/I2cBusSimulator.cpp | 0 .../Drivers}/I2c/Tests/Stub/I2cBusSimulator.hpp | 0 .../Drivers}/I2c/Tests/Stub/i2c_device_interface.h | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/i2c_fake_device.c | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/i2c_fake_device.h | 0 .../Drivers}/I2c/Tests/Stub/i2c_fake_slave_application_data.c | 0 .../Drivers}/I2c/Tests/Stub/i2c_fake_slave_application_data.h | 0 .../Drivers}/I2c/Tests/Stub/i2c_register_stub.c | 0 .../Drivers}/I2c/Tests/Stub/i2c_register_stub.h | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/test_isr_stub.h | 0 .../Drivers}/I2c/Tests/Stub/twi_hardware_stub.c | 0 .../Drivers}/I2c/Tests/Stub/twi_hardware_stub.h | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/config.h | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/i2c_driver_tests.cpp | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/inc/i2c.h | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/inc/i2c_private.h | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/inc/i2c_reg.h | 0 {Drivers => AvrAsyncSdk/Drivers}/I2c/src/i2c.c | 0 {Drivers => AvrAsyncSdk/Drivers}/Io/CMakeLists.txt | 0 {Drivers => AvrAsyncSdk/Drivers}/Io/Tests/CMakeLists.txt | 0 {Drivers => AvrAsyncSdk/Drivers}/Io/Tests/Stub/config.c | 0 {Drivers => AvrAsyncSdk/Drivers}/Io/Tests/Stub/config.h | 0 {Drivers => AvrAsyncSdk/Drivers}/Io/Tests/Stub/pinmapping.h | 0 {Drivers => AvrAsyncSdk/Drivers}/Io/Tests/io_tests.cpp | 0 {Drivers => AvrAsyncSdk/Drivers}/Io/inc/io.h | 0 {Drivers => AvrAsyncSdk/Drivers}/Io/src/io.c | 0 {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/CMakeLists.txt | 0 .../Drivers}/Lcd_screen/Examples/App/CMakeLists.txt | 0 .../Drivers}/Lcd_screen/Examples/App/inc/config.h | 0 .../Drivers}/Lcd_screen/Examples/App/inc/driver_setup.h | 0 .../Drivers}/Lcd_screen/Examples/App/inc/module_setup.h | 0 .../Drivers}/Lcd_screen/Examples/App/inc/pin_mapping.h | 0 .../Drivers}/Lcd_screen/Examples/App/src/driver_setup.c | 0 .../Drivers}/Lcd_screen/Examples/App/src/main.c | 0 .../Drivers}/Lcd_screen/Examples/App/src/module_setup.c | 0 .../Drivers}/Lcd_screen/Examples/CMakeLists.txt | 0 {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Tests/CMakeLists.txt | 0 .../Drivers}/Lcd_screen/Tests/HD44780_lcd_tests.cpp | 0 {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Tests/Stub/i2c.h | 0 {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Tests/Stub/i2c_stub.c | 0 {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Tests/Stub/timebase.h | 0 .../Drivers}/Lcd_screen/Tests/Stub/timebase_stub.c | 0 {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/inc/HD44780_lcd.h | 0 .../Drivers}/Lcd_screen/inc/HD44780_lcd_private.h | 0 {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/src/HD44780_lcd.c | 0 {Drivers => AvrAsyncSdk/Drivers}/Timers/CMakeLists.txt | 0 .../Drivers}/Timers/Timer_16_bit/CMakeLists.txt | 0 .../Drivers}/Timers/Timer_16_bit/Tests/CMakeLists.txt | 0 .../Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c | 0 .../Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.h | 0 .../Drivers}/Timers/Timer_16_bit/Tests/config.h | 0 .../Drivers}/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp | 0 .../Drivers}/Timers/Timer_16_bit/inc/timer_16_bit.h | 0 .../Drivers}/Timers/Timer_16_bit/inc/timer_16_bit_reg.h | 0 .../Drivers}/Timers/Timer_16_bit/src/timer_16_bit.c | 0 .../Drivers}/Timers/Timer_8_bit/CMakeLists.txt | 0 .../Drivers}/Timers/Timer_8_bit/Tests/CMakeLists.txt | 0 .../Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c | 0 .../Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h | 0 .../Drivers}/Timers/Timer_8_bit/Tests/config.h | 0 .../Drivers}/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp | 0 .../Drivers}/Timers/Timer_8_bit/inc/timer_8_bit.h | 0 .../Drivers}/Timers/Timer_8_bit/inc/timer_8_bit_reg.h | 0 .../Drivers}/Timers/Timer_8_bit/src/timer_8_bit.c | 0 .../Drivers}/Timers/Timer_8_bit_async/CMakeLists.txt | 0 .../Drivers}/Timers/Timer_8_bit_async/Tests/CMakeLists.txt | 0 .../Tests/Stub/timer_8_bit_async_registers_stub.c | 0 .../Tests/Stub/timer_8_bit_async_registers_stub.h | 0 .../Drivers}/Timers/Timer_8_bit_async/Tests/config.h | 0 .../Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp | 0 .../Drivers}/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h | 0 .../Drivers}/Timers/Timer_8_bit_async/inc/timer_8_bit_async_reg.h | 0 .../Drivers}/Timers/Timer_8_bit_async/src/timer_8_bit_async.c | 0 .../Drivers}/Timers/Timer_generic/CMakeLists.txt | 0 .../Drivers}/Timers/Timer_generic/Tests/CMakeLists.txt | 0 .../Drivers}/Timers/Timer_generic/Tests/timer_generic_tests.cpp | 0 .../Drivers}/Timers/Timer_generic/inc/timer_generic.h | 0 .../Drivers}/Timers/Timer_generic/src/timer_generic.c | 0 {Modules => AvrAsyncSdk/Modules}/CMakeLists.txt | 0 {Modules => AvrAsyncSdk/Modules}/Pwm/Tests/Stubs/config.h | 0 {Modules => AvrAsyncSdk/Modules}/Pwm/inc/pwm.h | 0 {Modules => AvrAsyncSdk/Modules}/Pwm/src/pwm.c | 0 {Modules => AvrAsyncSdk/Modules}/Timebase/CMakeLists.txt | 0 {Modules => AvrAsyncSdk/Modules}/Timebase/Tests/CMakeLists.txt | 0 .../Modules}/Timebase/Tests/Stubs/timer_16_bit_stub.c | 0 .../Modules}/Timebase/Tests/Stubs/timer_16_bit_stub.h | 0 .../Modules}/Timebase/Tests/Stubs/timer_8_bit_async_stub.c | 0 .../Modules}/Timebase/Tests/Stubs/timer_8_bit_async_stub.h | 0 .../Modules}/Timebase/Tests/Stubs/timer_8_bit_stub.c | 0 .../Modules}/Timebase/Tests/Stubs/timer_8_bit_stub.h | 0 {Modules => AvrAsyncSdk/Modules}/Timebase/Tests/inc/config.h | 0 .../Modules}/Timebase/Tests/timebase_tests.cpp | 0 {Modules => AvrAsyncSdk/Modules}/Timebase/inc/timebase.h | 0 {Modules => AvrAsyncSdk/Modules}/Timebase/inc/timebase_internal.h | 0 {Modules => AvrAsyncSdk/Modules}/Timebase/src/timebase.c | 0 {Scripts => AvrAsyncSdk/Scripts}/avr-gdb-commands.gdb | 0 {Sensors => AvrAsyncSdk/Sensors}/CMakeLists.txt | 0 {Sensors => AvrAsyncSdk/Sensors}/Thermistor/CMakeLists.txt | 0 {Sensors => AvrAsyncSdk/Sensors}/Thermistor/Tests/CMakeLists.txt | 0 .../Sensors}/Thermistor/Tests/Stubs/adc_stub.c | 0 .../Sensors}/Thermistor/Tests/Stubs/adc_stub.h | 0 {Sensors => AvrAsyncSdk/Sensors}/Thermistor/Tests/Stubs/config.c | 0 {Sensors => AvrAsyncSdk/Sensors}/Thermistor/Tests/Stubs/config.h | 0 .../Sensors}/Thermistor/Tests/thermistor_driver_tests.cpp | 0 {Sensors => AvrAsyncSdk/Sensors}/Thermistor/inc/thermistor.h | 0 .../Sensors}/Thermistor/private_inc/thermistor_private.h | 0 {Sensors => AvrAsyncSdk/Sensors}/Thermistor/src/thermistor.c | 0 {Tests => AvrAsyncSdk/Tests}/CMakeLists.txt | 0 {Tests => AvrAsyncSdk/Tests}/gdb_commands.gdb | 0 {Tests => AvrAsyncSdk/Tests}/run_all_tests.sh | 0 {Toolchain => AvrAsyncSdk/Toolchain}/avr8-gcc-toolchain.cmake | 0 {Utils => AvrAsyncSdk/Utils}/CMakeLists.txt | 0 {Utils => AvrAsyncSdk/Utils}/inc/memutils.h | 0 {Utils => AvrAsyncSdk/Utils}/src/memutils.c | 0 144 files changed, 0 insertions(+), 0 deletions(-) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/Tests/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/Tests/Stub/adc_register_stub.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/Tests/Stub/adc_register_stub.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/Tests/Stub/test_isr_wrapper.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/Tests/adc_driver_tests.cpp (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/Tests/adc_stack_tests.cpp (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/inc/adc.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/inc/adc_reg.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/private_inc/adc_stack.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/src/adc.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Adc/src/adc_stack.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/Readme.md (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/master_firmware/App/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/master_firmware/App/inc/config.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/master_firmware/App/inc/pin_mapping.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/master_firmware/App/inc/targeted_slave_i2c_interface.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/master_firmware/App/src/main.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/master_firmware/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/slave_firmware/App/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/slave_firmware/App/inc/config.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/slave_firmware/App/inc/pin_mapping.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/slave_firmware/App/src/i2c_slave_handler.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/slave_firmware/App/src/main.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Examples/slave_firmware/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Readme.md (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/I2cBusSimulator.cpp (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/I2cBusSimulator.hpp (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/i2c_device_interface.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/i2c_fake_device.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/i2c_fake_device.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/i2c_fake_slave_application_data.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/i2c_fake_slave_application_data.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/i2c_register_stub.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/i2c_register_stub.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/test_isr_stub.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/twi_hardware_stub.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/Stub/twi_hardware_stub.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/config.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/Tests/i2c_driver_tests.cpp (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/inc/i2c.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/inc/i2c_private.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/inc/i2c_reg.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/I2c/src/i2c.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Io/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Io/Tests/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Io/Tests/Stub/config.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Io/Tests/Stub/config.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Io/Tests/Stub/pinmapping.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Io/Tests/io_tests.cpp (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Io/inc/io.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Io/src/io.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Examples/App/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Examples/App/inc/config.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Examples/App/inc/driver_setup.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Examples/App/inc/module_setup.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Examples/App/inc/pin_mapping.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Examples/App/src/driver_setup.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Examples/App/src/main.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Examples/App/src/module_setup.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Examples/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Tests/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Tests/HD44780_lcd_tests.cpp (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Tests/Stub/i2c.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Tests/Stub/i2c_stub.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Tests/Stub/timebase.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/Tests/Stub/timebase_stub.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/inc/HD44780_lcd.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/inc/HD44780_lcd_private.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Lcd_screen/src/HD44780_lcd.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_16_bit/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_16_bit/Tests/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_16_bit/Tests/config.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_16_bit/inc/timer_16_bit.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_16_bit/inc/timer_16_bit_reg.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_16_bit/src/timer_16_bit.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit/Tests/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit/Tests/config.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit/inc/timer_8_bit.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit/inc/timer_8_bit_reg.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit/src/timer_8_bit.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit_async/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit_async/Tests/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit_async/Tests/config.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit_async/inc/timer_8_bit_async_reg.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_8_bit_async/src/timer_8_bit_async.c (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_generic/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_generic/Tests/CMakeLists.txt (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_generic/Tests/timer_generic_tests.cpp (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_generic/inc/timer_generic.h (100%) rename {Drivers => AvrAsyncSdk/Drivers}/Timers/Timer_generic/src/timer_generic.c (100%) rename {Modules => AvrAsyncSdk/Modules}/CMakeLists.txt (100%) rename {Modules => AvrAsyncSdk/Modules}/Pwm/Tests/Stubs/config.h (100%) rename {Modules => AvrAsyncSdk/Modules}/Pwm/inc/pwm.h (100%) rename {Modules => AvrAsyncSdk/Modules}/Pwm/src/pwm.c (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/CMakeLists.txt (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/Tests/CMakeLists.txt (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/Tests/Stubs/timer_16_bit_stub.c (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/Tests/Stubs/timer_16_bit_stub.h (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/Tests/Stubs/timer_8_bit_async_stub.c (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/Tests/Stubs/timer_8_bit_async_stub.h (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/Tests/Stubs/timer_8_bit_stub.c (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/Tests/Stubs/timer_8_bit_stub.h (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/Tests/inc/config.h (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/Tests/timebase_tests.cpp (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/inc/timebase.h (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/inc/timebase_internal.h (100%) rename {Modules => AvrAsyncSdk/Modules}/Timebase/src/timebase.c (100%) rename {Scripts => AvrAsyncSdk/Scripts}/avr-gdb-commands.gdb (100%) rename {Sensors => AvrAsyncSdk/Sensors}/CMakeLists.txt (100%) rename {Sensors => AvrAsyncSdk/Sensors}/Thermistor/CMakeLists.txt (100%) rename {Sensors => AvrAsyncSdk/Sensors}/Thermistor/Tests/CMakeLists.txt (100%) rename {Sensors => AvrAsyncSdk/Sensors}/Thermistor/Tests/Stubs/adc_stub.c (100%) rename {Sensors => AvrAsyncSdk/Sensors}/Thermistor/Tests/Stubs/adc_stub.h (100%) rename {Sensors => AvrAsyncSdk/Sensors}/Thermistor/Tests/Stubs/config.c (100%) rename {Sensors => AvrAsyncSdk/Sensors}/Thermistor/Tests/Stubs/config.h (100%) rename {Sensors => AvrAsyncSdk/Sensors}/Thermistor/Tests/thermistor_driver_tests.cpp (100%) rename {Sensors => AvrAsyncSdk/Sensors}/Thermistor/inc/thermistor.h (100%) rename {Sensors => AvrAsyncSdk/Sensors}/Thermistor/private_inc/thermistor_private.h (100%) rename {Sensors => AvrAsyncSdk/Sensors}/Thermistor/src/thermistor.c (100%) rename {Tests => AvrAsyncSdk/Tests}/CMakeLists.txt (100%) rename {Tests => AvrAsyncSdk/Tests}/gdb_commands.gdb (100%) rename {Tests => AvrAsyncSdk/Tests}/run_all_tests.sh (100%) rename {Toolchain => AvrAsyncSdk/Toolchain}/avr8-gcc-toolchain.cmake (100%) rename {Utils => AvrAsyncSdk/Utils}/CMakeLists.txt (100%) rename {Utils => AvrAsyncSdk/Utils}/inc/memutils.h (100%) rename {Utils => AvrAsyncSdk/Utils}/src/memutils.c (100%) diff --git a/Drivers/Adc/CMakeLists.txt b/AvrAsyncSdk/Drivers/Adc/CMakeLists.txt similarity index 100% rename from Drivers/Adc/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Adc/CMakeLists.txt diff --git a/Drivers/Adc/Tests/CMakeLists.txt b/AvrAsyncSdk/Drivers/Adc/Tests/CMakeLists.txt similarity index 100% rename from Drivers/Adc/Tests/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Adc/Tests/CMakeLists.txt diff --git a/Drivers/Adc/Tests/Stub/adc_register_stub.c b/AvrAsyncSdk/Drivers/Adc/Tests/Stub/adc_register_stub.c similarity index 100% rename from Drivers/Adc/Tests/Stub/adc_register_stub.c rename to AvrAsyncSdk/Drivers/Adc/Tests/Stub/adc_register_stub.c diff --git a/Drivers/Adc/Tests/Stub/adc_register_stub.h b/AvrAsyncSdk/Drivers/Adc/Tests/Stub/adc_register_stub.h similarity index 100% rename from Drivers/Adc/Tests/Stub/adc_register_stub.h rename to AvrAsyncSdk/Drivers/Adc/Tests/Stub/adc_register_stub.h diff --git a/Drivers/Adc/Tests/Stub/test_isr_wrapper.h b/AvrAsyncSdk/Drivers/Adc/Tests/Stub/test_isr_wrapper.h similarity index 100% rename from Drivers/Adc/Tests/Stub/test_isr_wrapper.h rename to AvrAsyncSdk/Drivers/Adc/Tests/Stub/test_isr_wrapper.h diff --git a/Drivers/Adc/Tests/adc_driver_tests.cpp b/AvrAsyncSdk/Drivers/Adc/Tests/adc_driver_tests.cpp similarity index 100% rename from Drivers/Adc/Tests/adc_driver_tests.cpp rename to AvrAsyncSdk/Drivers/Adc/Tests/adc_driver_tests.cpp diff --git a/Drivers/Adc/Tests/adc_stack_tests.cpp b/AvrAsyncSdk/Drivers/Adc/Tests/adc_stack_tests.cpp similarity index 100% rename from Drivers/Adc/Tests/adc_stack_tests.cpp rename to AvrAsyncSdk/Drivers/Adc/Tests/adc_stack_tests.cpp diff --git a/Drivers/Adc/inc/adc.h b/AvrAsyncSdk/Drivers/Adc/inc/adc.h similarity index 100% rename from Drivers/Adc/inc/adc.h rename to AvrAsyncSdk/Drivers/Adc/inc/adc.h diff --git a/Drivers/Adc/inc/adc_reg.h b/AvrAsyncSdk/Drivers/Adc/inc/adc_reg.h similarity index 100% rename from Drivers/Adc/inc/adc_reg.h rename to AvrAsyncSdk/Drivers/Adc/inc/adc_reg.h diff --git a/Drivers/Adc/private_inc/adc_stack.h b/AvrAsyncSdk/Drivers/Adc/private_inc/adc_stack.h similarity index 100% rename from Drivers/Adc/private_inc/adc_stack.h rename to AvrAsyncSdk/Drivers/Adc/private_inc/adc_stack.h diff --git a/Drivers/Adc/src/adc.c b/AvrAsyncSdk/Drivers/Adc/src/adc.c similarity index 100% rename from Drivers/Adc/src/adc.c rename to AvrAsyncSdk/Drivers/Adc/src/adc.c diff --git a/Drivers/Adc/src/adc_stack.c b/AvrAsyncSdk/Drivers/Adc/src/adc_stack.c similarity index 100% rename from Drivers/Adc/src/adc_stack.c rename to AvrAsyncSdk/Drivers/Adc/src/adc_stack.c diff --git a/Drivers/CMakeLists.txt b/AvrAsyncSdk/Drivers/CMakeLists.txt similarity index 100% rename from Drivers/CMakeLists.txt rename to AvrAsyncSdk/Drivers/CMakeLists.txt diff --git a/Drivers/I2c/CMakeLists.txt b/AvrAsyncSdk/Drivers/I2c/CMakeLists.txt similarity index 100% rename from Drivers/I2c/CMakeLists.txt rename to AvrAsyncSdk/Drivers/I2c/CMakeLists.txt diff --git a/Drivers/I2c/Examples/Readme.md b/AvrAsyncSdk/Drivers/I2c/Examples/Readme.md similarity index 100% rename from Drivers/I2c/Examples/Readme.md rename to AvrAsyncSdk/Drivers/I2c/Examples/Readme.md diff --git a/Drivers/I2c/Examples/master_firmware/App/CMakeLists.txt b/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/CMakeLists.txt similarity index 100% rename from Drivers/I2c/Examples/master_firmware/App/CMakeLists.txt rename to AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/CMakeLists.txt diff --git a/Drivers/I2c/Examples/master_firmware/App/inc/config.h b/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/config.h similarity index 100% rename from Drivers/I2c/Examples/master_firmware/App/inc/config.h rename to AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/config.h diff --git a/Drivers/I2c/Examples/master_firmware/App/inc/pin_mapping.h b/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/pin_mapping.h similarity index 100% rename from Drivers/I2c/Examples/master_firmware/App/inc/pin_mapping.h rename to AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/pin_mapping.h diff --git a/Drivers/I2c/Examples/master_firmware/App/inc/targeted_slave_i2c_interface.h b/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/targeted_slave_i2c_interface.h similarity index 100% rename from Drivers/I2c/Examples/master_firmware/App/inc/targeted_slave_i2c_interface.h rename to AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/targeted_slave_i2c_interface.h diff --git a/Drivers/I2c/Examples/master_firmware/App/src/main.c b/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/src/main.c similarity index 100% rename from Drivers/I2c/Examples/master_firmware/App/src/main.c rename to AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/src/main.c diff --git a/Drivers/I2c/Examples/master_firmware/CMakeLists.txt b/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/CMakeLists.txt similarity index 100% rename from Drivers/I2c/Examples/master_firmware/CMakeLists.txt rename to AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/CMakeLists.txt diff --git a/Drivers/I2c/Examples/slave_firmware/App/CMakeLists.txt b/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/CMakeLists.txt similarity index 100% rename from Drivers/I2c/Examples/slave_firmware/App/CMakeLists.txt rename to AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/CMakeLists.txt diff --git a/Drivers/I2c/Examples/slave_firmware/App/inc/config.h b/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/config.h similarity index 100% rename from Drivers/I2c/Examples/slave_firmware/App/inc/config.h rename to AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/config.h diff --git a/Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h b/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h similarity index 100% rename from Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h rename to AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h diff --git a/Drivers/I2c/Examples/slave_firmware/App/inc/pin_mapping.h b/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/pin_mapping.h similarity index 100% rename from Drivers/I2c/Examples/slave_firmware/App/inc/pin_mapping.h rename to AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/pin_mapping.h diff --git a/Drivers/I2c/Examples/slave_firmware/App/src/i2c_slave_handler.c b/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/src/i2c_slave_handler.c similarity index 100% rename from Drivers/I2c/Examples/slave_firmware/App/src/i2c_slave_handler.c rename to AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/src/i2c_slave_handler.c diff --git a/Drivers/I2c/Examples/slave_firmware/App/src/main.c b/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/src/main.c similarity index 100% rename from Drivers/I2c/Examples/slave_firmware/App/src/main.c rename to AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/src/main.c diff --git a/Drivers/I2c/Examples/slave_firmware/CMakeLists.txt b/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/CMakeLists.txt similarity index 100% rename from Drivers/I2c/Examples/slave_firmware/CMakeLists.txt rename to AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/CMakeLists.txt diff --git a/Drivers/I2c/Readme.md b/AvrAsyncSdk/Drivers/I2c/Readme.md similarity index 100% rename from Drivers/I2c/Readme.md rename to AvrAsyncSdk/Drivers/I2c/Readme.md diff --git a/Drivers/I2c/Tests/CMakeLists.txt b/AvrAsyncSdk/Drivers/I2c/Tests/CMakeLists.txt similarity index 100% rename from Drivers/I2c/Tests/CMakeLists.txt rename to AvrAsyncSdk/Drivers/I2c/Tests/CMakeLists.txt diff --git a/Drivers/I2c/Tests/Stub/I2cBusSimulator.cpp b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/I2cBusSimulator.cpp similarity index 100% rename from Drivers/I2c/Tests/Stub/I2cBusSimulator.cpp rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/I2cBusSimulator.cpp diff --git a/Drivers/I2c/Tests/Stub/I2cBusSimulator.hpp b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/I2cBusSimulator.hpp similarity index 100% rename from Drivers/I2c/Tests/Stub/I2cBusSimulator.hpp rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/I2cBusSimulator.hpp diff --git a/Drivers/I2c/Tests/Stub/i2c_device_interface.h b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_device_interface.h similarity index 100% rename from Drivers/I2c/Tests/Stub/i2c_device_interface.h rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_device_interface.h diff --git a/Drivers/I2c/Tests/Stub/i2c_fake_device.c b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_device.c similarity index 100% rename from Drivers/I2c/Tests/Stub/i2c_fake_device.c rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_device.c diff --git a/Drivers/I2c/Tests/Stub/i2c_fake_device.h b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_device.h similarity index 100% rename from Drivers/I2c/Tests/Stub/i2c_fake_device.h rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_device.h diff --git a/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.c b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.c similarity index 100% rename from Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.c rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.c diff --git a/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h similarity index 100% rename from Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h diff --git a/Drivers/I2c/Tests/Stub/i2c_register_stub.c b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_register_stub.c similarity index 100% rename from Drivers/I2c/Tests/Stub/i2c_register_stub.c rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_register_stub.c diff --git a/Drivers/I2c/Tests/Stub/i2c_register_stub.h b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_register_stub.h similarity index 100% rename from Drivers/I2c/Tests/Stub/i2c_register_stub.h rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_register_stub.h diff --git a/Drivers/I2c/Tests/Stub/test_isr_stub.h b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/test_isr_stub.h similarity index 100% rename from Drivers/I2c/Tests/Stub/test_isr_stub.h rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/test_isr_stub.h diff --git a/Drivers/I2c/Tests/Stub/twi_hardware_stub.c b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/twi_hardware_stub.c similarity index 100% rename from Drivers/I2c/Tests/Stub/twi_hardware_stub.c rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/twi_hardware_stub.c diff --git a/Drivers/I2c/Tests/Stub/twi_hardware_stub.h b/AvrAsyncSdk/Drivers/I2c/Tests/Stub/twi_hardware_stub.h similarity index 100% rename from Drivers/I2c/Tests/Stub/twi_hardware_stub.h rename to AvrAsyncSdk/Drivers/I2c/Tests/Stub/twi_hardware_stub.h diff --git a/Drivers/I2c/Tests/config.h b/AvrAsyncSdk/Drivers/I2c/Tests/config.h similarity index 100% rename from Drivers/I2c/Tests/config.h rename to AvrAsyncSdk/Drivers/I2c/Tests/config.h diff --git a/Drivers/I2c/Tests/i2c_driver_tests.cpp b/AvrAsyncSdk/Drivers/I2c/Tests/i2c_driver_tests.cpp similarity index 100% rename from Drivers/I2c/Tests/i2c_driver_tests.cpp rename to AvrAsyncSdk/Drivers/I2c/Tests/i2c_driver_tests.cpp diff --git a/Drivers/I2c/inc/i2c.h b/AvrAsyncSdk/Drivers/I2c/inc/i2c.h similarity index 100% rename from Drivers/I2c/inc/i2c.h rename to AvrAsyncSdk/Drivers/I2c/inc/i2c.h diff --git a/Drivers/I2c/inc/i2c_private.h b/AvrAsyncSdk/Drivers/I2c/inc/i2c_private.h similarity index 100% rename from Drivers/I2c/inc/i2c_private.h rename to AvrAsyncSdk/Drivers/I2c/inc/i2c_private.h diff --git a/Drivers/I2c/inc/i2c_reg.h b/AvrAsyncSdk/Drivers/I2c/inc/i2c_reg.h similarity index 100% rename from Drivers/I2c/inc/i2c_reg.h rename to AvrAsyncSdk/Drivers/I2c/inc/i2c_reg.h diff --git a/Drivers/I2c/src/i2c.c b/AvrAsyncSdk/Drivers/I2c/src/i2c.c similarity index 100% rename from Drivers/I2c/src/i2c.c rename to AvrAsyncSdk/Drivers/I2c/src/i2c.c diff --git a/Drivers/Io/CMakeLists.txt b/AvrAsyncSdk/Drivers/Io/CMakeLists.txt similarity index 100% rename from Drivers/Io/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Io/CMakeLists.txt diff --git a/Drivers/Io/Tests/CMakeLists.txt b/AvrAsyncSdk/Drivers/Io/Tests/CMakeLists.txt similarity index 100% rename from Drivers/Io/Tests/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Io/Tests/CMakeLists.txt diff --git a/Drivers/Io/Tests/Stub/config.c b/AvrAsyncSdk/Drivers/Io/Tests/Stub/config.c similarity index 100% rename from Drivers/Io/Tests/Stub/config.c rename to AvrAsyncSdk/Drivers/Io/Tests/Stub/config.c diff --git a/Drivers/Io/Tests/Stub/config.h b/AvrAsyncSdk/Drivers/Io/Tests/Stub/config.h similarity index 100% rename from Drivers/Io/Tests/Stub/config.h rename to AvrAsyncSdk/Drivers/Io/Tests/Stub/config.h diff --git a/Drivers/Io/Tests/Stub/pinmapping.h b/AvrAsyncSdk/Drivers/Io/Tests/Stub/pinmapping.h similarity index 100% rename from Drivers/Io/Tests/Stub/pinmapping.h rename to AvrAsyncSdk/Drivers/Io/Tests/Stub/pinmapping.h diff --git a/Drivers/Io/Tests/io_tests.cpp b/AvrAsyncSdk/Drivers/Io/Tests/io_tests.cpp similarity index 100% rename from Drivers/Io/Tests/io_tests.cpp rename to AvrAsyncSdk/Drivers/Io/Tests/io_tests.cpp diff --git a/Drivers/Io/inc/io.h b/AvrAsyncSdk/Drivers/Io/inc/io.h similarity index 100% rename from Drivers/Io/inc/io.h rename to AvrAsyncSdk/Drivers/Io/inc/io.h diff --git a/Drivers/Io/src/io.c b/AvrAsyncSdk/Drivers/Io/src/io.c similarity index 100% rename from Drivers/Io/src/io.c rename to AvrAsyncSdk/Drivers/Io/src/io.c diff --git a/Drivers/Lcd_screen/CMakeLists.txt b/AvrAsyncSdk/Drivers/Lcd_screen/CMakeLists.txt similarity index 100% rename from Drivers/Lcd_screen/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Lcd_screen/CMakeLists.txt diff --git a/Drivers/Lcd_screen/Examples/App/CMakeLists.txt b/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/CMakeLists.txt similarity index 100% rename from Drivers/Lcd_screen/Examples/App/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/CMakeLists.txt diff --git a/Drivers/Lcd_screen/Examples/App/inc/config.h b/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/config.h similarity index 100% rename from Drivers/Lcd_screen/Examples/App/inc/config.h rename to AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/config.h diff --git a/Drivers/Lcd_screen/Examples/App/inc/driver_setup.h b/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/driver_setup.h similarity index 100% rename from Drivers/Lcd_screen/Examples/App/inc/driver_setup.h rename to AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/driver_setup.h diff --git a/Drivers/Lcd_screen/Examples/App/inc/module_setup.h b/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/module_setup.h similarity index 100% rename from Drivers/Lcd_screen/Examples/App/inc/module_setup.h rename to AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/module_setup.h diff --git a/Drivers/Lcd_screen/Examples/App/inc/pin_mapping.h b/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/pin_mapping.h similarity index 100% rename from Drivers/Lcd_screen/Examples/App/inc/pin_mapping.h rename to AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/pin_mapping.h diff --git a/Drivers/Lcd_screen/Examples/App/src/driver_setup.c b/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/driver_setup.c similarity index 100% rename from Drivers/Lcd_screen/Examples/App/src/driver_setup.c rename to AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/driver_setup.c diff --git a/Drivers/Lcd_screen/Examples/App/src/main.c b/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/main.c similarity index 100% rename from Drivers/Lcd_screen/Examples/App/src/main.c rename to AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/main.c diff --git a/Drivers/Lcd_screen/Examples/App/src/module_setup.c b/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/module_setup.c similarity index 100% rename from Drivers/Lcd_screen/Examples/App/src/module_setup.c rename to AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/module_setup.c diff --git a/Drivers/Lcd_screen/Examples/CMakeLists.txt b/AvrAsyncSdk/Drivers/Lcd_screen/Examples/CMakeLists.txt similarity index 100% rename from Drivers/Lcd_screen/Examples/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Lcd_screen/Examples/CMakeLists.txt diff --git a/Drivers/Lcd_screen/Tests/CMakeLists.txt b/AvrAsyncSdk/Drivers/Lcd_screen/Tests/CMakeLists.txt similarity index 100% rename from Drivers/Lcd_screen/Tests/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Lcd_screen/Tests/CMakeLists.txt diff --git a/Drivers/Lcd_screen/Tests/HD44780_lcd_tests.cpp b/AvrAsyncSdk/Drivers/Lcd_screen/Tests/HD44780_lcd_tests.cpp similarity index 100% rename from Drivers/Lcd_screen/Tests/HD44780_lcd_tests.cpp rename to AvrAsyncSdk/Drivers/Lcd_screen/Tests/HD44780_lcd_tests.cpp diff --git a/Drivers/Lcd_screen/Tests/Stub/i2c.h b/AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/i2c.h similarity index 100% rename from Drivers/Lcd_screen/Tests/Stub/i2c.h rename to AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/i2c.h diff --git a/Drivers/Lcd_screen/Tests/Stub/i2c_stub.c b/AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/i2c_stub.c similarity index 100% rename from Drivers/Lcd_screen/Tests/Stub/i2c_stub.c rename to AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/i2c_stub.c diff --git a/Drivers/Lcd_screen/Tests/Stub/timebase.h b/AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/timebase.h similarity index 100% rename from Drivers/Lcd_screen/Tests/Stub/timebase.h rename to AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/timebase.h diff --git a/Drivers/Lcd_screen/Tests/Stub/timebase_stub.c b/AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/timebase_stub.c similarity index 100% rename from Drivers/Lcd_screen/Tests/Stub/timebase_stub.c rename to AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/timebase_stub.c diff --git a/Drivers/Lcd_screen/inc/HD44780_lcd.h b/AvrAsyncSdk/Drivers/Lcd_screen/inc/HD44780_lcd.h similarity index 100% rename from Drivers/Lcd_screen/inc/HD44780_lcd.h rename to AvrAsyncSdk/Drivers/Lcd_screen/inc/HD44780_lcd.h diff --git a/Drivers/Lcd_screen/inc/HD44780_lcd_private.h b/AvrAsyncSdk/Drivers/Lcd_screen/inc/HD44780_lcd_private.h similarity index 100% rename from Drivers/Lcd_screen/inc/HD44780_lcd_private.h rename to AvrAsyncSdk/Drivers/Lcd_screen/inc/HD44780_lcd_private.h diff --git a/Drivers/Lcd_screen/src/HD44780_lcd.c b/AvrAsyncSdk/Drivers/Lcd_screen/src/HD44780_lcd.c similarity index 100% rename from Drivers/Lcd_screen/src/HD44780_lcd.c rename to AvrAsyncSdk/Drivers/Lcd_screen/src/HD44780_lcd.c diff --git a/Drivers/Timers/CMakeLists.txt b/AvrAsyncSdk/Drivers/Timers/CMakeLists.txt similarity index 100% rename from Drivers/Timers/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Timers/CMakeLists.txt diff --git a/Drivers/Timers/Timer_16_bit/CMakeLists.txt b/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/CMakeLists.txt similarity index 100% rename from Drivers/Timers/Timer_16_bit/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Timers/Timer_16_bit/CMakeLists.txt diff --git a/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt b/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt similarity index 100% rename from Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt diff --git a/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c b/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c similarity index 100% rename from Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c rename to AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c diff --git a/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.h b/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.h similarity index 100% rename from Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.h rename to AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.h diff --git a/Drivers/Timers/Timer_16_bit/Tests/config.h b/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/config.h similarity index 100% rename from Drivers/Timers/Timer_16_bit/Tests/config.h rename to AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/config.h diff --git a/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp b/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp similarity index 100% rename from Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp rename to AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp diff --git a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h b/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h similarity index 100% rename from Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h rename to AvrAsyncSdk/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h diff --git a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h b/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h similarity index 100% rename from Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h rename to AvrAsyncSdk/Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h diff --git a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c b/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c similarity index 100% rename from Drivers/Timers/Timer_16_bit/src/timer_16_bit.c rename to AvrAsyncSdk/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c diff --git a/Drivers/Timers/Timer_8_bit/CMakeLists.txt b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/CMakeLists.txt similarity index 100% rename from Drivers/Timers/Timer_8_bit/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit/CMakeLists.txt diff --git a/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt similarity index 100% rename from Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt diff --git a/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c similarity index 100% rename from Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c diff --git a/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h similarity index 100% rename from Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h diff --git a/Drivers/Timers/Timer_8_bit/Tests/config.h b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/config.h similarity index 100% rename from Drivers/Timers/Timer_8_bit/Tests/config.h rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/config.h diff --git a/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp similarity index 100% rename from Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp diff --git a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h similarity index 100% rename from Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h diff --git a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h similarity index 100% rename from Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h diff --git a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c similarity index 100% rename from Drivers/Timers/Timer_8_bit/src/timer_8_bit.c rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c diff --git a/Drivers/Timers/Timer_8_bit_async/CMakeLists.txt b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/CMakeLists.txt similarity index 100% rename from Drivers/Timers/Timer_8_bit_async/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/CMakeLists.txt diff --git a/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt similarity index 100% rename from Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt diff --git a/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c similarity index 100% rename from Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c diff --git a/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.h b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.h similarity index 100% rename from Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.h rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.h diff --git a/Drivers/Timers/Timer_8_bit_async/Tests/config.h b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/config.h similarity index 100% rename from Drivers/Timers/Timer_8_bit_async/Tests/config.h rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/config.h diff --git a/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp similarity index 100% rename from Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp diff --git a/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h similarity index 100% rename from Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h diff --git a/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async_reg.h b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async_reg.h similarity index 100% rename from Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async_reg.h rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async_reg.h diff --git a/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c b/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c similarity index 100% rename from Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c rename to AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c diff --git a/Drivers/Timers/Timer_generic/CMakeLists.txt b/AvrAsyncSdk/Drivers/Timers/Timer_generic/CMakeLists.txt similarity index 100% rename from Drivers/Timers/Timer_generic/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Timers/Timer_generic/CMakeLists.txt diff --git a/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt b/AvrAsyncSdk/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt similarity index 100% rename from Drivers/Timers/Timer_generic/Tests/CMakeLists.txt rename to AvrAsyncSdk/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt diff --git a/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp b/AvrAsyncSdk/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp similarity index 100% rename from Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp rename to AvrAsyncSdk/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp diff --git a/Drivers/Timers/Timer_generic/inc/timer_generic.h b/AvrAsyncSdk/Drivers/Timers/Timer_generic/inc/timer_generic.h similarity index 100% rename from Drivers/Timers/Timer_generic/inc/timer_generic.h rename to AvrAsyncSdk/Drivers/Timers/Timer_generic/inc/timer_generic.h diff --git a/Drivers/Timers/Timer_generic/src/timer_generic.c b/AvrAsyncSdk/Drivers/Timers/Timer_generic/src/timer_generic.c similarity index 100% rename from Drivers/Timers/Timer_generic/src/timer_generic.c rename to AvrAsyncSdk/Drivers/Timers/Timer_generic/src/timer_generic.c diff --git a/Modules/CMakeLists.txt b/AvrAsyncSdk/Modules/CMakeLists.txt similarity index 100% rename from Modules/CMakeLists.txt rename to AvrAsyncSdk/Modules/CMakeLists.txt diff --git a/Modules/Pwm/Tests/Stubs/config.h b/AvrAsyncSdk/Modules/Pwm/Tests/Stubs/config.h similarity index 100% rename from Modules/Pwm/Tests/Stubs/config.h rename to AvrAsyncSdk/Modules/Pwm/Tests/Stubs/config.h diff --git a/Modules/Pwm/inc/pwm.h b/AvrAsyncSdk/Modules/Pwm/inc/pwm.h similarity index 100% rename from Modules/Pwm/inc/pwm.h rename to AvrAsyncSdk/Modules/Pwm/inc/pwm.h diff --git a/Modules/Pwm/src/pwm.c b/AvrAsyncSdk/Modules/Pwm/src/pwm.c similarity index 100% rename from Modules/Pwm/src/pwm.c rename to AvrAsyncSdk/Modules/Pwm/src/pwm.c diff --git a/Modules/Timebase/CMakeLists.txt b/AvrAsyncSdk/Modules/Timebase/CMakeLists.txt similarity index 100% rename from Modules/Timebase/CMakeLists.txt rename to AvrAsyncSdk/Modules/Timebase/CMakeLists.txt diff --git a/Modules/Timebase/Tests/CMakeLists.txt b/AvrAsyncSdk/Modules/Timebase/Tests/CMakeLists.txt similarity index 100% rename from Modules/Timebase/Tests/CMakeLists.txt rename to AvrAsyncSdk/Modules/Timebase/Tests/CMakeLists.txt diff --git a/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c b/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c similarity index 100% rename from Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c rename to AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c diff --git a/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.h b/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.h similarity index 100% rename from Modules/Timebase/Tests/Stubs/timer_16_bit_stub.h rename to AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.h diff --git a/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c b/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c similarity index 100% rename from Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c rename to AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c diff --git a/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.h b/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.h similarity index 100% rename from Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.h rename to AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.h diff --git a/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c b/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c similarity index 100% rename from Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c rename to AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c diff --git a/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.h b/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.h similarity index 100% rename from Modules/Timebase/Tests/Stubs/timer_8_bit_stub.h rename to AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.h diff --git a/Modules/Timebase/Tests/inc/config.h b/AvrAsyncSdk/Modules/Timebase/Tests/inc/config.h similarity index 100% rename from Modules/Timebase/Tests/inc/config.h rename to AvrAsyncSdk/Modules/Timebase/Tests/inc/config.h diff --git a/Modules/Timebase/Tests/timebase_tests.cpp b/AvrAsyncSdk/Modules/Timebase/Tests/timebase_tests.cpp similarity index 100% rename from Modules/Timebase/Tests/timebase_tests.cpp rename to AvrAsyncSdk/Modules/Timebase/Tests/timebase_tests.cpp diff --git a/Modules/Timebase/inc/timebase.h b/AvrAsyncSdk/Modules/Timebase/inc/timebase.h similarity index 100% rename from Modules/Timebase/inc/timebase.h rename to AvrAsyncSdk/Modules/Timebase/inc/timebase.h diff --git a/Modules/Timebase/inc/timebase_internal.h b/AvrAsyncSdk/Modules/Timebase/inc/timebase_internal.h similarity index 100% rename from Modules/Timebase/inc/timebase_internal.h rename to AvrAsyncSdk/Modules/Timebase/inc/timebase_internal.h diff --git a/Modules/Timebase/src/timebase.c b/AvrAsyncSdk/Modules/Timebase/src/timebase.c similarity index 100% rename from Modules/Timebase/src/timebase.c rename to AvrAsyncSdk/Modules/Timebase/src/timebase.c diff --git a/Scripts/avr-gdb-commands.gdb b/AvrAsyncSdk/Scripts/avr-gdb-commands.gdb similarity index 100% rename from Scripts/avr-gdb-commands.gdb rename to AvrAsyncSdk/Scripts/avr-gdb-commands.gdb diff --git a/Sensors/CMakeLists.txt b/AvrAsyncSdk/Sensors/CMakeLists.txt similarity index 100% rename from Sensors/CMakeLists.txt rename to AvrAsyncSdk/Sensors/CMakeLists.txt diff --git a/Sensors/Thermistor/CMakeLists.txt b/AvrAsyncSdk/Sensors/Thermistor/CMakeLists.txt similarity index 100% rename from Sensors/Thermistor/CMakeLists.txt rename to AvrAsyncSdk/Sensors/Thermistor/CMakeLists.txt diff --git a/Sensors/Thermistor/Tests/CMakeLists.txt b/AvrAsyncSdk/Sensors/Thermistor/Tests/CMakeLists.txt similarity index 100% rename from Sensors/Thermistor/Tests/CMakeLists.txt rename to AvrAsyncSdk/Sensors/Thermistor/Tests/CMakeLists.txt diff --git a/Sensors/Thermistor/Tests/Stubs/adc_stub.c b/AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/adc_stub.c similarity index 100% rename from Sensors/Thermistor/Tests/Stubs/adc_stub.c rename to AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/adc_stub.c diff --git a/Sensors/Thermistor/Tests/Stubs/adc_stub.h b/AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/adc_stub.h similarity index 100% rename from Sensors/Thermistor/Tests/Stubs/adc_stub.h rename to AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/adc_stub.h diff --git a/Sensors/Thermistor/Tests/Stubs/config.c b/AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/config.c similarity index 100% rename from Sensors/Thermistor/Tests/Stubs/config.c rename to AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/config.c diff --git a/Sensors/Thermistor/Tests/Stubs/config.h b/AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/config.h similarity index 100% rename from Sensors/Thermistor/Tests/Stubs/config.h rename to AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/config.h diff --git a/Sensors/Thermistor/Tests/thermistor_driver_tests.cpp b/AvrAsyncSdk/Sensors/Thermistor/Tests/thermistor_driver_tests.cpp similarity index 100% rename from Sensors/Thermistor/Tests/thermistor_driver_tests.cpp rename to AvrAsyncSdk/Sensors/Thermistor/Tests/thermistor_driver_tests.cpp diff --git a/Sensors/Thermistor/inc/thermistor.h b/AvrAsyncSdk/Sensors/Thermistor/inc/thermistor.h similarity index 100% rename from Sensors/Thermistor/inc/thermistor.h rename to AvrAsyncSdk/Sensors/Thermistor/inc/thermistor.h diff --git a/Sensors/Thermistor/private_inc/thermistor_private.h b/AvrAsyncSdk/Sensors/Thermistor/private_inc/thermistor_private.h similarity index 100% rename from Sensors/Thermistor/private_inc/thermistor_private.h rename to AvrAsyncSdk/Sensors/Thermistor/private_inc/thermistor_private.h diff --git a/Sensors/Thermistor/src/thermistor.c b/AvrAsyncSdk/Sensors/Thermistor/src/thermistor.c similarity index 100% rename from Sensors/Thermistor/src/thermistor.c rename to AvrAsyncSdk/Sensors/Thermistor/src/thermistor.c diff --git a/Tests/CMakeLists.txt b/AvrAsyncSdk/Tests/CMakeLists.txt similarity index 100% rename from Tests/CMakeLists.txt rename to AvrAsyncSdk/Tests/CMakeLists.txt diff --git a/Tests/gdb_commands.gdb b/AvrAsyncSdk/Tests/gdb_commands.gdb similarity index 100% rename from Tests/gdb_commands.gdb rename to AvrAsyncSdk/Tests/gdb_commands.gdb diff --git a/Tests/run_all_tests.sh b/AvrAsyncSdk/Tests/run_all_tests.sh similarity index 100% rename from Tests/run_all_tests.sh rename to AvrAsyncSdk/Tests/run_all_tests.sh diff --git a/Toolchain/avr8-gcc-toolchain.cmake b/AvrAsyncSdk/Toolchain/avr8-gcc-toolchain.cmake similarity index 100% rename from Toolchain/avr8-gcc-toolchain.cmake rename to AvrAsyncSdk/Toolchain/avr8-gcc-toolchain.cmake diff --git a/Utils/CMakeLists.txt b/AvrAsyncSdk/Utils/CMakeLists.txt similarity index 100% rename from Utils/CMakeLists.txt rename to AvrAsyncSdk/Utils/CMakeLists.txt diff --git a/Utils/inc/memutils.h b/AvrAsyncSdk/Utils/inc/memutils.h similarity index 100% rename from Utils/inc/memutils.h rename to AvrAsyncSdk/Utils/inc/memutils.h diff --git a/Utils/src/memutils.c b/AvrAsyncSdk/Utils/src/memutils.c similarity index 100% rename from Utils/src/memutils.c rename to AvrAsyncSdk/Utils/src/memutils.c From ab8444228f7bbcff76e5079304263eb592e03917 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Tue, 19 Oct 2021 10:29:14 +0200 Subject: [PATCH 04/51] Moved files and removed App folder Signed-off-by: bebenlebricolo --- App/CMakeLists.txt | 48 --- App/inc/config.h | 48 --- App/inc/driver_setup.h | 47 --- App/inc/module_setup.h | 42 --- App/inc/pin_mapping.h | 155 ---------- App/src/driver_setup.c | 283 ------------------ App/src/main.c | 280 ----------------- App/src/module_setup.c | 49 --- .../Drivers => Drivers}/Adc/CMakeLists.txt | 0 .../Adc/Tests/CMakeLists.txt | 0 .../Adc/Tests/Stub/adc_register_stub.c | 0 .../Adc/Tests/Stub/adc_register_stub.h | 0 .../Adc/Tests/Stub/test_isr_wrapper.h | 0 .../Adc/Tests/adc_driver_tests.cpp | 0 .../Adc/Tests/adc_stack_tests.cpp | 0 .../Drivers => Drivers}/Adc/inc/adc.h | 0 .../Drivers => Drivers}/Adc/inc/adc_reg.h | 0 .../Adc/private_inc/adc_stack.h | 0 .../Drivers => Drivers}/Adc/src/adc.c | 0 .../Drivers => Drivers}/Adc/src/adc_stack.c | 0 .../Drivers => Drivers}/CMakeLists.txt | 0 .../Drivers => Drivers}/I2c/CMakeLists.txt | 0 .../I2c/Examples/Readme.md | 0 .../master_firmware/App/CMakeLists.txt | 0 .../Examples/master_firmware/App/inc/config.h | 0 .../master_firmware/App/inc/pin_mapping.h | 0 .../App/inc/targeted_slave_i2c_interface.h | 0 .../Examples/master_firmware/App/src/main.c | 0 .../Examples/master_firmware/CMakeLists.txt | 0 .../slave_firmware/App/CMakeLists.txt | 0 .../Examples/slave_firmware/App/inc/config.h | 0 .../App/inc/i2c_slave_handler.h | 0 .../slave_firmware/App/inc/pin_mapping.h | 0 .../App/src/i2c_slave_handler.c | 0 .../Examples/slave_firmware/App/src/main.c | 0 .../Examples/slave_firmware/CMakeLists.txt | 0 .../Drivers => Drivers}/I2c/Readme.md | 0 .../I2c/Tests/CMakeLists.txt | 0 .../I2c/Tests/Stub/I2cBusSimulator.cpp | 0 .../I2c/Tests/Stub/I2cBusSimulator.hpp | 0 .../I2c/Tests/Stub/i2c_device_interface.h | 0 .../I2c/Tests/Stub/i2c_fake_device.c | 0 .../I2c/Tests/Stub/i2c_fake_device.h | 0 .../Stub/i2c_fake_slave_application_data.c | 0 .../Stub/i2c_fake_slave_application_data.h | 0 .../I2c/Tests/Stub/i2c_register_stub.c | 0 .../I2c/Tests/Stub/i2c_register_stub.h | 0 .../I2c/Tests/Stub/test_isr_stub.h | 0 .../I2c/Tests/Stub/twi_hardware_stub.c | 0 .../I2c/Tests/Stub/twi_hardware_stub.h | 0 .../Drivers => Drivers}/I2c/Tests/config.h | 0 .../I2c/Tests/i2c_driver_tests.cpp | 0 .../Drivers => Drivers}/I2c/inc/i2c.h | 0 .../Drivers => Drivers}/I2c/inc/i2c_private.h | 0 .../Drivers => Drivers}/I2c/inc/i2c_reg.h | 0 .../Drivers => Drivers}/I2c/src/i2c.c | 0 .../Drivers => Drivers}/Io/CMakeLists.txt | 0 .../Io/Tests/CMakeLists.txt | 0 .../Io/Tests/Stub/config.c | 0 .../Io/Tests/Stub/config.h | 0 .../Io/Tests/Stub/pinmapping.h | 0 .../Drivers => Drivers}/Io/Tests/io_tests.cpp | 0 {AvrAsyncSdk/Drivers => Drivers}/Io/inc/io.h | 0 {AvrAsyncSdk/Drivers => Drivers}/Io/src/io.c | 0 .../Lcd_screen/CMakeLists.txt | 0 .../Lcd_screen/Examples/App/CMakeLists.txt | 0 .../Lcd_screen/Examples/App/inc/config.h | 0 .../Examples/App/inc/driver_setup.h | 0 .../Examples/App/inc/module_setup.h | 0 .../Lcd_screen/Examples/App/inc/pin_mapping.h | 0 .../Examples/App/src/driver_setup.c | 0 .../Lcd_screen/Examples/App/src/main.c | 0 .../Examples/App/src/module_setup.c | 0 .../Lcd_screen/Examples/CMakeLists.txt | 0 .../Lcd_screen/Tests/CMakeLists.txt | 0 .../Lcd_screen/Tests/HD44780_lcd_tests.cpp | 0 .../Lcd_screen/Tests/Stub/i2c.h | 0 .../Lcd_screen/Tests/Stub/i2c_stub.c | 0 .../Lcd_screen/Tests/Stub/timebase.h | 0 .../Lcd_screen/Tests/Stub/timebase_stub.c | 0 .../Lcd_screen/inc/HD44780_lcd.h | 0 .../Lcd_screen/inc/HD44780_lcd_private.h | 0 .../Lcd_screen/src/HD44780_lcd.c | 0 .../Drivers => Drivers}/Timers/CMakeLists.txt | 0 .../Timers/Timer_16_bit/CMakeLists.txt | 0 .../Timers/Timer_16_bit/Tests/CMakeLists.txt | 0 .../Tests/Stub/timer_16_bit_registers_stub.c | 0 .../Tests/Stub/timer_16_bit_registers_stub.h | 0 .../Timers/Timer_16_bit/Tests/config.h | 0 .../Timer_16_bit/Tests/timer_16_bit_tests.cpp | 0 .../Timers/Timer_16_bit/inc/timer_16_bit.h | 0 .../Timer_16_bit/inc/timer_16_bit_reg.h | 0 .../Timers/Timer_16_bit/src/timer_16_bit.c | 0 .../Timers/Timer_8_bit/CMakeLists.txt | 0 .../Timers/Timer_8_bit/Tests/CMakeLists.txt | 0 .../Tests/Stub/timer_8_bit_registers_stub.c | 0 .../Tests/Stub/timer_8_bit_registers_stub.h | 0 .../Timers/Timer_8_bit/Tests/config.h | 0 .../Timer_8_bit/Tests/timer_8_bit_tests.cpp | 0 .../Timers/Timer_8_bit/inc/timer_8_bit.h | 0 .../Timers/Timer_8_bit/inc/timer_8_bit_reg.h | 0 .../Timers/Timer_8_bit/src/timer_8_bit.c | 0 .../Timers/Timer_8_bit_async/CMakeLists.txt | 0 .../Timer_8_bit_async/Tests/CMakeLists.txt | 0 .../Stub/timer_8_bit_async_registers_stub.c | 0 .../Stub/timer_8_bit_async_registers_stub.h | 0 .../Timers/Timer_8_bit_async/Tests/config.h | 0 .../Tests/timer_8_bit_async_tests.cpp | 0 .../Timer_8_bit_async/inc/timer_8_bit_async.h | 0 .../inc/timer_8_bit_async_reg.h | 0 .../Timer_8_bit_async/src/timer_8_bit_async.c | 0 .../Timers/Timer_generic/CMakeLists.txt | 0 .../Timers/Timer_generic/Tests/CMakeLists.txt | 0 .../Tests/timer_generic_tests.cpp | 0 .../Timers/Timer_generic/inc/timer_generic.h | 0 .../Timers/Timer_generic/src/timer_generic.c | 0 .../Modules => Modules}/CMakeLists.txt | 0 .../Pwm/Tests/Stubs/config.h | 0 .../Modules => Modules}/Pwm/inc/pwm.h | 0 .../Modules => Modules}/Pwm/src/pwm.c | 0 .../Timebase/CMakeLists.txt | 0 .../Timebase/Tests/CMakeLists.txt | 0 .../Timebase/Tests/Stubs/timer_16_bit_stub.c | 0 .../Timebase/Tests/Stubs/timer_16_bit_stub.h | 0 .../Tests/Stubs/timer_8_bit_async_stub.c | 0 .../Tests/Stubs/timer_8_bit_async_stub.h | 0 .../Timebase/Tests/Stubs/timer_8_bit_stub.c | 0 .../Timebase/Tests/Stubs/timer_8_bit_stub.h | 0 .../Timebase/Tests/inc/config.h | 0 .../Timebase/Tests/timebase_tests.cpp | 0 .../Timebase/inc/timebase.h | 0 .../Timebase/inc/timebase_internal.h | 0 .../Timebase/src/timebase.c | 0 .../Scripts => Scripts}/avr-gdb-commands.gdb | 0 .../Sensors => Sensors}/CMakeLists.txt | 0 .../Thermistor/CMakeLists.txt | 0 .../Thermistor/Tests/CMakeLists.txt | 0 .../Thermistor/Tests/Stubs/adc_stub.c | 0 .../Thermistor/Tests/Stubs/adc_stub.h | 0 .../Thermistor/Tests/Stubs/config.c | 0 .../Thermistor/Tests/Stubs/config.h | 0 .../Tests/thermistor_driver_tests.cpp | 0 .../Thermistor/inc/thermistor.h | 0 .../private_inc/thermistor_private.h | 0 .../Thermistor/src/thermistor.c | 0 {AvrAsyncSdk/Tests => Tests}/CMakeLists.txt | 0 {AvrAsyncSdk/Tests => Tests}/gdb_commands.gdb | 0 {AvrAsyncSdk/Tests => Tests}/run_all_tests.sh | 0 .../avr8-gcc-toolchain.cmake | 0 {AvrAsyncSdk/Utils => Utils}/CMakeLists.txt | 0 {AvrAsyncSdk/Utils => Utils}/inc/memutils.h | 0 {AvrAsyncSdk/Utils => Utils}/src/memutils.c | 0 152 files changed, 952 deletions(-) delete mode 100644 App/CMakeLists.txt delete mode 100644 App/inc/config.h delete mode 100644 App/inc/driver_setup.h delete mode 100644 App/inc/module_setup.h delete mode 100644 App/inc/pin_mapping.h delete mode 100644 App/src/driver_setup.c delete mode 100644 App/src/main.c delete mode 100644 App/src/module_setup.c rename {AvrAsyncSdk/Drivers => Drivers}/Adc/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Adc/Tests/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Adc/Tests/Stub/adc_register_stub.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Adc/Tests/Stub/adc_register_stub.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Adc/Tests/Stub/test_isr_wrapper.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Adc/Tests/adc_driver_tests.cpp (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Adc/Tests/adc_stack_tests.cpp (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Adc/inc/adc.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Adc/inc/adc_reg.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Adc/private_inc/adc_stack.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Adc/src/adc.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Adc/src/adc_stack.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/Readme.md (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/master_firmware/App/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/master_firmware/App/inc/config.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/master_firmware/App/inc/pin_mapping.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/master_firmware/App/inc/targeted_slave_i2c_interface.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/master_firmware/App/src/main.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/master_firmware/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/slave_firmware/App/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/slave_firmware/App/inc/config.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/slave_firmware/App/inc/pin_mapping.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/slave_firmware/App/src/i2c_slave_handler.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/slave_firmware/App/src/main.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Examples/slave_firmware/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Readme.md (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/I2cBusSimulator.cpp (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/I2cBusSimulator.hpp (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/i2c_device_interface.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/i2c_fake_device.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/i2c_fake_device.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/i2c_fake_slave_application_data.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/i2c_fake_slave_application_data.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/i2c_register_stub.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/i2c_register_stub.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/test_isr_stub.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/twi_hardware_stub.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/Stub/twi_hardware_stub.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/config.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/Tests/i2c_driver_tests.cpp (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/inc/i2c.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/inc/i2c_private.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/inc/i2c_reg.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/I2c/src/i2c.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Io/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Io/Tests/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Io/Tests/Stub/config.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Io/Tests/Stub/config.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Io/Tests/Stub/pinmapping.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Io/Tests/io_tests.cpp (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Io/inc/io.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Io/src/io.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Examples/App/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Examples/App/inc/config.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Examples/App/inc/driver_setup.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Examples/App/inc/module_setup.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Examples/App/inc/pin_mapping.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Examples/App/src/driver_setup.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Examples/App/src/main.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Examples/App/src/module_setup.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Examples/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Tests/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Tests/HD44780_lcd_tests.cpp (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Tests/Stub/i2c.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Tests/Stub/i2c_stub.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Tests/Stub/timebase.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/Tests/Stub/timebase_stub.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/inc/HD44780_lcd.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/inc/HD44780_lcd_private.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Lcd_screen/src/HD44780_lcd.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_16_bit/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_16_bit/Tests/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_16_bit/Tests/config.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_16_bit/inc/timer_16_bit.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_16_bit/inc/timer_16_bit_reg.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_16_bit/src/timer_16_bit.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit/Tests/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit/Tests/config.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit/inc/timer_8_bit.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit/inc/timer_8_bit_reg.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit/src/timer_8_bit.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit_async/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit_async/Tests/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit_async/Tests/config.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit_async/inc/timer_8_bit_async_reg.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_8_bit_async/src/timer_8_bit_async.c (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_generic/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_generic/Tests/CMakeLists.txt (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_generic/Tests/timer_generic_tests.cpp (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_generic/inc/timer_generic.h (100%) rename {AvrAsyncSdk/Drivers => Drivers}/Timers/Timer_generic/src/timer_generic.c (100%) rename {AvrAsyncSdk/Modules => Modules}/CMakeLists.txt (100%) rename {AvrAsyncSdk/Modules => Modules}/Pwm/Tests/Stubs/config.h (100%) rename {AvrAsyncSdk/Modules => Modules}/Pwm/inc/pwm.h (100%) rename {AvrAsyncSdk/Modules => Modules}/Pwm/src/pwm.c (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/CMakeLists.txt (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/Tests/CMakeLists.txt (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/Tests/Stubs/timer_16_bit_stub.c (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/Tests/Stubs/timer_16_bit_stub.h (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/Tests/Stubs/timer_8_bit_async_stub.c (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/Tests/Stubs/timer_8_bit_async_stub.h (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/Tests/Stubs/timer_8_bit_stub.c (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/Tests/Stubs/timer_8_bit_stub.h (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/Tests/inc/config.h (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/Tests/timebase_tests.cpp (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/inc/timebase.h (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/inc/timebase_internal.h (100%) rename {AvrAsyncSdk/Modules => Modules}/Timebase/src/timebase.c (100%) rename {AvrAsyncSdk/Scripts => Scripts}/avr-gdb-commands.gdb (100%) rename {AvrAsyncSdk/Sensors => Sensors}/CMakeLists.txt (100%) rename {AvrAsyncSdk/Sensors => Sensors}/Thermistor/CMakeLists.txt (100%) rename {AvrAsyncSdk/Sensors => Sensors}/Thermistor/Tests/CMakeLists.txt (100%) rename {AvrAsyncSdk/Sensors => Sensors}/Thermistor/Tests/Stubs/adc_stub.c (100%) rename {AvrAsyncSdk/Sensors => Sensors}/Thermistor/Tests/Stubs/adc_stub.h (100%) rename {AvrAsyncSdk/Sensors => Sensors}/Thermistor/Tests/Stubs/config.c (100%) rename {AvrAsyncSdk/Sensors => Sensors}/Thermistor/Tests/Stubs/config.h (100%) rename {AvrAsyncSdk/Sensors => Sensors}/Thermistor/Tests/thermistor_driver_tests.cpp (100%) rename {AvrAsyncSdk/Sensors => Sensors}/Thermistor/inc/thermistor.h (100%) rename {AvrAsyncSdk/Sensors => Sensors}/Thermistor/private_inc/thermistor_private.h (100%) rename {AvrAsyncSdk/Sensors => Sensors}/Thermistor/src/thermistor.c (100%) rename {AvrAsyncSdk/Tests => Tests}/CMakeLists.txt (100%) rename {AvrAsyncSdk/Tests => Tests}/gdb_commands.gdb (100%) rename {AvrAsyncSdk/Tests => Tests}/run_all_tests.sh (100%) rename {AvrAsyncSdk/Toolchain => Toolchain}/avr8-gcc-toolchain.cmake (100%) rename {AvrAsyncSdk/Utils => Utils}/CMakeLists.txt (100%) rename {AvrAsyncSdk/Utils => Utils}/inc/memutils.h (100%) rename {AvrAsyncSdk/Utils => Utils}/src/memutils.c (100%) diff --git a/App/CMakeLists.txt b/App/CMakeLists.txt deleted file mode 100644 index 4d4052e..0000000 --- a/App/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -add_executable(firmware - ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/driver_setup.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/module_setup.c -) - -# Produce a Map file -set (Map_file firmware.map) - -# Disable full debug optimizations for now -string(REPLACE "-Og" "-O0" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) - -set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wl,-Map=${Map_file}") -set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wl,-Map=${Map_file}") -set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -Wl,-Map=${Map_file}") -set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -Wl,-Map=${Map_file}") - -target_include_directories(firmware PUBLIC - ${CMAKE_SOURCE_DIR}/App/inc - ${CMAKE_SOURCE_DIR}/Drivers/Adc/inc - ${CMAKE_SOURCE_DIR}/Drivers/Timers/Timer_generic/inc - ${CMAKE_SOURCE_DIR}/Drivers/Timers/Timer_8_bit/inc - ${CMAKE_SOURCE_DIR}/Drivers/Timers/Timer_8_bit_async/inc - ${CMAKE_SOURCE_DIR}/Drivers/Timers/Timer_16_bit/inc - ${CMAKE_SOURCE_DIR}/Drivers/Lcd_screen/inc - ${CMAKE_SOURCE_DIR}/Drivers/I2c/inc - ${SIMAVR_INCLUDE_DIR} -) - -target_link_libraries(firmware - adc_driver - timer_8_bit_driver - timer_8_bit_async_driver - timer_16_bit_driver - i2c_driver - timebase_module - HD44780_lcd_driver - memutils -) - -set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT firmware) - -# Only add those targets if this is used on a Linux environment, as Atmel Studio already handles them itself - -if (CMAKE_HOST_UNIX) - message("-- Dealing with extra targets on Linux") - add_extra_avr_targets(firmware) -endif() diff --git a/App/inc/config.h b/App/inc/config.h deleted file mode 100644 index 64b5a7e..0000000 --- a/App/inc/config.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - ------------------- -@ -FreeMyCode version : 1.0 RC alpha - Author : bebenlebricolo - License : - name : GPLv3 - url : https://www.gnu.org/licenses/quick-guide-gplv3.html - Date : 12/02/2021 - Project : LabBenchPowerSupply - Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into - smaller ones, ranging from 0V to 16V, with voltage and current regulations -@ ------------------- - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_HEADER -#define CONFIG_HEADER - -/* Defines how many instances of timer/counters will be created */ -#define TIMER_8_BIT_COUNT 1 -#define TIMER_8_BIT_ASYNC_COUNT 1 -#define TIMER_16_BIT_COUNT 1 - -#define TIMEBASE_MAX_MODULES 3U -#define I2C_DEVICES_COUNT 1U - -// Only implement master tx driver -#define I2C_IMPLEM_MASTER_TX -//#define I2C_IMPLEM_FULL_DRIVER - -#define IO_MAX_PINS 6U - -#endif /* CONFIG_HEADER */ \ No newline at end of file diff --git a/App/inc/driver_setup.h b/App/inc/driver_setup.h deleted file mode 100644 index 8603730..0000000 --- a/App/inc/driver_setup.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - ------------------- -@ -FreeMyCode version : 1.0 RC alpha - Author : bebenlebricolo - License : - name : GPLv3 - url : https://www.gnu.org/licenses/quick-guide-gplv3.html - Date : 12/02/2021 - Project : LabBenchPowerSupply - Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into - smaller ones, ranging from 0V to 16V, with voltage and current regulations -@ ------------------- - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef DRIVER_SETUP_HEADER -#define DRIVER_SETUP_HEADER - -typedef enum -{ - DRIVER_SETUP_ERROR_OK, - DRIVER_SETUP_ERROR_INIT_FAILED, -} driver_setup_error_t; - -driver_setup_error_t driver_init_adc(void); -driver_setup_error_t driver_init_timer_0(void); -driver_setup_error_t driver_init_timer_1(void); -driver_setup_error_t driver_init_timer_2(void); -driver_setup_error_t driver_init_i2c(void); -driver_setup_error_t driver_init_lcd(void); - -#endif /* DRIVER_SETUP_HEADER */ \ No newline at end of file diff --git a/App/inc/module_setup.h b/App/inc/module_setup.h deleted file mode 100644 index fa45e43..0000000 --- a/App/inc/module_setup.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - ------------------- -@ -FreeMyCode version : 1.0 RC alpha - Author : bebenlebricolo - License : - name : GPLv3 - url : https://www.gnu.org/licenses/quick-guide-gplv3.html - Date : 12/02/2021 - Project : LabBenchPowerSupply - Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into - smaller ones, ranging from 0V to 16V, with voltage and current regulations -@ ------------------- - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef MODULE_SETUP_HEADER -#define MODULE_SETUP_HEADER - -typedef enum -{ - MODULE_SETUP_ERROR_OK, - MODULE_SETUP_ERROR_INIT_FAILED, -} module_setup_error_t; - -module_setup_error_t module_init_timebase(void); - -#endif /* MODULES_SETUP_HEADER */ \ No newline at end of file diff --git a/App/inc/pin_mapping.h b/App/inc/pin_mapping.h deleted file mode 100644 index cc2539e..0000000 --- a/App/inc/pin_mapping.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - ------------------- -@ -FreeMyCode version : 1.0 RC alpha - Author : bebenlebricolo - License : - name : GPLv3 - url : https://www.gnu.org/licenses/quick-guide-gplv3.html - Date : 12/02/2021 - Project : LabBenchPowerSupply - Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into - smaller ones, ranging from 0V to 16V, with voltage and current regulations -@ ------------------- - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef PIN_MAPPING_HEADER -#define PIN_MAPPING_HEADER - -#include - -// #################################################################################### -// ######################### Timers output compare pins ############################## -// #################################################################################### - -/* Timer 0 output compare pins */ -#define OC0A_PIN_NUMBER PORTD6 -#define OC0A_PORT_REG PORTD -#define OC0A_DDR_REG DDRD -#define OCOA_PIN_REG PIND - -#define OC0B_PIN_NUMBER PORTD5 -#define OC0B_PORT_REG PORTD -#define OC0B_DDR_REG DDRD -#define OCOB_PIN_REG PIND - -/* Timer 1 output compare pins */ -#define OC1A_PIN_NUMBER PORTB1 -#define OC1A_PORT_REG PORTB -#define OC1A_DDR_REG DDRB -#define OC1A_PIN_REG PINB - -#define OC1B_PIN_NUMBER PORTB2 -#define OC1B_PORT_REG PORTB -#define OC1B_DDR_REG DDRB -#define OC1B_PIN_REG PINB - -/* Timer 2 output compare pins */ -#define OC2A_PIN_NUMBER PORTB3 -#define OC2A_PORT_REG PORTB -#define OC2A_DDR_REG DDRB -#define OC2A_PIN_REG PINB - -#define OC2B_PIN_NUMBER PORTD3 -#define OC2B_PORT_REG PORTD -#define OC2B_DDR_REG DDRD -#define OC2B_PIN_REG PIND - -// #################################################################################### -// ######################### Buttons user interface ################################### -// #################################################################################### - -/* Buttons interface mapping */ -#define BUTTON_PLUS_PIN_NUMBER PORTD2 -#define BUTTON_PLUS_PORT_REG PORTD -#define BUTTON_PLUS_DDR_REG DDRD -#define BUTTON_PLUS_PIN_REG PIND - -#define BUTTON_MINUS_PIN_NUMBER PORTD3 -#define BUTTON_MINUS_PORT_REG PORTD -#define BUTTON_MINUS_DDR_REG DDRD -#define BUTTON_MINUS_PIN_REG PIND - -#define BUTTON_VARSELECT_PIN_NUMBER PORTD4 -#define BUTTON_VARSELECT_PORT_REG PORTD -#define BUTTON_VARSELECT_DDR_REG DDRD -#define BUTTON_VARSELECT_PIN_REG PIND - -#define BUTTON_MODE_PIN_NUMBER PORTD5 -#define BUTTON_MODE_PORT_REG PORTD -#define BUTTON_MODE_DDR_REG DDRD -#define BUTTON_MODE_PIN_REG PIND - -// #################################################################################### -// ######################### Power mosfet pins ######################################## -// #################################################################################### - -/* Mosfet controls */ -#define MOSFET_HIGH_SIDE_PIN_NUMBER PORTB1 // Wired to OC1A output -#define MOSFET_HIGH_SIDE_PORT_REG PORTB -#define MOSFET_HIGH_SIDE_DDR_REG DDRB -#define MOSFET_HIGH_SIDE_PIN_REG PINB - -#define MOSFET_LOW_SIDE_PIN_NUMBER PORTB2 // Wired to OC1B output -#define MOSFET_LOW_SIDE_PORT_REG PORTB -#define MOSFET_LOW_SIDE_DDR_REG DDRB -#define MOSFET_LOW_SIDE_PIN_REG PINB - -// #################################################################################### -// ######################### Fan control network ###################################### -// #################################################################################### - -/* Fan control network */ -#define FAN_CONTROL_PIN_NUMBER PORTD6 // which is wired to OC0A output -#define FAN_CONTROL_PORT_REG PORTD -#define FAN_CONTROL_DDR_REG DDRD -#define FAN_CONTROL_PIN_REG PIND - -// #################################################################################### -// ############################# Analog readings ###################################### -// #################################################################################### - -/* Temperature probe, analogic reading */ -#define TEMP_PROBE_PIN_NUMBER PORTC3 -#define TEMP_PROBE_PORT_REG PORTC -#define TEMP_PROBE_DDR_REG DDRC -#define TEMP_PROBE_PIN_REG PINC -#define TEMP_PROBE_ADC ADC3 - -/* Voltage analogic readings */ -#define SECONDARY_SMOOTHED_PIN_NUMBER PORTC2 -#define SECONDARY_SMOOTHED_PORT_REG PORTC -#define SECONDARY_SMOOTHED_DDR_REG DDRC -#define SECONDARY_SMOOTHED_PIN_REG PINC -#define SECONDARY_SMOOTHED_ADC ADC2 - -/* Voltage analogic readings */ -#define OUTVOLTAGE_SENSING_PIN_NUMBER PORTC1 -#define OUTVOLTAGE_SENSING_PORT_REG PORTC -#define OUTVOLTAGE_SENSING_DDR_REG DDRC -#define OUTVOLTAGE_SENSING_PIN_REG PINC -#define OUTVOLTAGE_SENSING_ADC ADC1 - -/* Voltage analogic readings */ -#define CURRENT_SENSING_PIN_NUMBER PORTC0 -#define CURRENT_SENSING_PORT_REG PORTC -#define CURRENT_SENSING_DDR_REG DDRC -#define CURRENT_SENSING_PIN_REG PINC -#define CURRENT_SENSING_ADC ADC0 - -#endif /* PIN_MAPPING_HEADER */ \ No newline at end of file diff --git a/App/src/driver_setup.c b/App/src/driver_setup.c deleted file mode 100644 index 4deb996..0000000 --- a/App/src/driver_setup.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - ------------------- -@ -FreeMyCode version : 1.0 RC alpha - Author : bebenlebricolo - License : - name : GPLv3 - url : https://www.gnu.org/licenses/quick-guide-gplv3.html - Date : 12/02/2021 - Project : LabBenchPowerSupply - Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into - smaller ones, ranging from 0V to 16V, with voltage and current regulations -@ ------------------- - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "driver_setup.h" - -#include -#include "adc.h" -#include "timer_8_bit.h" -#include "timer_8_bit_async.h" -#include "timer_16_bit.h" -#include "i2c.h" -#include "HD44780_lcd.h" - -#include "pin_mapping.h" -driver_setup_error_t driver_init_adc(void) -{ - adc_config_hal_t config; - adc_config_hal_get_default(&config); - config.prescaler = ADC_PRESCALER_64; - config.ref = ADC_VOLTAGE_REF_AVCC; - config.running_mode = ADC_RUNNING_MODE_SINGLE_SHOT; - config.supply_voltage_mv = 5000; - config.using_interrupt = true; - - - adc_error_t init_err = adc_base_init(&config); - if (ADC_ERROR_OK != init_err) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - return DRIVER_SETUP_ERROR_OK; -} - - -driver_setup_error_t driver_init_timer_0(void) -{ - timer_8_bit_config_t config; - timer_error_t local_error; - { - local_error = timer_8_bit_get_default_config(&config); - if (TIMER_ERROR_OK != local_error) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - } - - /* Configuring handle */ - config.handle.OCRA = &OCR0A; - config.handle.OCRB = &OCR0B; - config.handle.TCCRA = &TCCR0A; - config.handle.TCCRB = &TCCR0B; - config.handle.TCNT = &TCNT0; - config.handle.TIFR = &TIFR0; - config.handle.TIMSK = &TIMSK0; - - /* Enable OC0A and OC0B as outputs */ - OC0A_DDR_REG |= (1 << OC0A_PIN_NUMBER); - OC0B_DDR_REG |= (1 << OC0B_PIN_NUMBER); - - /* Set original port state of OC0A/OC0B pins before any OCRx overrides them */ - /* This is done in opposing polarities to respect mosfet push-pull driver pair starting point*/ - OC0A_PORT_REG |= (1 << OC0A_PIN_NUMBER); - OC0B_PORT_REG &= ~(1 << OC0B_PIN_NUMBER); - - /* Configuring timer */ - /* F_CPU = 16'000'000 Hz ; F_TIMER0 2'000'000 Hz*/ - /* 8-bit wide -> 256 values => F_PWM_0 = 7812 Hz*/ - config.timing_config.prescaler = TIMER8BIT_CLK_PRESCALER_8; - config.timing_config.waveform_mode = TIMER8BIT_WG_PWM_FAST_FULL_RANGE; - /* Invert OC0x behavior to provide a correct PWM for a push-pull driver pair */ - config.timing_config.comp_match_a = TIMER8BIT_CMOD_CLEAR_OCnX; - config.timing_config.comp_match_b = TIMER8BIT_CMOD_SET_OCnX; - /* Duty cycle : 39 % */ - config.timing_config.ocra_val = 99; - config.timing_config.ocrb_val = 99; - - { - local_error = timer_8_bit_init(0, &config); - if (TIMER_ERROR_OK != local_error) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - } - return DRIVER_SETUP_ERROR_OK; -} - -driver_setup_error_t driver_init_timer_1(void) -{ - timer_16_bit_config_t config; - timer_error_t local_error; - { - local_error = timer_16_bit_get_default_config(&config); - if (TIMER_ERROR_OK != local_error) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - } - - /* Configuring handle */ - config.handle.OCRA_H = &OCR1AH; - config.handle.OCRA_L = &OCR1AL; - config.handle.OCRB_H = &OCR1BH; - config.handle.OCRB_L = &OCR1BL; - config.handle.TCCRA = &TCCR1A; - config.handle.TCCRB = &TCCR1B; - config.handle.TCCRC = &TCCR1C; - config.handle.TCNT_H = &TCNT1H; - config.handle.TCNT_L = &TCNT1L; - config.handle.TIFR = &TIFR1; - config.handle.TIMSK = &TIMSK1; - config.handle.ICR_H = &ICR1H; - config.handle.ICR_L = &ICR1L; - - /* Enable OC0A and OC0B as outputs */ - /* PD6 = OC0A on arduino nano */ - /* PD5 = OC0B on arduino nano */ - OC1A_DDR_REG |= (1 << OC1A_PIN_NUMBER); - OC1B_DDR_REG |= (1 << OC1B_PIN_NUMBER); - - /* Set original port state of OC0A/OC0B pins before any OCRx overrides them */ - /* This is done in opposing polarities to respect mosfet push-pull driver pair starting point*/ - OC1A_PORT_REG |= (1 << OC1A_PIN_NUMBER); // Pulled to Vcc (low side of mosfet driver pulls mosfet's gate to ground) - OC1B_PORT_REG &= ~(1 << OC1B_PIN_NUMBER); // Pulled to ground (high side of mosfet driver is depleted) - - /* Configuring timer */ - /* F_CPU = 16'000'000 Hz ; F_TIMER0 2'000'000 Hz*/ - /* 10-bit wide -> 1024 values => F_PWM_1 = 1953 Hz*/ - config.timing_config.prescaler = TIMER16BIT_CLK_PRESCALER_8; - config.timing_config.waveform_mode = TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE; - /* Invert OC0x behavior to provide a correct PWM for a push-pull driver pair */ - config.timing_config.comp_match_a = TIMER16BIT_CMOD_CLEAR_OCnX; - config.timing_config.comp_match_b = TIMER16BIT_CMOD_SET_OCnX; - /* Duty cycle : 50 % */ - config.timing_config.ocra_val = 512; - config.timing_config.ocrb_val = 512; - - { - local_error = timer_16_bit_init(0, &config); - if (TIMER_ERROR_OK != local_error) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - } - return DRIVER_SETUP_ERROR_OK; -} - - -driver_setup_error_t driver_init_timer_2(void) -{ - timer_8_bit_async_config_t config; - timer_error_t local_error; - { - local_error = timer_8_bit_async_get_default_config(&config); - if (TIMER_ERROR_OK != local_error) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - } - - /* Configuring handle */ - config.handle.OCRA = &OCR2A; - config.handle.OCRB = &OCR2B; - config.handle.TCCRA = &TCCR2A; - config.handle.TCCRB = &TCCR2B; - config.handle.TCNT = &TCNT2; - config.handle.TIFR = &TIFR2; - config.handle.TIMSK = &TIMSK2; - config.handle.ASSR_REG = &ASSR; - - /* Enable OC0A and OC0B as outputs */ - OC2A_DDR_REG |= (1 << OC2A_PIN_NUMBER); - OC2B_DDR_REG |= (1 << OC2B_PIN_NUMBER); - - /* Set original port state of OC0A/OC0B pins before any OCRx overrides them */ - /* This is done in opposing polarities to respect mosfet push-pull driver pair starting point*/ - OC2A_PORT_REG |= (1 << OC2A_PIN_NUMBER); - OC2B_PORT_REG &= ~(1 << OC2B_PIN_NUMBER); - - /* Configuring timer */ - /* F_CPU = 16'000'000 Hz ; F_TIMER0 2'000'000 Hz*/ - /* 8-bit wide -> 256 values => F_PWM_2 = 7812 Hz*/ - config.timing_config.prescaler = TIMER8BIT_ASYNC_CLK_PRESCALER_8; - config.timing_config.waveform_mode = TIMER8BIT_ASYNC_WG_PWM_FAST_FULL_RANGE; - /* Invert OC0x behavior to provide a correct PWM for a push-pull driver pair */ - config.timing_config.comp_match_a = TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX; - config.timing_config.comp_match_b = TIMER8BIT_ASYNC_CMOD_SET_OCnX; - /* Duty cycle : 39 % */ - config.timing_config.ocra_val = 99; - config.timing_config.ocrb_val = 99; - - { - local_error = timer_8_bit_async_init(0, &config); - if (TIMER_ERROR_OK != local_error) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - } - return DRIVER_SETUP_ERROR_OK; -} - -driver_setup_error_t driver_init_i2c(void) -{ - i2c_config_t config = {0}; - i2c_error_t err = i2c_get_default_config(&config); - if (I2C_ERROR_OK != err) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - - // SCL frequency = F_CPU / (16 + 2 * bitrate * prescaler) - // 2 * bitrate * prescaler = (F_CPU / SCL frequency) - 16 - // targeted SCL frequency = 100'000 Hz - // -> bitrate * prescaler = 72 - // choose highest where 72 / prescaler is a pure integer number (prescaler = 4) - // then bitrate = (72/4) = 18 - 1 (-1 to account for the 0 based register value) = 17 - config.baudrate = 17U; - config.interrupt_enabled = false; - config.prescaler = I2C_PRESCALER_4; - config.slave.address = (0x32); - config.slave.enable = false; - config.handle._TWAMR = &TWAMR; - config.handle._TWAR = &TWAR; - config.handle._TWBR = &TWBR; - config.handle._TWCR = &TWCR; - config.handle._TWDR = &TWDR; - config.handle._TWSR = &TWSR; - - err = i2c_init(0U, &config); - if (I2C_ERROR_OK != err) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - return DRIVER_SETUP_ERROR_OK; -} - -driver_setup_error_t driver_init_lcd(void) -{ - hd44780_lcd_config_t config = {0}; - hd44780_lcd_error_t err = hd44780_lcd_get_default_config(&config); - - if (HD44780_LCD_ERROR_OK != err) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - - config.indexes.i2c = 0; - config.indexes.timebase = 0; - - err = hd44780_lcd_init(&config); - if (HD44780_LCD_ERROR_OK != err) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - - return DRIVER_SETUP_ERROR_OK; -} diff --git a/App/src/main.c b/App/src/main.c deleted file mode 100644 index 61673b1..0000000 --- a/App/src/main.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - ------------------- -@ -FreeMyCode version : 1.0 RC alpha - Author : bebenlebricolo - License : - name : GPLv3 - url : https://www.gnu.org/licenses/quick-guide-gplv3.html - Date : 12/02/2021 - Project : LabBenchPowerSupply - Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into - smaller ones, ranging from 0V to 16V, with voltage and current regulations -@ ------------------- - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "adc.h" -#include "timer_8_bit.h" -#include "timer_8_bit_async.h" -#include "timer_16_bit.h" -#include "HD44780_lcd.h" -#include "timebase.h" -#include "i2c.h" - -#include "driver_setup.h" -#include "module_setup.h" - -#include -#include - -#include - -#define MAX_MUX 5 - -static adc_mux_t mux_table[MAX_MUX] = -{ - ADC_MUX_ADC0, - ADC_MUX_ADC1, - ADC_MUX_ADC2, - ADC_MUX_ADC3, - ADC_MUX_ADC4, -}; - -static void error_handler(void); -static void bootup_sequence(void); -static driver_setup_error_t adc_register_all_channels(void); -static void adc_read_values(void); -static void print_data(void); - -ISR(ADC_vect) -{ - adc_isr_handler(); -} - -ISR(TIMER2_COMPA_vect) -{ - timebase_interrupt_callback(0U); -} - -int main(void) -{ - bootup_sequence(); - - i2c_error_t i2c_err = I2C_ERROR_OK; - - while(true) - { - i2c_err = i2c_process(0U); - (void) i2c_err; - adc_read_values(); - print_data(); - } - - return 0; -} - -/* ######################################################################################## - ########################## Static functions definitions ################################ - ######################################################################################## */ - -void adc_read_values(void) -{ - static uint8_t idx = 0; - adc_result_t results[5]; - adc_read_raw(mux_table[idx % MAX_MUX], &results[idx]); - - idx++; - idx %= MAX_MUX; -} - -void error_handler(void) -{ - while(1) - { - } -} - -driver_setup_error_t adc_register_all_channels(void) -{ - for (uint8_t i = 0; i < MAX_MUX ; i++) - { - adc_error_t err = adc_register_channel(mux_table[i]); - if (ADC_ERROR_OK != err) - { - return DRIVER_SETUP_ERROR_INIT_FAILED; - } - } - return DRIVER_SETUP_ERROR_OK; -} - -static void bootup_sequence(void) -{ - - driver_setup_error_t driver_init_error = DRIVER_SETUP_ERROR_OK; - module_setup_error_t module_init_error = MODULE_SETUP_ERROR_OK; - - /* Set up 8 bit timer 0 as 8 bit FAST PWM generator */ - driver_init_error = driver_init_timer_0(); - if (DRIVER_SETUP_ERROR_OK != driver_init_error) - { - error_handler(); - } - - /* Set up 16 bit timer 1 as 10 bit FAST PWM generator */ - driver_init_error = driver_init_timer_1(); - if (DRIVER_SETUP_ERROR_OK != driver_init_error) - { - error_handler(); - } - - /* Set up 8 bit timer 2 as 8 bit FAST PWM generator */ - driver_init_error = driver_init_timer_2(); - if (DRIVER_SETUP_ERROR_OK != driver_init_error) - { - error_handler(); - } - - module_init_error = module_init_timebase(); - if (MODULE_SETUP_ERROR_OK != module_init_error) - { - error_handler(); - } - - driver_init_error = driver_init_adc(); - if (DRIVER_SETUP_ERROR_OK != driver_init_error) - { - error_handler(); - } - - driver_init_error = driver_init_i2c(); - if (DRIVER_SETUP_ERROR_OK != driver_init_error) - { - error_handler(); - } - - driver_init_error = driver_init_lcd(); - if (DRIVER_SETUP_ERROR_OK != driver_init_error) - { - error_handler(); - } - - driver_init_error = adc_register_all_channels(); - if (DRIVER_SETUP_ERROR_OK != driver_init_error) - { - error_handler(); - } - - adc_start(); - sei(); - - /* Start both timers */ - timer_error_t timer_error = timer_8_bit_start(0); - if (TIMER_ERROR_OK != timer_error) - { - error_handler(); - } - timer_error = timer_16_bit_start(0); - if (TIMER_ERROR_OK != timer_error) - { - error_handler(); - } - timer_error = timer_8_bit_async_start(0); - if (TIMER_ERROR_OK != timer_error) - { - error_handler(); - } -} - -static void print_data(void) -{ - static char msg1[30] = "Hello World!"; - static char msg2[30] = "i = "; - static uint8_t state_count = 0; - static uint8_t iterations = 0; - static bool move_cursor = false; - - static char iteration_string[5] = ""; - - hd44780_lcd_state_t state = hd44780_lcd_get_state(); - hd44780_lcd_error_t err = HD44780_LCD_ERROR_OK; - - if (HD44780_LCD_STATE_READY != state) - { - err = hd44780_lcd_process(); - } - else - { - switch(state_count) - { - case 0 : - err = hd44780_lcd_set_display_on_off(true); - break; - case 1 : - err = hd44780_lcd_move_cursor_to_coord(0,0); - break; - case 2 : - err = hd44780_lcd_print(strnlen(msg1, 30U), msg1); - break; - case 3 : - err = hd44780_lcd_move_cursor_to_coord(1,0); - break; - case 4 : - err = hd44780_lcd_print(strnlen(msg2, 30U), msg2); - break; - case 5 : - err = hd44780_lcd_set_blinking_cursor(false); - break; - case 6: - err = hd44780_lcd_set_cursor_visible(false); - break; - case 7 : - if (move_cursor) - { - err = hd44780_lcd_move_cursor_to_coord(1, 4U); - move_cursor = false; - } - else - { - itoa(iterations, iteration_string, 10U); - int len = strnlen(iteration_string, 5U); - memset(&iteration_string[len], ' ', (5U - len)); - // Replace null-terminating characters in string - //for (uint8_t i = len ; i < 5U ; i++) - //{ - // if (iteration_string[i] == 0) - // { - // iteration_string[i] = ' '; - // } - //} - err = hd44780_lcd_print(3U, iteration_string); - iterations++; - move_cursor = true; - } - break; - - default: - break; - } - - if (state_count < 7U) - { - state_count++; - } - } - (void) err; -} diff --git a/App/src/module_setup.c b/App/src/module_setup.c deleted file mode 100644 index d54efaa..0000000 --- a/App/src/module_setup.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - ------------------- -@ -FreeMyCode version : 1.0 RC alpha - Author : bebenlebricolo - License : - name : GPLv3 - url : https://www.gnu.org/licenses/quick-guide-gplv3.html - Date : 12/02/2021 - Project : LabBenchPowerSupply - Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into - smaller ones, ranging from 0V to 16V, with voltage and current regulations -@ ------------------- - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "module_setup.h" -#include "timebase.h" - -module_setup_error_t module_init_timebase(void) -{ - timebase_config_t config = {0}; - config.cpu_freq = 16000000; - config.timer.index = 0; - config.timer.type = TIMEBASE_TIMER_8_BIT_ASYNC; - config.timescale = TIMEBASE_TIMESCALE_MILLISECONDS; - timebase_error_t err = timebase_init(0U, &config); - if (TIMEBASE_ERROR_OK != err) - { - return MODULE_SETUP_ERROR_INIT_FAILED; - } - return MODULE_SETUP_ERROR_OK; -} - - diff --git a/AvrAsyncSdk/Drivers/Adc/CMakeLists.txt b/Drivers/Adc/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/CMakeLists.txt rename to Drivers/Adc/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Adc/Tests/CMakeLists.txt b/Drivers/Adc/Tests/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/Tests/CMakeLists.txt rename to Drivers/Adc/Tests/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Adc/Tests/Stub/adc_register_stub.c b/Drivers/Adc/Tests/Stub/adc_register_stub.c similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/Tests/Stub/adc_register_stub.c rename to Drivers/Adc/Tests/Stub/adc_register_stub.c diff --git a/AvrAsyncSdk/Drivers/Adc/Tests/Stub/adc_register_stub.h b/Drivers/Adc/Tests/Stub/adc_register_stub.h similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/Tests/Stub/adc_register_stub.h rename to Drivers/Adc/Tests/Stub/adc_register_stub.h diff --git a/AvrAsyncSdk/Drivers/Adc/Tests/Stub/test_isr_wrapper.h b/Drivers/Adc/Tests/Stub/test_isr_wrapper.h similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/Tests/Stub/test_isr_wrapper.h rename to Drivers/Adc/Tests/Stub/test_isr_wrapper.h diff --git a/AvrAsyncSdk/Drivers/Adc/Tests/adc_driver_tests.cpp b/Drivers/Adc/Tests/adc_driver_tests.cpp similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/Tests/adc_driver_tests.cpp rename to Drivers/Adc/Tests/adc_driver_tests.cpp diff --git a/AvrAsyncSdk/Drivers/Adc/Tests/adc_stack_tests.cpp b/Drivers/Adc/Tests/adc_stack_tests.cpp similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/Tests/adc_stack_tests.cpp rename to Drivers/Adc/Tests/adc_stack_tests.cpp diff --git a/AvrAsyncSdk/Drivers/Adc/inc/adc.h b/Drivers/Adc/inc/adc.h similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/inc/adc.h rename to Drivers/Adc/inc/adc.h diff --git a/AvrAsyncSdk/Drivers/Adc/inc/adc_reg.h b/Drivers/Adc/inc/adc_reg.h similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/inc/adc_reg.h rename to Drivers/Adc/inc/adc_reg.h diff --git a/AvrAsyncSdk/Drivers/Adc/private_inc/adc_stack.h b/Drivers/Adc/private_inc/adc_stack.h similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/private_inc/adc_stack.h rename to Drivers/Adc/private_inc/adc_stack.h diff --git a/AvrAsyncSdk/Drivers/Adc/src/adc.c b/Drivers/Adc/src/adc.c similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/src/adc.c rename to Drivers/Adc/src/adc.c diff --git a/AvrAsyncSdk/Drivers/Adc/src/adc_stack.c b/Drivers/Adc/src/adc_stack.c similarity index 100% rename from AvrAsyncSdk/Drivers/Adc/src/adc_stack.c rename to Drivers/Adc/src/adc_stack.c diff --git a/AvrAsyncSdk/Drivers/CMakeLists.txt b/Drivers/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/CMakeLists.txt rename to Drivers/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/I2c/CMakeLists.txt b/Drivers/I2c/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/CMakeLists.txt rename to Drivers/I2c/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/Readme.md b/Drivers/I2c/Examples/Readme.md similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/Readme.md rename to Drivers/I2c/Examples/Readme.md diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/CMakeLists.txt b/Drivers/I2c/Examples/master_firmware/App/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/CMakeLists.txt rename to Drivers/I2c/Examples/master_firmware/App/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/config.h b/Drivers/I2c/Examples/master_firmware/App/inc/config.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/config.h rename to Drivers/I2c/Examples/master_firmware/App/inc/config.h diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/pin_mapping.h b/Drivers/I2c/Examples/master_firmware/App/inc/pin_mapping.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/pin_mapping.h rename to Drivers/I2c/Examples/master_firmware/App/inc/pin_mapping.h diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/targeted_slave_i2c_interface.h b/Drivers/I2c/Examples/master_firmware/App/inc/targeted_slave_i2c_interface.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/inc/targeted_slave_i2c_interface.h rename to Drivers/I2c/Examples/master_firmware/App/inc/targeted_slave_i2c_interface.h diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/src/main.c b/Drivers/I2c/Examples/master_firmware/App/src/main.c similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/App/src/main.c rename to Drivers/I2c/Examples/master_firmware/App/src/main.c diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/CMakeLists.txt b/Drivers/I2c/Examples/master_firmware/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/master_firmware/CMakeLists.txt rename to Drivers/I2c/Examples/master_firmware/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/CMakeLists.txt b/Drivers/I2c/Examples/slave_firmware/App/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/CMakeLists.txt rename to Drivers/I2c/Examples/slave_firmware/App/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/config.h b/Drivers/I2c/Examples/slave_firmware/App/inc/config.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/config.h rename to Drivers/I2c/Examples/slave_firmware/App/inc/config.h diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h b/Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h rename to Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/pin_mapping.h b/Drivers/I2c/Examples/slave_firmware/App/inc/pin_mapping.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/inc/pin_mapping.h rename to Drivers/I2c/Examples/slave_firmware/App/inc/pin_mapping.h diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/src/i2c_slave_handler.c b/Drivers/I2c/Examples/slave_firmware/App/src/i2c_slave_handler.c similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/src/i2c_slave_handler.c rename to Drivers/I2c/Examples/slave_firmware/App/src/i2c_slave_handler.c diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/src/main.c b/Drivers/I2c/Examples/slave_firmware/App/src/main.c similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/App/src/main.c rename to Drivers/I2c/Examples/slave_firmware/App/src/main.c diff --git a/AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/CMakeLists.txt b/Drivers/I2c/Examples/slave_firmware/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Examples/slave_firmware/CMakeLists.txt rename to Drivers/I2c/Examples/slave_firmware/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/I2c/Readme.md b/Drivers/I2c/Readme.md similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Readme.md rename to Drivers/I2c/Readme.md diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/CMakeLists.txt b/Drivers/I2c/Tests/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/CMakeLists.txt rename to Drivers/I2c/Tests/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/I2cBusSimulator.cpp b/Drivers/I2c/Tests/Stub/I2cBusSimulator.cpp similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/I2cBusSimulator.cpp rename to Drivers/I2c/Tests/Stub/I2cBusSimulator.cpp diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/I2cBusSimulator.hpp b/Drivers/I2c/Tests/Stub/I2cBusSimulator.hpp similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/I2cBusSimulator.hpp rename to Drivers/I2c/Tests/Stub/I2cBusSimulator.hpp diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_device_interface.h b/Drivers/I2c/Tests/Stub/i2c_device_interface.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_device_interface.h rename to Drivers/I2c/Tests/Stub/i2c_device_interface.h diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_device.c b/Drivers/I2c/Tests/Stub/i2c_fake_device.c similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_device.c rename to Drivers/I2c/Tests/Stub/i2c_fake_device.c diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_device.h b/Drivers/I2c/Tests/Stub/i2c_fake_device.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_device.h rename to Drivers/I2c/Tests/Stub/i2c_fake_device.h diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.c b/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.c similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.c rename to Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.c diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h b/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h rename to Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_register_stub.c b/Drivers/I2c/Tests/Stub/i2c_register_stub.c similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_register_stub.c rename to Drivers/I2c/Tests/Stub/i2c_register_stub.c diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_register_stub.h b/Drivers/I2c/Tests/Stub/i2c_register_stub.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/i2c_register_stub.h rename to Drivers/I2c/Tests/Stub/i2c_register_stub.h diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/test_isr_stub.h b/Drivers/I2c/Tests/Stub/test_isr_stub.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/test_isr_stub.h rename to Drivers/I2c/Tests/Stub/test_isr_stub.h diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/twi_hardware_stub.c b/Drivers/I2c/Tests/Stub/twi_hardware_stub.c similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/twi_hardware_stub.c rename to Drivers/I2c/Tests/Stub/twi_hardware_stub.c diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/Stub/twi_hardware_stub.h b/Drivers/I2c/Tests/Stub/twi_hardware_stub.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/Stub/twi_hardware_stub.h rename to Drivers/I2c/Tests/Stub/twi_hardware_stub.h diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/config.h b/Drivers/I2c/Tests/config.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/config.h rename to Drivers/I2c/Tests/config.h diff --git a/AvrAsyncSdk/Drivers/I2c/Tests/i2c_driver_tests.cpp b/Drivers/I2c/Tests/i2c_driver_tests.cpp similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/Tests/i2c_driver_tests.cpp rename to Drivers/I2c/Tests/i2c_driver_tests.cpp diff --git a/AvrAsyncSdk/Drivers/I2c/inc/i2c.h b/Drivers/I2c/inc/i2c.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/inc/i2c.h rename to Drivers/I2c/inc/i2c.h diff --git a/AvrAsyncSdk/Drivers/I2c/inc/i2c_private.h b/Drivers/I2c/inc/i2c_private.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/inc/i2c_private.h rename to Drivers/I2c/inc/i2c_private.h diff --git a/AvrAsyncSdk/Drivers/I2c/inc/i2c_reg.h b/Drivers/I2c/inc/i2c_reg.h similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/inc/i2c_reg.h rename to Drivers/I2c/inc/i2c_reg.h diff --git a/AvrAsyncSdk/Drivers/I2c/src/i2c.c b/Drivers/I2c/src/i2c.c similarity index 100% rename from AvrAsyncSdk/Drivers/I2c/src/i2c.c rename to Drivers/I2c/src/i2c.c diff --git a/AvrAsyncSdk/Drivers/Io/CMakeLists.txt b/Drivers/Io/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Io/CMakeLists.txt rename to Drivers/Io/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Io/Tests/CMakeLists.txt b/Drivers/Io/Tests/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Io/Tests/CMakeLists.txt rename to Drivers/Io/Tests/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Io/Tests/Stub/config.c b/Drivers/Io/Tests/Stub/config.c similarity index 100% rename from AvrAsyncSdk/Drivers/Io/Tests/Stub/config.c rename to Drivers/Io/Tests/Stub/config.c diff --git a/AvrAsyncSdk/Drivers/Io/Tests/Stub/config.h b/Drivers/Io/Tests/Stub/config.h similarity index 100% rename from AvrAsyncSdk/Drivers/Io/Tests/Stub/config.h rename to Drivers/Io/Tests/Stub/config.h diff --git a/AvrAsyncSdk/Drivers/Io/Tests/Stub/pinmapping.h b/Drivers/Io/Tests/Stub/pinmapping.h similarity index 100% rename from AvrAsyncSdk/Drivers/Io/Tests/Stub/pinmapping.h rename to Drivers/Io/Tests/Stub/pinmapping.h diff --git a/AvrAsyncSdk/Drivers/Io/Tests/io_tests.cpp b/Drivers/Io/Tests/io_tests.cpp similarity index 100% rename from AvrAsyncSdk/Drivers/Io/Tests/io_tests.cpp rename to Drivers/Io/Tests/io_tests.cpp diff --git a/AvrAsyncSdk/Drivers/Io/inc/io.h b/Drivers/Io/inc/io.h similarity index 100% rename from AvrAsyncSdk/Drivers/Io/inc/io.h rename to Drivers/Io/inc/io.h diff --git a/AvrAsyncSdk/Drivers/Io/src/io.c b/Drivers/Io/src/io.c similarity index 100% rename from AvrAsyncSdk/Drivers/Io/src/io.c rename to Drivers/Io/src/io.c diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/CMakeLists.txt b/Drivers/Lcd_screen/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/CMakeLists.txt rename to Drivers/Lcd_screen/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/CMakeLists.txt b/Drivers/Lcd_screen/Examples/App/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/CMakeLists.txt rename to Drivers/Lcd_screen/Examples/App/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/config.h b/Drivers/Lcd_screen/Examples/App/inc/config.h similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/config.h rename to Drivers/Lcd_screen/Examples/App/inc/config.h diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/driver_setup.h b/Drivers/Lcd_screen/Examples/App/inc/driver_setup.h similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/driver_setup.h rename to Drivers/Lcd_screen/Examples/App/inc/driver_setup.h diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/module_setup.h b/Drivers/Lcd_screen/Examples/App/inc/module_setup.h similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/module_setup.h rename to Drivers/Lcd_screen/Examples/App/inc/module_setup.h diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/pin_mapping.h b/Drivers/Lcd_screen/Examples/App/inc/pin_mapping.h similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/inc/pin_mapping.h rename to Drivers/Lcd_screen/Examples/App/inc/pin_mapping.h diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/driver_setup.c b/Drivers/Lcd_screen/Examples/App/src/driver_setup.c similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/driver_setup.c rename to Drivers/Lcd_screen/Examples/App/src/driver_setup.c diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/main.c b/Drivers/Lcd_screen/Examples/App/src/main.c similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/main.c rename to Drivers/Lcd_screen/Examples/App/src/main.c diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/module_setup.c b/Drivers/Lcd_screen/Examples/App/src/module_setup.c similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Examples/App/src/module_setup.c rename to Drivers/Lcd_screen/Examples/App/src/module_setup.c diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Examples/CMakeLists.txt b/Drivers/Lcd_screen/Examples/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Examples/CMakeLists.txt rename to Drivers/Lcd_screen/Examples/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Tests/CMakeLists.txt b/Drivers/Lcd_screen/Tests/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Tests/CMakeLists.txt rename to Drivers/Lcd_screen/Tests/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Tests/HD44780_lcd_tests.cpp b/Drivers/Lcd_screen/Tests/HD44780_lcd_tests.cpp similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Tests/HD44780_lcd_tests.cpp rename to Drivers/Lcd_screen/Tests/HD44780_lcd_tests.cpp diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/i2c.h b/Drivers/Lcd_screen/Tests/Stub/i2c.h similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/i2c.h rename to Drivers/Lcd_screen/Tests/Stub/i2c.h diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/i2c_stub.c b/Drivers/Lcd_screen/Tests/Stub/i2c_stub.c similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/i2c_stub.c rename to Drivers/Lcd_screen/Tests/Stub/i2c_stub.c diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/timebase.h b/Drivers/Lcd_screen/Tests/Stub/timebase.h similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/timebase.h rename to Drivers/Lcd_screen/Tests/Stub/timebase.h diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/timebase_stub.c b/Drivers/Lcd_screen/Tests/Stub/timebase_stub.c similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/Tests/Stub/timebase_stub.c rename to Drivers/Lcd_screen/Tests/Stub/timebase_stub.c diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/inc/HD44780_lcd.h b/Drivers/Lcd_screen/inc/HD44780_lcd.h similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/inc/HD44780_lcd.h rename to Drivers/Lcd_screen/inc/HD44780_lcd.h diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/inc/HD44780_lcd_private.h b/Drivers/Lcd_screen/inc/HD44780_lcd_private.h similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/inc/HD44780_lcd_private.h rename to Drivers/Lcd_screen/inc/HD44780_lcd_private.h diff --git a/AvrAsyncSdk/Drivers/Lcd_screen/src/HD44780_lcd.c b/Drivers/Lcd_screen/src/HD44780_lcd.c similarity index 100% rename from AvrAsyncSdk/Drivers/Lcd_screen/src/HD44780_lcd.c rename to Drivers/Lcd_screen/src/HD44780_lcd.c diff --git a/AvrAsyncSdk/Drivers/Timers/CMakeLists.txt b/Drivers/Timers/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/CMakeLists.txt rename to Drivers/Timers/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/CMakeLists.txt b/Drivers/Timers/Timer_16_bit/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_16_bit/CMakeLists.txt rename to Drivers/Timers/Timer_16_bit/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt b/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt rename to Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c b/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c rename to Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.h b/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.h rename to Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/config.h b/Drivers/Timers/Timer_16_bit/Tests/config.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/config.h rename to Drivers/Timers/Timer_16_bit/Tests/config.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp b/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp rename to Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h rename to Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h rename to Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c rename to Drivers/Timers/Timer_16_bit/src/timer_16_bit.c diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/CMakeLists.txt b/Drivers/Timers/Timer_8_bit/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit/CMakeLists.txt rename to Drivers/Timers/Timer_8_bit/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt b/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt rename to Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c b/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c rename to Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h b/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h rename to Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/config.h b/Drivers/Timers/Timer_8_bit/Tests/config.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/config.h rename to Drivers/Timers/Timer_8_bit/Tests/config.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp b/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp rename to Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h rename to Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h rename to Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c rename to Drivers/Timers/Timer_8_bit/src/timer_8_bit.c diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/CMakeLists.txt b/Drivers/Timers/Timer_8_bit_async/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/CMakeLists.txt rename to Drivers/Timers/Timer_8_bit_async/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt b/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt rename to Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c b/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c rename to Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.h b/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.h rename to Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/config.h b/Drivers/Timers/Timer_8_bit_async/Tests/config.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/config.h rename to Drivers/Timers/Timer_8_bit_async/Tests/config.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp b/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp rename to Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h b/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h rename to Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async_reg.h b/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async_reg.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async_reg.h rename to Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async_reg.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c b/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c rename to Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_generic/CMakeLists.txt b/Drivers/Timers/Timer_generic/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_generic/CMakeLists.txt rename to Drivers/Timers/Timer_generic/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt b/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt rename to Drivers/Timers/Timer_generic/Tests/CMakeLists.txt diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp b/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp rename to Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_generic/inc/timer_generic.h b/Drivers/Timers/Timer_generic/inc/timer_generic.h similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_generic/inc/timer_generic.h rename to Drivers/Timers/Timer_generic/inc/timer_generic.h diff --git a/AvrAsyncSdk/Drivers/Timers/Timer_generic/src/timer_generic.c b/Drivers/Timers/Timer_generic/src/timer_generic.c similarity index 100% rename from AvrAsyncSdk/Drivers/Timers/Timer_generic/src/timer_generic.c rename to Drivers/Timers/Timer_generic/src/timer_generic.c diff --git a/AvrAsyncSdk/Modules/CMakeLists.txt b/Modules/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Modules/CMakeLists.txt rename to Modules/CMakeLists.txt diff --git a/AvrAsyncSdk/Modules/Pwm/Tests/Stubs/config.h b/Modules/Pwm/Tests/Stubs/config.h similarity index 100% rename from AvrAsyncSdk/Modules/Pwm/Tests/Stubs/config.h rename to Modules/Pwm/Tests/Stubs/config.h diff --git a/AvrAsyncSdk/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h similarity index 100% rename from AvrAsyncSdk/Modules/Pwm/inc/pwm.h rename to Modules/Pwm/inc/pwm.h diff --git a/AvrAsyncSdk/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c similarity index 100% rename from AvrAsyncSdk/Modules/Pwm/src/pwm.c rename to Modules/Pwm/src/pwm.c diff --git a/AvrAsyncSdk/Modules/Timebase/CMakeLists.txt b/Modules/Timebase/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/CMakeLists.txt rename to Modules/Timebase/CMakeLists.txt diff --git a/AvrAsyncSdk/Modules/Timebase/Tests/CMakeLists.txt b/Modules/Timebase/Tests/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/Tests/CMakeLists.txt rename to Modules/Timebase/Tests/CMakeLists.txt diff --git a/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c b/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c rename to Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c diff --git a/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.h b/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.h similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.h rename to Modules/Timebase/Tests/Stubs/timer_16_bit_stub.h diff --git a/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c b/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c rename to Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c diff --git a/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.h b/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.h similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.h rename to Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.h diff --git a/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c b/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c rename to Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c diff --git a/AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.h b/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.h similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.h rename to Modules/Timebase/Tests/Stubs/timer_8_bit_stub.h diff --git a/AvrAsyncSdk/Modules/Timebase/Tests/inc/config.h b/Modules/Timebase/Tests/inc/config.h similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/Tests/inc/config.h rename to Modules/Timebase/Tests/inc/config.h diff --git a/AvrAsyncSdk/Modules/Timebase/Tests/timebase_tests.cpp b/Modules/Timebase/Tests/timebase_tests.cpp similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/Tests/timebase_tests.cpp rename to Modules/Timebase/Tests/timebase_tests.cpp diff --git a/AvrAsyncSdk/Modules/Timebase/inc/timebase.h b/Modules/Timebase/inc/timebase.h similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/inc/timebase.h rename to Modules/Timebase/inc/timebase.h diff --git a/AvrAsyncSdk/Modules/Timebase/inc/timebase_internal.h b/Modules/Timebase/inc/timebase_internal.h similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/inc/timebase_internal.h rename to Modules/Timebase/inc/timebase_internal.h diff --git a/AvrAsyncSdk/Modules/Timebase/src/timebase.c b/Modules/Timebase/src/timebase.c similarity index 100% rename from AvrAsyncSdk/Modules/Timebase/src/timebase.c rename to Modules/Timebase/src/timebase.c diff --git a/AvrAsyncSdk/Scripts/avr-gdb-commands.gdb b/Scripts/avr-gdb-commands.gdb similarity index 100% rename from AvrAsyncSdk/Scripts/avr-gdb-commands.gdb rename to Scripts/avr-gdb-commands.gdb diff --git a/AvrAsyncSdk/Sensors/CMakeLists.txt b/Sensors/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Sensors/CMakeLists.txt rename to Sensors/CMakeLists.txt diff --git a/AvrAsyncSdk/Sensors/Thermistor/CMakeLists.txt b/Sensors/Thermistor/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Sensors/Thermistor/CMakeLists.txt rename to Sensors/Thermistor/CMakeLists.txt diff --git a/AvrAsyncSdk/Sensors/Thermistor/Tests/CMakeLists.txt b/Sensors/Thermistor/Tests/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Sensors/Thermistor/Tests/CMakeLists.txt rename to Sensors/Thermistor/Tests/CMakeLists.txt diff --git a/AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/adc_stub.c b/Sensors/Thermistor/Tests/Stubs/adc_stub.c similarity index 100% rename from AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/adc_stub.c rename to Sensors/Thermistor/Tests/Stubs/adc_stub.c diff --git a/AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/adc_stub.h b/Sensors/Thermistor/Tests/Stubs/adc_stub.h similarity index 100% rename from AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/adc_stub.h rename to Sensors/Thermistor/Tests/Stubs/adc_stub.h diff --git a/AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/config.c b/Sensors/Thermistor/Tests/Stubs/config.c similarity index 100% rename from AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/config.c rename to Sensors/Thermistor/Tests/Stubs/config.c diff --git a/AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/config.h b/Sensors/Thermistor/Tests/Stubs/config.h similarity index 100% rename from AvrAsyncSdk/Sensors/Thermistor/Tests/Stubs/config.h rename to Sensors/Thermistor/Tests/Stubs/config.h diff --git a/AvrAsyncSdk/Sensors/Thermistor/Tests/thermistor_driver_tests.cpp b/Sensors/Thermistor/Tests/thermistor_driver_tests.cpp similarity index 100% rename from AvrAsyncSdk/Sensors/Thermistor/Tests/thermistor_driver_tests.cpp rename to Sensors/Thermistor/Tests/thermistor_driver_tests.cpp diff --git a/AvrAsyncSdk/Sensors/Thermistor/inc/thermistor.h b/Sensors/Thermistor/inc/thermistor.h similarity index 100% rename from AvrAsyncSdk/Sensors/Thermistor/inc/thermistor.h rename to Sensors/Thermistor/inc/thermistor.h diff --git a/AvrAsyncSdk/Sensors/Thermistor/private_inc/thermistor_private.h b/Sensors/Thermistor/private_inc/thermistor_private.h similarity index 100% rename from AvrAsyncSdk/Sensors/Thermistor/private_inc/thermistor_private.h rename to Sensors/Thermistor/private_inc/thermistor_private.h diff --git a/AvrAsyncSdk/Sensors/Thermistor/src/thermistor.c b/Sensors/Thermistor/src/thermistor.c similarity index 100% rename from AvrAsyncSdk/Sensors/Thermistor/src/thermistor.c rename to Sensors/Thermistor/src/thermistor.c diff --git a/AvrAsyncSdk/Tests/CMakeLists.txt b/Tests/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Tests/CMakeLists.txt rename to Tests/CMakeLists.txt diff --git a/AvrAsyncSdk/Tests/gdb_commands.gdb b/Tests/gdb_commands.gdb similarity index 100% rename from AvrAsyncSdk/Tests/gdb_commands.gdb rename to Tests/gdb_commands.gdb diff --git a/AvrAsyncSdk/Tests/run_all_tests.sh b/Tests/run_all_tests.sh similarity index 100% rename from AvrAsyncSdk/Tests/run_all_tests.sh rename to Tests/run_all_tests.sh diff --git a/AvrAsyncSdk/Toolchain/avr8-gcc-toolchain.cmake b/Toolchain/avr8-gcc-toolchain.cmake similarity index 100% rename from AvrAsyncSdk/Toolchain/avr8-gcc-toolchain.cmake rename to Toolchain/avr8-gcc-toolchain.cmake diff --git a/AvrAsyncSdk/Utils/CMakeLists.txt b/Utils/CMakeLists.txt similarity index 100% rename from AvrAsyncSdk/Utils/CMakeLists.txt rename to Utils/CMakeLists.txt diff --git a/AvrAsyncSdk/Utils/inc/memutils.h b/Utils/inc/memutils.h similarity index 100% rename from AvrAsyncSdk/Utils/inc/memutils.h rename to Utils/inc/memutils.h diff --git a/AvrAsyncSdk/Utils/src/memutils.c b/Utils/src/memutils.c similarity index 100% rename from AvrAsyncSdk/Utils/src/memutils.c rename to Utils/src/memutils.c From c75a7c6346a411c8b0e201395ce591eef960f3bc Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Tue, 19 Oct 2021 10:35:04 +0200 Subject: [PATCH 05/51] Removed Sensors as they are part of another library package Signed-off-by: bebenlebricolo --- CMakeLists.txt | 29 +-- Sensors/CMakeLists.txt | 4 - Sensors/Thermistor/CMakeLists.txt | 19 -- Sensors/Thermistor/Tests/CMakeLists.txt | 53 ----- Sensors/Thermistor/Tests/Stubs/adc_stub.c | 81 ------- Sensors/Thermistor/Tests/Stubs/adc_stub.h | 47 ---- Sensors/Thermistor/Tests/Stubs/config.c | 47 ---- Sensors/Thermistor/Tests/Stubs/config.h | 21 -- .../Tests/thermistor_driver_tests.cpp | 191 ---------------- Sensors/Thermistor/inc/thermistor.h | 144 ------------ .../private_inc/thermistor_private.h | 77 ------- Sensors/Thermistor/src/thermistor.c | 212 ------------------ 12 files changed, 6 insertions(+), 919 deletions(-) delete mode 100644 Sensors/CMakeLists.txt delete mode 100644 Sensors/Thermistor/CMakeLists.txt delete mode 100644 Sensors/Thermistor/Tests/CMakeLists.txt delete mode 100644 Sensors/Thermistor/Tests/Stubs/adc_stub.c delete mode 100644 Sensors/Thermistor/Tests/Stubs/adc_stub.h delete mode 100644 Sensors/Thermistor/Tests/Stubs/config.c delete mode 100644 Sensors/Thermistor/Tests/Stubs/config.h delete mode 100644 Sensors/Thermistor/Tests/thermistor_driver_tests.cpp delete mode 100644 Sensors/Thermistor/inc/thermistor.h delete mode 100644 Sensors/Thermistor/private_inc/thermistor_private.h delete mode 100644 Sensors/Thermistor/src/thermistor.c diff --git a/CMakeLists.txt b/CMakeLists.txt index b873ace..c928c31 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,34 +1,17 @@ cmake_minimum_required(VERSION 3.20) -# Use AVR GCC toolchain -set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/Toolchain/avr8-gcc-toolchain.cmake) -project(LabBenchPowerSupply_Firmware C) +# Use AVR GCC toolchain +set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Toolchain/avr8-gcc-toolchain.cmake) -set(AVR_MCU atmega328p) -set(AVR_MCU_SPEED 16000000) +project(AvrAsyncCoreLibs C) set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD 11) -add_compile_definitions( - F_CPU=${AVR_MCU_SPEED} - __AVR_ATmega328P__ - I2C_IMPLEM_MASTER_FULL -) -add_compile_options(-mmcu=${AVR_MCU}) - -set(CMAKE_EXE_LINKER_FLAGS "-mmcu=${AVR_MCU}") - -if(CMAKE_BUILD_TYPE MATCHES Debug) - add_definitions(-DDEBUG_WITH_SIMAVR) -endif() - # This variable is needed by some drivers in order to locate the config.h file # Provided by the application set (CONFIG_FILE_DIR ${CMAKE_SOURCE_DIR}/App/inc) -add_subdirectory(${CMAKE_SOURCE_DIR}/Utils) -add_subdirectory(${CMAKE_SOURCE_DIR}/Drivers) -add_subdirectory(${CMAKE_SOURCE_DIR}/Modules) -add_subdirectory(${CMAKE_SOURCE_DIR}/Sensors) -add_subdirectory(${CMAKE_SOURCE_DIR}/App) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Drivers) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Modules) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Utils) diff --git a/Sensors/CMakeLists.txt b/Sensors/CMakeLists.txt deleted file mode 100644 index 5c78b6f..0000000 --- a/Sensors/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -cmake_minimum_required(VERSION 3.0) - -add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Thermistor) - diff --git a/Sensors/Thermistor/CMakeLists.txt b/Sensors/Thermistor/CMakeLists.txt deleted file mode 100644 index 165c8cc..0000000 --- a/Sensors/Thermistor/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -cmake_minimum_required(VERSION 3.0) - -add_library(thermistor_driver STATIC - ${CMAKE_CURRENT_SOURCE_DIR}/src/thermistor.c -) - -target_include_directories(thermistor_driver PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/inc - ${CONFIG_FILE_DIR} - ${AVR_INCLUDES} -) - -target_include_directories(thermistor_driver PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/private_inc - ${CONFIG_FILE_DIR} - ${AVR_INCLUDES} -) - -target_link_libraries(thermistor_driver adc_driver) \ No newline at end of file diff --git a/Sensors/Thermistor/Tests/CMakeLists.txt b/Sensors/Thermistor/Tests/CMakeLists.txt deleted file mode 100644 index a8130ba..0000000 --- a/Sensors/Thermistor/Tests/CMakeLists.txt +++ /dev/null @@ -1,53 +0,0 @@ -cmake_minimum_required(VERSION 3.0) - -project(thermistor_test) - -######### Compile tested modules as individual libraries ######### - -### thermistor_driver library ### -add_library(thermistor_driver STATIC - ${CMAKE_CURRENT_SOURCE_DIR}/../src/thermistor.c -) -target_include_directories(thermistor_driver PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/../inc - ${CMAKE_CURRENT_SOURCE_DIR}/../private_inc - ${CMAKE_CURRENT_SOURCE_DIR}/../../../Drivers/Adc/inc - ${CMAKE_CURRENT_SOURCE_DIR}/Stubs -) - -target_compile_definitions(thermistor_driver PRIVATE - -DUNIT_TESTING -) - - -########## Thermistor driver tests ########## - -add_executable(thermistor_driver_test - ${CMAKE_CURRENT_SOURCE_DIR}/thermistor_driver_tests.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Stubs/config.c - ${CMAKE_CURRENT_SOURCE_DIR}/Stubs/adc_stub.c -) - -target_compile_definitions(thermistor_driver_test PRIVATE - -DUNIT_TESTING -) - -target_include_directories(thermistor_driver_test PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/../inc - ${CMAKE_CURRENT_SOURCE_DIR}/Stubs -) - -target_include_directories(thermistor_driver_test SYSTEM PUBLIC - ${GTEST_INCLUDE_DIRS} -) - -if(WIN32) - target_link_libraries(thermistor_driver_test thermistor_driver ${GTEST_LIBRARIES}) -else() - target_link_libraries(thermistor_driver_test thermistor_driver ${GTEST_LIBRARIES} pthread) -endif() - -set_target_properties(thermistor_driver_test - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/Thermistor -) diff --git a/Sensors/Thermistor/Tests/Stubs/adc_stub.c b/Sensors/Thermistor/Tests/Stubs/adc_stub.c deleted file mode 100644 index a99016e..0000000 --- a/Sensors/Thermistor/Tests/Stubs/adc_stub.c +++ /dev/null @@ -1,81 +0,0 @@ -#include - -#include "adc.h" -#include "adc_stub.h" - -static struct -{ - adc_mux_t channel; - adc_millivolts_t reading; - bool registered; -} stub_registered_channels[ADC_MUX_COUNT] = { - {.channel = ADC_MUX_ADC0}, - {.channel = ADC_MUX_ADC1}, - {.channel = ADC_MUX_ADC2}, - {.channel = ADC_MUX_ADC3}, - {.channel = ADC_MUX_ADC4}, - {.channel = ADC_MUX_ADC5}, - {.channel = ADC_MUX_ADC6}, - {.channel = ADC_MUX_ADC7}, - {.channel = ADC_MUX_INTERNAL_TEMPERATURE}, - {.channel = ADC_MUX_1v1_REF}, - {.channel = ADC_MUX_GND}, -}; - -static adc_error_t yielded_error = ADC_ERROR_OK; - -adc_error_t adc_read_millivolt(const adc_mux_t channel, adc_millivolts_t * const reading) -{ - if (!stub_registered_channels[channel].registered) - { - return ADC_ERROR_CHANNEL_NOT_FOUND; - } - - if (reading == NULL) - { - return ADC_ERROR_NULL_POINTER; - } - - *reading = stub_registered_channels[channel].reading; - - return yielded_error; -} - -void stub_adc_set_readings(const adc_mux_t channel, const adc_millivolts_t reading) -{ - stub_registered_channels[channel].reading = reading; -} - -void stub_adc_clear_readings(void) -{ - for (uint8_t i = 0 ; i < ADC_MUX_COUNT ; i++) - { - stub_registered_channels[i].reading = 0; - } -} - -void stub_adc_register_channel(const adc_mux_t channel) -{ - stub_registered_channels[channel].registered = true; -} - -void stub_adc_clear_registered_channels(void) -{ - for (uint8_t i = 0 ; i < ADC_MUX_COUNT ; i++) - { - stub_registered_channels[i].registered = false; - } -} - -void stub_adc_clear_all(void) -{ - stub_adc_clear_registered_channels(); - stub_adc_clear_readings(); - yielded_error = ADC_ERROR_OK; -} - -void stub_adc_set_error(const adc_error_t error) -{ - yielded_error = error; -} - diff --git a/Sensors/Thermistor/Tests/Stubs/adc_stub.h b/Sensors/Thermistor/Tests/Stubs/adc_stub.h deleted file mode 100644 index 1f1b288..0000000 --- a/Sensors/Thermistor/Tests/Stubs/adc_stub.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef ADC_STUB_HEADER -#define ADC_STUB_HEADER - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "adc.h" - -#define ADC_STUB_MAX_READINGS 5U - -/** - * @brief updates internal data storage for selected adc channel -*/ -void stub_adc_set_readings(const adc_mux_t channel, const adc_millivolts_t reading); - -/** - * @brief clears all fakes adc readings -*/ -void stub_adc_clear_readings(void); - -/** - * @brief performs a fake channel registration, as if it has effectively been registered by application program -*/ -void stub_adc_register_channel(const adc_mux_t channel); - -/** - * @brief clears registered channels -*/ -void stub_adc_clear_registered_channels(void); - -/** - * @brief resets this fake driver -*/ -void stub_adc_clear_all(void); - -/** - * @brief sets the adc_error_t that functions will return -*/ -void stub_adc_set_error(const adc_error_t error); - -#ifdef __cplusplus -} -#endif - -#endif /* ADC_STUB_HEADER */ \ No newline at end of file diff --git a/Sensors/Thermistor/Tests/Stubs/config.c b/Sensors/Thermistor/Tests/Stubs/config.c deleted file mode 100644 index a3583aa..0000000 --- a/Sensors/Thermistor/Tests/Stubs/config.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "config.h" -#include "thermistor.h" - -static const thermistor_curve_discrete_t hot_side_curve = -{ - .count = 5U, - .data = { - {100, 25}, /**< hot half is always less than 1, so we can retrieve percentages by multiplying by 100 to ease computations */ - {25, 39}, - {7, 53}, - {3, 64}, - {1, 77}, - } -}; - -static const thermistor_curve_discrete_t cold_side_curve = -{ - .count = 6U, - .data = { - {16, 1}, /**< cold half exceeds ratio exceeds 1 so we don't multiply the ratio by 100 to get correct computation */ - {12, 3}, - {8, 6}, - {4, 12}, - {2, 19}, - {1, 25} - } -}; - -thermistor_config_t thermistor_driver_config[THERMISTOR_MAX_SENSORS] = -{ - { - .adc_index = THERMISTOR_CONFIG_ADC_INDEX, - .model = - { - .curve = - { - .data = {.discrete.hot_side = &hot_side_curve, - .discrete.cold_side = &cold_side_curve}, - .type = THERMISTOR_CURVE_DISCRETE - }, - .bridge_res = 20U, - .calibration.resistance = 20U, - .calibration.temperature = 25U, - .ref_voltage = 5000, - } - } -}; \ No newline at end of file diff --git a/Sensors/Thermistor/Tests/Stubs/config.h b/Sensors/Thermistor/Tests/Stubs/config.h deleted file mode 100644 index 3c03266..0000000 --- a/Sensors/Thermistor/Tests/Stubs/config.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef CONFIG_STUB_HEADER -#define CONFIG_STUB_HEADER - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "adc.h" - -#define THERMISTOR_MAX_SAMPLES_COUNT 8U -#define THERMISTOR_MAX_SENSORS 1U - -#define THERMISTOR_CONFIG_ADC_INDEX (ADC_MUX_ADC1) - - -#ifdef __cplusplus -} -#endif - -#endif /* CONFIG_STUB_HEADER */ \ No newline at end of file diff --git a/Sensors/Thermistor/Tests/thermistor_driver_tests.cpp b/Sensors/Thermistor/Tests/thermistor_driver_tests.cpp deleted file mode 100644 index e95eb86..0000000 --- a/Sensors/Thermistor/Tests/thermistor_driver_tests.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* - ------------------- -@ -FreeMyCode version : 1.0 RC alpha - Author : bebenlebricolo - License : - name : GPLv3 - url : https://www.gnu.org/licenses/quick-guide-gplv3.html - Date : 12/02/2021 - Project : LabBenchPowerSupply - Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into - smaller ones, ranging from 0V to 16V, with voltage and current regulations -@ ------------------- - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include "gtest/gtest.h" - -#include "config.h" -#include "adc_stub.h" -#include "thermistor.h" -#include "thermistor_private.h" - -TEST(thermistor_tests, test_find_segment) -{ - uint8_t target_ratio = 11; - thermistor_curve_discrete_pair_t const * lower_bound = NULL; - thermistor_curve_discrete_pair_t const * upper_bound = NULL; - bool ret = find_segment(thermistor_driver_config[0].model.curve.data.discrete.cold_side, target_ratio, RATIO_COEF_1, &lower_bound, &upper_bound ); - ASSERT_TRUE(ret); - ASSERT_EQ(lower_bound->ratio, 12U); - ASSERT_EQ(upper_bound->ratio, 8U); - - // Using the x10 representation, actual ratio is 8 - target_ratio = 80U; - ret = find_segment(thermistor_driver_config[0].model.curve.data.discrete.cold_side, target_ratio, RATIO_COEF_10, &lower_bound, &upper_bound ); - ASSERT_TRUE(ret); - ASSERT_EQ(lower_bound->ratio, 8U); - ASSERT_EQ(upper_bound->ratio, 8U); - ASSERT_EQ(lower_bound, upper_bound); - - // Using the x10 representation, actual ratio is 8 - target_ratio = 63U; - ret = find_segment(thermistor_driver_config[0].model.curve.data.discrete.cold_side, target_ratio, RATIO_COEF_10, &lower_bound, &upper_bound ); - ASSERT_TRUE(ret); - ASSERT_EQ(lower_bound->ratio, 8U); - ASSERT_EQ(upper_bound->ratio, 4U); - - // Using the x100 representation, actual ratio is 0.53 (53%) - target_ratio = 53U; - ret = find_segment(thermistor_driver_config[0].model.curve.data.discrete.hot_side, target_ratio, RATIO_COEF_100, &lower_bound, &upper_bound ); - ASSERT_TRUE(ret); - ASSERT_EQ(lower_bound->ratio, 100U); - ASSERT_EQ(upper_bound->ratio, 25U); - - // Using the x100 representation, actual ratio is 0.53 (53%) - target_ratio = 0U; - ret = find_segment(thermistor_driver_config[0].model.curve.data.discrete.hot_side, target_ratio, RATIO_COEF_100, &lower_bound, &upper_bound ); - ASSERT_FALSE(ret); - ASSERT_EQ(lower_bound->ratio, 1U); - ASSERT_EQ(upper_bound->ratio, 1U); -} - -TEST(thermistor_tests, test_compute_ratios) -{ - // Cold side first - adc_millivolts_t reading = 2125U; - uint8_t ratio = 0; - ratio_coefficients_t coef = compute_ratio(&thermistor_driver_config[0].model, &reading, &ratio); - ASSERT_EQ(coef, RATIO_COEF_10); - ASSERT_EQ(ratio, 13U); - - reading = 1200U; - coef = compute_ratio(&thermistor_driver_config[0].model, &reading, &ratio); - ASSERT_EQ(coef, RATIO_COEF_10); - ASSERT_EQ(ratio, 31U); - - reading = 250U; - coef = compute_ratio(&thermistor_driver_config[0].model, &reading, &ratio); - ASSERT_EQ(coef, RATIO_COEF_1); - ASSERT_EQ(ratio, 19); - - reading = 120U; - coef = compute_ratio(&thermistor_driver_config[0].model, &reading, &ratio); - ASSERT_EQ(coef, RATIO_COEF_1); - ASSERT_EQ(ratio, 40); - - // Hot side - reading = 3000U; - coef = compute_ratio(&thermistor_driver_config[0].model, &reading, &ratio); - ASSERT_EQ(coef, RATIO_COEF_100); - ASSERT_EQ(ratio, 65); - - reading = 4500U; - coef = compute_ratio(&thermistor_driver_config[0].model, &reading, &ratio); - ASSERT_EQ(coef, RATIO_COEF_100); - ASSERT_EQ(ratio, 10U); -} - -TEST(thermistor_tests, test_compute_temperature) -{ - adc_millivolts_t reading = 2125U; - int8_t temp = compute_temperature(0, &reading); - ASSERT_EQ(temp, 23U); - - reading = 2500U; - temp = compute_temperature(0, &reading); - ASSERT_EQ(temp, 25U); - - reading = 2700U; - temp = compute_temperature(0, &reading); - ASSERT_EQ(temp, 27U); - - reading = 3200U; - temp = compute_temperature(0, &reading); - ASSERT_EQ(temp, 33U); - - reading = 4123U; - temp = compute_temperature(0, &reading); - ASSERT_EQ(temp, 42U); - - reading = 4980U; - temp = compute_temperature(0, &reading); - ASSERT_EQ(temp, 77); -} - - -TEST(thermistor_tests, test_process_sensors) -{ - adc_millivolts_t reading = 2125U; - thermistor_error_t error = THERMISTOR_ERR_OK; - int8_t temperature = 0; - stub_adc_set_readings(THERMISTOR_CONFIG_ADC_INDEX, reading); - - stub_adc_set_error(ADC_ERROR_CONFIG); - error = thermistor_process(); - ASSERT_EQ(error, THERMISTOR_ERR_WRONG_CONFIG); - - stub_adc_register_channel(ADC_MUX_ADC1); - - stub_adc_set_error(ADC_ERROR_OK); - error = thermistor_process(); - ASSERT_EQ(error, THERMISTOR_ERR_OK); - error = thermistor_read(0U, &temperature); - EXPECT_EQ(temperature, 23U); - - reading = 2000; - stub_adc_set_readings(THERMISTOR_CONFIG_ADC_INDEX, reading); - error = thermistor_process(); - ASSERT_EQ(error, THERMISTOR_ERR_OK); - error = thermistor_read(0U, &temperature); - ASSERT_EQ(error, THERMISTOR_ERR_OK); - EXPECT_EQ(temperature, 22); - - reading = 3200U; - stub_adc_set_readings(THERMISTOR_CONFIG_ADC_INDEX, reading); - error = thermistor_process(); - ASSERT_EQ(error, THERMISTOR_ERR_OK); - error = thermistor_read(0U, &temperature); - ASSERT_EQ(error, THERMISTOR_ERR_OK); - EXPECT_EQ(temperature, 33); - - reading = 4980U; - stub_adc_set_readings(THERMISTOR_CONFIG_ADC_INDEX, reading); - error = thermistor_process(); - ASSERT_EQ(error, THERMISTOR_ERR_OK); - error = thermistor_read(0U, &temperature); - ASSERT_EQ(error, THERMISTOR_ERR_OK); - EXPECT_EQ(temperature, 77); - -} - -int main(int argc, char **argv) -{ - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} \ No newline at end of file diff --git a/Sensors/Thermistor/inc/thermistor.h b/Sensors/Thermistor/inc/thermistor.h deleted file mode 100644 index 663f66c..0000000 --- a/Sensors/Thermistor/inc/thermistor.h +++ /dev/null @@ -1,144 +0,0 @@ -#ifndef THERMISTOR_HEADER -#define THERMISTOR_HEADER - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include - -#include "adc.h" -#include "config.h" - -#ifndef THERMISTOR_CURVE_MAX_SAMPLES -#define THERMISTOR_CURVE_MAX_SAMPLES 16U -#endif - -#ifndef THERMISTOR_MAX_THERMISTORS -#define THERMISTOR_MAX_THERMISTORS 1U -#endif - -/** - * @brief Thermistor sensor error types -*/ -typedef enum -{ - THERMISTOR_ERR_OK, - THERMISTOR_ERR_WRONG_CONFIG, - THERMISTOR_ERR_INDEX_OUT_OF_BOUNDS, -} thermistor_error_t; - - -/** - * @brief thermistor intrinsic type (positive thermal coefficient, negative thermal coefficient, ...) -*/ -typedef enum -{ - THERMISTOR_CURVE_LINEAR, /**< Linear curve */ - THERMISTOR_CURVE_DISCRETE, /**< Discrete points (requires array of data for the modeled thermistor) */ -} thermistor_curve_type_t; - -typedef struct -{ - uint8_t ratio; /**< Rtherm/Rcalibration */ - int8_t temperature; /**< matching temperature in Celsius degrees (°C) */ -} thermistor_curve_discrete_pair_t; - -/** - * @brief discrete curve implementation. Curve should be filled with consecutive data points with no doubles - * List of points should be ordered as well. -*/ -typedef struct -{ - thermistor_curve_discrete_pair_t data[THERMISTOR_CURVE_MAX_SAMPLES / 2U + 1]; /**< Hot half curve (ratio <= 1) */ - uint8_t count; /**< Stores how many samples are used in this curve */ -} thermistor_curve_discrete_t; - -/** - * @brief linear curve using classic affine equation of type T = a.X + b - * where : - * - T : temperature (Kelvin) - * - a : temperature coefficient - * - b : offset -*/ -typedef struct -{ - int8_t coefficient; /**< Linear coefficient using first order approximation */ - int8_t offset; /**< Offset for linear equation */ -} thermistor_curve_linear_t; - -/** - * @brief represents a basic curve using samples -*/ -typedef struct -{ - thermistor_curve_type_t type; /**< curve type, either discrete or linear curve */ - union - { - struct - { - thermistor_curve_discrete_t const * hot_side; /**< hot side curve, where ratio is between 0 and 1 */ - thermistor_curve_discrete_t const * cold_side; /**< cold side curve, when ratio is above 1 */ - } discrete; - thermistor_curve_linear_t * linear; /**< Linear curve in case we need to use one */ - } data; -} thermistor_curve_t; - -/** - * @brief Describes a thermistor model using all calibration parameters and data coming from the thermistor. - * We do not rely on -*/ -typedef struct -{ - struct - { - uint8_t resistance; /**< Calibration resistance for the modelised thermistance (in kOhms) */ - int8_t temperature; /**< Calibration temperature for the modelised thermistance (in Kelvin) */ - } calibration; - - uint8_t bridge_res; /**< Divider bridge resistance (in kOhms) */ - adc_millivolts_t ref_voltage; /**< Reference voltage being used by ADC on MCU analog input pin (in millivolts) */ - thermistor_curve_t curve; /**< Thermistor modeled curve (either linear equation or discrete curve) */ -} thermistor_model_t; - -/** - * @brief configuration structure for thermistor driver -*/ -typedef struct -{ - adc_mux_t adc_index; /**< Index of adc input to be requested to adc driver */ - thermistor_model_t model; /**< Thermistor model used */ -} thermistor_config_t; - -/** - * @brief configures thermistor driver using static configuration (@see thermistor_driver_config symbol) - * @return thermistor driver errors -*/ -thermistor_error_t thermistor_init(void); - -/** - * @brief reads temperature for a given sensor (fetched data from internal data bank, thermistor_process function should be called to - * update stored data) - * @see thermistor_process - * @param[in] index : index of targeted thermistor driver - * @param[out] temp : computed temperature -*/ -thermistor_error_t thermistor_read(const uint8_t index, int8_t * temp); - -/** - * @brief scans all registered thermistors and compute temperatures -*/ -thermistor_error_t thermistor_process(void); - -/** - * @brief this extern symbol has to be implemented by application code. Usually, this is done in a config.c file - * whose symbols are linked when building the whole application -*/ -extern thermistor_config_t thermistor_driver_config[THERMISTOR_MAX_THERMISTORS]; - -#ifdef __cplusplus -} -#endif - -#endif /* THERMISTOR_HEADER */ \ No newline at end of file diff --git a/Sensors/Thermistor/private_inc/thermistor_private.h b/Sensors/Thermistor/private_inc/thermistor_private.h deleted file mode 100644 index c49e600..0000000 --- a/Sensors/Thermistor/private_inc/thermistor_private.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef THERMISTOR_PRIVATE_HEADER -#define THERMISTOR_PRIVATE_HEADER - - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "thermistor.h" - -/** - * @brief this enum is used internally to correctly express the resistance ratio number - * without loosing too much of the precious digits, but fitting within a uint8_t enveloppe. - * Handling this kind of things adds a bit more code to the program (bigger flash footprint) but allows - * more fine-grain computation over a wide range of ratios number, ensuring ratios stay within the 0-255 range. -*/ -typedef enum -{ - RATIO_COEF_1 = 1U, /**< Ratio is expressed without scaling (1:1) scale */ - RATIO_COEF_10 = 10U, /**< Ratio is expressed as 10 times the actual effective ratio (10:1) scale */ - RATIO_COEF_100 = 100U, /**< Ratio is expressed as 100 times the actual ratio (100:1) scale */ -} ratio_coefficients_t; - -/** - * @brief implements a dichotomic search (binary search) to help finding the right - * data interval. Data is rejected whenever given ratio is out of bounds, and in case of exact match, - * both lower_bound and upper_bound points to the same data pair. - * @param[in] curve : input curve used to find the including interval - * @param[in] ratio : thermistor resistance ratio (nominal resistance over calibration resistance) - * @param[out] lower_bound : lower bound of the found interval - * @param[out] upper_bound : upper bound of the found interval - * @return true or false. false means input ratio is out of bounds ; this algorithm does not extrapolate. -*/ -bool find_segment(thermistor_curve_discrete_t const * const curve, - const uint8_t ratio, - const ratio_coefficients_t coef, - thermistor_curve_discrete_pair_t const ** lower_bound, - thermistor_curve_discrete_pair_t const ** upper_bound); - -/** - * @brief computes a temperature using sensor index and an appropriate sensor reading - * @param[in] index : sensor index - * @param[in] reading : analogic value read from the sensor's adc pin - * @return processed temperature value. - * INT8_MIN is returned in case of error (@see limits.h) -*/ -int8_t compute_temperature(const uint8_t index, adc_millivolts_t * reading); - - -/** - * @brief calculates thermistor ratio (Rth/R0) where : - * - Rth : current resistance of thermistance - * - R0 : calibration resistance of thermistance (usually 25°C / 298.15K) - * And returns a ratio_coefficient_t enum value to indicate the scale used by the ratio number to accurately represent it later. - * This is useful because we want to restrict data usage as much as possible to prevent bloating the flash with unecessary data, so a bit - * of code is sacrificed to help reduce the ram footprint. - * - * For instance, ratio could be encoded with : - * | scale | ratio values | - * | 1:1 | >= 10 | - * | 10:1 | [1,10] | - * | 100:1 | [0,1] | - * - * @param[in] model : thermistor model as configured in config.c - * @param[in] reading : adc reading in millivolt for a given sensor - * @param[out] ratio : output calculated ratio - * @return ratio coefficient used to depict ratio's current scaling -*/ -ratio_coefficients_t compute_ratio(thermistor_model_t const * const model, const adc_millivolts_t * reading, uint8_t * const ratio); - - -#ifdef __cplusplus -} -#endif - -#endif /* THERMISTOR_PRIVATE_HEADER */ \ No newline at end of file diff --git a/Sensors/Thermistor/src/thermistor.c b/Sensors/Thermistor/src/thermistor.c deleted file mode 100644 index 973ee21..0000000 --- a/Sensors/Thermistor/src/thermistor.c +++ /dev/null @@ -1,212 +0,0 @@ -#include "thermistor.h" -#include "thermistor_private.h" - -#define RATIO_POSITIVE_LOWER_LIMIT 10U - -static int8_t temperatures[THERMISTOR_MAX_THERMISTORS] = {0}; - -thermistor_error_t thermistor_read(const uint8_t index, int8_t * temp) -{ - if (index >= THERMISTOR_MAX_THERMISTORS) - { - return THERMISTOR_ERR_INDEX_OUT_OF_BOUNDS; - } - - *temp = temperatures[index]; - return THERMISTOR_ERR_OK; -} - -thermistor_error_t thermistor_init(void) -{ - return THERMISTOR_ERR_OK; -} - -thermistor_error_t thermistor_process(void) -{ - adc_millivolts_t reading = 0; - adc_error_t err = ADC_ERROR_OK; - for (uint8_t i = 0 ; i < THERMISTOR_MAX_THERMISTORS ; i++) - { - err = adc_read_millivolt(thermistor_driver_config[i].adc_index, &reading); - if (err != ADC_ERROR_OK) - { - return THERMISTOR_ERR_WRONG_CONFIG; - } - temperatures[i] = compute_temperature(i, &reading); - } - return THERMISTOR_ERR_OK; -} - - -bool find_segment(thermistor_curve_discrete_t const * const curve, - const uint8_t ratio, - const ratio_coefficients_t coef, - thermistor_curve_discrete_pair_t const ** lower_bound, - thermistor_curve_discrete_pair_t const ** upper_bound) -{ - uint8_t index = 0; - uint8_t upper_idx = curve->count - 1; - uint8_t lower_idx = 0; - uint8_t rcoef = 1; - - // Special case where ratio is expressed as 10x the real ratio, to prevent data loss - // This only works for that particular value, interpolation is the same for the 1x and 100x cases however because data is directly - // encoded like this in the curves. - if (RATIO_COEF_10 == coef) - { - rcoef = (uint8_t) coef; - } - - // Reject out of bounds values - if (ratio > (curve->data[0].ratio * rcoef)) - { - *lower_bound = &curve->data[0]; - *upper_bound = *lower_bound; - return false; - } - - if(ratio < (curve->data[curve->count - 1].ratio * rcoef)) - { - *lower_bound = &curve->data[curve->count - 1]; - *upper_bound = *lower_bound; - return false; - } - - while((upper_idx - lower_idx) > 1) - { - index = ((upper_idx - lower_idx) / 2) + lower_idx; - uint16_t current_ratio = curve->data[index].ratio * rcoef; - - // Exact match, we need to return the two exact same data pair then - if (ratio == current_ratio) - { - lower_idx = index; - upper_idx = index; - break; - } - - // Curves are written in reverse order (maximum ratio first, cold temperatures first) - if (ratio > current_ratio) - { - upper_idx = index; - } - else - { - lower_idx = index; - } - } - - *lower_bound = &curve->data[lower_idx]; - *upper_bound = &curve->data[upper_idx]; - - return true; -} - -/** - * Vcc - * ┌┴┐ - * │/│ } Thermistor - * └┬┘ - * ├───── > Vout - * ┌┴┐ - * │ │ } Bridge resistor (low side configuration) - * └┬┘ - * ╧ -*/ -int8_t compute_temperature(const uint8_t index, adc_millivolts_t * reading) -{ - int8_t temperature = 0; - uint8_t ratio = 0; - - ratio_coefficients_t coef = compute_ratio(&thermistor_driver_config[index].model, reading, &ratio); - - // Determine if we need to evaluate the cold side or not. - // "Hot" side is characterized by a resistance lower than the calibration resistance, with ratios lower than 1 so we need - // to scale up (multiply) the thermistor value by 100 in order to get the ratio from 0 to 100% - // - // On the cold side however, ratio always exceed 1 so we can perform a direct calculation with the parameters. - // This time, ratio is used to express a value which is always greater than 100%, so we save some memory space by only using the integer portion of the number. - if (thermistor_driver_config[index].model.curve.type == THERMISTOR_CURVE_DISCRETE) - { - thermistor_curve_discrete_pair_t const * lower_bound = NULL; - thermistor_curve_discrete_pair_t const * upper_bound = NULL; - bool found = true; - thermistor_curve_discrete_t const * curve = NULL; - if (coef == RATIO_COEF_100) - { - curve = thermistor_driver_config[index].model.curve.data.discrete.hot_side; - } - else - { - curve = thermistor_driver_config[index].model.curve.data.discrete.cold_side; - } - - found = find_segment(curve, ratio, coef, &lower_bound, &upper_bound); - - // If not found, take the lowest temperature of the range as a default value - if (!found) - { - temperature = lower_bound->temperature; - } - else - { - uint8_t rcoef = 1U; - - // Same remark as somewhere above : special case handling only for the 10x case where curves are not encoded with this 10x rule (because we'll lose data) - // This case is an in-between case ; RATIO_COEF_1 and RATIO_COEF_100 work just fine as curves already contain correctly encoded data - // Note: we would not have such an issue with uint16_t (up to ratios 65+), but this consumes a lot of FLASH/SRAM for nothing. - if (RATIO_COEF_10 == coef) - { - rcoef = (uint8_t) coef; - } - - uint16_t numerator_part = (ratio - (lower_bound->ratio * rcoef)) * (lower_bound->temperature - upper_bound->temperature); - uint16_t denominator_part = rcoef * (lower_bound->ratio - upper_bound->ratio); - temperature = (numerator_part / denominator_part) + lower_bound->temperature; - } - } - else - { - // Do nothing for now (not yet implemented) - } - - return temperature; -} - -ratio_coefficients_t compute_ratio(thermistor_model_t const * const model, const adc_millivolts_t * reading, uint8_t * const ratio) -{ - ratio_coefficients_t coef = RATIO_COEF_1; - - // Vcc - Vout - adc_millivolts_t potential_diff = (model->ref_voltage - *reading); - - // ((Vcc - Vout) * Rbridge) / Vout - uint16_t thermistor_value = (potential_diff * model->bridge_res) / *reading; - - if (thermistor_value >= model->calibration.resistance ) - { - // Perform upscaled calculation first, then decide if we need to downscale it or not - // This is done this way to get the maximum resolution first (thermistor value * 100) * 10 - // Then we can decimate the result if need be. - // Curves are still changing quite fast around ratios close to 1,2,3,4, so that's why we may use a bit more precise - // ratio evaluation. For instance, if computed ratio equals 1.7, integer arithmetic will truncate it to 1 and we won't be able to interpolate between 1 and 2 ratio values. - - uint16_t tmp_ratio = (thermistor_value * 1000) / (uint16_t) model->calibration.resistance; - if ((tmp_ratio / 1000U) < RATIO_POSITIVE_LOWER_LIMIT) - { - coef = RATIO_COEF_10; - *ratio = tmp_ratio / 100U; - } - else - { - *ratio = tmp_ratio / 1000U; - } - } - else - { - coef = RATIO_COEF_100; - *ratio = thermistor_value * 100U / model->calibration.resistance; - } - - return coef; -} \ No newline at end of file From e38ce89c3128677d0ef93917437355ff89449da8 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Tue, 19 Oct 2021 10:45:26 +0200 Subject: [PATCH 06/51] Fixed tests CMakelists.txt after extraction Signed-off-by: bebenlebricolo --- .gitignore | 2 ++ Tests/CMakeLists.txt | 49 ++++++++++++++++++++------------------------ 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index c6127b3..a4930d7 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,5 @@ modules.order Module.symvers Mkfile.old dkms.conf + +build/ \ No newline at end of file diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 8e08de9..923ebee 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.20) -project(LabBenchPowerSupply_FirmwareTests C CXX) +project(AvrAsyncCoreLibs_Tests C CXX) find_package(GTest REQUIRED) enable_testing() @@ -30,51 +30,46 @@ endif() -set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -add_subdirectory( ${CMAKE_SOURCE_DIR}/../Drivers/Adc/Tests - ${CMAKE_BINARY_DIR}/Tests/Adc +set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) +add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/Adc/Tests + ${CMAKE_CURRENT_BINARY_DIR}/Tests/Adc ) # Memory utils library -add_subdirectory( ${CMAKE_SOURCE_DIR}/../Utils - ${CMAKE_BINARY_DIR}/Tests/Utils +add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Utils + ${CMAKE_CURRENT_BINARY_DIR}/Tests/Utils ) # Timer drivers -add_subdirectory( ${CMAKE_SOURCE_DIR}/../Drivers/Timers/Timer_generic/Tests - ${CMAKE_BINARY_DIR}/Tests/Drivers/Timers/Timer_generic +add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/Timers/Timer_generic/Tests + ${CMAKE_CURRENT_BINARY_DIR}/Tests/Drivers/Timers/Timer_generic ) -add_subdirectory( ${CMAKE_SOURCE_DIR}/../Drivers/Timers/Timer_8_bit/Tests - ${CMAKE_BINARY_DIR}/Tests/Drivers/Timers/Timer_8_bit +add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/Timers/Timer_8_bit/Tests + ${CMAKE_CURRENT_BINARY_DIR}/Tests/Drivers/Timers/Timer_8_bit ) -add_subdirectory( ${CMAKE_SOURCE_DIR}/../Drivers/Timers/Timer_8_bit_async/Tests - ${CMAKE_BINARY_DIR}/Tests/Drivers/Timers/Timer_8_bit_async +add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/Timers/Timer_8_bit_async/Tests + ${CMAKE_CURRENT_BINARY_DIR}/Tests/Drivers/Timers/Timer_8_bit_async ) -add_subdirectory( ${CMAKE_SOURCE_DIR}/../Drivers/Timers/Timer_16_bit/Tests - ${CMAKE_BINARY_DIR}/Tests/Drivers/Timers/Timer_16_bit +add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/Timers/Timer_16_bit/Tests + ${CMAKE_CURRENT_BINARY_DIR}/Tests/Drivers/Timers/Timer_16_bit ) # I2C driver -add_subdirectory( ${CMAKE_SOURCE_DIR}/../Drivers/I2c/Tests - ${CMAKE_BINARY_DIR}/Tests/Drivers/I2c +add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/I2c/Tests + ${CMAKE_CURRENT_BINARY_DIR}/Tests/Drivers/I2c ) # LCD Screen HD44780 driver -add_subdirectory( ${CMAKE_SOURCE_DIR}/../Drivers/Lcd_screen/Tests - ${CMAKE_BINARY_DIR}/Tests/Drivers/Lcd_screen +add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/Lcd_screen/Tests + ${CMAKE_CURRENT_BINARY_DIR}/Tests/Drivers/Lcd_screen ) # Io driver -add_subdirectory( ${CMAKE_SOURCE_DIR}/../Drivers/Io/Tests - ${CMAKE_BINARY_DIR}/Tests/Drivers/Io -) - -# Thermistor driver -add_subdirectory( ${CMAKE_SOURCE_DIR}/../Sensors/Thermistor/Tests - ${CMAKE_BINARY_DIR}/Tests/Sensors/Thermistor +add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/Io/Tests + ${CMAKE_CURRENT_BINARY_DIR}/Tests/Drivers/Io ) # Modules -add_subdirectory( ${CMAKE_SOURCE_DIR}/../Modules/Timebase/Tests - ${CMAKE_BINARY_DIR}/Tests/Modules/Timebase +add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Modules/Timebase/Tests + ${CMAKE_CURRENT_BINARY_DIR}/Tests/Modules/Timebase ) \ No newline at end of file From 1acf33ee85e9d85767800126a8810cefcc6e4489 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 23 Feb 2022 17:02:41 +0100 Subject: [PATCH 07/51] Added ExampleApp Signed-off-by: bebenlebricolo --- .gitignore | 8 +- ExampleApp/CMakeLists.txt | 48 ++++++ ExampleApp/inc/config.h | 48 ++++++ ExampleApp/inc/driver_setup.h | 47 ++++++ ExampleApp/inc/module_setup.h | 42 +++++ ExampleApp/inc/pin_mapping.h | 155 +++++++++++++++++++ ExampleApp/src/driver_setup.c | 283 ++++++++++++++++++++++++++++++++++ ExampleApp/src/main.c | 280 +++++++++++++++++++++++++++++++++ ExampleApp/src/module_setup.c | 49 ++++++ 9 files changed, 959 insertions(+), 1 deletion(-) create mode 100644 ExampleApp/CMakeLists.txt create mode 100644 ExampleApp/inc/config.h create mode 100644 ExampleApp/inc/driver_setup.h create mode 100644 ExampleApp/inc/module_setup.h create mode 100644 ExampleApp/inc/pin_mapping.h create mode 100644 ExampleApp/src/driver_setup.c create mode 100644 ExampleApp/src/main.c create mode 100644 ExampleApp/src/module_setup.c diff --git a/.gitignore b/.gitignore index a4930d7..354fe92 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +<<<<<<< HEAD # Prerequisites *.d @@ -51,4 +52,9 @@ Module.symvers Mkfile.old dkms.conf -build/ \ No newline at end of file +build/ +======= +[Bb]uild/ +*.vscode/ +*.vs/ +>>>>>>> a8d02a8 (Added ExampleApp) diff --git a/ExampleApp/CMakeLists.txt b/ExampleApp/CMakeLists.txt new file mode 100644 index 0000000..c363b50 --- /dev/null +++ b/ExampleApp/CMakeLists.txt @@ -0,0 +1,48 @@ +cmake_minimum_required(VERSION 3.15) +project(ExampleApp C) + +##################################################################################################################### +########################################## Typical example application ############################################## +##################################################################################################################### + +add_executable(firmware + ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/driver_setup.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/module_setup.c +) + +# Produce a Map file +set (Map_file firmware.map) + +# Setup C flags for each configuration +set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wl,-Map=${Map_file}") +set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wl,-Map=${Map_file}") +set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -Wl,-Map=${Map_file}") +set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -Wl,-Map=${Map_file}") + +# Specify include directories for this application +# Note that CMake automatically handles transitive include dependencies +target_include_directories(firmware PUBLIC + ${CMAKE_SOURCE_DIR}/App/inc +) + +# Link our application with the built libraries +target_link_libraries(firmware + adc_driver + timer_8_bit_driver + timer_8_bit_async_driver + timer_16_bit_driver + i2c_driver + timebase_module + HD44780_lcd_driver + memutils +) + +set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT firmware) + +# Only add those targets if this is used on a Linux environment, as Atmel Studio already handles them itself + +if (CMAKE_HOST_UNIX) + message("-- Dealing with extra targets on Linux") + add_extra_avr_targets(firmware) +endif() diff --git a/ExampleApp/inc/config.h b/ExampleApp/inc/config.h new file mode 100644 index 0000000..64b5a7e --- /dev/null +++ b/ExampleApp/inc/config.h @@ -0,0 +1,48 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_HEADER +#define CONFIG_HEADER + +/* Defines how many instances of timer/counters will be created */ +#define TIMER_8_BIT_COUNT 1 +#define TIMER_8_BIT_ASYNC_COUNT 1 +#define TIMER_16_BIT_COUNT 1 + +#define TIMEBASE_MAX_MODULES 3U +#define I2C_DEVICES_COUNT 1U + +// Only implement master tx driver +#define I2C_IMPLEM_MASTER_TX +//#define I2C_IMPLEM_FULL_DRIVER + +#define IO_MAX_PINS 6U + +#endif /* CONFIG_HEADER */ \ No newline at end of file diff --git a/ExampleApp/inc/driver_setup.h b/ExampleApp/inc/driver_setup.h new file mode 100644 index 0000000..8603730 --- /dev/null +++ b/ExampleApp/inc/driver_setup.h @@ -0,0 +1,47 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef DRIVER_SETUP_HEADER +#define DRIVER_SETUP_HEADER + +typedef enum +{ + DRIVER_SETUP_ERROR_OK, + DRIVER_SETUP_ERROR_INIT_FAILED, +} driver_setup_error_t; + +driver_setup_error_t driver_init_adc(void); +driver_setup_error_t driver_init_timer_0(void); +driver_setup_error_t driver_init_timer_1(void); +driver_setup_error_t driver_init_timer_2(void); +driver_setup_error_t driver_init_i2c(void); +driver_setup_error_t driver_init_lcd(void); + +#endif /* DRIVER_SETUP_HEADER */ \ No newline at end of file diff --git a/ExampleApp/inc/module_setup.h b/ExampleApp/inc/module_setup.h new file mode 100644 index 0000000..fa45e43 --- /dev/null +++ b/ExampleApp/inc/module_setup.h @@ -0,0 +1,42 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef MODULE_SETUP_HEADER +#define MODULE_SETUP_HEADER + +typedef enum +{ + MODULE_SETUP_ERROR_OK, + MODULE_SETUP_ERROR_INIT_FAILED, +} module_setup_error_t; + +module_setup_error_t module_init_timebase(void); + +#endif /* MODULES_SETUP_HEADER */ \ No newline at end of file diff --git a/ExampleApp/inc/pin_mapping.h b/ExampleApp/inc/pin_mapping.h new file mode 100644 index 0000000..cc2539e --- /dev/null +++ b/ExampleApp/inc/pin_mapping.h @@ -0,0 +1,155 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef PIN_MAPPING_HEADER +#define PIN_MAPPING_HEADER + +#include + +// #################################################################################### +// ######################### Timers output compare pins ############################## +// #################################################################################### + +/* Timer 0 output compare pins */ +#define OC0A_PIN_NUMBER PORTD6 +#define OC0A_PORT_REG PORTD +#define OC0A_DDR_REG DDRD +#define OCOA_PIN_REG PIND + +#define OC0B_PIN_NUMBER PORTD5 +#define OC0B_PORT_REG PORTD +#define OC0B_DDR_REG DDRD +#define OCOB_PIN_REG PIND + +/* Timer 1 output compare pins */ +#define OC1A_PIN_NUMBER PORTB1 +#define OC1A_PORT_REG PORTB +#define OC1A_DDR_REG DDRB +#define OC1A_PIN_REG PINB + +#define OC1B_PIN_NUMBER PORTB2 +#define OC1B_PORT_REG PORTB +#define OC1B_DDR_REG DDRB +#define OC1B_PIN_REG PINB + +/* Timer 2 output compare pins */ +#define OC2A_PIN_NUMBER PORTB3 +#define OC2A_PORT_REG PORTB +#define OC2A_DDR_REG DDRB +#define OC2A_PIN_REG PINB + +#define OC2B_PIN_NUMBER PORTD3 +#define OC2B_PORT_REG PORTD +#define OC2B_DDR_REG DDRD +#define OC2B_PIN_REG PIND + +// #################################################################################### +// ######################### Buttons user interface ################################### +// #################################################################################### + +/* Buttons interface mapping */ +#define BUTTON_PLUS_PIN_NUMBER PORTD2 +#define BUTTON_PLUS_PORT_REG PORTD +#define BUTTON_PLUS_DDR_REG DDRD +#define BUTTON_PLUS_PIN_REG PIND + +#define BUTTON_MINUS_PIN_NUMBER PORTD3 +#define BUTTON_MINUS_PORT_REG PORTD +#define BUTTON_MINUS_DDR_REG DDRD +#define BUTTON_MINUS_PIN_REG PIND + +#define BUTTON_VARSELECT_PIN_NUMBER PORTD4 +#define BUTTON_VARSELECT_PORT_REG PORTD +#define BUTTON_VARSELECT_DDR_REG DDRD +#define BUTTON_VARSELECT_PIN_REG PIND + +#define BUTTON_MODE_PIN_NUMBER PORTD5 +#define BUTTON_MODE_PORT_REG PORTD +#define BUTTON_MODE_DDR_REG DDRD +#define BUTTON_MODE_PIN_REG PIND + +// #################################################################################### +// ######################### Power mosfet pins ######################################## +// #################################################################################### + +/* Mosfet controls */ +#define MOSFET_HIGH_SIDE_PIN_NUMBER PORTB1 // Wired to OC1A output +#define MOSFET_HIGH_SIDE_PORT_REG PORTB +#define MOSFET_HIGH_SIDE_DDR_REG DDRB +#define MOSFET_HIGH_SIDE_PIN_REG PINB + +#define MOSFET_LOW_SIDE_PIN_NUMBER PORTB2 // Wired to OC1B output +#define MOSFET_LOW_SIDE_PORT_REG PORTB +#define MOSFET_LOW_SIDE_DDR_REG DDRB +#define MOSFET_LOW_SIDE_PIN_REG PINB + +// #################################################################################### +// ######################### Fan control network ###################################### +// #################################################################################### + +/* Fan control network */ +#define FAN_CONTROL_PIN_NUMBER PORTD6 // which is wired to OC0A output +#define FAN_CONTROL_PORT_REG PORTD +#define FAN_CONTROL_DDR_REG DDRD +#define FAN_CONTROL_PIN_REG PIND + +// #################################################################################### +// ############################# Analog readings ###################################### +// #################################################################################### + +/* Temperature probe, analogic reading */ +#define TEMP_PROBE_PIN_NUMBER PORTC3 +#define TEMP_PROBE_PORT_REG PORTC +#define TEMP_PROBE_DDR_REG DDRC +#define TEMP_PROBE_PIN_REG PINC +#define TEMP_PROBE_ADC ADC3 + +/* Voltage analogic readings */ +#define SECONDARY_SMOOTHED_PIN_NUMBER PORTC2 +#define SECONDARY_SMOOTHED_PORT_REG PORTC +#define SECONDARY_SMOOTHED_DDR_REG DDRC +#define SECONDARY_SMOOTHED_PIN_REG PINC +#define SECONDARY_SMOOTHED_ADC ADC2 + +/* Voltage analogic readings */ +#define OUTVOLTAGE_SENSING_PIN_NUMBER PORTC1 +#define OUTVOLTAGE_SENSING_PORT_REG PORTC +#define OUTVOLTAGE_SENSING_DDR_REG DDRC +#define OUTVOLTAGE_SENSING_PIN_REG PINC +#define OUTVOLTAGE_SENSING_ADC ADC1 + +/* Voltage analogic readings */ +#define CURRENT_SENSING_PIN_NUMBER PORTC0 +#define CURRENT_SENSING_PORT_REG PORTC +#define CURRENT_SENSING_DDR_REG DDRC +#define CURRENT_SENSING_PIN_REG PINC +#define CURRENT_SENSING_ADC ADC0 + +#endif /* PIN_MAPPING_HEADER */ \ No newline at end of file diff --git a/ExampleApp/src/driver_setup.c b/ExampleApp/src/driver_setup.c new file mode 100644 index 0000000..4deb996 --- /dev/null +++ b/ExampleApp/src/driver_setup.c @@ -0,0 +1,283 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "driver_setup.h" + +#include +#include "adc.h" +#include "timer_8_bit.h" +#include "timer_8_bit_async.h" +#include "timer_16_bit.h" +#include "i2c.h" +#include "HD44780_lcd.h" + +#include "pin_mapping.h" +driver_setup_error_t driver_init_adc(void) +{ + adc_config_hal_t config; + adc_config_hal_get_default(&config); + config.prescaler = ADC_PRESCALER_64; + config.ref = ADC_VOLTAGE_REF_AVCC; + config.running_mode = ADC_RUNNING_MODE_SINGLE_SHOT; + config.supply_voltage_mv = 5000; + config.using_interrupt = true; + + + adc_error_t init_err = adc_base_init(&config); + if (ADC_ERROR_OK != init_err) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + return DRIVER_SETUP_ERROR_OK; +} + + +driver_setup_error_t driver_init_timer_0(void) +{ + timer_8_bit_config_t config; + timer_error_t local_error; + { + local_error = timer_8_bit_get_default_config(&config); + if (TIMER_ERROR_OK != local_error) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + } + + /* Configuring handle */ + config.handle.OCRA = &OCR0A; + config.handle.OCRB = &OCR0B; + config.handle.TCCRA = &TCCR0A; + config.handle.TCCRB = &TCCR0B; + config.handle.TCNT = &TCNT0; + config.handle.TIFR = &TIFR0; + config.handle.TIMSK = &TIMSK0; + + /* Enable OC0A and OC0B as outputs */ + OC0A_DDR_REG |= (1 << OC0A_PIN_NUMBER); + OC0B_DDR_REG |= (1 << OC0B_PIN_NUMBER); + + /* Set original port state of OC0A/OC0B pins before any OCRx overrides them */ + /* This is done in opposing polarities to respect mosfet push-pull driver pair starting point*/ + OC0A_PORT_REG |= (1 << OC0A_PIN_NUMBER); + OC0B_PORT_REG &= ~(1 << OC0B_PIN_NUMBER); + + /* Configuring timer */ + /* F_CPU = 16'000'000 Hz ; F_TIMER0 2'000'000 Hz*/ + /* 8-bit wide -> 256 values => F_PWM_0 = 7812 Hz*/ + config.timing_config.prescaler = TIMER8BIT_CLK_PRESCALER_8; + config.timing_config.waveform_mode = TIMER8BIT_WG_PWM_FAST_FULL_RANGE; + /* Invert OC0x behavior to provide a correct PWM for a push-pull driver pair */ + config.timing_config.comp_match_a = TIMER8BIT_CMOD_CLEAR_OCnX; + config.timing_config.comp_match_b = TIMER8BIT_CMOD_SET_OCnX; + /* Duty cycle : 39 % */ + config.timing_config.ocra_val = 99; + config.timing_config.ocrb_val = 99; + + { + local_error = timer_8_bit_init(0, &config); + if (TIMER_ERROR_OK != local_error) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + } + return DRIVER_SETUP_ERROR_OK; +} + +driver_setup_error_t driver_init_timer_1(void) +{ + timer_16_bit_config_t config; + timer_error_t local_error; + { + local_error = timer_16_bit_get_default_config(&config); + if (TIMER_ERROR_OK != local_error) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + } + + /* Configuring handle */ + config.handle.OCRA_H = &OCR1AH; + config.handle.OCRA_L = &OCR1AL; + config.handle.OCRB_H = &OCR1BH; + config.handle.OCRB_L = &OCR1BL; + config.handle.TCCRA = &TCCR1A; + config.handle.TCCRB = &TCCR1B; + config.handle.TCCRC = &TCCR1C; + config.handle.TCNT_H = &TCNT1H; + config.handle.TCNT_L = &TCNT1L; + config.handle.TIFR = &TIFR1; + config.handle.TIMSK = &TIMSK1; + config.handle.ICR_H = &ICR1H; + config.handle.ICR_L = &ICR1L; + + /* Enable OC0A and OC0B as outputs */ + /* PD6 = OC0A on arduino nano */ + /* PD5 = OC0B on arduino nano */ + OC1A_DDR_REG |= (1 << OC1A_PIN_NUMBER); + OC1B_DDR_REG |= (1 << OC1B_PIN_NUMBER); + + /* Set original port state of OC0A/OC0B pins before any OCRx overrides them */ + /* This is done in opposing polarities to respect mosfet push-pull driver pair starting point*/ + OC1A_PORT_REG |= (1 << OC1A_PIN_NUMBER); // Pulled to Vcc (low side of mosfet driver pulls mosfet's gate to ground) + OC1B_PORT_REG &= ~(1 << OC1B_PIN_NUMBER); // Pulled to ground (high side of mosfet driver is depleted) + + /* Configuring timer */ + /* F_CPU = 16'000'000 Hz ; F_TIMER0 2'000'000 Hz*/ + /* 10-bit wide -> 1024 values => F_PWM_1 = 1953 Hz*/ + config.timing_config.prescaler = TIMER16BIT_CLK_PRESCALER_8; + config.timing_config.waveform_mode = TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE; + /* Invert OC0x behavior to provide a correct PWM for a push-pull driver pair */ + config.timing_config.comp_match_a = TIMER16BIT_CMOD_CLEAR_OCnX; + config.timing_config.comp_match_b = TIMER16BIT_CMOD_SET_OCnX; + /* Duty cycle : 50 % */ + config.timing_config.ocra_val = 512; + config.timing_config.ocrb_val = 512; + + { + local_error = timer_16_bit_init(0, &config); + if (TIMER_ERROR_OK != local_error) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + } + return DRIVER_SETUP_ERROR_OK; +} + + +driver_setup_error_t driver_init_timer_2(void) +{ + timer_8_bit_async_config_t config; + timer_error_t local_error; + { + local_error = timer_8_bit_async_get_default_config(&config); + if (TIMER_ERROR_OK != local_error) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + } + + /* Configuring handle */ + config.handle.OCRA = &OCR2A; + config.handle.OCRB = &OCR2B; + config.handle.TCCRA = &TCCR2A; + config.handle.TCCRB = &TCCR2B; + config.handle.TCNT = &TCNT2; + config.handle.TIFR = &TIFR2; + config.handle.TIMSK = &TIMSK2; + config.handle.ASSR_REG = &ASSR; + + /* Enable OC0A and OC0B as outputs */ + OC2A_DDR_REG |= (1 << OC2A_PIN_NUMBER); + OC2B_DDR_REG |= (1 << OC2B_PIN_NUMBER); + + /* Set original port state of OC0A/OC0B pins before any OCRx overrides them */ + /* This is done in opposing polarities to respect mosfet push-pull driver pair starting point*/ + OC2A_PORT_REG |= (1 << OC2A_PIN_NUMBER); + OC2B_PORT_REG &= ~(1 << OC2B_PIN_NUMBER); + + /* Configuring timer */ + /* F_CPU = 16'000'000 Hz ; F_TIMER0 2'000'000 Hz*/ + /* 8-bit wide -> 256 values => F_PWM_2 = 7812 Hz*/ + config.timing_config.prescaler = TIMER8BIT_ASYNC_CLK_PRESCALER_8; + config.timing_config.waveform_mode = TIMER8BIT_ASYNC_WG_PWM_FAST_FULL_RANGE; + /* Invert OC0x behavior to provide a correct PWM for a push-pull driver pair */ + config.timing_config.comp_match_a = TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX; + config.timing_config.comp_match_b = TIMER8BIT_ASYNC_CMOD_SET_OCnX; + /* Duty cycle : 39 % */ + config.timing_config.ocra_val = 99; + config.timing_config.ocrb_val = 99; + + { + local_error = timer_8_bit_async_init(0, &config); + if (TIMER_ERROR_OK != local_error) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + } + return DRIVER_SETUP_ERROR_OK; +} + +driver_setup_error_t driver_init_i2c(void) +{ + i2c_config_t config = {0}; + i2c_error_t err = i2c_get_default_config(&config); + if (I2C_ERROR_OK != err) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + + // SCL frequency = F_CPU / (16 + 2 * bitrate * prescaler) + // 2 * bitrate * prescaler = (F_CPU / SCL frequency) - 16 + // targeted SCL frequency = 100'000 Hz + // -> bitrate * prescaler = 72 + // choose highest where 72 / prescaler is a pure integer number (prescaler = 4) + // then bitrate = (72/4) = 18 - 1 (-1 to account for the 0 based register value) = 17 + config.baudrate = 17U; + config.interrupt_enabled = false; + config.prescaler = I2C_PRESCALER_4; + config.slave.address = (0x32); + config.slave.enable = false; + config.handle._TWAMR = &TWAMR; + config.handle._TWAR = &TWAR; + config.handle._TWBR = &TWBR; + config.handle._TWCR = &TWCR; + config.handle._TWDR = &TWDR; + config.handle._TWSR = &TWSR; + + err = i2c_init(0U, &config); + if (I2C_ERROR_OK != err) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + return DRIVER_SETUP_ERROR_OK; +} + +driver_setup_error_t driver_init_lcd(void) +{ + hd44780_lcd_config_t config = {0}; + hd44780_lcd_error_t err = hd44780_lcd_get_default_config(&config); + + if (HD44780_LCD_ERROR_OK != err) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + + config.indexes.i2c = 0; + config.indexes.timebase = 0; + + err = hd44780_lcd_init(&config); + if (HD44780_LCD_ERROR_OK != err) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + + return DRIVER_SETUP_ERROR_OK; +} diff --git a/ExampleApp/src/main.c b/ExampleApp/src/main.c new file mode 100644 index 0000000..61673b1 --- /dev/null +++ b/ExampleApp/src/main.c @@ -0,0 +1,280 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "adc.h" +#include "timer_8_bit.h" +#include "timer_8_bit_async.h" +#include "timer_16_bit.h" +#include "HD44780_lcd.h" +#include "timebase.h" +#include "i2c.h" + +#include "driver_setup.h" +#include "module_setup.h" + +#include +#include + +#include + +#define MAX_MUX 5 + +static adc_mux_t mux_table[MAX_MUX] = +{ + ADC_MUX_ADC0, + ADC_MUX_ADC1, + ADC_MUX_ADC2, + ADC_MUX_ADC3, + ADC_MUX_ADC4, +}; + +static void error_handler(void); +static void bootup_sequence(void); +static driver_setup_error_t adc_register_all_channels(void); +static void adc_read_values(void); +static void print_data(void); + +ISR(ADC_vect) +{ + adc_isr_handler(); +} + +ISR(TIMER2_COMPA_vect) +{ + timebase_interrupt_callback(0U); +} + +int main(void) +{ + bootup_sequence(); + + i2c_error_t i2c_err = I2C_ERROR_OK; + + while(true) + { + i2c_err = i2c_process(0U); + (void) i2c_err; + adc_read_values(); + print_data(); + } + + return 0; +} + +/* ######################################################################################## + ########################## Static functions definitions ################################ + ######################################################################################## */ + +void adc_read_values(void) +{ + static uint8_t idx = 0; + adc_result_t results[5]; + adc_read_raw(mux_table[idx % MAX_MUX], &results[idx]); + + idx++; + idx %= MAX_MUX; +} + +void error_handler(void) +{ + while(1) + { + } +} + +driver_setup_error_t adc_register_all_channels(void) +{ + for (uint8_t i = 0; i < MAX_MUX ; i++) + { + adc_error_t err = adc_register_channel(mux_table[i]); + if (ADC_ERROR_OK != err) + { + return DRIVER_SETUP_ERROR_INIT_FAILED; + } + } + return DRIVER_SETUP_ERROR_OK; +} + +static void bootup_sequence(void) +{ + + driver_setup_error_t driver_init_error = DRIVER_SETUP_ERROR_OK; + module_setup_error_t module_init_error = MODULE_SETUP_ERROR_OK; + + /* Set up 8 bit timer 0 as 8 bit FAST PWM generator */ + driver_init_error = driver_init_timer_0(); + if (DRIVER_SETUP_ERROR_OK != driver_init_error) + { + error_handler(); + } + + /* Set up 16 bit timer 1 as 10 bit FAST PWM generator */ + driver_init_error = driver_init_timer_1(); + if (DRIVER_SETUP_ERROR_OK != driver_init_error) + { + error_handler(); + } + + /* Set up 8 bit timer 2 as 8 bit FAST PWM generator */ + driver_init_error = driver_init_timer_2(); + if (DRIVER_SETUP_ERROR_OK != driver_init_error) + { + error_handler(); + } + + module_init_error = module_init_timebase(); + if (MODULE_SETUP_ERROR_OK != module_init_error) + { + error_handler(); + } + + driver_init_error = driver_init_adc(); + if (DRIVER_SETUP_ERROR_OK != driver_init_error) + { + error_handler(); + } + + driver_init_error = driver_init_i2c(); + if (DRIVER_SETUP_ERROR_OK != driver_init_error) + { + error_handler(); + } + + driver_init_error = driver_init_lcd(); + if (DRIVER_SETUP_ERROR_OK != driver_init_error) + { + error_handler(); + } + + driver_init_error = adc_register_all_channels(); + if (DRIVER_SETUP_ERROR_OK != driver_init_error) + { + error_handler(); + } + + adc_start(); + sei(); + + /* Start both timers */ + timer_error_t timer_error = timer_8_bit_start(0); + if (TIMER_ERROR_OK != timer_error) + { + error_handler(); + } + timer_error = timer_16_bit_start(0); + if (TIMER_ERROR_OK != timer_error) + { + error_handler(); + } + timer_error = timer_8_bit_async_start(0); + if (TIMER_ERROR_OK != timer_error) + { + error_handler(); + } +} + +static void print_data(void) +{ + static char msg1[30] = "Hello World!"; + static char msg2[30] = "i = "; + static uint8_t state_count = 0; + static uint8_t iterations = 0; + static bool move_cursor = false; + + static char iteration_string[5] = ""; + + hd44780_lcd_state_t state = hd44780_lcd_get_state(); + hd44780_lcd_error_t err = HD44780_LCD_ERROR_OK; + + if (HD44780_LCD_STATE_READY != state) + { + err = hd44780_lcd_process(); + } + else + { + switch(state_count) + { + case 0 : + err = hd44780_lcd_set_display_on_off(true); + break; + case 1 : + err = hd44780_lcd_move_cursor_to_coord(0,0); + break; + case 2 : + err = hd44780_lcd_print(strnlen(msg1, 30U), msg1); + break; + case 3 : + err = hd44780_lcd_move_cursor_to_coord(1,0); + break; + case 4 : + err = hd44780_lcd_print(strnlen(msg2, 30U), msg2); + break; + case 5 : + err = hd44780_lcd_set_blinking_cursor(false); + break; + case 6: + err = hd44780_lcd_set_cursor_visible(false); + break; + case 7 : + if (move_cursor) + { + err = hd44780_lcd_move_cursor_to_coord(1, 4U); + move_cursor = false; + } + else + { + itoa(iterations, iteration_string, 10U); + int len = strnlen(iteration_string, 5U); + memset(&iteration_string[len], ' ', (5U - len)); + // Replace null-terminating characters in string + //for (uint8_t i = len ; i < 5U ; i++) + //{ + // if (iteration_string[i] == 0) + // { + // iteration_string[i] = ' '; + // } + //} + err = hd44780_lcd_print(3U, iteration_string); + iterations++; + move_cursor = true; + } + break; + + default: + break; + } + + if (state_count < 7U) + { + state_count++; + } + } + (void) err; +} diff --git a/ExampleApp/src/module_setup.c b/ExampleApp/src/module_setup.c new file mode 100644 index 0000000..d54efaa --- /dev/null +++ b/ExampleApp/src/module_setup.c @@ -0,0 +1,49 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "module_setup.h" +#include "timebase.h" + +module_setup_error_t module_init_timebase(void) +{ + timebase_config_t config = {0}; + config.cpu_freq = 16000000; + config.timer.index = 0; + config.timer.type = TIMEBASE_TIMER_8_BIT_ASYNC; + config.timescale = TIMEBASE_TIMESCALE_MILLISECONDS; + timebase_error_t err = timebase_init(0U, &config); + if (TIMEBASE_ERROR_OK != err) + { + return MODULE_SETUP_ERROR_INIT_FAILED; + } + return MODULE_SETUP_ERROR_OK; +} + + From 1a4244dc3db8b8796bda273650574eb2dffe3ac1 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 23 Feb 2022 17:26:09 +0100 Subject: [PATCH 08/51] Tweaked a little bit AvrAsyncCore being handled as a submodule Signed-off-by: bebenlebricolo --- .gitignore | 57 ------------------------------------------------ CMakeLists.txt | 59 ++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 55 insertions(+), 61 deletions(-) diff --git a/.gitignore b/.gitignore index 354fe92..d06a4a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,60 +1,3 @@ -<<<<<<< HEAD -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf - -build/ -======= [Bb]uild/ *.vscode/ *.vs/ ->>>>>>> a8d02a8 (Added ExampleApp) diff --git a/CMakeLists.txt b/CMakeLists.txt index c928c31..66f4dc1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,17 +1,68 @@ cmake_minimum_required(VERSION 3.20) # Use AVR GCC toolchain -set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Toolchain/avr8-gcc-toolchain.cmake) project(AvrAsyncCoreLibs C) set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD 11) -# This variable is needed by some drivers in order to locate the config.h file -# Provided by the application -set (CONFIG_FILE_DIR ${CMAKE_SOURCE_DIR}/App/inc) +############################################################################################################################################ +############################################# Checking environment is setup correctly ###################################################### +############################################################################################################################################ + +# If we are not in a submodule (this project is used as a standalone project) +# we do not want to set the CONFIG FILE +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + # This variable is needed by some drivers in order to locate the config.h file + # Provided by the application + set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Toolchain/avr8-gcc-toolchain.cmake) + set (CONFIG_FILE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ExampleApp/inc) + set(AVR_MCU atmega328pb) + set(AVR_MCU_SPEED 16000000) + set(AVR_MCU_HEADER_DEFINITION __AVR_ATmega328P__) + + # Global definitions for avr-gcc + add_compile_definitions( + F_CPU=${AVR_MCU_SPEED} + ${AVR_MCU_HEADER_DEFINITION} + ) + add_compile_options(-mmcu=${AVR_MCU}) + +endif() + +if (NOT DEFINED CMAKE_TOOLCHAIN_FILE) + message(ERROR " This async core needs to know about toolchain file, please set the CMAKE_TOOLCHAIN_FILE variable to a valid toolchain file !") + message(STATUS "Some example toolchain files can be found at : https://github.com/bebenlebricolo/CMakeAS7-Toolchains") +endif() + +# Check that the config file directory was specified +if (NOT DEFINED CONFIG_FILE_DIR) + message(ERROR " Some drivers need to know the CONFIG_FILE_DIR variable ! You must use it to point to your config.h file's parent directory !") +endif() + +if (NOT DEFINED AVR_MCU) + message(WARNING " AVR_MCU was not found at this point, drivers need that variable in order to target the right MCU !") +endif() + +if (NOT DEFINED AVR_MCU_SPEED) + message(WARNING " AVR_MCU_SPEED was not found at this point, drivers need that variable in order to handle the right CPU clock speed !") +endif() + +if (NOT DEFINED AVR_MCU_HEADER_DEFINITION) + message(WARNING " AVR_MCU_HEADER_DEFINITION was not found at this point, drivers need that variable in order to consume the right files in atmel's lib !") +endif() + +############################################################################################################################################ +###################################################### Configuring all the libs ############################################################ +############################################################################################################################################ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Drivers) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Modules) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Utils) + +# If we are not in a submodule (this project is used as a standalone project) +# we do not want to set the CONFIG FILE +if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/ExampleApp) +endif() From d3c2ac71f8f3f18384624eb897c49f3f28e1658a Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 23 Feb 2022 22:36:03 +0100 Subject: [PATCH 09/51] Updated ExampleApp conditional configuration steps Signed-off-by: bebenlebricolo --- CMakeLists.txt | 2 +- Modules/Pwm/inc/pwm.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 66f4dc1..3539f45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,6 @@ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Utils) # If we are not in a submodule (this project is used as a standalone project) # we do not want to set the CONFIG FILE -if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/ExampleApp) endif() diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index f421265..9891f52 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -46,7 +46,6 @@ typedef struct /** * @brief Compile-time configuration used to configure this Pwm module. - * Note that a union is used, so soft and hard configurations occupy the same memory space. */ typedef struct { From 0620c44baca02cdd716081267b655ed2f92477e1 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 2 Mar 2022 11:29:24 +0100 Subject: [PATCH 10/51] Updated pwm header to include complementary PWM config Signed-off-by: bebenlebricolo --- .../Timers/Timer_8_bit/inc/timer_8_bit_reg.h | 6 +- Modules/Pwm/inc/pwm.h | 58 ++++++++++++++++++- Modules/Pwm/src/pwm.c | 12 ++++ 3 files changed, 71 insertions(+), 5 deletions(-) diff --git a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h index e3265a4..8686303 100644 --- a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h +++ b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -149,8 +149,8 @@ typedef struct uint8_t counter; /**< Main Counter value used to start the timer */ uint8_t ocra_val; /**< Value to be set inside OCRA register to control PWM for instance */ uint8_t ocrb_val; /**< Value to be set inside OCRB register to control PWM for instance */ - timer_8_bit_compare_output_mode_t comp_match_a; /**< Equivalent to TCCRnA COMnA0 and COMnA1 bits */ - timer_8_bit_compare_output_mode_t comp_match_b; /**< Equivalent to TCCRnA COMnB0 and COMnB1 bits */ + timer_8_bit_compare_output_mode_t comp_match_a; /**< Describes the kind of compare match behavior ; equivalent to TCCRnA COMnA0 and COMnA1 bits */ + timer_8_bit_compare_output_mode_t comp_match_b; /**< Describes the kind of compare match behavior ; equivalent to TCCRnA COMnB0 and COMnB1 bits */ timer_8_bit_waveform_generation_t waveform_mode; /**< Selects the right waveform mode and dispatch it to the right registers */ timer_8_bit_prescaler_selection_t prescaler; /**< Selects the right prescaler to be fed in the timer */ } timer_8_bit_timing_config_t; diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index 9891f52..2c90894 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -52,16 +52,57 @@ typedef struct uint8_t io_index; /**< IO index from the Io lookup table @see static io configuration */ } pwm_soft_static_config_t; +/** + * @brief Encodes the two kinds of PWM this driver handles (either software based or hardware based PWMs) + */ typedef enum { - PWM_TYPE_SOFTWARE, - PWM_TYPE_HARDWARE + PWM_TYPE_UNKNOWN, /**< Default configuration for PWM type enum */ + PWM_TYPE_SOFTWARE, /**< Software based PWM, software wrapper will be used to toggle discrete IOs */ + PWM_TYPE_HARDWARE /**< Hardware based PWM, used to get the maximum speed, reliability and accuracy straight from hardware timers */ } pwm_type_t; +/** + * @brief Hardware PWM complementary configuration structure + * Used to produce alternating patterns of PWM for a single Timer unit. + * Note that it only works with double slope configurations such as : + * - TIMER8BIT_WG_PWM_PHASE_CORRECT_XXX => Timer 8 bit phase correct setting + * - TIMER16BIT_WG_PWM_PHASE_CORRECT_XXX => Timer 16 bit phase correct setting + * - TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_XXX => Timer 16 bit phase and frequency correct setting + * - TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_XXX => Timer 8 bit async phase correct setting + * + * @details This structure configures the drivers to produce such patterns : + * time |start ----------restart------------> + * |───┐ ┊ ┌───┊───┐ ┊ ┌───| + * OCRnA | └────┊────┘ ┊ └────┊────┘ | There is a dead time being generated when OCRnA or OCRnB is pulled down, so both lines are down for some time + * | ┌───┊───┐ ┊ ┌───┊───┐ | before the other is switched on again. + * OCRnB |────┘ ┊ └────┊────┘ ┊ └────| Here, OCRnA is approx 40% duty cycle and OCRnB is approx 50% + * | ^ ┊ ^ | + * ╵ ╵ + * BTM TOP TOP BTM BTM : timer's counter reached BOTTOM value and starts counting up again (ascending slope) + * TOP : timer's counter reached TOP value and starts counting down (descending slope) + */ +typedef struct +{ + uint8_t timer_index; /**< Timer index as registered in pwm config structure */ + uint32_t frequency; /**< Frequency of the timer counter */ + uint8_t duty_cycle; /**< Duty cycle of first PWM (unit A) between 0 and 100 */ + uint8_t dead_time; /**< Dead time generation feature, ranging from [ 0 - (100 - duty_cycle) ] + Dead time is used to generate complementary PWM that do not overlap + It basically provides a time when none of the PWM is turned ON, which is + useful to counteract inductive/capacitive parasitic coupling and gives + enough time for a mosfet to fully turn off, for instance */ +} pwm_hard_compl_config_t; + /** * @brief initialises this pwm driver using the static configuration written in config.c * Note : this functions does not take care about initialising other modules it depends on, this * should be handled by application software before this function is called. + * @warning Pwm driver does not alter Timer's hardware configuration, so in order for this driver to work properly, + * you must ensure Timer drivers are initialised properly with the right settings ! + * This is done like so because it's quite difficult, from the PWM driver's point of view, to know exactly what the user wants. + * So instead of providing a complete frontend (i.e : another wrapping api) to the Timer's stack, its easier and clearer to rely on proper + * timer initialisation instead. * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors @@ -116,6 +157,8 @@ pwm_error_t pwm_stop_all(void); /** * @brief Sets the frequency of a single PWM instance + * @note for hardware based PWMs, setting the frequency of a timer impacts its two PWM outputs at once + * (because they are physically linked to the same underlying counter) * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors @@ -123,6 +166,17 @@ pwm_error_t pwm_stop_all(void); */ pwm_error_t pwm_set_frequency(const pwm_type_t type, const uint8_t index, const uint32_t * frequency, const uint32_t * cpu_freq); +/** + * @brief Configures a particular timer to output complementary PWM with dead time generation. + * It uses the Phase correct and phase and frequency correct modes in order to achieve proper dead time generation + * and symmetrical PWM output signals. + * + * @param config + * @param cpu_freq + * @return pwm_error_t + */ +pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const config, const uint32_t * cpu_freq ); + /** * @brief Sets the duty cycle for a single PWM instance * @return pwm_error_t: diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 0314806..f85b5e9 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -56,11 +56,23 @@ static pwm_error_t pwm_init_single_hard(const uint8_t index) case TIMEBASE_TIMER_8_BIT: { timer_8_bit_config_t config; + config.timing_config.waveform_mode = TIMER8BIT_WG_PWM_FAST_OCRA_MAX; + config.timing_config.comp_match_a = TIMER8BIT_CMOD_CLEAR_OCnX; + config.timing_config.comp_match_b = TIMER8BIT_CMOD_CLEAR_OCnX; + config.timing_config.ocra_val = 12U; + config.timing_config.ocrb_val = 15U; + //config.force_compare.force_comp_match_a //timerr = timer_8_bit_stop(config->timer_index); } break; + + + + + + // TODO report implementation to 8 bit async and 16 bit case TIMEBASE_TIMER_8_BIT_ASYNC: timerr = timer_8_bit_async_stop(config->timer_index); break; From 42b8522896fec3b3ce9ee9a2b7f0373ae8b1ccac Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Mon, 14 Mar 2022 09:21:35 +0100 Subject: [PATCH 11/51] Updated PWM driver interface Signed-off-by: bebenlebricolo --- Modules/Pwm/inc/pwm.h | 74 +++++++++++++++++++++------ Modules/Pwm/src/pwm.c | 113 ++++++++++++++++++++++++++++-------------- 2 files changed, 135 insertions(+), 52 deletions(-) diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index 2c90894..e70e331 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -33,6 +33,26 @@ typedef enum PWM_ERR_TIMER_ISSUE /**< Timer drivers encountered some errors */ } pwm_error_t; +/** + * @brief Encodes the two kinds of hardware unit (slices?) of avr timers. + * There are usually two of them, units A and B, using the same counter and master settings, but using different OCRxx values + */ +typedef enum +{ + PWM_HARD_TIMER_UNIT_UNDEFINED, /**< Default value, no unit selected */ + PWM_HARD_TIMER_UNIT_A, /**< Hardware timer unit A */ + PWM_HARD_TIMER_UNIT_B, /**< Hardware timer unit B */ +} pwm_hard_timer_unit_t; + +/** + * @brief Encodes the two kinds of PWM this driver handles (either software based or hardware based PWMs) + */ +typedef enum +{ + PWM_TYPE_UNKNOWN, /**< Default configuration for PWM type enum */ + PWM_TYPE_SOFTWARE, /**< Software based PWM, software wrapper will be used to toggle discrete IOs */ + PWM_TYPE_HARDWARE /**< Hardware based PWM, used to get the maximum speed, reliability and accuracy straight from hardware timers */ +} pwm_type_t; /** * @brief Compile-time configuration used to configure this Pwm module. @@ -42,6 +62,7 @@ typedef struct { timebase_timer_t targeted_timer; /**< Tells which kind of timer is targeted by this PWM instance */ uint8_t timer_index; /**< Tells which timer we need to use for this PWM instance */ + pwm_hard_timer_unit_t unit; /**< Gives the unit kind of this PWM instance */ } pwm_hard_static_config_t; /** @@ -49,18 +70,36 @@ typedef struct */ typedef struct { - uint8_t io_index; /**< IO index from the Io lookup table @see static io configuration */ + uint8_t io_index; /**< IO index from the Io lookup table @see static io configuration */ + io_state_t initial_state; /**< Configures starting pin state (pulling a pin to down by default is not compatible with open collector topologies */ } pwm_soft_static_config_t; /** - * @brief Encodes the two kinds of PWM this driver handles (either software based or hardware based PWMs) + * @brief Packs the two kinds of PWM configurations (either software or hardware configs) + */ +typedef struct +{ + pwm_type_t type; /**< Encodes the underlying type of configuration */ + union + { + pwm_hard_static_config_t hard; /**< Encodes the hardware static configuration */ + pwm_soft_static_config_t soft; /**< Encodes the software static configuration */ + } config; +} pwm_static_config_t; + +/** + * @brief Encodes the various kind of TOP value used by a hardware timer counter to set the resolution (impacts frequency as well) + * They are essentially used by this PWM driver to configure Timer registers when configuring resolution and frequency. + * As TOP value varies depending on Timer waveform generation modes, + * we shall take this into account and update the right register accordingly */ typedef enum { - PWM_TYPE_UNKNOWN, /**< Default configuration for PWM type enum */ - PWM_TYPE_SOFTWARE, /**< Software based PWM, software wrapper will be used to toggle discrete IOs */ - PWM_TYPE_HARDWARE /**< Hardware based PWM, used to get the maximum speed, reliability and accuracy straight from hardware timers */ -} pwm_type_t; + PWM_HARD_TIMER_TOP_UNDEFINED, /**< Default value, no top value selected */ + PWM_HARD_TIMER_TOP_MAX_RES, /**< Counter will reach max value permitted by WG mode (see datasheet for that) */ + PWM_HARD_TIMER_TOP_OCR, /**< Counter will go until the OCRx1 value before starting over */ + PWM_HARD_TIMER_TOP_ICR, /**< Counter will go until the ICRx1 value before starting over */ +} pwm_hard_timer_top_t; /** * @brief Hardware PWM complementary configuration structure @@ -87,7 +126,8 @@ typedef struct uint8_t timer_index; /**< Timer index as registered in pwm config structure */ uint32_t frequency; /**< Frequency of the timer counter */ uint8_t duty_cycle; /**< Duty cycle of first PWM (unit A) between 0 and 100 */ - uint8_t dead_time; /**< Dead time generation feature, ranging from [ 0 - (100 - duty_cycle) ] + int8_t dead_time; /**< Dead time generation feature, ranging from [ -100, (100 - duty_cycle) ] + Note : dead time can be negative (we want some overlap). Dead time is used to generate complementary PWM that do not overlap It basically provides a time when none of the PWM is turned ON, which is useful to counteract inductive/capacitive parasitic coupling and gives @@ -159,21 +199,28 @@ pwm_error_t pwm_stop_all(void); * @brief Sets the frequency of a single PWM instance * @note for hardware based PWMs, setting the frequency of a timer impacts its two PWM outputs at once * (because they are physically linked to the same underlying counter) + * @note 2 : this pwm driver does not handle frequencies that are too low (the internal use of @see timebase_compute_timer_parameters gives a non zero value + * to the accumulator variable, which is the symptom of a PWM which is too slow for the counter to handle). + * @param pwm_instance_index : pwm instance index as per given in config.c file + * @param frequency : targeted PWM frequency + * @param cpu_freq : current CPU frequency (note that if CPU frequency changes, output PWM will be off as well) * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ -pwm_error_t pwm_set_frequency(const pwm_type_t type, const uint8_t index, const uint32_t * frequency, const uint32_t * cpu_freq); +pwm_error_t pwm_set_frequency(const uint8_t pwm_instance_index, const uint32_t * frequency, const uint32_t * cpu_freq); /** * @brief Configures a particular timer to output complementary PWM with dead time generation. * It uses the Phase correct and phase and frequency correct modes in order to achieve proper dead time generation * and symmetrical PWM output signals. - * - * @param config - * @param cpu_freq - * @return pwm_error_t + * @see pwm_hard_compl_config_t structure for more details. + * @param config : input configuration structure + * @param cpu_freq : current CPU frequency, used to calculate timer's configuration parameters + * @return pwm_error_t: + * PWM_ERR_OK : operation succeeded + * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const config, const uint32_t * cpu_freq ); @@ -188,8 +235,7 @@ pwm_error_t pwm_set_duty_cycle(const pwm_type_t type, const uint8_t index, const // Static configuration for both software based and hardware based pwms -extern pwm_hard_static_config_t pwm_hard_config[PWM_MAX_HARD_INSTANCES]; /**< Static compile-time configuration for this driver (usually symbol is created in a config.c file) */ -extern pwm_soft_static_config_t pwm_soft_config[PWM_MAX_SOFT_INSTANCES]; /**< Static compile-time configuration for this driver (usually symbol is created in a config.c file) */ +extern pwm_static_config_t pwm_config[PWM_MAX_SOFT_INSTANCES + PWM_MAX_HARD_INSTANCES]; /** Static compile-time configuration used by this driver (needs to be implemented in config.c)*/ #ifdef __cplusplus diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index f85b5e9..03b31e1 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -20,7 +20,7 @@ static struct } soft_config[PWM_MAX_SOFT_INSTANCES] = {0}; -static pwm_error_t pwm_init_single_soft(const uint8_t index); +static inline pwm_error_t pwm_init_single_soft(const uint8_t index); static pwm_error_t pwm_init_single_hard(const uint8_t index); pwm_error_t pwm_init(void) @@ -31,7 +31,8 @@ pwm_error_t pwm_init(void) err |= pwm_init_single_hard(i); } - for (uint8_t i = 0 ; i < PWM_MAX_SOFT_INSTANCES ; i++) + // Software PWM has very little work to do (put pins in their default state) + for (uint8_t i = 0 ; i < PWM_MAX_HARD_INSTANCES ; i++) { err |= pwm_init_single_soft(i); } @@ -44,48 +45,75 @@ pwm_error_t pwm_init(void) return err; } -static pwm_error_t pwm_init_single_hard(const uint8_t index) -{ - pwm_error_t ret = PWM_ERR_OK; - pwm_hard_static_config_t * config = &pwm_hard_config[index]; - timer_error_t timerr = TIMER_ERROR_OK; - // Configuration varies accross the several timer drivers +static pwm_error_t check_initialisation(const uint8_t index) +{ + pwm_error_t err = PWM_ERR_OK; + bool timer_initialised = false; + pwm_hard_static_config_t * config = &pwm_config[index].config.hard; switch(config->targeted_timer) { case TIMEBASE_TIMER_8_BIT: - { - timer_8_bit_config_t config; - config.timing_config.waveform_mode = TIMER8BIT_WG_PWM_FAST_OCRA_MAX; - config.timing_config.comp_match_a = TIMER8BIT_CMOD_CLEAR_OCnX; - config.timing_config.comp_match_b = TIMER8BIT_CMOD_CLEAR_OCnX; - config.timing_config.ocra_val = 12U; - config.timing_config.ocrb_val = 15U; - - //config.force_compare.force_comp_match_a - //timerr = timer_8_bit_stop(config->timer_index); - } + err = timer_8_bit_is_initialised(config->timer_index, &timer_initialised); break; - - - - - - // TODO report implementation to 8 bit async and 16 bit case TIMEBASE_TIMER_8_BIT_ASYNC: - timerr = timer_8_bit_async_stop(config->timer_index); + err = timer_8_bit_async_is_initialised(config->timer_index, &timer_initialised); break; case TIMEBASE_TIMER_16_BIT: - timerr = timer_16_bit_stop(config->timer_index); + err = timer_16_bit_is_initialised(config->timer_index, &timer_initialised); break; default: - ret = PWM_ERR_CONFIG; + err = PWM_ERR_CONFIG; break; } + // Reject requests if timer drivers are not initialised beforehand + if(false == timer_initialised) + { + err = PWM_ERR_CONFIG; + } + + return err; +} + +// This function essentially checks timer are setup correctly +// and initialisation steps were performed prior to use the pwm driver. +static pwm_error_t pwm_init_single_hard(const uint8_t index) +{ + pwm_error_t ret = PWM_ERR_OK; + pwm_hard_static_config_t * config = &pwm_config[index].config.hard; + timer_error_t timerr = TIMER_ERROR_OK; + + ret = check_initialisation(index); + if(PWM_ERR_OK == ret) + { + switch(config->targeted_timer) + { + case TIMEBASE_TIMER_8_BIT: + timerr = timer_8_bit_stop(config->timer_index); + break; + + // TODO report implementation to 8 bit async and 16 bit + case TIMEBASE_TIMER_8_BIT_ASYNC: + timerr = timer_8_bit_async_stop(config->timer_index); + break; + + case TIMEBASE_TIMER_16_BIT: + timerr = timer_16_bit_stop(config->timer_index); + break; + + default: + ret = PWM_ERR_CONFIG; + break; + } + } + + + // Timer should be already initialised, otherwise we are trying to use peripheral in an undefined state + // that might not behave as we expect. if (TIMER_ERROR_OK != timerr) { ret = PWM_ERR_CONFIG; @@ -94,17 +122,17 @@ static pwm_error_t pwm_init_single_hard(const uint8_t index) return ret; } -static pwm_error_t pwm_init_single_soft(const uint8_t index) +static inline pwm_error_t pwm_init_single_soft(const uint8_t index) { - pwm_error_t ret = PWM_ERR_OK; - io_write(pwm_soft_config[index].io_index, IO_STATE_LOW); - return ret; + // Pull the targeted pin up or down dependending on the required initial state + io_write(pwm_config[index].config.soft.io_index, pwm_config[index].config.soft.initial_state); + return PWM_ERR_OK; } -pwm_error_t pwm_set_frequency(const pwm_type_t type, const uint8_t index, const uint32_t * frequency, const uint32_t * cpu_freq) +pwm_error_t pwm_set_frequency(const uint8_t index, const uint32_t * frequency, const uint32_t * cpu_freq) { pwm_error_t ret = PWM_ERR_OK; - if (PWM_TYPE_HARDWARE == type) + if (PWM_TYPE_HARDWARE == pwm_config[index].type) { timebase_config_t config; timebase_error_t timerr = TIMEBASE_ERROR_OK; @@ -115,19 +143,28 @@ pwm_error_t pwm_set_frequency(const pwm_type_t type, const uint8_t index, const config.cpu_freq = *cpu_freq; config.custom_target_freq = *frequency; config.timescale = TIMEBASE_TIMESCALE_CUSTOM; + + // At this point the accumulator should be 0, otherwise it means the generated PWM is not slow enough + // and this driver does not support it for now timerr = timebase_compute_timer_parameters(&config, &prescaler_val, &ocr_value, &accumulator); - switch(pwm_hard_config[index].targeted_timer) + switch(pwm_config[index].config.hard.targeted_timer) { case TIMEBASE_TIMER_8_BIT: - //timerr = timer_8_bit_ + timerr = timer_8_bit_set_prescaler(index, prescaler_val); + if ( PWM_HARD_TIMER_UNIT_A == pwm_config[index].config.hard.unit) + { + timerr = timer_8_bit_set_ocra_register_value(index, ocr_value); + } + else + { + timerr = timer_8_bit_set_ocrb_register_value(index, ocr_value); + } break; case TIMEBASE_TIMER_8_BIT_ASYNC: - timerr = timer_8_bit_async_stop(pwm_hard_config[index].timer_index); break; case TIMEBASE_TIMER_16_BIT: - timerr = timer_16_bit_stop(pwm_hard_config[index].timer_index); break; default: From eb06e2265d95eae4c2ba442816b2449126f1c3e7 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Tue, 15 Mar 2022 18:44:16 +0100 Subject: [PATCH 12/51] Added some documentation for PWM module Signed-off-by: bebenlebricolo --- .gitignore | 1 + Modules/Pwm/Readme.md | 74 ++++++++++++++++++ Modules/Pwm/docs/Timer8bit_dual_channel.png | Bin 0 -> 198540 bytes Modules/Pwm/docs/Timer8bit_dual_channel.xopp | Bin 0 -> 957049 bytes Modules/Pwm/docs/Timer8bit_single_channel.png | Bin 0 -> 207875 bytes .../Pwm/docs/Timer8bit_single_channel.xopp | Bin 0 -> 306892 bytes Modules/Pwm/inc/pwm.h | 61 +++++++++------ Modules/Pwm/src/pwm.c | 20 ++++- 8 files changed, 131 insertions(+), 25 deletions(-) create mode 100644 Modules/Pwm/Readme.md create mode 100644 Modules/Pwm/docs/Timer8bit_dual_channel.png create mode 100644 Modules/Pwm/docs/Timer8bit_dual_channel.xopp create mode 100644 Modules/Pwm/docs/Timer8bit_single_channel.png create mode 100644 Modules/Pwm/docs/Timer8bit_single_channel.xopp diff --git a/.gitignore b/.gitignore index d06a4a8..acc847e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ [Bb]uild/ *.vscode/ *.vs/ +*.autosave* \ No newline at end of file diff --git a/Modules/Pwm/Readme.md b/Modules/Pwm/Readme.md new file mode 100644 index 0000000..5c67401 --- /dev/null +++ b/Modules/Pwm/Readme.md @@ -0,0 +1,74 @@ +# Index +- [Index](#index) +- [PWM driver](#pwm-driver) +- [Driving 8 bit timers](#driving-8-bit-timers) + - [Dual channel PWM configuration](#dual-channel-pwm-configuration) + - [Single channel, high speed PWM configuration](#single-channel-high-speed-pwm-configuration) + +# PWM driver +This PWM driver builds upon the various timer driver found in the AvrAsyncCore SDK. +It basically provides a frontend which abstract some inner mechanisms of the timer themselves, trying to make its interface more generic and more +portable across the Avr family. + +# Driving 8 bit timers +Regular 8 bit timers and 8 bit asynchronous timers share a common peripheral interface, where one can choose how configure them as PWM units. +As per the other kinds of timers, they have two units, A and B, which are sharing a common counter register (usually TCNTx). + +> Note : as both 8 regular 8 bit timer and 8 bit asynchronous timer share a very similar architecture, following aspects and code snippets can apply to both of them. +> Their specific implementation can be found in their `timer_8_bit{...}_reg.h` header file which encodes all available enum types. + +Timer configuration is performed through the correct use of their `waveform generation` bits, located within the `TCCRxA` and `TCCRxB` registers. +However, one might note that the available `Waveform Generation` bits combinations state that the TOP value of the counters can either be `0xFF` or `OCRxA`. +Those Waveform Generation configurations are depicted in [timer_8_bit_reg.h](../../Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h) and [timer_8_bit__async_reg.h](../../ +Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h) header files like so : + +```C +/** + * @brief Describes 8 bits timers waveform generation modes +*/ +typedef enum +{ /**< | Mode of operation | TOP | Update of OCRx at | TOV Flag set on |*/ + TIMER8BIT_WG_NORMAL = 0U, /**< | Normal operation mode | 0xFF | Immediate | MAX |*/ +/* --------------------------------------------------------------------------------------------------------------------------------------- */ + TIMER8BIT_WG_PWM_FAST_FULL_RANGE = 3U, /**< | Fast PWM | 0xFF | BOTTOM | MAX |*/ + TIMER8BIT_WG_PWM_FAST_OCRA_MAX = 7U, /**< | Fast PWM | OCRA | BOTTOM | MAX |*/ +/* --------------------------------------------------------------------------------------------------------------------------------------- */ + TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE = 1U, /**< | PWM, phase correct | 0xFF | TOP | BOTTOM |*/ + TIMER8BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX = 5U, /**< | PWM, phase correct | OCRA | TOP | BOTTOM |*/ +/* --------------------------------------------------------------------------------------------------------------------------------------- */ + TIMER8BIT_WG_CTC = 2U, /**< | Clear Timer Compare match | OCRA | Immediate | MAX |*/ +} timer_8_bit_waveform_generation_t; +``` +So as we can see, both fast and phase correct PWM modes alternatively use `OCRA` and `0xFF` as TOP values (autoreload trigger) by the timer peripheral. +This implies that regarding PWM modes, we have essentially two available solutions in order to generate a pure hardware PWM signal : +* Dual channel configuration with almost no control over the frequency, and full control over duty_cyle +* Single channel, high speed PWM with full frequency and duty cycle control + +## Dual channel PWM configuration +This configuration is achieved when either `TIMER8BIT_WG_PWM_FAST_FULL_RANGE` or `TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE` is used to configure a given timer. +As a result, the top value of the counter is always set to the maximum value of the 8 bit counter, which is `0xFF`. +Then, the only way to change the frequency of the output PWMs will be to change the prescaler used by the timer itself, or by varying the CPU frequency as the output frequency is governed by the following equation : + +$$\dfrac{F\_CPU}{Prescaler \times TOP}$$ + +Hence, for a CPU frequency of, say 16 MHz it gives the following table: +| Prescaler | 1 | 8 | 64 | 256 | 1024 | +|-----------------------|-------|------|-----|-----|------| +| output frequency (Hz) | 62500 | 7812 | 976 | 244 | 61 | + +So if we want a slow PWM, this is perfectly suitable and we can even setup a complementary output PWM with this kind of configuration, with dead-time generation and and the good stuff. + +For high speed PWM however, this is really limiting and the fact that we cannot choose an output frequency apart from the one listed above is really the main limiting factor. + +![](docs/Timer8bit_dual_channel.png) + +## Single channel, high speed PWM configuration +This configuration sacrifices the unit A of the timer, as it its OCRA value is used by the timer to determine the `TOP` value. +It is achieved through the use of `TIMER8BIT_WG_PWM_FAST_OCRA_MAX` or `TIMER8BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX` and correctly handling `COMAxx` and `COMBxx` registers. +Hence, the B unit will benefit from the `OCRA` value in order to pinpoint the closest frequency we want to work with, and the `OCRB` value will then be used to set the `duty_cycle` of the B unit. + +At best, the A PWM channel can output a 50% duty_cycle PWM with half the frequency of B unit's if setup as a pin toggle event (`TIMER8BIT_CMOD_TOGGLE_OCnX`). +* Using `TIMER8BIT_CMOD_CLEAR_OCnX` will pull the output pin up to VCC permanently (pin is set to HIGH when timer reaches the BOTTOM value = 0) +* Using `TIMER8BIT_CMOD_SET_OCnX` will pull the output pin down to GND permanently (pin is cleared when timer reaches the BOTTOM value = 0) + +![](docs/Timer8bit_single_channel.png) diff --git a/Modules/Pwm/docs/Timer8bit_dual_channel.png b/Modules/Pwm/docs/Timer8bit_dual_channel.png new file mode 100644 index 0000000000000000000000000000000000000000..a4fd76533b9766e099de3dbf81f5fb816d6757a8 GIT binary patch literal 198540 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 literal 0 HcmV?d00001 diff --git a/Modules/Pwm/docs/Timer8bit_dual_channel.xopp b/Modules/Pwm/docs/Timer8bit_dual_channel.xopp new file mode 100644 index 0000000000000000000000000000000000000000..5a43ee8f800cd7bcb6a43e43e6dcb23b8ca00cea GIT binary patch literal 957049 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 j6gTbH-8KDLbyH^*Q8|H|j#Mp&sLsrZch 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⩔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 Si%H_lte$lVEG7}9bad)2buvDK8d-bt)=Q<3 zKm6Ko@F8n)ZB3{v%9g2sI%f*jaA=Tmr#3l8`>2Rc9KzibX`jhMC(xk{MtU4wVX5jJ zdSbje*rq;;X7n1&PxuXEz?5gz#2-g^*LV0m)fwk%QI$r7UA-p`SC79m$aq(tVC;OR zRrxiC_LSJWsZ=Ic9v$LZPaeQ@+lPAJYNf*J&H3zopB?I}K>K~7FpHbNE%v}ejut1> z*0%*~>(VVF=mB9by1GM43zru1dzZqRWRYy?q;Wli^V%BJ*Elm{tD+XB&WB_W-u{m^ ztwkwy?h?-X8Qxq0JG%S8j%R(m1qkcNz_>D3P2j834h5hfO)iyd4pLIn!1;7e3l8N3 zXf^I{8zN*j=cV0OK=A+$-|Kb z86QfP-fzMFj2>xecARe;0&;uQbQztZrr_`fvEy{9T=0)m>Z^p`g?btIheKXhJmv8F z?Nx7o0UNo8->@-1Yvx0`^m?M_XF5C!B%rD*94i03LE-j0)qyqaA?zk2Z~iK{zFaPp zbbo>P`OjO-PX6)l5O7lwgjyIqXE3jv-b*as$S2RD96R%P<@uaLGFa@CKcb8QQLl3! z!nW@0BIurU@t)9ZfwRR>y#($#RFRG;^WMZw>)z)>lhC?`7F1X`t?SJQ2l_Qo?b!ar zP!d^}L%UFO-{aqhiuIHWueKI}y#E{>Xb>NyDR+TQs23f-!KZ093v&7B+~wMxG$SpM zS~ILFd#9g+CJ#+3i;Cn-0jy0MxIXmQ&tZUvgQ|w&?L5{I{~$VVd0fYaBtGny`nc7& ziJHv~>ZAJB+!p$U+2d(oDpSCuL%lk4q@hqz>LtaA1u5LQZsAA?hDge2UJDP4T^qWX zmr8C z<8eUmAyk@0;0cPqUk8fCpAY1!p93GpE|*)+u#H1Un%X7BNi=IAjAo-Gz-_J7PXs*F zNi@@zL5Fs%deqEww|n)Y2L1r?uPD-P=H<-2HNQfoMCWX*WgpRn(_7Nq4B2PMt66_r z>{WvX>GxG1GenXl#GT{PM3&f8Ct0^=mH3pX(Pl|iP@!Kxr-FAz1GU3}^Xm#Ee39ID zrT?gk$d#*}0@^y<`8b|3P){_Z=5rkmSt27~1GoHbp~;VJH{H<9gXH%+f zX%NZp$gHdE4kJ$`8$U+#>k{A>!%8nZ=ehhxvAGnAmo+e|A z9tVb@tyBo$HJoq&+{0%m0`>EN40iv|Ax#$~wzY4Qi1W?5&}Ol5gx@xq(3u%U4@1CA zfcZEl$hl}dxB zII{S)+H~>V1+|wgEOsynXCXG((=|H^r$rM+*v}DLJWhUF$ZVmkHh&2!6VOrWS^4*8 z7U@@|{*PU+5X{&t=v$sSTw4+C(zEvcywbO3p{(*eI|NIh0Ms2&(0{1VSLQ2h!$M=W zl7NR^y;-_oOru}BQ9<#P6vx(ke=H>wvS(JmjvEH>ZFK`!$O9FI45%34c98Fi&}>_&f1)BfsWMZJw6$n|Py z9h9cTAD&{f4JntcpzwQmwk>>g69dUQNjf`xvZr;5Bp3u|3DONOd|{Fu$eZNt9lo7+ z6Je(A+fPU$Ra%@~Yz!n{+8bCH{yU`Rm32)LGIkI$;^Ey{0l!cOaa1pb5v8it@Z72Z z%TgMh?c%$+4c~h3ZTOba(V57QMJ%uRez9yz3WX2{K4NEsYN<+|z5B-$siy5US}%+e|^}r@0_|qdCd}Q!k%;gr30*Q+zKBO1MQq`tGdwKl&}m z6V(m)d-ZYO0vSlfzUezcT_%xY-h~?hgdOuXX>0Ok>$gw*eW-l`)h^F9gss;3H;0;8 zH=#bzA^);aLWrV7=pwkZZ)i-3+~KcGP#A`re~UaeOQ~!+n+Vfkoh12eswiHJO}_C3 z4j+5xWeAHdz>`^YsC2N-e_Qa2XWzh%?`F?(EO7eHxqe&hdLbdK_qRzW#Lln&oR`L; z0|-|{7!zqhu%K!oG~xjukuU)Mc}|;AzESZlPUYY5YTG6=`EHX?`P+tMC+wUjxCKig zhAevr{Q`oM4)pVerpc7eWuNog<`3I8qj-10&}O&!ofSZ(;_zJ1E?ah zMi4R1c}B-KY5D4(p$6sq`Z-56UGj9!v)zvSY=TFEtKGH|D(7l1oit;8sv#c;m@7R$ zD5qZ}Bci38Vx@H0<+s&EN>jFFfL%RLO^K6Gj_v!{{DK5UjLG$nvaa7j%CJe_WM0>X zK31VdeKWbbFrs-6^|{)yME|{n1nk$!k{%>|;+q}Ip5P!fzDj=72qq0AJzqsSDWhiU zU0(7dK@DT7EP%b2^CCn`Mg@~j@LgIwEW-vY=f4*%hDXmq*I|gVfy>b0_7;asgOjSW zdG;P=k$O_hX_45pp339m9MW=CHU}vMAY@SPMQ^k6dF)h3?oWSv)ie=p=1>#$5)Np0 zHF_aN4*yr*5A=)k5^E?#*`H3AZ|{THiovV6oKM`Y#gn^ofA;of4`IUX_verL1zkt* zd4i5==Z4-s%(oIh2eKhs+xs29XEIEt+0hG;q9!!W9z(%!t|2>7TN|ML<)w+tHbea5 znkDRX?iai{r`UMEp^b8^Y8w;%VjGwv5hIXSxQ z`ZMbLEp0i;4?&7bsbh)=<=U|hU_*=yPGCcXkjsBAxUM(E(#2#Kap2VsBu)pFa(68@ z>{tj-tW^5u{`>--ug}EOTVi0#4%NCt-wzzzB`KzDc)!j7?iBK)wHal<4P(AhPck)I zt7fwU`fa0%JU(8}2R`jsU3+Y6`(0sYjOEH>xpE5)ir%v8x1SbPT_~<~8U2hiwL*pP z-;lS5WJ25M=fl#bg?_!>+P5;V%yg8dL7qphuO%t7b+)mkcIPf#kZ{uOIGJW_d^T?Tl}u8GMSx(9RS3i zhs-Z8SCndqf{$B&>1e_SQ&{tE&3}hOmGOOi2=T5j>!_Z3Ym)7W-ko!_{J%p=l-@)a zd(Oi5PNHv5=mm`5zYha5<;zzYbjd@E+MzA4TfhOBffxAcov6EL-{5TV@;uB{nt_m| zrwu2F!xu(qJDC{yD7o7YKXPdzG%%;tcj+d;@@xx%2~!sdJXuF$xH6XUaBPBY^AJX! zM;OT{vW*}DCrNU$Q6wSRMxoWV&C>oIwzEl}){@E??!o*43J$*<)aLf@$vyzFKL2i) z*Tr|c=#k9@Ef)SAOaO#){5u$fg+zcu*GW#7pG9vF)H6ljk5&>4O8k2h)XT1)@5iOZ z4@G$~qbE4@?-plK6&gQ_!x#|)izTKUFaaEYq-b99$rVw(qfswhGp6f1}rt z$V>C@_7D)uv+oob&X%1WRA?I30{p-7@4#ak*{vlkHXUa+&fsvnbmXK&$;z}zje;S$ zPrB^*dr~j#Zzw2&FoA)6!M0XNtS7EHDVIi$fxjtYhv(lXI8{L43z}@2wfcTmct`ve zJy1xS+I}rciPojbw1hJxeKYuXm<(8dd={#Dd{4bQ0&K#9rQ)!~-$~yydh?c`_#Ur+ zp9rY1n;zd2=E?E9VZL#l=y_6nBqv%k$Iav#AR$JXg@5n3ouD|lX3+D+zvun?_r=IpC!5_x+Ntw0~yVa?N&IfRy=n)UHX_=$a95 z0szK4%}z6?d2T`81E~UYtar4ibno{30qazKzo!ON*coyHm1Zc_+csqfaVAIx#^WE zdjf>Gx?DoU;({oWBEu{26M_8xll-w)NS1rj`^f4aQBF){W1ALP>)7U7GR-wf76gOcwVinSs`#vc7Xgpk?*n3pG5us1IHw{5 zdL&_;g%rX7@rGwu;i?B1m;I|Mdfm&D%mdCdfJTcnY=UIq@BP<~+U+LQRr|6_Y)PU;#J7Q~0u1ugh8VT!pSd^{rYu{flcThY)4z@`6^;Q9S_xGytpW zV@0v5dvlanHrVo22Yah2k;V2+;vi@9Y!-vJni7VB1NNtoBtr?BjI%8SycxT>>b!n5 zU_Op-%xnZ z*Ul2ME)1&+>FZY&xkuS5NK-E+{P{ zP`xy%9EtLUa?3Nb$;ZXPkar>(Rv!fwssomAzbxwabw!I7j54>cId4Y6~@dY zyBAGoL{BcYWZnggP3&G0@*&4af}AXcowbKUDw!iN19RO!4ov+Kxt8AGB%&#v14rUO zb!2WZ+2+-E+T0vcwx4pn!R3%%;G5^}wMZpHJne3m&V#kiJo|#~=aJ6zUvCGEg820I zD<}(!FHjh7#sgZA0lkdf2`NRt;=yLlcPryVx6SKsd#20re0$lCNq ztGMgcsslhj*G>GEHF|MBX9ih~0_F#dar#>ng4m=$$sYSpY}Seqi+aLruA(!i zrIQGXcYBxlpH&oP?242XoFs}J1mN0yj-W{8he6SYE&2FF`Ny_SbVu&r09Ux+j(W~5 zId*B;eJot5RImJWjIfj(W}$6|GCYz>L(xK45+BO zwn-(*nNmFEt88!0-m^%X09n4S-$;!*%7-5i-<>W2qHL&V*TzSE3ooQdKsk)k&pbGH zjvMzSF8mZ0&Sw>>J1m1HSb_J+ks5{~^jft|=tr%IzfFGx z5wt3fowfedzAb%@`k$lC?TBEg)7XD> z+vYGJ0+zi3wBT`>5;r(P8#3YroujOGo~lSb^O@~G4I$OeS3T;;-e8FZ*@j;gT>VK} z_B7x$1Q1e+cmCHd3+)`wP-!D{qy-=vWDe8$$KnCLloa#~F)g}VMfeprE3k2F0gzC0 zl^>J-d-w`W6Ad-@ib(Mz+^s9KsG&Mq&Q4C6VSmo%v;?Kt<85fjsq5T_69HKThAO8k z$sdQLA(F~L0OY}x%Ac6xK9d`glsEc0I>r&Of6CT?e}$ll*gdDi0W|6syLxXZ41>_N zh4agM+8Wzma*yN{O9m6imU$lbfMXjZMP;2Q0uY^qq%6BbJX~T!*x}Ywu50KTP6Yyx z{<>}&$Q|^>mFR>!mgMgS?o4`(End+l?0H(;<5eTu3%djbkHiPy5BN&TQ_r)I3MboV zTj@H$=%ryzk96iYsFn_~Ib4aTq^{{nzWt2x_$s*AM!E7E$8WTMq{Jd+x?`=!-67*F z4oZ0C*Cy~S-^C>I`4FL-vG*$IU2H2n4oP|x2iuMxk_mQ1rkG&QloguqS>J@TCIj7L z$}E`;Wz3der}ba?3gjZ7Wb@R9%#a76BKSu)}$7tqI%Lmg^VB;a5g*O{WI_d7{dE zp!dXwCs@L}X$~_E+@|jks^9J`rfAkcqs34y5!q!4iU8vNe1XCElN6nNx}WbJir$m= zwR^uI2;kQ;Vh1-4Im3+sRZjUR&wMxyu~fF4wwWcroZXit$WQ#Td>MZ)OMvTKmcTyu z%R&!1!M0ndf~Yk+vJhq$%^-*2(3>y1F1s|w>>p?E+sBe6YBN#TcA)9VaB11={AKwf z^0JF&u;;n6Nq)Ha;BfC7v+RkoZur&V_zG||#SEC0OdN)_u z;H)nrGZwfTYv01ZUl16ULhRJ%C0mWfE->oX)s+Qxl-SxK?LTb@2xF=V+a z1*Yq&L4<*n%KI6>)vWgPs2!DEYy{L**@!SG1m~0m0kE!qp5$7#VsOn6tS?AGAOFmk z9~}#AV#xvS$G4#dIpJ9JZ-a?4@q#na5*s&sGGG zKNj`^fh7*!O)Tbv*d*ORINVtzxMVSB4-TBob^ZZeXTBN@;l5Q7{x^71xL2M{=JyX( zpgttG5{Jdyuk3m(;cwZ5yMF_7$VKu9ou`^K?IC6Mnf~9yDGCh@slux%9~c3^YNrDG zwl_|knEbe!An=(!Pw!piX}O--dYKx+e3-i~L{w>jrh^9yguF>Su_VL643cKRLeX=I z>E`~7;Pu|KAT{S z0ciA@=S7Sg6RXkJ$Zp4>~OYI*J7ijrNgseoqgs4Z$u4qQ*H+ z*$LWEU*`d8si#xPa&?bfvM2)jl4WG2n)(Tw%+6)Ms>u2xXwhCZJ0~)p4rfGe7gjg3 z&^f-qucphA9%tq1k0%9edp2KfHtn3YgHrVOtN`dEJAwXOfc(p3h?gfC$encp zTLoGHd|4jIl^6Z3PH`l%puZ8qc{DL6vmXrCJb4Cb@ss9WBi9k9kmM|lt@?_swHzcSrT+M6$qNG zZTnGZ%tkwV;Im|vb72=gJLw{ji$TNcs2`6oexs z0K(0Y5`ZTQ3tQRrF8u0r7I@s(Gq@}^fhwR9|29gga;T8779)3Z5eJb2(D)k_#m*rhS7uth6N|1-1thq)uVzOR!-_V?z)KK^6$DRC_wc0_i^KO1 zV$mDEX#D}W34l}@Qu*1al<6u%5+RX8%g}bu;l=dOzkGmi0?Z~1Uq}w;McZo9Z^||f zkty|t;YVZ$nlPbLIZDS35mNtLdT|rCUo$FbVEp^A35Me^aq!^YSslI?r)zju)XN-k z3`sCMmfiLgd)!;e&O&3)JfKJEketx7@MW(^szJEYfNc;E4bJD6jv{Tx?kP<5?MFHe zoCbSh;&npaHqn-^p(?rS9=={hbwW!yBlwq^C6VkWD=n8jMFSzJ4+Ar;?R3>&%RA&e zA_>c|2p#2g%`g@_X9y}5Lzn^h1@lKCb);5zuH~Vg<+7;2oLuU((gG`wi6D3BWjg#{w zbH?^0oGX@5YS(U-#U|dfxCze_&MbM*40)5==1d@Mo4qr$#Zw-ZwM9|w$(LsU5B#8j zlk>?Vh6NA>u9o{v6*w0s4;G8qx_VO&e+CQXpby{BmrqXD)(~#)^W^m5eke@2`mI?Y zz!|_{umDo0_I-b*BLfZbe?O@)vEXsqWOa|qj*ki8UKTqy&6#d)0ZP+t4VeX}P@t!J zGUs8j9b`8~M_x267DUe8w>Lov$Gpt$7TS8$IxqJM2dn@33^(^wDad5;+LMLZ6vJOy zVl0rC50TuTa|d2~03h2x`%(8oFFVuRF+&z_uEAyg z+hX5VA+ox^ZNcjeS!2Gh0P-%*aihRvcvlKDvCd3S97L@gi(RP2dii3ww6%it^m6Ix z^ND84wX;ZjHL_J=vFU1)w>eR5rR~wex!;yI#>0X>!&(#S|P$x2bxEJl@_z2=f;Jy>T0@YB9R=M z+B5FAO_W(-<}BAvQMw~w=J+)ako4sH^2JtZoAy6sCbIL4qQofd{UZzfW694spyCHyMO!QxeFLSeD{3Ph{)>9w4^s^42h9-M>?n(f zH?>lr!|Phj9mpt$8Z{z#3eDnqyJoOzr30 zk;C>*{244V=Fn4PL4>NQj8_Gv$yEAfX@K0ue%6a1xs#9TYKNi|+-JPKInMpAYqMnl zh4ABV4sF;ZVt!thg$t{fYgRR?2uakGnmb*x6Ql%>r&I8riXAk7>l&avfnK^S4+PmA zAE`+}hPcmn3iL6Xs2dy5H&{?OosT`F$u+dArdW4=2BZWeY52;8qX0k|&!8zY4V8jl z0T7y^ifk(`%sI7wAUL8=Qe^R#Ku2ZK z{y<8hMM5X-OcBLi?!aS~RJl>u z45DOtv>k?`1$2GOW5^P9r4w?c-j27xn|R-heSK>i!%#(p`TrPBZq5}`ZKZjli^|<_ zFnM4WBWb_#nAfF4R=7b9flCeQ^WxN%w(*e{)Po`g;g}0C);fU0rgLc?x<3MVlsFW7 zZ<3Prfv%uUj0(pOlB%rOby8QV)YwS4O+Ps-tfl?g3yQf&|6`vVRLm&{q~I?Z_8UPP#tyf z)z8nt$^Ogo`j`}N$s;L^L5xNP9D0)L+A3hJrfP}q$DU1gX737q7bhy;mO>R&3-V#VzPrRH;yKEaKNX`~p9L2cm2N^_ry?aapQV#TCUfDOvskn&7F3tivtPE@vWF4LA-M;2c%T%QbOpfVp-Yg(LTd;({i;>>gvlyX zfdjYYOwcG#qR@(WqpF>422H{f`5&6s)ZUp@>9aMga@OHRfvYSoPj`7yw?%L^5)s$8 zRbbQr4yIoL9m-x4AW8CcKfmGnFw68xM)WbWi|O`KFL5C(WLF`@ye!E{j33edpIIZ( zP*^CqBmXyYIiF~Z0YE>RFVIxWJ3PGeevYgWP#1d!^|>Q4k<0;f+d2sE`T^BPFSFN0 z;yMLv2p*MQ=_}7e#76_u&JDr1N6(O13g0$7`AK|Fga?=k3x%PnN@)0jZVQ)&S{O540fjnK`OM9?WZ?aXwEPZAzsdUWb)GA0SRzI==MP^hR zL&<3;a{paIn(V8yhQ4X;(EVBpFstXP#}2xT5pB+Q#5ZWL?lk;7dOwtVfDX$7K{}!j z9#JfGN@tek5f%LO&wN?LWy$1&>Lo;TeOnOYxvnj+uVVqx*2Y#Lc;l0ixq>m)=KcP1 zg=2x^9h&Kr_Zy2hWjro2MOZq}AhKQU(@+ z<2AMS25x#RP0P7E_xV?=151Z`qV3#jcsiHmJvI5A4jW~@Yv0GU9s2?ILw$SI9p8WJ z*vB(C_ML%RC6%G&bLY*i+7ksXltmH7E+$d*;qS-3jZMUNOH|n?oca5KM!feoL)R5= z@oiNe+c>gDf6s1}k!R{Fqvah<6~w#!k43L$VNp+- zzM3rNFemy|WD)sb)riz7iW7jayEEp1i2^_to0@q^S*OCQ ziFOys!H%#oFyWE!&%paB3lK+VyhbpP_y8FLnpP}nKv1Yv?<<1+X=-tecU0gk*3SI(uN(n zSAzNCj`a(5>74lXKE#)JxC|ZoDRU~@2Iz?01mbHfozvezFz+Vy=fN}TT^l+N23g#l z)HZq&;UD1W-n)XzQxO zw_>iU6oig2?zX(H>uHGz=hG6yI4s~YrH_4Vx##MMTYIPB2-cqE?%`W9>RE8hE)v41 zD2D~^=GwN{(wj8w9Iz9()tT&a7XFM-10Cd_g#SWkUq` zeg@)ISxDr5l9R{pgsXlFU4Kqn5>OT-fx9Cz3MD`1qmu-UcdG|I-4}BZRaFNhTth{3 zWef98)g;=5G^CZS-$UD6pxmbs+b?dTdDh!|yAz*0FUXH^D< ztctAwa+)-o3p>nCEJ<8uS%az!7)E}s@Ug+mY!P4H3HA3hG7GQ-n+f^aA<2Ux^N{Mg zQUZ-#6*BYWyB*1zTr66`VrzIT2|@rVL)?m1<&Q{C!OQy5E!(Ps^xhZUN*C2V&A-){SN@jd#5Lp&A0O>ctB9KqHD839x= zV+UIw2`VhMEkG!62U}ps3CbMw5Y$qIRev7O5*@-!vLFB{%Hj}G{kdZvbSGZt6>)b9 ze+7OL%bf45pCqlYSm4v;35a|685fcY*-%g2rbk5}O*|30vC&BJ`RiR@`R9E1DQUEM{6n}WsUdTFF(O7K*n5j z7_cs=VA3ZUeH`;+t3)EUtlLnJlUXVr&C};G*Z-W)h-}Kr-sofS_B@$ z+@v6@A!1r`FXHf}$btQ*&n=|OgY<@f0+-EcHl(KIe2!V9N|YQpwyJvs9Yn66d}^bv zT3ojFlc=-Lq3X|qRoXY$!_7|2IN;oFXT-_G>`TEij1t+=m=Qx5hA&JpB)ULDLEHLs za6hu)6R*o+C{potDMJ65>sJLE@yj)al>v)GBxcC7sU>jmcgQ0RNYFsAJo`oi6YtO z??k;svsBoY*M8gId}b2M04T$qwS0xOZ_5|!rf;kK>dt2lVW-KEK+^*#wr?T#R~7NR z(-0sfvF@^SZ#~N}L-vG~0?nb9xcs(r-*5X7oJ&t<@}pC*j8h#`Drc<6mhU$Q8G7o@ zj2<+b|NM}DrBCTDF5bItvm8xk=U}r-Nkn5kM?R$B|@g410!PV-;VkTeTB0H{KqgT zoW)-Mw?Cz5jX6Nww&&^`0&&P`?`3<4l3ZOZUT^4S3D4mbR_PrgzwDgI$Y1HCVrA8t z&(2e(PFI9I+?yBPPfQMTN?+ZDgknh@%LGh0Ho*HEZ)&>P0Pb?1AW*(j9Kw{1D80gudu>8Y-cBrC)3p&#JkZj-gZU81owW8Bh;2?`R9PmTjaU$l zBj?v=I*_(8?`w-&&3UI$KA7i54Z2M~Bwndmr>Vz5zKW7q9`vz1_ZWrN*(e^@e)&0N zw9S$sX?lK1y-#S`VLRT1vhe0OawKZ&TL>&2nN@?OPw{$tG4~5|ygm~e{rDYQYOw0~ z+#w4Ds!kSIThg2k?)X9xbf-4kZMSkL!WZ^&&BXc-e8TWo-fuw&SM!BPb}YOb(b85I^!=I5fO2lQ%*H)gZ_ zxOZDQQ`q@4hk_+D*=y;?;VVm#eB$0)zrc4aEu%3p^O^s{GHh}px^_mkSV+OU7~J8? zQlrU;o9?~!Tj0fFSAcBYb2)3&Xe=68d4~Y+-rCvOAZObEM|IXoNvK1c0`Fzr07r()kHhstUIvTZ54nHeTPL4TchvC~%rYqXRN;tmMA4pk z9Cj{7P2r+D6Up`rW#c1=9m|3s^T`)1Dh+n`A%2LTqs;*e)Lc~|XKW--LnudN!oBMB zZDGO!dNF@$OYqo%7LdiREsswv=6!R3H!6vZTCWq^ERY~uNPbmzWTEIQcy0uIV1dPC zsRDcius}iTQ2Uv$l1_J@zRfK5Z9@{OjZPXgU3hb5kz9y}!*8Dc?-l;O3PI6DhRM$l zmcWMcUm8x|ZtnjWhHp580bgaOXG}*K$9CB)HvD?}#s7ELb)refgN@+Fhhgmhg`RQU zrxfhh8*=d7cJIY=qh8wMVFKa`w)&aay zo+lZ8;N2z|Bve<(W_Q?udsc zw-Zkm;3RD@pzoImNYa^4#Uj?MHhn!cFl0*ogXJ$|2-OS_cXqRY@$TLX5PYHE+K4a&H;Z%f?LKdQ!rj7YXq&4l77W5^mI^3OnWDMlZnSw-=7H<`wwJ{(!SGTf2O`|y=~IZ zIr|kLX$ISzr+p@%lDT%ji8(2)?pcxgz58GlxG%N*7|%-CF&vu$|Wy;j_9QzDkm{vE>;H zO4%r>pH_mD4`U7tZ@a;BY78e(~<_wT%I(tph=7CrWNm|&}@Ucoi@a%RzF za4~6aSrEEHs|R#HSZCqLmN-igrMGpytQl+Xe=3B$GH;%_V`^Z2Li1L z1#G*M2&css;$+WT?Y9MX-lqL0(s2*E@-cszZ(TNG)NpjiI6?f(1sI z%@N;)E|KQWnQXwq{)0n+1v(x4a3}kFU|HmZInodivRi!6gg{uhiTKmYNjX2tzkg2U zT50ZapiT&EVH=l(G#N5rJ!0spgw#U|0y@j#%cMgaE_4HB0D7(T2Y6r3<^_j;?Kcg` zr`hO8&JLOn`f#DkqB0@x3>LAcre8}6ji;fg8y2|-aV?x1v)J;0kJpuwp&5B}*khTn zMRaF0ePz~9OQ%DDa$}VRQrYSn%JIcwLCUbUbaHl{89RDq5`74%-OGIdzDJGJHv(`@ zQ@n4G*Eh)qu6wyhnc*YP7+D;Z1BKz?!<_nMC)IMdiMpK8H0p&fRd+=>eEkj+H4_|d zw#Z%|pl&`@Mq(I30;IuYg*hp_g{dx#R35`Ff)(B==v41s)hYMey{Uw>d*&hu2SN4z{R zv5pMQbn#5r8*hN8rStq8Mj$l_`Tb=!_nys?^NQ7men6J$DB?$=RX;x>&`(98=J)ZX z{%9%J9Gm(N7UHxj_bhV5+7ZTCM(fqZn2Ke{GpNo^i&BY$(55(`YKDJFjKk;v(GZBG z0W28B<;LwnXY%#3RC))5Qi_bjmjz|bisbROOex~}3?x``s!XoHJ_8Ke=QG;8P;+BJ zBE73sBXSY*3~UM$H25mCi4M-_kp-7d)W{NJw)^hduqM$y0@KYo=U;*FnYn6h%(B2G zj_iRfG%Z)Tj*;^?P4dhYjRR*krb;v9>`jX7sMgkg?E@3&we8DeZQjhUg!JS!);@*~ zEP@!irBb;qQL6gkj#`%^2un+wTY2a?H$nQBF;d$P51Mtb^6xv)nAgFLjk+wefUWjFix1<(xG zqFpJ6&^|@SN%bUvMNZG~)W8(n#anlu}0;v7@0pg~#a!#Cv+fRZEx zn^SGY*06sSB8|gtPJDH^&`X0Cn$}{EbL=SNQ~n2`Kwy4SX`ZHeiQMC`O2#9fDIHq1 zhWDfez){fIigFrNr!xWxKdQ(NY21i^ALp{sAw)sGvB6I#=0|rRle3^;MF6NR(+rak ziBv+Ai-xhEb{3jv(S?@&JT(*yg-!@*m5Lwjp{?6F{^|Or;v1ErF%SSxh(G}MjAz$V zVYQ-a3#-VXnqdZ*0^vQAM3y{#oCnyhSW8mUj>27;%!$-V#wB$@owpYe1Ro+!5I`jW z{OvgeqGd48p+M;X(xi(Rx9h85AeoZu=AKY;<#gdU5}rqqLJr8iC7;R+2$E--kq^m4 z42fvO^@m=Wq2mUlVi5+(_RM;Tm2{{BE8lhLp2QnW!eJ!^T+mppZYMD6ris)VY7SKf zyE!^|Cx#(iJn5cHHv2@)^OVWVuyEVjt1i>>$}(o#>R~g?DW8%|W}xIeVJhD#zJdEFQ>v93{i=uxmiwuB@E4u6RNm}t`!DzvFQ~*r%wS1 zV>3g#ldpX1pTiho-Fe#CK5+c_q=;3-Y5Q{{5g;)Y+>X_NaOyT zfRH4D4JS8!@rnUxl7x@cxezrjB$d-IKQrQ9GTOV^eeHNl$vG+l-6(tBPJKk4Q-n*l zl2e0y^9sq4pU(aV7OAAX0XK!Jp>O*Q)=n=5$Kkuz2PhB~cSlVh;2hiH*X}B`Md@-= z|38Lr+u^?t?YJ+GAAj_tj?K7f7qIK&K;@QySsGah>2sKMz&b$O0z2;HWnE`xlZZu#e=1A z4p#d=wB8d8CpaOG3^c}!;#$`a&4>+`yof|%fi=RA=>+r^90d9rmzYnLA2`cMhyjas zlxY(eDh6|m={u0Y_7QlAiW`=6R-aR|uoU$&*_`XAG!N`&4J9bwuU;))?gMU5(zxtb zbph4$JGY03RAo96gs1t7heVDgi6Dq@yvY;l8E^d1}ktnnZMd^sdPA@UWk%L#cWnNUNFWR%Nh=m&mf5N?TP}HCjB^d2AoQ z5#PsQh_1n9co*mK8>kUZe8}aO3n?-+0`ff%oZQ8~iY#7bBRV`8xK&7=6OtU>5?o|9 zL4jPK+Y+tF;VraX9l4#%F&c|h(#%w7+x!m!*8wFhLEfJ zX&(@=L9ps2PLDJk0Vf+h4z^PjrJf#y`Q@kz4)k94?A{q`kz$V>3HgWyN)J~AnuOEN+JK!1QB0z5*2NRrygC4Yz zuXipqF2VP_-g&(9c=8@!6`jL~<~W=~dUiq5L6UyXl7P$L{4r;GIjW*dS4eGHhoe9T zvl;LxugkS)jZFsd=W&SBzl=;9`CSf;C8eGu0~4vDHh$;}(~S)@4wTTL4T*u3%DHx= z3Jya&$_~TvtfrC{59Pik$)7bvt%kvt1g$9;Xza9r(!Z*@WOpVDG;Bpw2WgOH26?rv z^bn{DP;d}#pDQYWM9zg1FcpVzYZG!FuR)WcfgKbUrauC-!S#Ng)sUq;3o@)rxU~yG zWqV(~ls7v?BJ((=Ct^NJ?az4*EXuVxCt(SC*_;~(Oi~-(a`+!O<}iH!mP-EP9gyba z_VlB zRzh@r8F~oL`c;5;<$0BKB3NXR8cEVx5+Ve#;|J!JrQ~T!`38hg5X6f^<^sb&KCAkk z{ARi$@P$19fs00Q5rz#m{^6TLm|FQC2|7J%oZ79&ZyYm-qKIw6AJ5qS#GK7_qG4F- z85%!a{|+Vb`1#O4~cXZ^T)2R-9)h9Xx$+{|<4(*i{mw^qx(E!di<&ln@ zYj0`{g+}a6N=a7?}MIF zifb{7`1`U+k>b~xs9AP()$=eX>s%k6k~s+II`l?L)C8F701dti4lf&36=$vfHdGm; zva;(RFBMl}{z{l<&~4z9S!AwleU)=)^TmF|J1E|E!l#m1-%|z77S#94T%b@lBB;RNubVJiOu$-GW@D{)VP+dbNaKBXG=}x)vU&CiS zA9`AsXE~s~I@h0hb+iq2ya2%H=L#4bA`AlYI0Xks*HA_LoalqYjyv`km&8dzl?7xv zLcm2ym1ClF(gH3m_dXf$@8?&6sBneG(=mXL3YygIF}wjb%?Y-x&s_4gvw~K!0Bw0i zAZ!YNVg$-urxSG;VyPfP{0}#no(a|h%H-#+M-_PhZ`aO>P-s%klsm5w2(5AYt{vwC zD$do;6v^?}V@+oes3B-t#~Jzz>H5(B+|R25+E2x}x*PmDgU~W|vWZ>`c@LYz5Fa96 z_1GelKNh{+p;k})ZoOJ&dtZCPff>e);xx5MNHx8jH%Lja7T7EHyaHQAi;f_G15JeL zO%hIzx+q7mKMc`tbR_+gmX#&@77`)qadLFPgW@MrK zn3YI{S{DZmeSmUTKb=}L*qxJI$!BKD=_Jve%GW1wNzh)x^LQQSzdi!VD?(4t5Q)yI zidO~S*R+2&JL{Xvs6mlRib}%_Ygf63YHV}5n4)Y!^rkS{kxta21w z&5+rSho2ujj4twUGtlr;0Ds_&*|;zD0wH7DoBd=ux7UFuNJnfh*SrE@0{=(84e%}y zLwFn^-k4 zB6tkBksO}qaX09OBPK3doI_nlbO#Qa;b?R4t&hT;xwKRFF)eJOu&>agOFujLojQEldw!wBE^yiB@Uaj3-Ggs=uPaFn- zRy1c6e}l;kP+=?a0?$#)ez{ExUk(L%M;p9w{9o~hwIWoKR6)m ze_{9u)%QQAoqRR*zEXT@VVI*lw=Qr{`wK(VFq1FhSLz}3W5GIJ9sVQbiL{)P$2^bq z+$1esQ1OFy zvMa57RGA{A_DF~Tpnuf#w$77asV+|6!BT7WFPMxs->%co9&UC#@DMgdno2RpJ7@%&=i5#U23Ot0AFOdv{WTK5cPQ_kd-!c||1VzVFP^}*dnmlTlTj!8a}8f) zU8r)jA<7Cd*)Z$-9f&a@GyDnjIq`k>yZVH)K3QpioE)h{dhl4 zaf;*cA`VYjy=R#j;HYo%++w~JyjevY+V+~`WQt5tYy$$mHvbKz(MVykQz0kleO~da z=rp14Qko0=xF`$kEQ5JP;)ui$k*Df#{2i=N(GvS{h76{he_}|Ztjds?lT)bt{!dbo zKMSGQnv|;Y$=no>OD8?kRM=n}sK_li-tCvDnnSfA#SI*^NWsJ&jc%B8T1^N5iIS8+ zd@=$)n;DRxL99=-%g|$@rszf2Qlexwug6Z*VVg?!JsL2*GaeqFh!Jxnc{(CAc%f*z zq8NCj1QxDPB4!$=^TeH#)Im#`DM}-|+O{FA%4|^e@)UUIaGCQC!dCqEoTZf=vE0M2 z>Q8_U$Gu|;b)rNPEMw27#)^oga>i@HEG{MXa@{ zg~Ko?Jb#BaacuKfDk`W!qj0)B^KAz{bnWRLqM?{JWid{LOEsI@xMi2Q|bJR?eRf&fysb(b>D~&8wZcjy&s%!fXnn+c+SS862 zWTVyL9M+{q1pVz0b7IoaB7iAo5HioW3UZv3qPmp1L##Dme(-|C=#nw;Q)5amNVCMQ zr#q_rAg>z3)s^G$rA0Y#-VOOKFUs5Oa^@9cqQ@)z$h7rO%n7Bj6Ey-d$vPi0?q6*u zV$BvQc*d;FC4zf$Lcfl@mxt_Me+)yX%K=`pSZK4!|BsZe>4IeAw+BrLR)&VSSoieb zH#LWWEiTK03xzhjRLZ4uoU!GK>^fk;Fb6@yyXNnn!LAz1~Z{b>k$F9v9n3pC1c z2HLl>js+&%jv+f9*<;pPwc^Jd^{4Up$aX!2w3tP z3*B`)O5t*{>+RCF;64x|0#gz*KIXmsW6QKrg~A}w#3IcuVHeDyU+qW*WmWxl0>@@U$ zV5)#)=9ghg?8_HUFbuXaHkNwC@@Re8o3Ss;>j>d6kc%(d`TABQ(WR2mA;-+QYLWdU z#9ZqrZlX%X28zF^SwfTLn&XtkQUE9g-0V75Wze`NH;0xR1hr+b7nXtHD2*w_XznA+ z8Mc#c&1*S_t5P4Rl3i1Vh8Pv@Qv{l4wT#)X01k|vpB@SS4B#<#nq)Pm@%Qd_hJ|w) z8sy(kZ@-@I*Ihe)oItk0p9Ehw(rX-EGxsCo!=2OCYg<%4Pzicg2_4mP`f-Pb+G((j zzCgj?fqwWZwk5Q{*1CSYs3i|sTX~oG+wF1vdbX}aT_Jj~2*H~lkf)tcN~m*8*7Em_ zT($=T-D3E%+I$1RB=A>$#>MFkTUevrL`~RWnAN9R(Z=MIb$|IW~J$nMQOpQNQC@{dhEtn>UKDx&Mg)uP5Fd55(y|g2HOC-%GEJ4MysBkq3op%S|0r9pI0bc96`P`N!q8C z|DJ7)w+|X-oDK@TS{B8K^ZhhHgsEIty$qB6o9fS$0ZW%;x*9yt!|u^L`tzOO^|)gy zs41=VTm^GGJcVCl`7dwlL%=tQ^AD<$>;eG{5eFJRB#$XBO|%=5lQBX5VuqIPp(xix zT4;`R6$Jess`pD-_egN~z+0a4#cvf*QBAsl3egJfo#VOmgQ5tu?Ha%$5?djP#r9`n zxWJG=YfIu2X>)j;!91Ix(7{S}@z6=1KsxQjqL^^VecL_*&%V;1=vmuZWqXkU-4Ht#XAl2z; zbe31d=3IZ3mxBg=9<0^y$~2x= zk>&;XdE}@e@Q;b{41ONqQ<<0B2!5XKGxD0}C*Wh{boUMD4XY|$rM8t8FX+6!9;|!` zh7UiiwL53tATlHNsA*?Dazt6Y#Pm|N62q!LU!p7@XI6`Bqk&=0PMq~@lG1-4z8`zr z!@m7_(y{K&!YC!lN9f+8)*`MC|AR2hHm^mJ1l5Uods`oSqir}_sByZk7k+g8Aafwo zas_B=om*!F45D`OsT+;G%2oK&rjNfICtzgt*4rgAH~m1YbbS~+7uX~Wt3%-W-lxm z1=k-wDpnib(2ZEAHg&~P6>q*o?x1Ou}ntd z_$pY})Pl#IBXtQ#!^>=MOn_+0fB-%zSfCV1w~P#3l7;ThWD!~*u?_h&`Oa3$>3zdE zO9VoJgJ}QNaOv8}m%LRBe%VuO7U;DHn*-3ioYp z(vfm$+FFpBk^wJiN)nb&4ECI*O?=v;eaLWQcu19UGLl&#A^}LpkApO6?e;d{w4;Dc zZ(fAVaD%o36UfQi;6$|leq^8@p|i@*xjQ6)i$d7-8~)g-w<;HdC+Ft@AGa5kk}en2 z-m>ZY=eVOKe#ox?_`x?J{wENfK^mYr7ULZ-lmLIw)y8_09moT^AW(4_}AOZ%QI zncj=iHk%ZQbZRY13c*@W=?r!k#A3vSbWriYB10$loKDiyU|s#n-3!vW6+4g@7qrh}%GA9MweVC-t>+Iw&B}rr_ zd8;n3XAptKtB9uMCzNzG1emAm1%ckZ{VsF^3Io_K(pv(~=~U-E3GOJ)rU#0jeAU`x z6Zgp|heh&7X%puxXx!C-481E`Z`*WS^faZiep{e`RU5@+nIbVkPfixP0^6!LO;VwO zi6BGsCejzho^&jB;3CK2R{*``6ti^3SI=}vd%OBXpk9sIdk5R36&uF=+y;7d@IDT8hfh)iq*YE@A+y-ZBeR?iiXd+_NB6WYr>3Ld zut~R-o_X^<-O+-yPGpflTVmh(NtYEH*U!Cx&UGHN;7F`^b7|>1xZj*zs6}hyI8cka zJvVa)eE+a1Z2lq+XKY2sLb^D0-B0MqK6x!I+_TS0#Yq;a*Vo-hO}M54B^C&=lGy0V z(g|h;XO&b!MJVhdo>O6TWU(*}dHKJm+~}gXsMqk-p|?FTRhOR*TYISC*=dM#b+vfj zGosNH(DrOa&aH?@ow7%P&3h9vg!R(V_uNckW`PW{NPGO8U!gspxw6O-b#=nSQ&S6R zKv^cP{Ll;^%>9hWnUf-_-&$M|EbK~;iL+1+8k`=H!YmrqZF)X?9utn+Q~DpM0DbAY z?H-#WW)2$gRZtV~;g>)=4qx7Fnr~fIXWD&q=SZ1ssNN`X3|~@`kiQMXm)RpwScScs zH2U-83jxc*d%Rl<21T1IbPsxmGQLe$&_d0@*5n&S`0+Ht3@tzb$B>KdyByu9gOw*2Q#6LZk2y`n;$z zp$Z`TBi{0ZQjS~)RhW^}MMFna2%ujyxd-iK70Wgy!J@q%j7HK%gQB@GDNn!77>gJm zK*v*rZVNUUI5k|Mz0d}b_Zh=0nvb+M=ua+)(2V;tG$`9*h9B+vor09H-P@-e6n zJQv;FX^A_^`E4&pty|D$5Il>zWhD!-HNeBQ#S@GB!Ku^>KF%d{!x!P0H5qnrtca&ZEB=MQlBDjjv{&n=UMcMn+8~)FHO&A6V`Aju>V|nR`5NsoCs-gR= zQdycF$_#{J>jeRnC{*6^^)Q5*(>>LzL>dKrWli}Ca!$+fV(r`PaW9p?4hCQ3JPH`< z;aiN;ZES&*4!gYMJg7@oI>xkJz>0Hmvxr=xU=;yK7KEu+7aE?l6cBfc`>0iS0mBp8KIk+NLCoNiU*Oz1qxgmA5@NMv3 zy5KVKz)TC{y02gg&ibfD{op8tLSFfg<=nm>KHxu3B7`L8&L^C_(UkSf7Zsl_DfKK) zUkj!vA`I0+AUO51NU`mty5`b5407DCzGOQj6narsQ9#x~giSSPngd$4j_iLNnxGwN zY#Sbei*(c}bS}$~GU3y23s4S#9Vz{`P~I6Xb9Pv014asGOZ^^}H}p6yFSqh<3mLNK z>A$Wz26IS8P()d6GeVO98;=VqC}*GcynTZ#WDMYkThF}sYnw{lmD-D2SVpGreATF%UKVyfNZDPX@XL~ix_wL5wj2v}JS2)=Si+~F}|I2wxPX7@CQOR!l!#v?m zD^vA+x=Low?(-kRE&0eI=xM110Oc&=E(e4U5rBA3AAWGhk<&2g7`=hx^GRELiD(vB zymF(!?V%3uI*vMM_D{-vE4Z=4-M!a0&iTKG0dpQy*VYt^j=cCzrO}b|c5|DqDAS1N z`JFI~cd<3yC^-~0~zUeg1&g<5s;G|NKcWp^k)-JOwlNb!Rb zYPzU*i|CHhr6SOz?gV@6xP0D7#c|RbpO#38e2AhX=_D@kb^o%E9CCHKLwx0+tj1E+ zQs)cdrENbXR?g*nSmN<^TH=w&?@VUu=$FTNUR#&c{gAZic|XzHIxS5Nh7v=)ekXd5 zNYhCAr+L1^oLAZ}{n`kP7l0P!6oCBA$G^?~9nvVzLr|Ot8hA;@fP(}$S%|L>$(V$M zcBf`P#bjdhpbGDXWzdR@lmV8?^Jt1ZE(`kUMgPIK**bXivU=vZi7-IdW}ftN{${gK z!(%SV0 zuq}C9aFg}sJqT5h@t=dBI|9w=K=8(cf$U*xE+|TG)h5h&dk{!}4KKbRO;)^18CTL7 zfEoqR<}J@*NXf5Pht_wn{Oh{jmr*BNWGn>)=m3N-%P|0xy5=Sp2~~`D_(BH)>&L%) zo`;6xp^tD|-Z1^N#JK3Tyk6vKK@^P|d`iD9?^b_XChTy zbi8VF7L#N0&kV#y8lmcW*aRvMEQQv6K|rAeAtzL}$dc`zNLf1l2mH+Csh&o86Y`Pr z;VkIE;P9Z!oBa@YQ+=Hy(pK1*JKF9v{kL0v^GFRx`ik>e!}}n?iM^e^dO49}<(yRm zS?z&Xna`cZ=9)Q0&Z~Z-mj3~1CrSwA0_B9^M?nFS4jdU$%sbVBrhb^8fzGDHcF~{hCz@q*tMIROAuZ~8bp9m!BQnB+WEe>B+ zRQp4VUX_xkWVQRN-cnJlD3jgo!@0`ApE{H*^N{>#2txoo-nSK{FJe97?bSVo;SavU za5+J&bfAdq?4{a;{Ep#0rWqnM^9zPf=HK;{Y^Rf#1dOmdQO`dx)d9yA1Vaq8`qwNP zSbMd!j8$R5&L_@v8+#gdtOyVm*outUA=kYoE6{?QU&6V;D>d(2?zSCWb3y7ZtY7_tVh1MOCR>N77&yLmqJY zk@TV>B7ezQ%ZkJwXIu}diyCmVU%`tnh;%QyQ$kuH!f#8MiGf<>l(9Rn;5f>UtB!Jc zql@b>uhH)H69`$(xN(q^M^ERu>o}3C<#ebb6;8w&{W(=dD5z%J=F{@wOYsnf;cs6y z=%99S2w%YSpZsrMx=x&Fr}i8GN}U|^r07#f@pIDd1s$ac(Llb0mZs#F{agvhMo`9h zhxR6wBJofL$pLi~cR2r*tuz->)P6r_FK%c^JEoC(zsgVx)fp12883l3yF>4+wCw<{ z;FF(n2md1rQs}fu9^RdQX3(dwb=Yhv!eUzPD+nb~EQ1t7AFf+AETYv@r~eE9;4bmv z;8eIIyo;~d&CQy;V)Cti(3%Fr#B94<`&DSeVxtFA^WPTgHEb?FM_P@xwSuIulrm$< z8jETV($tATITnZo`m+`1zIl0BL?hbo=XQQ3Y=T&*pYvKz?@hgSFu35c9^3GBKcO~( zg(kdKpL}?4ve4yW-;mEuL#>pQ2%nv#`$iyo3)Eg`a$iug9-zdrkWpSAu)#MrQJW=O zVCxr@>S(}>!mfY5ovb7-0eMvLscm=irBZqUis&k}Ez)RA%(Pd z1f0A%eYj_weufxZBvlL{N%w84lPYt*glZ4FJIaKLjMKg$G1T+_$KILbNYW!q`YM4w zK!WqI>H8n6^%JF=k@U=ZKqG4RYEiI1HQYuHI*5wIMVJO=OI!sb*%0?b`ZHZ9@;Fo- zP6-tyQJq3!BU*lYgErRDT_0du(jv5&%h7%LbYAHjJE@$8pHmz`O{J?}0j;#~g}8jV ztSmr5q#jFh+3QL7<$v!7 zJSrDz!lXeu%_{-LS4g=c+v?YO@~c?Pe`ct))63I0H47x!XBq>Ggs`RHw|mrBCVNC* z=+4Lck_AE9yz=bZ($`s5`YOI|(yG^}GFLf42BFSXUM~tl^1c$lGV>OuKPgNN%A(pQ zqroRdbx-gP%&!cN8H_lCHh6M4dsMN|K9@@JJ3w8yd(}&XGL#YKZIKAC?F%EHZJAgq zge|a#Twfu9U}jXP+RHy`rGT-^|(z-hauLeq65q6;l3RA?5!SQvP2d<^L5@cJ^R0`%bC| z2XgRL1}ZJd-cwvB(j8iR0I>M#g@@3+>z;1S;tN@e%y(ZEp`mwx+KW|#-hs-cGu8{( z_H$6>!?F>Z++GBOz$LOqnA>A-@Zv#*Mag3Mu91E~U+L*98DYbEC2g?K=-Apy^gIa3 z)3PUrAf2(nTvYTq5=vMgkt)>((3?Jlj|SDkQ5+%prX0m>!xBE+t$WjykQ4?xZ(ayV zkX)I?7mGa)ugfRV2eTzQ)GeU{{Mlf^IiDUF##{*NJeJ3~nZ()F&a2 zN5jY0R7N+5;Opn?lscyiyr{N+skK4uQQ2loT!rSR8gfpT!vaPMb*+VJIxHQy!>E3p zPv53b7xTo;NzLCDzNKv}UluK_In-60R^U^X1$pCYP)D zWw6=GH8i4o@0Q#^jzffMt_qWwqn=>ci01gwq=2dj%+(|vr0v@7C@M*S84HaS!3z)V5 z;AG_MY{-03b7<8Yb#j0Ng%l_VMvzPb=&QL$^-hZ~>fjEDteUshunLor#S&3BSIHSB z5n9tlg;#+u%^n1(C}{DbLJql{Sqe-PW3^$xMKk~@VX^oJx|%86yA2+@Y4RsXzacuJ zo*B^X^t_^sfd!zrySv5n$WxIn;%|1HB)1wgazoewIyH3G8cY$zk;MpL46#OlIYen* z(9>WExFbkPU=<{^zJ~C;Ck@ET*g4 z_uxA98z_h5*&KPt^ExzY39KId-YR8?a3M?eJi2OLh};iE2@6q_cz3nmO$pBUdxOC- zdg6ZD33=BdN1DlVVGyqsv0r8iD@cNbaAkXP>Mi5Keu7TPeS6?*1gGo>BKc~`;X ziJP%N2#R+088>5r{bNWH`6zsyzu96rEEM~rmyou8^J^q-G2=B7w>VSdEmJN}j^2C= zU-o_Mi!!g>d43u=7zc1scBy)wXCqHXH)HQd9`*OBmLBp2LME~$KL-qB^ujV=*+$1 zy+TkGuiSH0HyGR*MfvI`VVU(C+r22%4Ox;J$>2Y&@J`!IR!%s~KQ7Rg+xOX$jlxvq zM_iU}K3@PFby<)>C$SyEeFron7kIG!Y>+Ml&)y^wltFC-SlE_neZAi(D_EdvTdwsG zd1kt7S_;?tUPY8YV_kW~clSfNxwEvbPTqHqqcO|IC!!BO2RlJR&KeH<4{H7i0k1n~ zlCZF?zg+K{+!hG@^!q}vvqu@cSUdmXIDRI?AX&ayyWbnz9d*d}H}Hwd63CB~@_n7{t}UuauvU#<=lk5nKkZ$#MMLqHz|A2>7c*Rk zTODFM{OjLRvW8Ut=WOr$hu#Zpzusx^>d5SuNKy=NWKpZJw_EFeQ$A%t_f;%;;iL;; z3klaGu(gbqG?Z5_u9TvJGl7hO7^x1%ET7fMRmqTdpBX~qwx{Wm z@LU8-AQZJJ9#EXoP%r8R8XlygvjU#~9_k4yOGxeB;ef^wd7=9fj zk_rWGB!bNn1xUBMj?n#~IGGx49ne5le^R7oC-DLn3$pD|r@uE_`(}Xx5etkHHrG5H z$4_YrY?>GtyD0R|Kpmtx5FUwJ(L8VKT%K#5o>2sQ*ETkub2ufLJHMMtXm;UaaPC*mo1K~0%sQDlRx4Df#DuPW2%S2HPnqNW$h6O3^s!}0e8&5*aik<2TYDc&% zY$7Cl5-w#IX9c^G{|2Elt=XOkWQU%Lb_6cp0WvkkId4S4#`b#JyIMBCp$Fkqq5 zSmnC1iO{?SPBnGb12sJiZ*8~b#KuCG#T>4NXtpdRMQ1?8;!@n7ruQe!1b8_CVC~*0 z-|RUn%r{tusKkn=rV6w#S?{2r&X}{-5WHd=4Pb<2K^hV*4c#?4=?L%-3q{%PEGaZ+ z*b-KC9b0$oH%f$DZ|Aan=8s>8GMS2qLgI}PU)=C|=nEW^7 zT#5?Aj8Wu~%p3T1mr_Dh&HzZIH7+t<3+;;wV(%!msGddzmgZ%*m2iGNQ5$)25dyRh z>_q=M)L&mb#+(k9B@ob2U1SU@MmqpCy>V z)UUA@#SU`QGqX^GV%XyNwLPbcVe47iYKT>JL(kB@Jxc*B;an6E5A6fx1DAZ-!16oS83iv3_kIrW zc?FJB`=t~GUE_4UE3nludn$W7M7nl5)%*rMePt_1s=}f5Bb71R;v5N^Rcv>_J_2Wc zzwo@T)+|IR+6Qj0+4plLt)D;G6|)*mmWz8dXrcPKu&FDDv?#OP~hN2LO&CQ|#ImKOjF6-cmARR$@N=vk@Z{|B>St2ZKUa6^SneM2SratLu zP2@{2chW5OrXQ+v9PI+Q_G^uMM8gt9*TBO* zQP`$*ztMts3$K-bg;+%25w00*mOLz6QCs`DQrPMOAPlh^XDox+Y?kj83G`*m8X-~g zgTo09j}ej>2RKA-vE7DPv&mv>6&+Z2Hff+93nH|K@85uzwx!y$R??#;4o;{R;j880 z77IH?DDdlh{mURRJ04+h^@OEp&z8_Vm3JM!8^znA`v^3gd{L#_B=r8|4Fp@r!Y_KI zr#?!qwwLUiwne>F%^Wz^LYN%f

{uN#hVqlqWU!L-Sv0Mb%E7Q*UeA7k#~RqTBfE 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⁡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

L^KjFF`4kU#0mkjdqYo*N+5; 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

v1w9rhUN~pNwU>WT3;ygxL}{{k=21y- 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

^7vEcV0?k&EpGhqI-0nbPIk+YoO}lQZ2lsATqv9 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%0AqE;8;ZP)&@_aNJ9u!g=A`a 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%0D%S`4I- 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 duty cycle has a fine control over the full range 0 - 255 + * -> Output frequency is limit to a few frequencies as per this relation : F_CPU/(prescaler*TOP) ; where TOP = 0xFF + * which for a CPU frequency of 16 MHz gives : | prescaler | 1 | 8 | 64 | 256 | 1024 | + * | Frequency (Hz) | 62500 | 7812 | 976 | 244 | 61 | * @param pwm_instance_index : pwm instance index as per given in config.c file * @param frequency : targeted PWM frequency * @param cpu_freq : current CPU frequency (note that if CPU frequency changes, output PWM will be off as well) @@ -209,7 +231,7 @@ pwm_error_t pwm_stop_all(void); * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ -pwm_error_t pwm_set_frequency(const uint8_t pwm_instance_index, const uint32_t * frequency, const uint32_t * cpu_freq); +pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); /** * @brief Configures a particular timer to output complementary PWM with dead time generation. @@ -224,15 +246,6 @@ pwm_error_t pwm_set_frequency(const uint8_t pwm_instance_index, const uint32_t * */ pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const config, const uint32_t * cpu_freq ); -/** - * @brief Sets the duty cycle for a single PWM instance - * @return pwm_error_t: - * PWM_ERR_OK : operation succeeded - * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors - * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors -*/ -pwm_error_t pwm_set_duty_cycle(const pwm_type_t type, const uint8_t index, const uint8_t duty_cycle); - // Static configuration for both software based and hardware based pwms extern pwm_static_config_t pwm_config[PWM_MAX_SOFT_INSTANCES + PWM_MAX_HARD_INSTANCES]; /** Static compile-time configuration used by this driver (needs to be implemented in config.c)*/ diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 03b31e1..8697ff4 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -129,7 +129,7 @@ static inline pwm_error_t pwm_init_single_soft(const uint8_t index) return PWM_ERR_OK; } -pwm_error_t pwm_set_frequency(const uint8_t index, const uint32_t * frequency, const uint32_t * cpu_freq) +pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq) { pwm_error_t ret = PWM_ERR_OK; if (PWM_TYPE_HARDWARE == pwm_config[index].type) @@ -162,9 +162,27 @@ pwm_error_t pwm_set_frequency(const uint8_t index, const uint32_t * frequency, c break; case TIMEBASE_TIMER_8_BIT_ASYNC: + timerr = timer_8_bit_set_prescaler(index, prescaler_val); + if ( PWM_HARD_TIMER_UNIT_A == pwm_config[index].config.hard.unit) + { + timerr = timer_8_bit_async_set_ocra_register_value(index, ocr_value); + } + else + { + timerr = timer_8_bit_async_set_ocrb_register_value(index, ocr_value); + } break; case TIMEBASE_TIMER_16_BIT: + timerr = timer_16_bit_set_prescaler(index, prescaler_val); + if ( PWM_HARD_TIMER_UNIT_A == pwm_config[index].config.hard.unit) + { + timerr = timer_16_bit_set_ocra_register_value(index, ocr_value); + } + else + { + timerr = timer_16_bit_set_ocrb_register_value(index, ocr_value); + } break; default: From 3c07a553365c1e3fb58956221d27e4ae3ec6aa5b Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 16 Mar 2022 13:21:35 +0100 Subject: [PATCH 13/51] Updated Timebase, IO and timers interfaces Signed-off-by: bebenlebricolo --- CMakeLists.txt | 9 +- Drivers/Io/Tests/Stub/config.c | 2 +- Drivers/Io/inc/io.h | 10 +- Drivers/Io/src/io.c | 10 +- .../Timers/Timer_generic/inc/timer_generic.h | 13 +- ExampleApp/CMakeLists.txt | 1 + ExampleApp/src/config.c | 24 ++++ ExampleApp/src/main.c | 3 +- ExampleApp/src/module_setup.c | 9 +- Modules/Timebase/Tests/CMakeLists.txt | 1 + Modules/Timebase/Tests/Stubs/config.c | 13 ++ Modules/Timebase/Tests/timebase_tests.cpp | 114 ++++++++---------- Modules/Timebase/inc/timebase.h | 36 +++--- Modules/Timebase/inc/timebase_internal.h | 4 +- Modules/Timebase/src/timebase.c | 64 +++++----- 15 files changed, 173 insertions(+), 140 deletions(-) create mode 100644 ExampleApp/src/config.c create mode 100644 Modules/Timebase/Tests/Stubs/config.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 3539f45..fb57dbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,15 @@ cmake_minimum_required(VERSION 3.20) -# Use AVR GCC toolchain +# Use AVR GCC toolchain (needs to be added before the project is declared, otherwise CMake does not take it into account) +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Toolchain/avr8-gcc-toolchain.cmake) +endif() + project(AvrAsyncCoreLibs C) set(CMAKE_CXX_STANDARD 17) -set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD 17) ############################################################################################################################################ ############################################# Checking environment is setup correctly ###################################################### @@ -16,7 +20,6 @@ set(CMAKE_C_STANDARD 11) if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) # This variable is needed by some drivers in order to locate the config.h file # Provided by the application - set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/Toolchain/avr8-gcc-toolchain.cmake) set (CONFIG_FILE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ExampleApp/inc) set(AVR_MCU atmega328pb) set(AVR_MCU_SPEED 16000000) diff --git a/Drivers/Io/Tests/Stub/config.c b/Drivers/Io/Tests/Stub/config.c index f12642d..c591c38 100644 --- a/Drivers/Io/Tests/Stub/config.c +++ b/Drivers/Io/Tests/Stub/config.c @@ -54,7 +54,7 @@ io_t io_pins_lut[IO_MAX_PINS] = }; -io_config_t io_config = +io_reg_config_t io_reg_config = { .mcucr_reg = &stubbed_registers.st_mcucr, .porta_cfg = diff --git a/Drivers/Io/inc/io.h b/Drivers/Io/inc/io.h index 871c1da..5d640e5 100644 --- a/Drivers/Io/inc/io.h +++ b/Drivers/Io/inc/io.h @@ -1,5 +1,5 @@ -#ifndef IOMANAGER_HEADER -#define IOMANAGER_HEADER +#ifndef IO_DRIVER_HEADER +#define IO_DRIVER_HEADER #include #include @@ -82,7 +82,7 @@ typedef struct io_port_config_t portb_cfg; /**< Port B configuration */ io_port_config_t portc_cfg; /**< Port C configuration */ io_port_config_t portd_cfg; /**< Port D configuration */ -} io_config_t; +} io_reg_config_t; /** * @brief the following extern symbol is a lookup table with pins configuration. @@ -98,7 +98,7 @@ extern io_t io_pins_lut[IO_MAX_PINS]; * Further calls to those addresses (e.g. while reading or writing to a pin) * will normally by optimized by the compiler as direct calls afterwards (no pointer dereferencing then) */ -extern io_config_t io_config; +extern io_reg_config_t io_reg_config; /** * @brief reads data on a given io, using its index as an input (referencing an @@ -128,4 +128,4 @@ void io_init(void); } #endif -#endif /* IOMANAGER_HEADER */ \ No newline at end of file +#endif /* IO_DRIVER_HEADER */ \ No newline at end of file diff --git a/Drivers/Io/src/io.c b/Drivers/Io/src/io.c index 3fafb88..8f8e83a 100644 --- a/Drivers/Io/src/io.c +++ b/Drivers/Io/src/io.c @@ -4,10 +4,10 @@ static io_port_config_t * port_lut[IO_PORT_COUNT] = { - &io_config.porta_cfg, - &io_config.portb_cfg, - &io_config.portc_cfg, - &io_config.portd_cfg + &io_reg_config.porta_cfg, + &io_reg_config.portb_cfg, + &io_reg_config.portc_cfg, + &io_reg_config.portd_cfg }; static inline void configure_single_pin(io_port_config_t * config, io_t * io) @@ -51,7 +51,7 @@ void io_init(void) // Only enables pull ups if requested if (true == needs_pull_up) { - *io_config.mcucr_reg |= PUD_MSK; + *io_reg_config.mcucr_reg |= PUD_MSK; } } diff --git a/Drivers/Timers/Timer_generic/inc/timer_generic.h b/Drivers/Timers/Timer_generic/inc/timer_generic.h index 9d0ccd5..f8666f8 100644 --- a/Drivers/Timers/Timer_generic/inc/timer_generic.h +++ b/Drivers/Timers/Timer_generic/inc/timer_generic.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -68,6 +68,17 @@ typedef enum TIMER_GENERIC_RESOLUTION_16_BIT, } timer_generic_resolution_t; +/** + * @brief Encodes the various timer architecture found in AVR world + */ +typedef enum +{ + TIMER_ARCH_UNDEFINED, /**< Default value */ + TIMER_ARCH_8_BIT, /**< Regular 8 bit timer counter architecture */ + TIMER_ARCH_8_BIT_ASYNC, /**< 8 bit timer counter with asynchronous features */ + TIMER_ARCH_16_BIT /**< Enhanced 16 bit timer counter architecture */ +} timer_arch_t; + typedef struct { uint16_t value : 11; diff --git a/ExampleApp/CMakeLists.txt b/ExampleApp/CMakeLists.txt index c363b50..02e6c69 100644 --- a/ExampleApp/CMakeLists.txt +++ b/ExampleApp/CMakeLists.txt @@ -9,6 +9,7 @@ add_executable(firmware ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c ${CMAKE_CURRENT_SOURCE_DIR}/src/driver_setup.c ${CMAKE_CURRENT_SOURCE_DIR}/src/module_setup.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/config.c ) # Produce a Map file diff --git a/ExampleApp/src/config.c b/ExampleApp/src/config.c new file mode 100644 index 0000000..5a221cc --- /dev/null +++ b/ExampleApp/src/config.c @@ -0,0 +1,24 @@ +#include "config.h" +#include "timebase.h" +#include "timer_8_bit.h" +#include "timer_8_bit_async.h" +#include "timer_16_bit.h" + +#ifndef F_CPU +#pragma message("F_CPU macro was not set, defaulting to 8MHz") + #define F_CPU (8'000'000ULL) +#endif + +timebase_config_t timebase_static_config[TIMEBASE_MAX_MODULES] = +{ + [0] = + { + .timer = + { + .type = TIMEBASE_TIMER_8_BIT_ASYNC, + .index = 0, + }, + .cpu_freq = F_CPU, + .timescale = TIMEBASE_TIMESCALE_MILLISECONDS + } +}; diff --git a/ExampleApp/src/main.c b/ExampleApp/src/main.c index 61673b1..2ddc603 100644 --- a/ExampleApp/src/main.c +++ b/ExampleApp/src/main.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -28,6 +28,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +#include "config.h" #include "adc.h" #include "timer_8_bit.h" #include "timer_8_bit_async.h" diff --git a/ExampleApp/src/module_setup.c b/ExampleApp/src/module_setup.c index d54efaa..733c34d 100644 --- a/ExampleApp/src/module_setup.c +++ b/ExampleApp/src/module_setup.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -33,12 +33,7 @@ along with this program. If not, see . module_setup_error_t module_init_timebase(void) { - timebase_config_t config = {0}; - config.cpu_freq = 16000000; - config.timer.index = 0; - config.timer.type = TIMEBASE_TIMER_8_BIT_ASYNC; - config.timescale = TIMEBASE_TIMESCALE_MILLISECONDS; - timebase_error_t err = timebase_init(0U, &config); + timebase_error_t err = timebase_init(0U); if (TIMEBASE_ERROR_OK != err) { return MODULE_SETUP_ERROR_INIT_FAILED; diff --git a/Modules/Timebase/Tests/CMakeLists.txt b/Modules/Timebase/Tests/CMakeLists.txt index 011a376..ce42aa1 100644 --- a/Modules/Timebase/Tests/CMakeLists.txt +++ b/Modules/Timebase/Tests/CMakeLists.txt @@ -27,6 +27,7 @@ add_executable(timebase_module_tests Stubs/timer_8_bit_stub.c Stubs/timer_8_bit_async_stub.c Stubs/timer_16_bit_stub.c + Stubs/config.c ) target_include_directories(timebase_module_tests PUBLIC diff --git a/Modules/Timebase/Tests/Stubs/config.c b/Modules/Timebase/Tests/Stubs/config.c new file mode 100644 index 0000000..e121f33 --- /dev/null +++ b/Modules/Timebase/Tests/Stubs/config.c @@ -0,0 +1,13 @@ +#include "config.h" +#include "timebase.h" +#include "timer_generic.h" + +timebase_config_t timebase_static_config[TIMEBASE_MAX_MODULES] = +{ + { + .cpu_freq = 16000000UL, + .custom_target_freq = 0, + .timescale = TIMEBASE_TIMESCALE_MICROSECONDS, + .timer = {.index = 0, .type = TIMER_ARCH_8_BIT_ASYNC} + } +}; diff --git a/Modules/Timebase/Tests/timebase_tests.cpp b/Modules/Timebase/Tests/timebase_tests.cpp index a24db0a..c68dbd1 100644 --- a/Modules/Timebase/Tests/timebase_tests.cpp +++ b/Modules/Timebase/Tests/timebase_tests.cpp @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -50,17 +50,16 @@ class TimebaseModuleBasicConfig : public ::testing::Test timer_8_bit_async_stub_reset(); timer_16_bit_stub_reset(); - config.cpu_freq = 16'000'000; - config.timescale = TIMEBASE_TIMESCALE_MILLISECONDS; - config.timer.type = TIMEBASE_TIMER_16_BIT; - config.timer.index = 0U; + timebase_static_config[0].cpu_freq = 16'000'000; + timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_MILLISECONDS; + timebase_static_config[0].timer.type = TIMER_ARCH_16_BIT; + timebase_static_config[0].timer.index = 0U; } void TearDown(void) override { } - timebase_config_t config; }; class TimebaseModule8BitInitialised : public TimebaseModuleBasicConfig @@ -71,8 +70,8 @@ class TimebaseModule8BitInitialised : public TimebaseModuleBasicConfig TimebaseModuleBasicConfig::SetUp(); timer_8_bit_stub_set_initialised(true); - config.timer.type = TIMEBASE_TIMER_8_BIT; - config.timer.index = 0U; + timebase_static_config[0].timer.type = TIMER_ARCH_8_BIT; + timebase_static_config[0].timer.index = 0U; timer_8_bit_prescaler_selection_t prescaler = TIMER8BIT_CLK_PRESCALER_64; uint32_t accumulator = 5U; @@ -80,18 +79,17 @@ class TimebaseModule8BitInitialised : public TimebaseModuleBasicConfig timer_8_bit_stub_set_next_parameters(prescaler, ocra, accumulator); - timebase_error_t err = timebase_init(0U, &config); + timebase_error_t err = timebase_init(0U); ASSERT_EQ(TIMEBASE_ERROR_OK, err); } }; TEST(timebase_module_tests, test_compute_timer_parameters) { - timebase_config_t config; - config.cpu_freq = 16'000'000; - config.timescale = TIMEBASE_TIMESCALE_MILLISECONDS; - config.timer.type = TIMEBASE_TIMER_16_BIT; - config.timer.index = 0U; + timebase_static_config[0].cpu_freq = 16'000'000; + timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_MILLISECONDS; + timebase_static_config[0].timer.type = TIMER_ARCH_16_BIT; + timebase_static_config[0].timer.index = 0U; uint16_t prescaler = 0; uint16_t ocr_value = 0; @@ -99,25 +97,25 @@ TEST(timebase_module_tests, test_compute_timer_parameters) timer_16_bit_stub_set_next_parameters(TIMER16BIT_CLK_PRESCALER_1, 15999U, 0U); - timebase_error_t err = timebase_compute_timer_parameters(&config, &prescaler, &ocr_value, &accumulator); + timebase_error_t err = timebase_compute_timer_parameters(0U, &prescaler, &ocr_value, &accumulator); ASSERT_EQ(TIMEBASE_ERROR_OK, err); ASSERT_EQ(0U, accumulator); ASSERT_EQ(prescaler, 1U); ASSERT_EQ(ocr_value, 15999U); - config.timer.type = TIMEBASE_TIMER_8_BIT; - config.timer.index = 0U; + timebase_static_config[0].timer.type = TIMER_ARCH_8_BIT; + timebase_static_config[0].timer.index = 0U; timer_8_bit_stub_set_next_parameters(TIMER8BIT_CLK_PRESCALER_64, 250, 3U); - err = timebase_compute_timer_parameters(&config, &prescaler, &ocr_value, &accumulator); + err = timebase_compute_timer_parameters(0U, &prescaler, &ocr_value, &accumulator); ASSERT_EQ(TIMEBASE_ERROR_OK, err); ASSERT_EQ(3U, accumulator); ASSERT_EQ(prescaler, 64U); ASSERT_EQ(ocr_value, 250U); - config.timer.type = TIMEBASE_TIMER_8_BIT_ASYNC; - config.timer.index = 0U; + timebase_static_config[0].timer.type = TIMER_ARCH_8_BIT_ASYNC; + timebase_static_config[0].timer.index = 0U; timer_8_bit_async_stub_set_next_parameters(TIMER8BIT_ASYNC_CLK_PRESCALER_1024, 127, 4U); - err = timebase_compute_timer_parameters(&config, &prescaler, &ocr_value, &accumulator); + err = timebase_compute_timer_parameters(0U, &prescaler, &ocr_value, &accumulator); ASSERT_EQ(TIMEBASE_ERROR_OK, err); ASSERT_EQ(4U, accumulator); ASSERT_EQ(prescaler, 1024); @@ -127,36 +125,30 @@ TEST(timebase_module_tests, test_compute_timer_parameters) TEST(timebase_module_test, test_guard_wrong_parameters) { { - timebase_config_t config; - memset(&config, 0, sizeof(timebase_config_t)); + memset(&timebase_static_config[0], 0, sizeof(timebase_config_t)); uint16_t * null_prescaler = nullptr; uint16_t * null_ocr_value = nullptr; uint16_t * null_accumulator = nullptr; - auto ret = timebase_compute_timer_parameters(&config, null_prescaler, null_ocr_value, null_accumulator); + auto ret = timebase_compute_timer_parameters(0U, null_prescaler, null_ocr_value, null_accumulator); ASSERT_EQ(ret, TIMEBASE_ERROR_NULL_POINTER); uint16_t prescaler = 0; uint16_t accumulator = 0; uint16_t ocr_value = 0; // Forcing a wrong timer type - config.timer.type = TIMEBASE_TIMER_UNDEFINED; - config.timescale = TIMEBASE_TIMESCALE_MICROSECONDS; - ret = timebase_compute_timer_parameters(&config, &prescaler, &ocr_value, &accumulator); + timebase_static_config[0].timer.type = TIMER_ARCH_UNDEFINED; + timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_MICROSECONDS; + ret = timebase_compute_timer_parameters(0U, &prescaler, &ocr_value, &accumulator); ASSERT_EQ(ret, TIMEBASE_ERROR_UNSUPPORTED_TIMER_TYPE); - config.timer.type = TIMEBASE_TIMER_16_BIT; - config.timescale = TIMEBASE_TIMESCALE_UNDEFINED; - ret = timebase_compute_timer_parameters(&config, &prescaler, &ocr_value, &accumulator); + timebase_static_config[0].timer.type = TIMER_ARCH_16_BIT; + timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_UNDEFINED; + ret = timebase_compute_timer_parameters(0U, &prescaler, &ocr_value, &accumulator); ASSERT_EQ(ret, TIMEBASE_ERROR_UNSUPPORTED_TIMESCALE); } { - timebase_config_t * null_config = nullptr; - timebase_config_t config; - memset(&config, 0, sizeof(timebase_config_t)); - auto ret = timebase_init(0U, null_config); - ASSERT_EQ(ret, TIMEBASE_ERROR_NULL_POINTER); - - ret = timebase_init(TIMEBASE_MAX_MODULES, &config); + timebase_error_t ret = TIMEBASE_ERROR_OK; + ret = timebase_init(TIMEBASE_MAX_MODULES); ASSERT_EQ(ret, TIMEBASE_ERROR_INVALID_INDEX); } { @@ -212,56 +204,54 @@ TEST(timebase_module_test, test_guard_wrong_parameters) TEST(timebase_module_tests, test_wrong_index_error_forwarding) { - timebase_config_t config; - config.cpu_freq = 16'000'000; - config.timescale = TIMEBASE_TIMESCALE_MILLISECONDS; + timebase_static_config[0].cpu_freq = 16'000'000; + timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_MILLISECONDS; // This index should break execution as this timer driver does not exist (only '0' is declared) - config.timer.index = 1U; + timebase_static_config[0].timer.index = 1U; - config.timer.type = TIMEBASE_TIMER_16_BIT; - timebase_error_t err = timebase_init(0U, &config); + timebase_static_config[0].timer.type = TIMER_ARCH_16_BIT; + timebase_error_t err = timebase_init(0U); ASSERT_EQ(TIMEBASE_ERROR_TIMER_ERROR, err); - config.timer.type = TIMEBASE_TIMER_8_BIT; - err = timebase_init(0U, &config); + timebase_static_config[0].timer.type = TIMER_ARCH_8_BIT; + err = timebase_init(0U); ASSERT_EQ(TIMEBASE_ERROR_TIMER_ERROR, err); - config.timer.type = TIMEBASE_TIMER_8_BIT_ASYNC; - err = timebase_init(0U, &config); + timebase_static_config[0].timer.type = TIMER_ARCH_8_BIT_ASYNC; + err = timebase_init(0U); ASSERT_EQ(TIMEBASE_ERROR_TIMER_ERROR, err); // Repeat this with a wrong index for timebase module this time - config.timer.index = 0U; - err = timebase_init(TIMEBASE_MAX_MODULES, &config); + timebase_static_config[0].timer.index = 0U; + err = timebase_init(TIMEBASE_MAX_MODULES); ASSERT_EQ(TIMEBASE_ERROR_INVALID_INDEX, err); } TEST(timebase_module_tests, test_uninitialised_timer_error) { - timebase_config_t config; - config.cpu_freq = 16'000'000; - config.timescale = TIMEBASE_TIMESCALE_MILLISECONDS; - config.timer.type = TIMEBASE_TIMER_16_BIT; - config.timer.index = 0U; + timebase_static_config[0].cpu_freq = 16'000'000; + timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_MILLISECONDS; + timebase_static_config[0].timer.type = TIMER_ARCH_16_BIT; + timebase_static_config[0].timer.index = 0U; - timebase_error_t err = timebase_init(0U, &config); + timebase_error_t err = timebase_init(0U); ASSERT_EQ(TIMEBASE_ERROR_TIMER_UNINITIALISED, err); - config.timer.type = TIMEBASE_TIMER_8_BIT; - err = timebase_init(0U, &config); + timebase_static_config[0].timer.type = TIMER_ARCH_8_BIT; + err = timebase_init(0U); ASSERT_EQ(TIMEBASE_ERROR_TIMER_UNINITIALISED, err); - config.timer.type = TIMEBASE_TIMER_8_BIT_ASYNC; - err = timebase_init(0U, &config); + timebase_static_config[0].timer.type = TIMER_ARCH_8_BIT_ASYNC; + err = timebase_init(0U); ASSERT_EQ(TIMEBASE_ERROR_TIMER_UNINITIALISED, err); } TEST_F(TimebaseModuleBasicConfig, test_timer_initialisation) { timer_8_bit_stub_set_initialised(true); - config.timer.type = TIMEBASE_TIMER_8_BIT; - config.timer.index = 0U; + timebase_static_config[0].timer.type = TIMER_ARCH_8_BIT; + timebase_static_config[0].timer.index = 0U; timer_8_bit_prescaler_selection_t prescaler = TIMER8BIT_CLK_PRESCALER_64; uint32_t accumulator = 5U; @@ -269,7 +259,7 @@ TEST_F(TimebaseModuleBasicConfig, test_timer_initialisation) timer_8_bit_stub_set_next_parameters(prescaler, ocra, accumulator); - timebase_error_t err = timebase_init(0U, &config); + timebase_error_t err = timebase_init(0U); ASSERT_EQ(TIMEBASE_ERROR_OK, err); timer_8_bit_config_t driver_config; memset(&driver_config, 0, sizeof(timer_8_bit_config_t)); diff --git a/Modules/Timebase/inc/timebase.h b/Modules/Timebase/inc/timebase.h index 57d8777..fa4e437 100644 --- a/Modules/Timebase/inc/timebase.h +++ b/Modules/Timebase/inc/timebase.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -38,6 +38,8 @@ extern "C" #include #include +#include "config.h" +#include "timer_generic.h" /** * @brief Describes available error codes for this timebase module @@ -50,24 +52,13 @@ typedef enum yet, so timebase may run eratically) */ TIMEBASE_ERROR_NULL_POINTER, /**< One or more parameters are not initialised properly */ TIMEBASE_ERROR_INVALID_INDEX, /**< Index is not set correctly, probably out of bounds */ - TIMEBASE_ERROR_UNSUPPORTED_TIMER_TYPE, /**< Given timer type is not compatible with timebase_timer_t enum */ + TIMEBASE_ERROR_UNSUPPORTED_TIMER_TYPE, /**< Given timer type is not compatible with timer_arch_t enum */ TIMEBASE_ERROR_UNSUPPORTED_TIMESCALE, /**< Given timescale is not relevant to timebase module */ TIMEBASE_ERROR_TIMER_UNINITIALISED, /**< Underlying timer is not initialised */ TIMEBASE_ERROR_TIMER_ERROR, /**< Encountered an error while using underlying timer driver */ } timebase_error_t; -/** - * @brief Allows to select the underlying timer driver -*/ -typedef enum -{ - TIMEBASE_TIMER_UNDEFINED, /**< Undefined timer type, default value */ - TIMEBASE_TIMER_8_BIT, /**< Uses a regular 8 bit timer */ - TIMEBASE_TIMER_16_BIT, /**< Uses a regular 16 bit timer */ - TIMEBASE_TIMER_8_BIT_ASYNC, /**< Uses an advanced / async capable 8 bit timer */ -} timebase_timer_t; - /** * @brief Selects the reference timebase */ @@ -87,15 +78,17 @@ typedef struct { struct { - timebase_timer_t type; /**< Used to select a timer from its type */ + timer_arch_t type; /**< Used to select a timer from its type */ uint8_t index; /**< Used to select a particular timer from the available ones */ } timer; uint32_t cpu_freq; /**< Gives the CPU frequency to compute the right prescaler for the timebase */ struct { - timebase_timescale_t timescale; /**< Selects what is the resolution of the timer */ - uint32_t custom_target_freq; /**< Custom target frequency */ + timebase_timescale_t timescale; /**< Selects what is the resolution of the timer */ + uint32_t custom_target_freq; /**< Custom target frequency (only used if timescale = TIMEBASE_TIMESCALE_CUSTOM enum value ) */ + // it basically allows to set a specific target frequency which does not fall in common use cases + // such as 1000Hz, 1Hz, 1000000Hz etc. }; } timebase_config_t; @@ -110,18 +103,17 @@ typedef struct * TIMEBASE_ERROR_UNSUPPORTED_TIMER_TYPE : targeted timer type does not exist * TIMEBASE_ERROR_UNSUPPORTED_TIMESCALE : timescale is not relevant to timebase module */ -timebase_error_t timebase_compute_timer_parameters(timebase_config_t const * const config, uint16_t * const prescaler_val, uint16_t * const ocr_value, uint16_t * const accumulator); +timebase_error_t timebase_compute_timer_parameters(const uint8_t id, uint16_t * const prescaler_val, uint16_t * const ocr_value, uint16_t * const accumulator); /** * @brief Initialises the timebase module using an id and a configuration. * @param[in] id : index of timebase module to be initialised - * @param[in] config : configuration to be used to initialise the targeted timebase module * @return * TIMEBASE_ERROR_OK : operation succeeded * TIMEBASE_ERROR_NULL_POINTER : given parameter is uninitialised * TIMEBASE_ERROR_INVALID_INDEX : given module id is out of bounds */ -timebase_error_t timebase_init(const uint8_t id, timebase_config_t const * const config); +timebase_error_t timebase_init(const uint8_t id); /** @@ -187,6 +179,12 @@ timebase_error_t timebase_get_duration_now(const uint8_t id, uint16_t const * co */ void timebase_interrupt_callback(const uint8_t id); +/** + * @brief Encodes the static configuration used by this module + * Each slot of this array codes for a single timebase instance, based on a single individual hardware timer + */ +extern timebase_config_t timebase_static_config[TIMEBASE_MAX_MODULES]; + #ifdef __cplusplus } #endif diff --git a/Modules/Timebase/inc/timebase_internal.h b/Modules/Timebase/inc/timebase_internal.h index c986721..9d78f92 100644 --- a/Modules/Timebase/inc/timebase_internal.h +++ b/Modules/Timebase/inc/timebase_internal.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -41,7 +41,7 @@ extern "C" typedef struct { - timebase_timer_t timer; + timer_arch_t arch; uint8_t timer_id; struct { diff --git a/Modules/Timebase/src/timebase.c b/Modules/Timebase/src/timebase.c index edba38e..7ab2f8f 100644 --- a/Modules/Timebase/src/timebase.c +++ b/Modules/Timebase/src/timebase.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -41,7 +41,8 @@ along with this program. If not, see . #include "timer_8_bit_async.h" #ifndef TIMEBASE_MAX_MODULES - #error "TIMEBASE_MAX_MODULES define is missing, please set the maximum number of available timebase modules in your config.h" + #warning "TIMEBASE_MAX_MODULES define is missing, please set the maximum number of available timebase modules in your config.h" + #define TIMEBASE_MAX_MODULES 1U #endif timebase_internal_config_t timebase_internal_config[TIMEBASE_MAX_MODULES] = {0}; @@ -61,7 +62,7 @@ static void reset_internal_config(const uint8_t id) timebase_internal_config[id].accumulator.programmed = 0; timebase_internal_config[id].accumulator.running = 0; timebase_internal_config[id].tick = 0; - timebase_internal_config[id].timer = TIMEBASE_TIMER_UNDEFINED; + timebase_internal_config[id].arch = TIMER_ARCH_UNDEFINED; timebase_internal_config[id].timer_id = 0; timebase_internal_config[id].initialised = false; } @@ -234,10 +235,10 @@ static inline timebase_error_t setup_16_bit_timer(const uint8_t timebase_id, uin return TIMEBASE_ERROR_OK; } -static inline timebase_error_t convert_timescale_to_frequency(const timebase_config_t * const config, uint32_t * const target_frequency) +static inline timebase_error_t convert_timescale_to_frequency(const uint8_t id, uint32_t * const target_frequency) { /* Handle target frequency */ - switch (config->timescale) + switch (timebase_static_config[id].timescale) { case TIMEBASE_TIMESCALE_MICROSECONDS: *target_frequency = 1000000UL; @@ -249,7 +250,7 @@ static inline timebase_error_t convert_timescale_to_frequency(const timebase_con *target_frequency = 1UL; break; case TIMEBASE_TIMESCALE_CUSTOM: - *target_frequency = config->custom_target_freq; + *target_frequency = timebase_static_config[id].custom_target_freq; break; default: return TIMEBASE_ERROR_UNSUPPORTED_TIMESCALE; @@ -257,16 +258,16 @@ static inline timebase_error_t convert_timescale_to_frequency(const timebase_con return TIMEBASE_ERROR_OK; } -timebase_error_t timebase_compute_timer_parameters(timebase_config_t const * const config, uint16_t * const prescaler_val, uint16_t * const ocr_value, uint16_t * const accumulator) +timebase_error_t timebase_compute_timer_parameters(const uint8_t id, uint16_t * const prescaler_val, uint16_t * const ocr_value, uint16_t * const accumulator) { timer_8_bit_prescaler_selection_t prescaler; uint32_t target_frequency = 0; - if (NULL == config || NULL == prescaler_val || NULL == ocr_value || NULL == accumulator) + if (NULL == prescaler_val || NULL == ocr_value || NULL == accumulator) { return TIMEBASE_ERROR_NULL_POINTER; } - timebase_error_t ret = convert_timescale_to_frequency(config, &target_frequency); + timebase_error_t ret = convert_timescale_to_frequency(id, &target_frequency); if (TIMEBASE_ERROR_OK != ret) { return ret; @@ -274,10 +275,10 @@ timebase_error_t timebase_compute_timer_parameters(timebase_config_t const * con uint16_t ocra = 0; // Initialise each timer using the right parameters set - switch(config->timer.type) + switch(timebase_static_config[id].timer.type) { - case TIMEBASE_TIMER_8_BIT: - timer_8_bit_compute_matching_parameters(&config->cpu_freq, + case TIMER_ARCH_8_BIT: + timer_8_bit_compute_matching_parameters(&timebase_static_config[id].cpu_freq, &target_frequency, &prescaler, (uint8_t*) &ocra, @@ -286,8 +287,8 @@ timebase_error_t timebase_compute_timer_parameters(timebase_config_t const * con *ocr_value = ocra; break; - case TIMEBASE_TIMER_8_BIT_ASYNC: - timer_8_bit_async_compute_matching_parameters(&config->cpu_freq, + case TIMER_ARCH_8_BIT_ASYNC: + timer_8_bit_async_compute_matching_parameters(&timebase_static_config[id].cpu_freq, &target_frequency, (timer_8_bit_async_prescaler_selection_t *) &prescaler, (uint8_t*) &ocra, @@ -296,8 +297,8 @@ timebase_error_t timebase_compute_timer_parameters(timebase_config_t const * con *ocr_value = ocra; break; - case TIMEBASE_TIMER_16_BIT: - timer_16_bit_compute_matching_parameters(&config->cpu_freq, + case TIMER_ARCH_16_BIT: + timer_16_bit_compute_matching_parameters(&timebase_static_config[id].cpu_freq, &target_frequency, (timer_16_bit_prescaler_selection_t *)&prescaler, &ocra, @@ -313,49 +314,44 @@ timebase_error_t timebase_compute_timer_parameters(timebase_config_t const * con } -timebase_error_t timebase_init(const uint8_t timebase_id, timebase_config_t const * const config) +timebase_error_t timebase_init(const uint8_t id) { timebase_error_t ret = TIMEBASE_ERROR_OK; - if (false == is_index_valid(timebase_id)) + if (false == is_index_valid(id)) { return TIMEBASE_ERROR_INVALID_INDEX; } - if (NULL == config) - { - return TIMEBASE_ERROR_NULL_POINTER; - } - - timebase_internal_config[timebase_id].timer_id = config->timer.index; - timebase_internal_config[timebase_id].timer = config->timer.type; + timebase_internal_config[id].timer_id = timebase_static_config[id].timer.index; + timebase_internal_config[id].arch = timebase_static_config[id].timer.type; uint32_t target_freq = 0; - ret = convert_timescale_to_frequency(config, &target_freq); + ret = convert_timescale_to_frequency(id, &target_freq); if (TIMEBASE_ERROR_OK != ret) { return ret; } // Initialise each timer using the right parameters set - switch(config->timer.type) + switch(timebase_static_config[id].timer.type) { - case TIMEBASE_TIMER_8_BIT: - ret = setup_8_bit_timer(timebase_id, &(config->cpu_freq), &target_freq); + case TIMER_ARCH_8_BIT: + ret = setup_8_bit_timer(id, &(timebase_static_config[id].cpu_freq), &target_freq); break; - case TIMEBASE_TIMER_8_BIT_ASYNC: - ret = setup_8_bit_async_timer(timebase_id, &(config->cpu_freq), &target_freq); + case TIMER_ARCH_8_BIT_ASYNC: + ret = setup_8_bit_async_timer(id, &(timebase_static_config[id].cpu_freq), &target_freq); break; - case TIMEBASE_TIMER_16_BIT: - ret = setup_16_bit_timer(timebase_id, &(config->cpu_freq), &target_freq); + case TIMER_ARCH_16_BIT: + ret = setup_16_bit_timer(id, &(timebase_static_config[id].cpu_freq), &target_freq); break; default: return TIMEBASE_ERROR_UNSUPPORTED_TIMER_TYPE; } - timebase_internal_config[timebase_id].initialised = true; + timebase_internal_config[id].initialised = true; return ret; } From d5015beed61d44836b28ae1c81af88c356f0eaa0 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 16 Mar 2022 13:21:49 +0100 Subject: [PATCH 14/51] Added example config for PWM and documentation Signed-off-by: bebenlebricolo --- Modules/Pwm/Readme.md | 44 ++++++++++++++++++ Modules/Pwm/examples/config.c | 84 +++++++++++++++++++++++++++++++++++ Modules/Pwm/examples/config.h | 67 ++++++++++++++++++++++++++++ Modules/Pwm/inc/pwm.h | 14 +++++- 4 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 Modules/Pwm/examples/config.c create mode 100644 Modules/Pwm/examples/config.h diff --git a/Modules/Pwm/Readme.md b/Modules/Pwm/Readme.md index 5c67401..f4630f5 100644 --- a/Modules/Pwm/Readme.md +++ b/Modules/Pwm/Readme.md @@ -1,16 +1,40 @@ # Index - [Index](#index) - [PWM driver](#pwm-driver) +- [Interaction with hardware timer peripherals](#interaction-with-hardware-timer-peripherals) + - [Limitations](#limitations) - [Driving 8 bit timers](#driving-8-bit-timers) - [Dual channel PWM configuration](#dual-channel-pwm-configuration) - [Single channel, high speed PWM configuration](#single-channel-high-speed-pwm-configuration) +- [Driving 16 bits timers](#driving-16-bits-timers) +- [Basic configuration](#basic-configuration) # PWM driver +[Back to top](#index) + This PWM driver builds upon the various timer driver found in the AvrAsyncCore SDK. It basically provides a frontend which abstract some inner mechanisms of the timer themselves, trying to make its interface more generic and more portable across the Avr family. +# Interaction with hardware timer peripherals +[Back to top](#index) + +This PWM drivers **builds on top of the various Timer drivers and interfaces**. +It is able to **probe the current timer hardware configuration** by reading the registers and will try to accommodate a working pwm configuration to achieve both frequency and/or duty cycle if possible. Note that this is not a strong guarantee, because of some limitations found in hardware timer implementations. + +Amongst other things, this driver does not mess with the Waveform Generation bits other than pure reading. +However, it is able to modify the `COMxA/B` registers in order to select the PWM start polarity. + +## Limitations +[Back to top](#index) + +Because of hardware limitations, some use cases such as using a 8 bit timer to generate a PWM signal might result in a PWM which might be quite off compared to the desired PWM signal. This is mainly due to the lack of functionality when it comes to dual PWM configurations for a single hardware timer. + +Software is also limited in speed and refresh rate : it needs the main application to call the `process()` function at a high enough rate to cope with the software PWM requirements. In that regard, it is better to keep the software PWM frequency low enough, like at least ***10 times lower than the main `while loop` refresh rate.*** + # Driving 8 bit timers +[Back to top](#index) + Regular 8 bit timers and 8 bit asynchronous timers share a common peripheral interface, where one can choose how configure them as PWM units. As per the other kinds of timers, they have two units, A and B, which are sharing a common counter register (usually TCNTx). @@ -45,6 +69,8 @@ This implies that regarding PWM modes, we have essentially two available solutio * Single channel, high speed PWM with full frequency and duty cycle control ## Dual channel PWM configuration +[Back to top](#index) + This configuration is achieved when either `TIMER8BIT_WG_PWM_FAST_FULL_RANGE` or `TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE` is used to configure a given timer. As a result, the top value of the counter is always set to the maximum value of the 8 bit counter, which is `0xFF`. Then, the only way to change the frequency of the output PWMs will be to change the prescaler used by the timer itself, or by varying the CPU frequency as the output frequency is governed by the following equation : @@ -63,6 +89,8 @@ For high speed PWM however, this is really limiting and the fact that we cannot ![](docs/Timer8bit_dual_channel.png) ## Single channel, high speed PWM configuration +[Back to top](#index) + This configuration sacrifices the unit A of the timer, as it its OCRA value is used by the timer to determine the `TOP` value. It is achieved through the use of `TIMER8BIT_WG_PWM_FAST_OCRA_MAX` or `TIMER8BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX` and correctly handling `COMAxx` and `COMBxx` registers. Hence, the B unit will benefit from the `OCRA` value in order to pinpoint the closest frequency we want to work with, and the `OCRB` value will then be used to set the `duty_cycle` of the B unit. @@ -72,3 +100,19 @@ At best, the A PWM channel can output a 50% duty_cycle PWM with half the frequen * Using `TIMER8BIT_CMOD_SET_OCnX` will pull the output pin down to GND permanently (pin is cleared when timer reaches the BOTTOM value = 0) ![](docs/Timer8bit_single_channel.png) + +# Driving 16 bits timers +[Back to top](#index) + +16 bit timers are a bit more full-featured and allow the generation of accurate, complementary PWM signals out of a single timer. +Still, both channels share the same base prescaler, counter and `TOP` value, hence the same output frequency. +However, we can use the `ICR` register in order to provide an external value to the counter which will serve as the new `TOP` value, as well as reducing the counter's resolution using the appropriate WG mode. + +# Basic configuration +This driver uses a static configuration variable which needs to be exposed somewhere in the application code. +This is usually done by implementing the external symbol `pwm_config` in a `config.c` file, compiled by the firmware. +Both Hardware and Software PWMs configurations are mixed in this array, so one might need to retain the indices of each PWM instance in order to access them later on when using the PWM driver. + +```C + +``` \ No newline at end of file diff --git a/Modules/Pwm/examples/config.c b/Modules/Pwm/examples/config.c new file mode 100644 index 0000000..1b7d2e4 --- /dev/null +++ b/Modules/Pwm/examples/config.c @@ -0,0 +1,84 @@ +#include "config.h" +#include "pwm.h" +#include "timebase.h" +#include "timer_8_bit.h" +#include "timer_8_bit_async.h" +#include "timer_16_bit.h" + +#ifndef F_CPU +#pragma message("F_CPU macro was not set, defaulting to 8MHz") + #define F_CPU (8'000'000ULL) +#endif + +timebase_config_t timebase_static_config[TIMEBASE_MAX_INSTANCES] = +{ + [0] = + { + .timer = + { + .type = TIMEBASE_TIMER_8_BIT, + .index = TIMEBASE_TARGETED_TIMER_IDX, + }, + .cpu_freq = F_CPU, + .timescale = TIMEBASE_TIMESCALE_MILLISECONDS + } +}; + +pwm_static_config_t pwm_config[PWM_MAX_HARD_INSTANCES + PWM_MAX_SOFT_INSTANCES] = +{ + // Software based PWM configuration block + [FAN_1_PWM_IDX] = + {.type = PWM_TYPE_SOFTWARE, + .config.soft = + { + .io_index = FAN_1_IO_IDX, + .timebase_index = FAN_1_TIMEBASE_IDX + } + }, + [FAN_2_PWM_IDX] = + {.type = PWM_TYPE_SOFTWARE, + .config.soft = + { + .io_index = FAN_2_IO_IDX, + .timebase_index = FAN_2_TIMEBASE_IDX + } + }, + + // Hardware based PWM configuration block + [MOTOR_1_PWM_IDX] = + {.type = PWM_TYPE_HARDWARE, + .config.hard = + { + .targeted_timer = TIMEBASE_TIMER_8_BIT, + .unit = PWM_HARD_TIMER_UNIT_A, + .timer_index = MOTOR_1_TIMER_IDX + } + }, + [MOTOR_2_PWM_IDX] = + {.type = PWM_TYPE_HARDWARE, + .config.hard = + { + .targeted_timer = TIMEBASE_TIMER_8_BIT, + .unit = PWM_HARD_TIMER_UNIT_A, + .timer_index = MOTOR_2_TIMER_IDX + } + } +}; + +io_t io_pins_lut[IO_MAX_PINS] = +{ + [FAN_1_IO_IDX] = + { + .direction = IO_OUT_PUSH_PULL, + .pin = FAN_1_IO_PIN, + .port = IO_PORT_B, + .state = IO_STATE_LOW + }, + [FAN_2_IO_IDX] = + { + .direction = IO_OUT_PUSH_PULL, + .pin = FAN_2_IO_PIN, + .port = IO_PORT_B, + .state = IO_STATE_LOW + } +} \ No newline at end of file diff --git a/Modules/Pwm/examples/config.h b/Modules/Pwm/examples/config.h new file mode 100644 index 0000000..1f5e75a --- /dev/null +++ b/Modules/Pwm/examples/config.h @@ -0,0 +1,67 @@ +#ifndef PWM_DRIVER_CONFIG_HEADER_EXAMPLE +#define PWM_DRIVER_CONFIG_HEADER_EXAMPLE + +#ifdef __cplusplus +extern "C" { +#endif + +// Pseudo timebase configuration (needed by the software PWM driver) +#define TIMEBASE_MAX_INSTANCES 1U +#define TIMEBASE_TARGETED_TIMER_IDX 0U +#define IO_MAX_PINS 2U + +// Pseudo timer configuration as per registered in Timer 8 bit driver +#define MOTOR_1_TIMER_IDX 0U +#define MOTOR_2_TIMER_IDX 1U + +// Software PWM implementation +// Pseudo pin mapping -> interacts with the IO driver + +#define FAN_1_IO_IDX 0U +#define FAN_1_IO_PIN 2U +// FAN_1_IO_PORT is directly defined in config.c to benefit from type checking + +#define FAN_2_IO_IDX 1U +#define FAN_2_IO_PIN 3U +// FAN_2_IO_PORT is directly defined in config.c to benefit from type checking + +#define FAN_1_TIMEBASE_IDX 0U // Selecting the first timebase module +#define FAN_2_TIMEBASE_IDX FAN_1_TIMEBASE_IDX // Same as FAN_1_TIMEBASE module + +// Configure PWM driver to have 2 instances +#define PWM_MAX_HARD_INSTANCES 2 +#define PWM_MAX_SOFT_INSTANCES 2 + +// Pseudo PWM mapping +#define FAN_1_PWM_IDX 0 +#define FAN_2_PWM_IDX 1 +#define MOTOR_1_PWM_IDX 2 +#define MOTOR_2_PWM_IDX 3 + + + + + + + + + + + + + + + + + + + + + + + +#ifdef __cplusplus +} +#endif + +#endif /* PWM_DRIVER_CONFIG_HEADER_EXAMPLE */ \ No newline at end of file diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index b50325e..c42b6e6 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -54,6 +54,12 @@ typedef enum PWM_TYPE_HARDWARE /**< Hardware based PWM, used to get the maximum speed, reliability and accuracy straight from hardware timers */ } pwm_type_t; +typedef enum +{ + PWM_POLARITY_NORMAL, /**< PWM signal starts at the HIGH state (output pin is set to VCC when counter reaches TOP) */ + PWM_POLARITY_INVERTED, /**< PWM signal starts at the LOW state (output pin is set to GND when counter reaches TOP) */ +} pwm_polarity_t; + // ################################################################################################ // ############################ Compile time static configuration ################################# // ################################################################################################ @@ -75,7 +81,7 @@ typedef struct typedef struct { uint8_t io_index; /**< IO index from the Io lookup table @see static io configuration */ - io_state_t initial_state; /**< Configures starting pin state (pulling a pin to down by default is not compatible with open collector topologies */ + uint8_t timebase_index; /**< Timebase index used to look at the watch */ } pwm_soft_static_config_t; /** @@ -116,6 +122,7 @@ typedef struct { uint32_t frequency; /**< Desired frequency of the timer counter */ uint8_t duty_cycle; /**< Desired duty cycle, ranging from 0 to 100 */ + pwm_polarity_t pol; /**< Desired start polarity on the targeted pin */ } pwm_props_t; /** @@ -223,6 +230,11 @@ pwm_error_t pwm_stop_all(void); * -> Output frequency is limit to a few frequencies as per this relation : F_CPU/(prescaler*TOP) ; where TOP = 0xFF * which for a CPU frequency of 16 MHz gives : | prescaler | 1 | 8 | 64 | 256 | 1024 | * | Frequency (Hz) | 62500 | 7812 | 976 | 244 | 61 | + * - Single pwm channel on 8 bit timers need to sacrifice the unit A in order to get full control over B unit's frequency AND duty cycle alltogether. + * -> This is achieve through the use of WG FAST PWM OCRA MAX mode and WG PHASE CORRECT OCRA MAX modes + * This driver checks the actual values of TCCRxx, looking for WG modes and COMxA/B modes. + * Those values will then be taken into account in order to configure the timer accordingly, but this function will not configure WG and COM modes for + * you, this is the responsibility of the Timer initialisation steps. * @param pwm_instance_index : pwm instance index as per given in config.c file * @param frequency : targeted PWM frequency * @param cpu_freq : current CPU frequency (note that if CPU frequency changes, output PWM will be off as well) From fd9d61c8258eb278d391ab70f586367c7116a608 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 16 Mar 2022 13:23:20 +0100 Subject: [PATCH 15/51] Updated example config file Signed-off-by: bebenlebricolo --- Modules/Pwm/examples/config.c | 8 ++++---- Modules/Pwm/examples/config.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/Pwm/examples/config.c b/Modules/Pwm/examples/config.c index 1b7d2e4..1e82f1e 100644 --- a/Modules/Pwm/examples/config.c +++ b/Modules/Pwm/examples/config.c @@ -16,7 +16,7 @@ timebase_config_t timebase_static_config[TIMEBASE_MAX_INSTANCES] = { .timer = { - .type = TIMEBASE_TIMER_8_BIT, + .type = TIMER_ARCH_8_BIT, .index = TIMEBASE_TARGETED_TIMER_IDX, }, .cpu_freq = F_CPU, @@ -49,7 +49,7 @@ pwm_static_config_t pwm_config[PWM_MAX_HARD_INSTANCES + PWM_MAX_SOFT_INSTANCES] {.type = PWM_TYPE_HARDWARE, .config.hard = { - .targeted_timer = TIMEBASE_TIMER_8_BIT, + .targeted_timer = TIMER_ARCH_16_BIT, .unit = PWM_HARD_TIMER_UNIT_A, .timer_index = MOTOR_1_TIMER_IDX } @@ -58,8 +58,8 @@ pwm_static_config_t pwm_config[PWM_MAX_HARD_INSTANCES + PWM_MAX_SOFT_INSTANCES] {.type = PWM_TYPE_HARDWARE, .config.hard = { - .targeted_timer = TIMEBASE_TIMER_8_BIT, - .unit = PWM_HARD_TIMER_UNIT_A, + .targeted_timer = TIMER_ARCH_16_BIT, + .unit = PWM_HARD_TIMER_UNIT_B, .timer_index = MOTOR_2_TIMER_IDX } } diff --git a/Modules/Pwm/examples/config.h b/Modules/Pwm/examples/config.h index 1f5e75a..1e164db 100644 --- a/Modules/Pwm/examples/config.h +++ b/Modules/Pwm/examples/config.h @@ -12,7 +12,7 @@ extern "C" { // Pseudo timer configuration as per registered in Timer 8 bit driver #define MOTOR_1_TIMER_IDX 0U -#define MOTOR_2_TIMER_IDX 1U +#define MOTOR_2_TIMER_IDX MOTOR_1_TIMER_IDX // both motor output pins are driven by the same timer // Software PWM implementation // Pseudo pin mapping -> interacts with the IO driver From f56024acbeb36e9f45dfe3a670d03fe3a5164e19 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Tue, 22 Mar 2022 09:14:50 +0100 Subject: [PATCH 16/51] Modified TIMER 8 Bit handle configuration procedure Signed-off-by: bebenlebricolo --- Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h | 32 +- .../Timers/Timer_8_bit/inc/timer_8_bit_reg.h | 4 +- Drivers/Timers/Timer_8_bit/src/timer_8_bit.c | 291 +++--------------- ExampleApp/src/config.c | 14 +- ExampleApp/src/driver_setup.c | 15 +- Modules/Timebase/src/timebase.c | 12 +- 6 files changed, 69 insertions(+), 299 deletions(-) diff --git a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h index e55f94b..24408df 100644 --- a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h +++ b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -72,7 +72,6 @@ typedef struct timer_8_bit_timing_config_t timing_config; /**< Handles basic timing configuration for 8 bit timers */ timer_8_bit_interrupt_config_t interrupt_config; /**< Handles interrupt configuraitons for 8 bit timers */ timer_8_bit_force_compare_config_t force_compare; /**< Handles force compare flags on output A and B, generic configuration among timers */ - timer_8_bit_handle_t handle; /**< Stores pointer locations to peripheral registers */ } timer_8_bit_config_t; @@ -92,30 +91,6 @@ typedef struct */ timer_error_t timer_8_bit_get_default_config(timer_8_bit_config_t * config); -/** - * @brief sets the handle of timer_8_bit driver - * @param[in] id : targeted timer id (used to fetch internal configuration based on ids) - * @param[in] handle : handle to be copied into internal configuration - * @return - * TIMER_ERROR_OK : operation succeeded - * TIMER_ERROR_UNKNOWN_TIMER : given id is out of range - * TIMER_ERROR_NULL_POINTER : given force_comp_config parameter points to NULL -*/ -timer_error_t timer_8_bit_set_handle(uint8_t id, timer_8_bit_handle_t * const handle); - -/** - * @brief fetches the handle of timer_8_bit driver - * @param[in] id : targeted timer id (used to fetch internal configuration based on ids) - * @param[out] handle : output handle extracted from internal driver memory - * @return - * TIMER_ERROR_OK : operation succeeded - * TIMER_ERROR_UNKNOWN_TIMER : given id is out of range - * TIMER_ERROR_NULL_POINTER : given force_comp_config parameter points to NULL -*/ -timer_error_t timer_8_bit_get_handle(uint8_t id, timer_8_bit_handle_t * const handle); - - - /* ################################ Force compare flags configuration ############################### */ /** * @brief sets the given force compare configuration object to targeted timer @@ -420,6 +395,11 @@ timer_error_t timer_8_bit_stop(uint8_t id); */ extern const timer_generic_prescaler_pair_t timer_8_bit_prescaler_table[TIMER_8_BIT_MAX_PRESCALER_COUNT]; +/** + * @brief this handle has to be declared somewhere and initialised appropriately + */ +extern timer_8_bit_handle_t timer_8_bit_static_handle; + void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, const uint32_t * const target_freq, timer_8_bit_prescaler_selection_t * const prescaler, diff --git a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h index 8686303..2d8cf50 100644 --- a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h +++ b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit_reg.h @@ -149,8 +149,8 @@ typedef struct uint8_t counter; /**< Main Counter value used to start the timer */ uint8_t ocra_val; /**< Value to be set inside OCRA register to control PWM for instance */ uint8_t ocrb_val; /**< Value to be set inside OCRB register to control PWM for instance */ - timer_8_bit_compare_output_mode_t comp_match_a; /**< Describes the kind of compare match behavior ; equivalent to TCCRnA COMnA0 and COMnA1 bits */ - timer_8_bit_compare_output_mode_t comp_match_b; /**< Describes the kind of compare match behavior ; equivalent to TCCRnA COMnB0 and COMnB1 bits */ + timer_8_bit_compare_output_mode_t comp_mode_a; /**< Describes the kind of compare match behavior ; equivalent to TCCRnA COMnA0 and COMnA1 bits */ + timer_8_bit_compare_output_mode_t comp_mode_b; /**< Describes the kind of compare match behavior ; equivalent to TCCRnA COMnB0 and COMnB1 bits */ timer_8_bit_waveform_generation_t waveform_mode; /**< Selects the right waveform mode and dispatch it to the right registers */ timer_8_bit_prescaler_selection_t prescaler; /**< Selects the right prescaler to be fed in the timer */ } timer_8_bit_timing_config_t; diff --git a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c index 85018e3..2cde16b 100644 --- a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c +++ b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -49,7 +49,6 @@ along with this program. If not, see . static struct { - timer_8_bit_handle_t handle; timer_8_bit_prescaler_selection_t prescaler; bool is_initialised; } internal_config[TIMER_8_BIT_COUNT] = {0}; @@ -111,33 +110,6 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, } - -static inline timer_error_t check_handle(timer_8_bit_handle_t * const handle) -{ - bool found_null = false; - if (NULL == handle) - { - /* Not the use case we really want to check, but this is a case of error anyway - which will generate segfaults errors if we let it propagate further ... */ - found_null = true; - } - else - { - found_null |= (NULL == handle->OCRA); - found_null |= (NULL == handle->OCRB); - found_null |= (NULL == handle->TCCRA); - found_null |= (NULL == handle->TCCRB); - found_null |= (NULL == handle->TCNT); - found_null |= (NULL == handle->TIFR); - found_null |= (NULL == handle->TIMSK); - } - if (found_null) - { - return TIMER_ERROR_NULL_HANDLE; - } - return TIMER_ERROR_OK;; -} - static inline timer_error_t check_id(uint8_t id) { if (id >= TIMER_8_BIT_COUNT) @@ -147,41 +119,6 @@ static inline timer_error_t check_id(uint8_t id) return TIMER_ERROR_OK; } -timer_error_t timer_8_bit_set_handle(uint8_t id, timer_8_bit_handle_t * const handle) -{ - timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - if (NULL == handle) - { - return TIMER_ERROR_NULL_POINTER; - } - - memcpy(&internal_config[id].handle, handle, sizeof(timer_8_bit_handle_t)); - return ret; -} - -timer_error_t timer_8_bit_get_handle(uint8_t id, timer_8_bit_handle_t * const handle) -{ - timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - if (NULL == handle) - { - return TIMER_ERROR_NULL_POINTER; - } - - memcpy(handle, &internal_config[id].handle, sizeof(timer_8_bit_handle_t)); - return ret; -} - - timer_error_t timer_8_bit_get_default_config(timer_8_bit_config_t * config) { timer_error_t ret = TIMER_ERROR_OK; @@ -205,20 +142,12 @@ timer_error_t timer_8_bit_get_default_config(timer_8_bit_config_t * config) config->timing_config.ocrb_val = 0U; config->timing_config.prescaler = TIMER8BIT_CLK_NO_CLOCK; config->timing_config.waveform_mode = TIMER8BIT_WG_NORMAL; - config->timing_config.comp_match_a = TIMER8BIT_CMOD_NORMAL; - config->timing_config.comp_match_b = TIMER8BIT_CMOD_NORMAL; + config->timing_config.comp_mode_a = TIMER8BIT_CMOD_NORMAL; + config->timing_config.comp_mode_b = TIMER8BIT_CMOD_NORMAL; config->force_compare.force_comp_match_a = false; config->force_compare.force_comp_match_b = false; - /* Architecture and device dependent, must be set at configuration time */ - config->handle.OCRA = NULL; - config->handle.OCRB = NULL; - config->handle.TCCRA = NULL; - config->handle.TCCRB = NULL; - config->handle.TCNT = NULL; - config->handle.TIFR = NULL; - config->handle.TIMSK = NULL; return ret; } @@ -235,31 +164,24 @@ timer_error_t timer_8_bit_set_force_compare_config(uint8_t id, timer_8_bit_force return TIMER_ERROR_NULL_POINTER; } - /* Not fully configured handle, do not attempt to write to it until configured !*/ - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* Handles force output compare A flags */ if (true == force_comp_config->force_comp_match_a) { - *(internal_config[id].handle.TCCRB) |= (1U << FOCA_BIT) ; + *(timer_8_bit_static_handle.TCCRB) |= (1U << FOCA_BIT) ; } else { - *(internal_config[id].handle.TCCRB) &= ~(1U << FOCA_BIT) ; + *(timer_8_bit_static_handle.TCCRB) &= ~(1U << FOCA_BIT) ; } /* Handles force output compare A flags */ if (true == force_comp_config->force_comp_match_b) { - *(internal_config[id].handle.TCCRB) |= (1U << FOCB_BIT) ; + *(timer_8_bit_static_handle.TCCRB) |= (1U << FOCB_BIT) ; } else { - *(internal_config[id].handle.TCCRB) &= ~(1U << FOCB_BIT) ; + *(timer_8_bit_static_handle.TCCRB) &= ~(1U << FOCB_BIT) ; } return ret; } @@ -275,15 +197,9 @@ timer_error_t timer_8_bit_get_force_compare_config(uint8_t id, timer_8_bit_force { return TIMER_ERROR_NULL_POINTER; } - /* Not fully configured handle, do not attempt to write to it until configured !*/ - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } /* Handles Force Compare Output A flag */ - if (0U == (*(internal_config[id].handle.TCCRB) & FOCA_MSK)) + if (0U == (*(timer_8_bit_static_handle.TCCRB) & FOCA_MSK)) { force_comp_config->force_comp_match_a = false; } @@ -293,7 +209,7 @@ timer_error_t timer_8_bit_get_force_compare_config(uint8_t id, timer_8_bit_force } /* Handles Force Compare Output B flag */ - if (0U == (*(internal_config[id].handle.TCCRB) & FOCB_MSK)) + if (0U == (*(timer_8_bit_static_handle.TCCRB) & FOCB_MSK)) { force_comp_config->force_comp_match_b = false; } @@ -316,39 +232,34 @@ timer_error_t timer_8_bit_set_interrupt_config(uint8_t id, timer_8_bit_interrupt { return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } /* TIMSK register */ if (true == it_config->it_comp_match_a) { - *(internal_config[id].handle.TIMSK) |= 1U << OCIEA_BIT; + *(timer_8_bit_static_handle.TIMSK) |= 1U << OCIEA_BIT; } else { - *(internal_config[id].handle.TIMSK) &= ~(1U << OCIEA_BIT); + *(timer_8_bit_static_handle.TIMSK) &= ~(1U << OCIEA_BIT); } if (true == it_config->it_comp_match_b) { - *(internal_config[id].handle.TIMSK) |= 1U << OCIEB_BIT; + *(timer_8_bit_static_handle.TIMSK) |= 1U << OCIEB_BIT; } else { - *(internal_config[id].handle.TIMSK) &= ~(1U << OCIEB_BIT); + *(timer_8_bit_static_handle.TIMSK) &= ~(1U << OCIEB_BIT); } /* TOIE interrupt flag is the first bit, no need to bitshift it */ if (true == it_config->it_timer_overflow) { - *(internal_config[id].handle.TIMSK) |= 1U; + *(timer_8_bit_static_handle.TIMSK) |= 1U; } else { - *(internal_config[id].handle.TIMSK) &= ~1U; + *(timer_8_bit_static_handle.TIMSK) &= ~1U; } return ret; } @@ -367,14 +278,10 @@ timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + /* Output Compare Match A Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIMSK) & OCIEA_MSK)) + if (0U == (*(timer_8_bit_static_handle.TIMSK) & OCIEA_MSK)) { it_config->it_comp_match_a = false; } @@ -384,7 +291,7 @@ timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt } /* Output Compare Match B Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIMSK) & OCIEB_MSK)) + if (0U == (*(timer_8_bit_static_handle.TIMSK) & OCIEB_MSK)) { it_config->it_comp_match_b = false; } @@ -394,7 +301,7 @@ timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt } /* Timer Overflow Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIMSK) & 1U)) + if (0U == (*(timer_8_bit_static_handle.TIMSK) & 1U)) { it_config->it_timer_overflow = false; } @@ -419,15 +326,8 @@ timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_ return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - /* Output Compare Match A Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIFR) & OCIEA_MSK)) + if (0U == (*(timer_8_bit_static_handle.TIFR) & OCIEA_MSK)) { it_flags->it_comp_match_a = false; } @@ -437,7 +337,7 @@ timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_ } /* Output Compare Match B Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIFR) & OCIEB_MSK)) + if (0U == (*(timer_8_bit_static_handle.TIFR) & OCIEB_MSK)) { it_flags->it_comp_match_b = false; } @@ -447,7 +347,7 @@ timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_ } /* Timer Overflow Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIFR) & 1U)) + if (0U == (*(timer_8_bit_static_handle.TIFR) & 1U)) { it_flags->it_timer_overflow = false; } @@ -471,13 +371,7 @@ timer_error_t timer_8_bit_set_prescaler(uint8_t id, const timer_8_bit_prescaler_ return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~CS_MSK) | prescaler; + *(timer_8_bit_static_handle.TCCRB) = (*(timer_8_bit_static_handle.TCCRB) & ~CS_MSK) | prescaler; return ret; } @@ -494,13 +388,7 @@ timer_error_t timer_8_bit_get_prescaler(uint8_t id, timer_8_bit_prescaler_select return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *prescaler = (*(internal_config[id].handle.TCCRB) & CS_MSK); + *prescaler = (*(timer_8_bit_static_handle.TCCRB) & CS_MSK); return ret; } @@ -512,13 +400,7 @@ timer_error_t timer_8_bit_set_compare_match_A(uint8_t id, const timer_8_bit_comp return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *(internal_config[id].handle.TCCRA) = (*(internal_config[id].handle.TCCRA) & ~COMA_MSK) | (compA << COMA_BIT); + *(timer_8_bit_static_handle.TCCRA) = (*(timer_8_bit_static_handle.TCCRA) & ~COMA_MSK) | (compA << COMA_BIT); return ret; } @@ -535,13 +417,7 @@ timer_error_t timer_8_bit_get_compare_match_A(uint8_t id, timer_8_bit_compare_ou return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *compA = ((*(internal_config[id].handle.TCCRA) & COMA_MSK) >> COMA_BIT); + *compA = ((*(timer_8_bit_static_handle.TCCRA) & COMA_MSK) >> COMA_BIT); return ret; } @@ -553,13 +429,7 @@ timer_error_t timer_8_bit_set_compare_match_B(uint8_t id, timer_8_bit_compare_ou return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *(internal_config[id].handle.TCCRA) = (*(internal_config[id].handle.TCCRA) & ~COMB_MSK) | (compB << COMB_BIT); + *(timer_8_bit_static_handle.TCCRA) = (*(timer_8_bit_static_handle.TCCRA) & ~COMB_MSK) | (compB << COMB_BIT); return ret; } @@ -576,13 +446,7 @@ timer_error_t timer_8_bit_get_compare_match_B(uint8_t id, timer_8_bit_compare_ou return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *compB = ((*(internal_config[id].handle.TCCRA) & COMB_MSK) >> COMB_BIT); + *compB = ((*(timer_8_bit_static_handle.TCCRA) & COMB_MSK) >> COMB_BIT); return ret; } @@ -594,15 +458,9 @@ timer_error_t timer_8_bit_set_waveform_generation(uint8_t id, const timer_8_bit_ return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *(internal_config[id].handle.TCCRA) = (*(internal_config[id].handle.TCCRA) & ~(WGM0_MSK | WGM1_MSK)) | (waveform & (WGM0_MSK | WGM1_MSK)); + *(timer_8_bit_static_handle.TCCRA) = (*(timer_8_bit_static_handle.TCCRA) & ~(WGM0_MSK | WGM1_MSK)) | (waveform & (WGM0_MSK | WGM1_MSK)); /* Select bit index 2 of waveform mode (matches datasheet bit mapping) and store it to bit index 3 of TCCRB with one more bitshift */ - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~WGM2_MSK) | (waveform & (1U << 2U) << 1U); + *(timer_8_bit_static_handle.TCCRB) = (*(timer_8_bit_static_handle.TCCRB) & ~WGM2_MSK) | (waveform & (1U << 2U) << 1U); return ret; } @@ -619,15 +477,9 @@ timer_error_t timer_8_bit_get_waveform_generation(uint8_t id, timer_8_bit_wavefo return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - *waveform = (timer_8_bit_waveform_generation_t)(0U); - *waveform |= (*(internal_config[id].handle.TCCRA) & (WGM0_MSK | WGM1_MSK)); - *waveform |= (*(internal_config[id].handle.TCCRB) & (WGM2_MSK)) >> 1U; + *waveform |= (*(timer_8_bit_static_handle.TCCRA) & (WGM0_MSK | WGM1_MSK)); + *waveform |= (*(timer_8_bit_static_handle.TCCRB) & (WGM2_MSK)) >> 1U; return ret; } @@ -639,14 +491,8 @@ timer_error_t timer_8_bit_set_counter_value(uint8_t id, const uint8_t ticks) return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* Write new value to internal timer/counter register */ - *(internal_config[id].handle.TCNT) = ticks; + *(timer_8_bit_static_handle.TCNT) = ticks; return ret; } @@ -663,14 +509,8 @@ timer_error_t timer_8_bit_get_counter_value(uint8_t id, uint8_t * ticks) return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* Transfer data from internal device's timer/count main register */ - *ticks = *internal_config[id].handle.TCNT; + *ticks = *timer_8_bit_static_handle.TCNT; return ret; } @@ -682,13 +522,8 @@ timer_error_t timer_8_bit_set_ocra_register_value(uint8_t id, uint8_t ocra) return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - *internal_config[id].handle.OCRA = ocra; + *timer_8_bit_static_handle.OCRA = ocra; return ret; } @@ -705,13 +540,8 @@ timer_error_t timer_8_bit_get_ocra_register_value(uint8_t id, uint8_t * ocra) return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - *ocra = *internal_config[id].handle.OCRA; + *ocra = *timer_8_bit_static_handle.OCRA; return ret; } @@ -723,13 +553,7 @@ timer_error_t timer_8_bit_set_ocrb_register_value(uint8_t id, uint8_t ocrb) return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *internal_config[id].handle.OCRB = ocrb; + *timer_8_bit_static_handle.OCRB = ocrb; return ret; } @@ -746,20 +570,15 @@ timer_error_t timer_8_bit_get_ocrb_register_value(uint8_t id, uint8_t * ocrb) return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - *ocrb = *internal_config[id].handle.OCRB; + *ocrb = *timer_8_bit_static_handle.OCRB; return ret; } static timer_error_t timer_8_bit_write_config(uint8_t id, timer_8_bit_config_t * const config) { timer_error_t ret = TIMER_ERROR_OK; - timer_8_bit_handle_t * handle = &internal_config[id].handle; + const timer_8_bit_handle_t * handle = &timer_8_bit_static_handle; internal_config[id].prescaler = config->timing_config.prescaler; /* Initialise counter as well */ @@ -774,8 +593,8 @@ static timer_error_t timer_8_bit_write_config(uint8_t id, timer_8_bit_config_t * /* TCCRA register */ *(handle->OCRA) = config->timing_config.ocra_val; *(handle->OCRB) = config->timing_config.ocrb_val; - *(handle->TCCRA) = (*(handle->TCCRA) & ~COMA_MSK) | (config->timing_config.comp_match_a << COMA_BIT); - *(handle->TCCRA) = (*(handle->TCCRA) & ~COMB_MSK) | (config->timing_config.comp_match_b << COMB_BIT); + *(handle->TCCRA) = (*(handle->TCCRA) & ~COMA_MSK) | (config->timing_config.comp_mode_a << COMA_BIT); + *(handle->TCCRA) = (*(handle->TCCRA) & ~COMB_MSK) | (config->timing_config.comp_mode_b << COMB_BIT); *(handle->TCCRA) = (*(handle->TCCRA) & ~(WGM0_MSK | WGM1_MSK)) | (config->timing_config.waveform_mode & (WGM0_MSK | WGM1_MSK)); /* TCCRB register */ @@ -866,18 +685,6 @@ timer_error_t timer_8_bit_reconfigure(uint8_t id, timer_8_bit_config_t * const c return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&config->handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - ret = timer_8_bit_set_handle(id, &config->handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* Stop the timer before reconfiguring it */ if (true == internal_config[id].is_initialised) { @@ -905,12 +712,6 @@ timer_error_t timer_8_bit_deinit(uint8_t id) return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* Retrieve a config object to write back default configuration into timer registers */ timer_8_bit_config_t config; ret = timer_8_bit_stop(id); @@ -938,19 +739,13 @@ timer_error_t timer_8_bit_start(uint8_t id) return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - if (false == internal_config[id].is_initialised) { return TIMER_ERROR_NOT_INITIALISED; } /* This time, set the prescaler to start the timer, unless prescaler is set to NO_CLOCK source */ - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~CS_MSK) | internal_config[id].prescaler; + *(timer_8_bit_static_handle.TCCRB) = (*(timer_8_bit_static_handle.TCCRB) & ~CS_MSK) | internal_config[id].prescaler; return ret; } @@ -968,7 +763,7 @@ timer_error_t timer_8_bit_stop(uint8_t id) } /* Reset prescaler to NO_CLOCK*/ - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~CS_MSK) | TIMER8BIT_CLK_NO_CLOCK; + *(timer_8_bit_static_handle.TCCRB) = (*(timer_8_bit_static_handle.TCCRB) & ~CS_MSK) | TIMER8BIT_CLK_NO_CLOCK; return ret; } diff --git a/ExampleApp/src/config.c b/ExampleApp/src/config.c index 5a221cc..3dc3019 100644 --- a/ExampleApp/src/config.c +++ b/ExampleApp/src/config.c @@ -3,6 +3,7 @@ #include "timer_8_bit.h" #include "timer_8_bit_async.h" #include "timer_16_bit.h" +#include "avr/io.h" #ifndef F_CPU #pragma message("F_CPU macro was not set, defaulting to 8MHz") @@ -15,10 +16,21 @@ timebase_config_t timebase_static_config[TIMEBASE_MAX_MODULES] = { .timer = { - .type = TIMEBASE_TIMER_8_BIT_ASYNC, + .type = TIMER_ARCH_8_BIT_ASYNC, .index = 0, }, .cpu_freq = F_CPU, .timescale = TIMEBASE_TIMESCALE_MILLISECONDS } }; + +timer_8_bit_handle_t timer_8_bit_static_handle = +{ + .OCRA = &OCR0A, + .OCRB = &OCR0B, + .TCCRA = &TCCR0A, + .TCCRB = &TCCR0B, + .TCNT = &TCNT0, + .TIFR = &TIFR0, + .TIMSK = &TIMSK0 +}; \ No newline at end of file diff --git a/ExampleApp/src/driver_setup.c b/ExampleApp/src/driver_setup.c index 4deb996..923e00f 100644 --- a/ExampleApp/src/driver_setup.c +++ b/ExampleApp/src/driver_setup.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -71,15 +71,6 @@ driver_setup_error_t driver_init_timer_0(void) } } - /* Configuring handle */ - config.handle.OCRA = &OCR0A; - config.handle.OCRB = &OCR0B; - config.handle.TCCRA = &TCCR0A; - config.handle.TCCRB = &TCCR0B; - config.handle.TCNT = &TCNT0; - config.handle.TIFR = &TIFR0; - config.handle.TIMSK = &TIMSK0; - /* Enable OC0A and OC0B as outputs */ OC0A_DDR_REG |= (1 << OC0A_PIN_NUMBER); OC0B_DDR_REG |= (1 << OC0B_PIN_NUMBER); @@ -95,8 +86,8 @@ driver_setup_error_t driver_init_timer_0(void) config.timing_config.prescaler = TIMER8BIT_CLK_PRESCALER_8; config.timing_config.waveform_mode = TIMER8BIT_WG_PWM_FAST_FULL_RANGE; /* Invert OC0x behavior to provide a correct PWM for a push-pull driver pair */ - config.timing_config.comp_match_a = TIMER8BIT_CMOD_CLEAR_OCnX; - config.timing_config.comp_match_b = TIMER8BIT_CMOD_SET_OCnX; + config.timing_config.comp_mode_a = TIMER8BIT_CMOD_CLEAR_OCnX; + config.timing_config.comp_mode_b = TIMER8BIT_CMOD_SET_OCnX; /* Duty cycle : 39 % */ config.timing_config.ocra_val = 99; config.timing_config.ocrb_val = 99; diff --git a/Modules/Timebase/src/timebase.c b/Modules/Timebase/src/timebase.c index 7ab2f8f..60848de 100644 --- a/Modules/Timebase/src/timebase.c +++ b/Modules/Timebase/src/timebase.c @@ -91,13 +91,6 @@ static inline timebase_error_t setup_8_bit_timer(const uint8_t timebase_id, uint &timebase_internal_config[timebase_id].accumulator.programmed); timer_error_t ret = timer_8_bit_stop(timebase_internal_config[timebase_id].timer_id); - timer_8_bit_handle_t handle = {0}; - ret = timer_8_bit_get_handle(timebase_internal_config[timebase_id].timer_id, &handle); - - if (TIMER_ERROR_OK != ret) - { - return TIMEBASE_ERROR_TIMER_ERROR; - } timer_8_bit_config_t config = {0}; ret = timer_8_bit_get_default_config(&config); @@ -107,9 +100,8 @@ static inline timebase_error_t setup_8_bit_timer(const uint8_t timebase_id, uint } // Use old handle - config.handle = handle; - config.timing_config.comp_match_a = TIMER8BIT_CMOD_CLEAR_OCnX; - config.timing_config.comp_match_b = TIMER8BIT_CMOD_NORMAL; + config.timing_config.comp_mode_a = TIMER8BIT_CMOD_CLEAR_OCnX; + config.timing_config.comp_mode_b = TIMER8BIT_CMOD_NORMAL; config.timing_config.ocra_val = ocra; config.timing_config.prescaler = prescaler; config.interrupt_config.it_comp_match_a = true; From aa13e1c300bc1054508aa8efbfd96d63387a3b7a Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Tue, 22 Mar 2022 09:15:40 +0100 Subject: [PATCH 17/51] Added examples to general build system Signed-off-by: bebenlebricolo --- CMakeLists.txt | 6 ++++ Modules/CMakeLists.txt | 1 + Modules/Pwm/CMakeLists.txt | 41 +++++++++++++++++++++++++ Modules/Pwm/examples/CMakeLists.txt | 28 +++++++++++++++++ Modules/Pwm/examples/config.c | 4 +-- Modules/Pwm/examples/main.c | 47 +++++++++++++++++++++++++++++ Modules/Pwm/inc/pwm.h | 8 ++--- Modules/Pwm/src/pwm.c | 11 +++++++ 8 files changed, 140 insertions(+), 6 deletions(-) create mode 100644 Modules/Pwm/CMakeLists.txt create mode 100644 Modules/Pwm/examples/CMakeLists.txt create mode 100644 Modules/Pwm/examples/main.c diff --git a/CMakeLists.txt b/CMakeLists.txt index fb57dbe..6fa507d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,12 @@ project(AvrAsyncCoreLibs C) set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD 17) + +# This option, disabled by default, allows CMake to configure subproject and build examples that are located within +# Driver's or Module's "examples" folder. +# The aim behind that is to validate that the examples are well declared and build fine altogether with regular codebase +option(BUILD_EXAMPLES "Will configure example projects as well" OFF ) + ############################################################################################################################################ ############################################# Checking environment is setup correctly ###################################################### ############################################################################################################################################ diff --git a/Modules/CMakeLists.txt b/Modules/CMakeLists.txt index 3aef0ab..6ffd655 100644 --- a/Modules/CMakeLists.txt +++ b/Modules/CMakeLists.txt @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.0) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Timebase) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Pwm) diff --git a/Modules/Pwm/CMakeLists.txt b/Modules/Pwm/CMakeLists.txt new file mode 100644 index 0000000..2218a91 --- /dev/null +++ b/Modules/Pwm/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.0) + +################################################################################################# +##################################### PWM driver library ######################################## +################################################################################################# + +project(pwm_driver C) + +set(SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/src/pwm.c +) + +set(HEADERS + ${CMAKE_CURRENT_SOURCE_DIR}/inc/pwm.h +) + +add_library(pwm_driver STATIC + ${SOURCES} + ${HEADERS} +) + +target_include_directories(pwm_driver PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/inc + ${AVR_INCLUDES} +) + +target_link_libraries(pwm_driver + timer_8_bit_driver + timer_16_bit_driver + timer_8_bit_async_driver + timebase_module + io_driver +) + +################################################################################################# +################################## PWM driver example code ###################################### +################################################################################################# +if(BUILD_EXAMPLES) + message(STATUS "Configuring PWM driver examples project") + add_subdirectory(examples ${CMAKE_CURRENT_BINARY_DIR}/examples) +endif() \ No newline at end of file diff --git a/Modules/Pwm/examples/CMakeLists.txt b/Modules/Pwm/examples/CMakeLists.txt new file mode 100644 index 0000000..ad7b9cd --- /dev/null +++ b/Modules/Pwm/examples/CMakeLists.txt @@ -0,0 +1,28 @@ +cmake_minimum_required(VERSION 3.0) + +################################################################################################# +##################################### PWM driver library ######################################## +################################################################################################# + +project(pwm_driver_example C) + +set(SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/main.c + ${CMAKE_CURRENT_SOURCE_DIR}/config.c +) + +set(HEADERS + ${CMAKE_CURRENT_SOURCE_DIR}/config.h +) + +add_executable(pwm_driver_example + ${SOURCES} + ${HEADERS} +) + +target_include_directories(pwm_driver_example PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} + ${AVR_INCLUDES} +) + +target_link_libraries(pwm_driver_example pwm_driver ) diff --git a/Modules/Pwm/examples/config.c b/Modules/Pwm/examples/config.c index 1e82f1e..a65efe5 100644 --- a/Modules/Pwm/examples/config.c +++ b/Modules/Pwm/examples/config.c @@ -49,7 +49,7 @@ pwm_static_config_t pwm_config[PWM_MAX_HARD_INSTANCES + PWM_MAX_SOFT_INSTANCES] {.type = PWM_TYPE_HARDWARE, .config.hard = { - .targeted_timer = TIMER_ARCH_16_BIT, + .arch = TIMER_ARCH_16_BIT, .unit = PWM_HARD_TIMER_UNIT_A, .timer_index = MOTOR_1_TIMER_IDX } @@ -58,7 +58,7 @@ pwm_static_config_t pwm_config[PWM_MAX_HARD_INSTANCES + PWM_MAX_SOFT_INSTANCES] {.type = PWM_TYPE_HARDWARE, .config.hard = { - .targeted_timer = TIMER_ARCH_16_BIT, + .arch = TIMER_ARCH_16_BIT, .unit = PWM_HARD_TIMER_UNIT_B, .timer_index = MOTOR_2_TIMER_IDX } diff --git a/Modules/Pwm/examples/main.c b/Modules/Pwm/examples/main.c new file mode 100644 index 0000000..fd87afa --- /dev/null +++ b/Modules/Pwm/examples/main.c @@ -0,0 +1,47 @@ +#include "config.h" +#include "timer_8_bit.h" +#include "pwm.h" +#include "avr/io.h" + +/** + * @brief Drivers initialisation is carried out by this function. + * + * @return true : initialisation succeeded + * @return false : initialisation failed + */ +static bool driver_init(void) +{ + bool ret = true; + { + timer_8_bit_config_t config = {0}; + timer_error_t err = timer_8_bit_get_default_config(&config); + config.handle.OCRA = OCR0A; + config.handle.OCRB = OCR0B; + config.handle.TCCRA = TCCR0A; + config.handle.TCCRB = TCCR0B; + config.handle.TCNT = TCNT0; + config.handle.TIFR = TIFR0; + config.handle.TIMSK = TIMSK0; + config.timing_config.prescaler = TIMER8BIT_CLK_PRESCALER_1; + config.timing_config.waveform_mode = TIMER8BIT_WG_PWM_FAST_FULL_RANGE; + config.timing_config.comp_match_a = TIMER8BIT_CMOD_NORMAL; + config.timing_config.comp_match_a = TIMER8BIT_CMOD_NORMAL; + // TODO : properly setup the config object before initialising the timer itself + err = timer_8_bit_init(MOTOR_1_TIMER_IDX, &config); + ret &= TIMER_ERROR_OK == err; + } + { + pwm_error_t err = pwm_init(); + ret &= PWM_ERR_OK == err; + } + +} + +int main(void) +{ + while(1) + { + asm("NOP"); + } + return 0; +} \ No newline at end of file diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index c42b6e6..80114fa 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -10,7 +10,7 @@ extern "C" #include "io.h" #include "config.h" -#include "timebase.h" +#include "timer_generic.h" #ifndef PWM_MAX_SOFT_INSTANCES #define PWM_MAX_SOFT_INSTANCES 1U @@ -70,9 +70,9 @@ typedef enum */ typedef struct { - timebase_timer_t targeted_timer; /**< Tells which kind of timer is targeted by this PWM instance */ - uint8_t timer_index; /**< Tells which timer we need to use for this PWM instance */ - pwm_hard_timer_unit_t unit; /**< Gives the unit kind of this PWM instance */ + timer_arch_t arch; /**< Tells which kind of timer is targeted by this PWM instance */ + uint8_t timer_index; /**< Tells which timer we need to use for this PWM instance */ + pwm_hard_timer_unit_t unit; /**< Gives the unit kind of this PWM instance */ } pwm_hard_static_config_t; /** diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 8697ff4..0aab5a6 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -5,6 +5,17 @@ #include "timer_16_bit.h" #include "timer_8_bit_async.h" + +#ifndef PWM_MAX_SOFT_INSTANCES +#define PWM_MAX_SOFT_INSTANCES 1U +#warning "PWM_MAX_SOFT_INSTANCES macro not defined in config.h, fallsback to 1U by default" +#endif + +#ifndef PWM_MAX_HARD_INSTANCES +#define PWM_MAX_HARD_INSTANCES 1U +#warning "PWM_MAX_HARD_INSTANCES macro not defined in config.h, fallsback to 1U by default" +#endif + /** * @brief Static storage for pwm configuration * This is done this way to enhance the dynamic nature of PWMs, so that we can From c62b68317bd1fdd674fdb7a14696941c896518b9 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 23 Mar 2022 09:30:09 +0100 Subject: [PATCH 18/51] Refactored timer 8 bit structure a bit Signed-off-by: bebenlebricolo --- Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h | 37 ++++-- Drivers/Timers/Timer_8_bit/src/timer_8_bit.c | 123 ++++++++++++------ .../Timers/Timer_generic/inc/timer_generic.h | 2 +- .../Timers/Timer_generic/src/timer_generic.c | 6 +- 4 files changed, 113 insertions(+), 55 deletions(-) diff --git a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h index 24408df..5911d69 100644 --- a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h +++ b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h @@ -387,28 +387,45 @@ timer_error_t timer_8_bit_start(uint8_t id); */ timer_error_t timer_8_bit_stop(uint8_t id); -#define TIMER_8_BIT_MAX_PRESCALER_COUNT (5U) -/** - * @brief Timer 8 bit prescaler table, ascending order. Used to compute the closest prescaler - * which can be used to generate any given frequency -*/ -extern const timer_generic_prescaler_pair_t timer_8_bit_prescaler_table[TIMER_8_BIT_MAX_PRESCALER_COUNT]; /** - * @brief this handle has to be declared somewhere and initialised appropriately + * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, + * using CPU main clock frequency as the time constraint. + * + * @param[in] cpu_freq : current CPU main clock frequency + * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) + * @param[out] prescaler : output prescaler parameter + * @param[out] ocr : output ocr value + * @param[out] accumulator : output accumulator value ; used by the timebase module for instance to count events and extend timer's counter capabilities */ -extern timer_8_bit_handle_t timer_8_bit_static_handle; - void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, const uint32_t * const target_freq, timer_8_bit_prescaler_selection_t * const prescaler, - uint8_t * const ocra, + uint8_t * const ocr, uint16_t * const accumulator); +/** + * @brief Converts a single prescaler enum to its value-based counterpart. + * Behaves as a lookup table + * @param prescaler : input prescaler + * @return uint16_t : returns the translated value (from 1 to 1024) + */ uint16_t timer_8_bit_prescaler_to_value(const timer_8_bit_prescaler_selection_t prescaler); + +/** + * @brief Translates back a plain prescaler value to its enum counterpart. + * If no direct equivalent is found, returns the TIMER8BIT_CLK_NO_CLOCK enum value + * @param input_prescaler : input prescaler parameter + * @return enum value + */ timer_8_bit_prescaler_selection_t timer_8_bit_prescaler_from_value(uint16_t const * const input_prescaler); +/** + * @brief this handle has to be declared somewhere and initialised appropriately + */ +extern timer_8_bit_handle_t timer_8_bit_static_handle[TIMER_8_BIT_COUNT]; + #ifdef __cplusplus } #endif diff --git a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c index 2cde16b..7894060 100644 --- a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c +++ b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c @@ -53,6 +53,8 @@ static struct bool is_initialised; } internal_config[TIMER_8_BIT_COUNT] = {0}; +#define TIMER_8_BIT_MAX_PRESCALER_COUNT 5U + const timer_generic_prescaler_pair_t timer_8_bit_prescaler_table[TIMER_8_BIT_MAX_PRESCALER_COUNT] = { {.value = 1U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_1 }, @@ -89,7 +91,7 @@ uint16_t timer_8_bit_prescaler_to_value(const timer_8_bit_prescaler_selection_t void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, const uint32_t * const target_freq, timer_8_bit_prescaler_selection_t * const prescaler, - uint8_t * const ocra, + uint8_t * const ocr, uint16_t * const accumulator) { timer_generic_parameters_t parameters = @@ -105,7 +107,7 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, }; timer_generic_compute_parameters(¶meters); *prescaler = timer_8_bit_prescaler_from_value(¶meters.output.prescaler); - *ocra = (uint8_t) parameters.output.ocra; + *ocr = (uint8_t) parameters.output.ocr; *accumulator = parameters.output.accumulator; } @@ -154,6 +156,7 @@ timer_error_t timer_8_bit_get_default_config(timer_8_bit_config_t * config) timer_error_t timer_8_bit_set_force_compare_config(uint8_t id, timer_8_bit_force_compare_config_t * const force_comp_config) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; if (TIMER_ERROR_OK != ret) { @@ -167,21 +170,21 @@ timer_error_t timer_8_bit_set_force_compare_config(uint8_t id, timer_8_bit_force /* Handles force output compare A flags */ if (true == force_comp_config->force_comp_match_a) { - *(timer_8_bit_static_handle.TCCRB) |= (1U << FOCA_BIT) ; + *(handle->TCCRB) |= (1U << FOCA_BIT) ; } else { - *(timer_8_bit_static_handle.TCCRB) &= ~(1U << FOCA_BIT) ; + *(handle->TCCRB) &= ~(1U << FOCA_BIT) ; } /* Handles force output compare A flags */ if (true == force_comp_config->force_comp_match_b) { - *(timer_8_bit_static_handle.TCCRB) |= (1U << FOCB_BIT) ; + *(handle->TCCRB) |= (1U << FOCB_BIT) ; } else { - *(timer_8_bit_static_handle.TCCRB) &= ~(1U << FOCB_BIT) ; + *(handle->TCCRB) &= ~(1U << FOCB_BIT) ; } return ret; } @@ -189,6 +192,8 @@ timer_error_t timer_8_bit_set_force_compare_config(uint8_t id, timer_8_bit_force timer_error_t timer_8_bit_get_force_compare_config(uint8_t id, timer_8_bit_force_compare_config_t * force_comp_config) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -199,7 +204,7 @@ timer_error_t timer_8_bit_get_force_compare_config(uint8_t id, timer_8_bit_force } /* Handles Force Compare Output A flag */ - if (0U == (*(timer_8_bit_static_handle.TCCRB) & FOCA_MSK)) + if (0U == (*(handle->TCCRB) & FOCA_MSK)) { force_comp_config->force_comp_match_a = false; } @@ -209,7 +214,7 @@ timer_error_t timer_8_bit_get_force_compare_config(uint8_t id, timer_8_bit_force } /* Handles Force Compare Output B flag */ - if (0U == (*(timer_8_bit_static_handle.TCCRB) & FOCB_MSK)) + if (0U == (*(handle->TCCRB) & FOCB_MSK)) { force_comp_config->force_comp_match_b = false; } @@ -223,6 +228,8 @@ timer_error_t timer_8_bit_get_force_compare_config(uint8_t id, timer_8_bit_force timer_error_t timer_8_bit_set_interrupt_config(uint8_t id, timer_8_bit_interrupt_config_t * const it_config) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -236,30 +243,30 @@ timer_error_t timer_8_bit_set_interrupt_config(uint8_t id, timer_8_bit_interrupt /* TIMSK register */ if (true == it_config->it_comp_match_a) { - *(timer_8_bit_static_handle.TIMSK) |= 1U << OCIEA_BIT; + *(handle->TIMSK) |= 1U << OCIEA_BIT; } else { - *(timer_8_bit_static_handle.TIMSK) &= ~(1U << OCIEA_BIT); + *(handle->TIMSK) &= ~(1U << OCIEA_BIT); } if (true == it_config->it_comp_match_b) { - *(timer_8_bit_static_handle.TIMSK) |= 1U << OCIEB_BIT; + *(handle->TIMSK) |= 1U << OCIEB_BIT; } else { - *(timer_8_bit_static_handle.TIMSK) &= ~(1U << OCIEB_BIT); + *(handle->TIMSK) &= ~(1U << OCIEB_BIT); } /* TOIE interrupt flag is the first bit, no need to bitshift it */ if (true == it_config->it_timer_overflow) { - *(timer_8_bit_static_handle.TIMSK) |= 1U; + *(handle->TIMSK) |= 1U; } else { - *(timer_8_bit_static_handle.TIMSK) &= ~1U; + *(handle->TIMSK) &= ~1U; } return ret; } @@ -268,6 +275,8 @@ timer_error_t timer_8_bit_set_interrupt_config(uint8_t id, timer_8_bit_interrupt timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt_config_t * it_config) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -281,7 +290,7 @@ timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt /* Output Compare Match A Interrupt Flag */ - if (0U == (*(timer_8_bit_static_handle.TIMSK) & OCIEA_MSK)) + if (0U == (*(handle->TIMSK) & OCIEA_MSK)) { it_config->it_comp_match_a = false; } @@ -291,7 +300,7 @@ timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt } /* Output Compare Match B Interrupt Flag */ - if (0U == (*(timer_8_bit_static_handle.TIMSK) & OCIEB_MSK)) + if (0U == (*(handle->TIMSK) & OCIEB_MSK)) { it_config->it_comp_match_b = false; } @@ -301,7 +310,7 @@ timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt } /* Timer Overflow Interrupt Flag */ - if (0U == (*(timer_8_bit_static_handle.TIMSK) & 1U)) + if (0U == (*(handle->TIMSK) & 1U)) { it_config->it_timer_overflow = false; } @@ -316,6 +325,8 @@ timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_config_t * it_flags) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -327,7 +338,7 @@ timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_ } /* Output Compare Match A Interrupt Flag */ - if (0U == (*(timer_8_bit_static_handle.TIFR) & OCIEA_MSK)) + if (0U == (*(handle->TIFR) & OCIEA_MSK)) { it_flags->it_comp_match_a = false; } @@ -337,7 +348,7 @@ timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_ } /* Output Compare Match B Interrupt Flag */ - if (0U == (*(timer_8_bit_static_handle.TIFR) & OCIEB_MSK)) + if (0U == (*(handle->TIFR) & OCIEB_MSK)) { it_flags->it_comp_match_b = false; } @@ -347,7 +358,7 @@ timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_ } /* Timer Overflow Interrupt Flag */ - if (0U == (*(timer_8_bit_static_handle.TIFR) & 1U)) + if (0U == (*(handle->TIFR) & 1U)) { it_flags->it_timer_overflow = false; } @@ -366,18 +377,22 @@ timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_ timer_error_t timer_8_bit_set_prescaler(uint8_t id, const timer_8_bit_prescaler_selection_t prescaler) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; } - *(timer_8_bit_static_handle.TCCRB) = (*(timer_8_bit_static_handle.TCCRB) & ~CS_MSK) | prescaler; + *(handle->TCCRB) = (*(handle->TCCRB) & ~CS_MSK) | prescaler; return ret; } timer_error_t timer_8_bit_get_prescaler(uint8_t id, timer_8_bit_prescaler_selection_t * prescaler) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -388,25 +403,29 @@ timer_error_t timer_8_bit_get_prescaler(uint8_t id, timer_8_bit_prescaler_select return TIMER_ERROR_NULL_POINTER; } - *prescaler = (*(timer_8_bit_static_handle.TCCRB) & CS_MSK); + *prescaler = (*(handle->TCCRB) & CS_MSK); return ret; } timer_error_t timer_8_bit_set_compare_match_A(uint8_t id, const timer_8_bit_compare_output_mode_t compA) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; } - *(timer_8_bit_static_handle.TCCRA) = (*(timer_8_bit_static_handle.TCCRA) & ~COMA_MSK) | (compA << COMA_BIT); + *(handle->TCCRA) = (*(handle->TCCRA) & ~COMA_MSK) | (compA << COMA_BIT); return ret; } timer_error_t timer_8_bit_get_compare_match_A(uint8_t id, timer_8_bit_compare_output_mode_t * compA) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -417,25 +436,29 @@ timer_error_t timer_8_bit_get_compare_match_A(uint8_t id, timer_8_bit_compare_ou return TIMER_ERROR_NULL_POINTER; } - *compA = ((*(timer_8_bit_static_handle.TCCRA) & COMA_MSK) >> COMA_BIT); + *compA = ((*(handle->TCCRA) & COMA_MSK) >> COMA_BIT); return ret; } timer_error_t timer_8_bit_set_compare_match_B(uint8_t id, timer_8_bit_compare_output_mode_t compB) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; } - *(timer_8_bit_static_handle.TCCRA) = (*(timer_8_bit_static_handle.TCCRA) & ~COMB_MSK) | (compB << COMB_BIT); + *(handle->TCCRA) = (*(handle->TCCRA) & ~COMB_MSK) | (compB << COMB_BIT); return ret; } timer_error_t timer_8_bit_get_compare_match_B(uint8_t id, timer_8_bit_compare_output_mode_t * compB) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -446,27 +469,31 @@ timer_error_t timer_8_bit_get_compare_match_B(uint8_t id, timer_8_bit_compare_ou return TIMER_ERROR_NULL_POINTER; } - *compB = ((*(timer_8_bit_static_handle.TCCRA) & COMB_MSK) >> COMB_BIT); + *compB = ((*(handle->TCCRA) & COMB_MSK) >> COMB_BIT); return ret; } timer_error_t timer_8_bit_set_waveform_generation(uint8_t id, const timer_8_bit_waveform_generation_t waveform) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; } - *(timer_8_bit_static_handle.TCCRA) = (*(timer_8_bit_static_handle.TCCRA) & ~(WGM0_MSK | WGM1_MSK)) | (waveform & (WGM0_MSK | WGM1_MSK)); + *(handle->TCCRA) = (*(handle->TCCRA) & ~(WGM0_MSK | WGM1_MSK)) | (waveform & (WGM0_MSK | WGM1_MSK)); /* Select bit index 2 of waveform mode (matches datasheet bit mapping) and store it to bit index 3 of TCCRB with one more bitshift */ - *(timer_8_bit_static_handle.TCCRB) = (*(timer_8_bit_static_handle.TCCRB) & ~WGM2_MSK) | (waveform & (1U << 2U) << 1U); + *(handle->TCCRB) = (*(handle->TCCRB) & ~WGM2_MSK) | (waveform & (1U << 2U) << 1U); return ret; } timer_error_t timer_8_bit_get_waveform_generation(uint8_t id, timer_8_bit_waveform_generation_t * waveform) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -478,27 +505,31 @@ timer_error_t timer_8_bit_get_waveform_generation(uint8_t id, timer_8_bit_wavefo } *waveform = (timer_8_bit_waveform_generation_t)(0U); - *waveform |= (*(timer_8_bit_static_handle.TCCRA) & (WGM0_MSK | WGM1_MSK)); - *waveform |= (*(timer_8_bit_static_handle.TCCRB) & (WGM2_MSK)) >> 1U; + *waveform |= (*(handle->TCCRA) & (WGM0_MSK | WGM1_MSK)); + *waveform |= (*(handle->TCCRB) & (WGM2_MSK)) >> 1U; return ret; } timer_error_t timer_8_bit_set_counter_value(uint8_t id, const uint8_t ticks) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; } /* Write new value to internal timer/counter register */ - *(timer_8_bit_static_handle.TCNT) = ticks; + *(handle->TCNT) = ticks; return ret; } timer_error_t timer_8_bit_get_counter_value(uint8_t id, uint8_t * ticks) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -510,26 +541,29 @@ timer_error_t timer_8_bit_get_counter_value(uint8_t id, uint8_t * ticks) } /* Transfer data from internal device's timer/count main register */ - *ticks = *timer_8_bit_static_handle.TCNT; + *ticks = *handle->TCNT; return ret; } timer_error_t timer_8_bit_set_ocra_register_value(uint8_t id, uint8_t ocra) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; } - - *timer_8_bit_static_handle.OCRA = ocra; + *handle->OCRA = ocra; return ret; } timer_error_t timer_8_bit_get_ocra_register_value(uint8_t id, uint8_t * ocra) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -541,25 +575,29 @@ timer_error_t timer_8_bit_get_ocra_register_value(uint8_t id, uint8_t * ocra) } - *ocra = *timer_8_bit_static_handle.OCRA; + *ocra = *handle->OCRA; return ret; } timer_error_t timer_8_bit_set_ocrb_register_value(uint8_t id, uint8_t ocrb) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; } - *timer_8_bit_static_handle.OCRB = ocrb; + *handle->OCRB = ocrb; return ret; } timer_error_t timer_8_bit_get_ocrb_register_value(uint8_t id, uint8_t * ocrb) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -570,15 +608,14 @@ timer_error_t timer_8_bit_get_ocrb_register_value(uint8_t id, uint8_t * ocrb) return TIMER_ERROR_NULL_POINTER; } - - *ocrb = *timer_8_bit_static_handle.OCRB; + *ocrb = *handle->OCRB; return ret; } static timer_error_t timer_8_bit_write_config(uint8_t id, timer_8_bit_config_t * const config) { timer_error_t ret = TIMER_ERROR_OK; - const timer_8_bit_handle_t * handle = &timer_8_bit_static_handle; + const timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; internal_config[id].prescaler = config->timing_config.prescaler; /* Initialise counter as well */ @@ -734,6 +771,8 @@ timer_error_t timer_8_bit_deinit(uint8_t id) timer_error_t timer_8_bit_start(uint8_t id) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if(TIMER_ERROR_OK != ret) { return ret; @@ -745,13 +784,15 @@ timer_error_t timer_8_bit_start(uint8_t id) } /* This time, set the prescaler to start the timer, unless prescaler is set to NO_CLOCK source */ - *(timer_8_bit_static_handle.TCCRB) = (*(timer_8_bit_static_handle.TCCRB) & ~CS_MSK) | internal_config[id].prescaler; + *(handle->TCCRB) = (*(handle->TCCRB) & ~CS_MSK) | internal_config[id].prescaler; return ret; } timer_error_t timer_8_bit_stop(uint8_t id) { timer_error_t ret = check_id(id); + timer_8_bit_handle_t * handle = &timer_8_bit_static_handle[id]; + if(TIMER_ERROR_OK != ret) { return ret; @@ -763,7 +804,7 @@ timer_error_t timer_8_bit_stop(uint8_t id) } /* Reset prescaler to NO_CLOCK*/ - *(timer_8_bit_static_handle.TCCRB) = (*(timer_8_bit_static_handle.TCCRB) & ~CS_MSK) | TIMER8BIT_CLK_NO_CLOCK; + *(handle->TCCRB) = (*(handle->TCCRB) & ~CS_MSK) | TIMER8BIT_CLK_NO_CLOCK; return ret; } diff --git a/Drivers/Timers/Timer_generic/inc/timer_generic.h b/Drivers/Timers/Timer_generic/inc/timer_generic.h index f8666f8..0603222 100644 --- a/Drivers/Timers/Timer_generic/inc/timer_generic.h +++ b/Drivers/Timers/Timer_generic/inc/timer_generic.h @@ -102,7 +102,7 @@ typedef struct struct { uint16_t prescaler; - uint16_t ocra; + uint16_t ocr; uint32_t accumulator; } output; } timer_generic_parameters_t; diff --git a/Drivers/Timers/Timer_generic/src/timer_generic.c b/Drivers/Timers/Timer_generic/src/timer_generic.c index 0d6f2ef..6c16a75 100644 --- a/Drivers/Timers/Timer_generic/src/timer_generic.c +++ b/Drivers/Timers/Timer_generic/src/timer_generic.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -100,11 +100,11 @@ void timer_generic_compute_parameters(timer_generic_parameters_t * const paramet if (computed_ocra != 0) { - parameters->output.ocra = (computed_ocra - 1U); + parameters->output.ocr = (computed_ocra - 1U); } else { //TODO : We might be a bit off. In this case, normally we would have to raise the prescaler one step further and recompute ocra value. - parameters->output.ocra = computed_ocra; + parameters->output.ocr = computed_ocra; } } From c03c33b71b879e439cf50fb0c274b06d020de850 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 23 Mar 2022 10:35:45 +0100 Subject: [PATCH 19/51] Adapted tests to timer 8 nit refacto Signed-off-by: bebenlebricolo --- .../Timers/Timer_8_bit/Tests/CMakeLists.txt | 15 ++- .../Tests/Stub/timer_8_bit_registers_stub.c | 16 +-- .../Tests/Stub/timer_8_bit_registers_stub.h | 3 +- Drivers/Timers/Timer_8_bit/Tests/config.c | 17 +++ .../Timer_8_bit/Tests/timer_8_bit_tests.cpp | 108 +++++++----------- Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h | 8 ++ Drivers/Timers/Timer_8_bit/src/timer_8_bit.c | 9 +- .../Timebase/Tests/Stubs/timer_8_bit_stub.c | 14 +-- Modules/Timebase/Tests/inc/config.h | 5 +- 9 files changed, 90 insertions(+), 105 deletions(-) create mode 100644 Drivers/Timers/Timer_8_bit/Tests/config.c diff --git a/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt b/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt index bae153e..c1012b2 100644 --- a/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt +++ b/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt @@ -8,25 +8,28 @@ enable_testing() ### timer_8_bit_driver library ### add_library(timer_8_bit_driver STATIC -../src/timer_8_bit.c + ../src/timer_8_bit.c ) + target_include_directories(timer_8_bit_driver PRIVATE -${CMAKE_CURRENT_SOURCE_DIR}/../inc -${CMAKE_CURRENT_SOURCE_DIR}/../../Timer_generic/inc -${CMAKE_CURRENT_SOURCE_DIR}/ + ${CMAKE_CURRENT_SOURCE_DIR}/../inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../Timer_generic/inc + ${CMAKE_CURRENT_SOURCE_DIR}/ ) ########## Timer 8 bit driver tests ########## add_executable(timer_8_bit_driver_tests -timer_8_bit_tests.cpp -Stub/timer_8_bit_registers_stub.c + timer_8_bit_tests.cpp + Stub/timer_8_bit_registers_stub.c + config.c ) target_include_directories(timer_8_bit_driver_tests PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Stub ${CMAKE_CURRENT_SOURCE_DIR}/../inc ${CMAKE_CURRENT_SOURCE_DIR}/../../Timer_generic/inc + ${CMAKE_CURRENT_SOURCE_DIR}/ ) target_include_directories(timer_8_bit_driver_tests SYSTEM PUBLIC diff --git a/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c b/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c index 3818bde..0e95de0 100644 --- a/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c +++ b/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -38,18 +38,4 @@ void timer_8_bit_registers_stub_erase(void) memset(&timer_8_bit_registers_stub, 0, sizeof(timer_8_bit_registers_stub_t)); } -void timer_8_bit_registers_stub_init_handle(timer_8_bit_handle_t * handle) -{ - if (NULL != handle) - { - handle->OCRA = &timer_8_bit_registers_stub.OCRA; - handle->OCRB = &timer_8_bit_registers_stub.OCRB; - handle->TCCRA = &timer_8_bit_registers_stub.TCCRA; - handle->TCCRB = &timer_8_bit_registers_stub.TCCRB; - handle->TCNT = &timer_8_bit_registers_stub.TCNT; - handle->TIMSK = &timer_8_bit_registers_stub.TIMSK; - handle->TIFR = &timer_8_bit_registers_stub.TIFR; - } -} - diff --git a/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h b/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h index 23cddc2..3eb21a7 100644 --- a/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h +++ b/Drivers/Timers/Timer_8_bit/Tests/Stub/timer_8_bit_registers_stub.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -55,7 +55,6 @@ typedef struct extern timer_8_bit_registers_stub_t timer_8_bit_registers_stub; void timer_8_bit_registers_stub_erase(void); -void timer_8_bit_registers_stub_init_handle(timer_8_bit_handle_t * handle); #ifdef __cplusplus } diff --git a/Drivers/Timers/Timer_8_bit/Tests/config.c b/Drivers/Timers/Timer_8_bit/Tests/config.c new file mode 100644 index 0000000..acd6221 --- /dev/null +++ b/Drivers/Timers/Timer_8_bit/Tests/config.c @@ -0,0 +1,17 @@ +#include "config.h" +#include "timer_8_bit.h" +#include "timer_8_bit_registers_stub.h" + + +timer_8_bit_handle_t timer_8_bit_static_handle[TIMER_8_BIT_COUNT] = +{ + { + .OCRA = &timer_8_bit_registers_stub.OCRA, + .OCRB = &timer_8_bit_registers_stub.OCRB, + .TCCRA = &timer_8_bit_registers_stub.TCCRA, + .TCCRB = &timer_8_bit_registers_stub.TCCRB, + .TCNT = &timer_8_bit_registers_stub.TCNT, + .TIFR = &timer_8_bit_registers_stub.TIFR, + .TIMSK = &timer_8_bit_registers_stub.TIMSK + } +}; \ No newline at end of file diff --git a/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp b/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp index 608b997..14744ac 100644 --- a/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp +++ b/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -28,7 +28,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "gtest/gtest.h" +#include #include "config.h" #include "timer_8_bit.h" #include "timer_8_bit_registers_stub.h" @@ -45,8 +45,7 @@ class Timer8BitFixture : public ::testing::Test { timer_8_bit_registers_stub_erase(); (void) timer_8_bit_get_default_config(&config); - timer_8_bit_registers_stub_init_handle(&config.handle); - (void) timer_8_bit_set_handle(DT_ID, &config.handle); + timer_8_bit_clear_init_states(); } void TearDown() override { @@ -59,77 +58,64 @@ TEST(timer_8_bit_driver_tests, guard_null_handle) timer_error_t ret = timer_8_bit_get_default_config(&config); ASSERT_EQ(TIMER_ERROR_OK, ret); - /* We should have a null handle at the moment */ - ASSERT_TRUE(NULL == (void*) (config.handle.OCRA) ); - ASSERT_TRUE(NULL == (void*) (config.handle.OCRB) ); - ASSERT_TRUE(NULL == (void*) (config.handle.TCCRA) ); - ASSERT_TRUE(NULL == (void*) (config.handle.TCCRB) ); - ASSERT_TRUE(NULL == (void*) (config.handle.TCNT) ); - ASSERT_TRUE(NULL == (void*) (config.handle.TIFR) ); - ASSERT_TRUE(NULL == (void*) (config.handle.TIMSK) ); - ret = timer_8_bit_reconfigure(DT_ID, &config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_init(DT_ID, &config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test compare match mode A get/set api */ - ret = timer_8_bit_set_compare_match_A(DT_ID, config.timing_config.comp_match_a); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); - ret = timer_8_bit_get_compare_match_A(DT_ID, &config.timing_config.comp_match_a); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ret = timer_8_bit_set_compare_match_A(DT_ID, config.timing_config.comp_mode_a); + ASSERT_EQ(TIMER_ERROR_OK, ret); + ret = timer_8_bit_get_compare_match_A(DT_ID, &config.timing_config.comp_mode_a); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test compare match mode B get/set api */ - ret = timer_8_bit_set_compare_match_B(DT_ID, config.timing_config.comp_match_b); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); - ret = timer_8_bit_get_compare_match_B(DT_ID, &config.timing_config.comp_match_b); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); - - /* Test handle setting function */ - ret = timer_8_bit_set_handle(DT_ID, &config.handle); + ret = timer_8_bit_set_compare_match_B(DT_ID, config.timing_config.comp_mode_b); + ASSERT_EQ(TIMER_ERROR_OK, ret); + ret = timer_8_bit_get_compare_match_B(DT_ID, &config.timing_config.comp_mode_b); ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test interrupt config get/set api */ ret = timer_8_bit_set_interrupt_config(DT_ID, &config.interrupt_config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_get_interrupt_config(DT_ID, &config.interrupt_config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test OCRA get/set api */ ret = timer_8_bit_set_ocra_register_value(DT_ID, config.timing_config.ocra_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_get_ocra_register_value(DT_ID, &config.timing_config.ocra_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test OCRB get/set api */ ret = timer_8_bit_set_ocrb_register_value(DT_ID, config.timing_config.ocrb_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_get_ocrb_register_value(DT_ID, &config.timing_config.ocrb_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test counter get/set api */ ret = timer_8_bit_set_counter_value(DT_ID, config.timing_config.counter); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_get_counter_value(DT_ID, &config.timing_config.counter); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test force compare flags get/set api */ ret = timer_8_bit_set_force_compare_config(DT_ID, &config.force_compare); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_get_force_compare_config(DT_ID, &config.force_compare); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test prescaler get/set api */ ret = timer_8_bit_set_prescaler(DT_ID, config.timing_config.prescaler); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_get_prescaler(DT_ID, &config.timing_config.prescaler); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test waveforme generation get/set api */ ret = timer_8_bit_set_waveform_generation(DT_ID, config.timing_config.waveform_mode); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_get_waveform_generation(DT_ID, &config.timing_config.waveform_mode); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); } TEST(timer_8_bit_driver_tests, guard_null_pointer) @@ -146,11 +132,6 @@ TEST(timer_8_bit_driver_tests, guard_null_pointer) ret = timer_8_bit_get_compare_match_B(DT_ID, nullptr_compare_output_mode); ASSERT_EQ(TIMER_ERROR_NULL_POINTER, ret); - timer_8_bit_handle_t * nullptr_handle = NULL; - /* Test handle setting function */ - ret = timer_8_bit_set_handle(DT_ID, nullptr_handle); - ASSERT_EQ(TIMER_ERROR_NULL_POINTER, ret); - /* Test interrupt config get/set api */ timer_8_bit_interrupt_config_t * nullptr_interrupt_config = NULL; ret = timer_8_bit_set_interrupt_config(DT_ID, nullptr_interrupt_config); @@ -187,9 +168,6 @@ TEST(timer_8_bit_driver_tests, guard_null_pointer) ret = timer_8_bit_reconfigure(DT_ID, nullptr_config); ASSERT_EQ(TIMER_ERROR_NULL_POINTER, ret); - - ret = timer_8_bit_get_handle(DT_ID, nullptr_handle); - ASSERT_EQ(TIMER_ERROR_NULL_POINTER, ret); } TEST(timer_8_bit_driver_tests, guard_wrong_id) @@ -208,15 +186,9 @@ TEST(timer_8_bit_driver_tests, guard_wrong_id) ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); /* Test compare match mode A get/set api */ - ret = timer_8_bit_get_compare_match_A(targeted_id, &config.timing_config.comp_match_a); - ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); - ret = timer_8_bit_get_compare_match_B(targeted_id, &config.timing_config.comp_match_b); - ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); - - /* Test handle setting function */ - ret = timer_8_bit_set_handle(targeted_id, &config.handle); + ret = timer_8_bit_get_compare_match_A(targeted_id, &config.timing_config.comp_mode_a); ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); - ret = timer_8_bit_get_handle(targeted_id, &config.handle); + ret = timer_8_bit_get_compare_match_B(targeted_id, &config.timing_config.comp_mode_b); ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); /* Test interrupt config get/set api */ @@ -262,9 +234,9 @@ TEST_F(Timer8BitFixture, test_handle_is_set_correctly) // Data should be reset to its default state when we begin // Testing TCCRA register - config.timing_config.comp_match_a = TIMER8BIT_CMOD_SET_OCnX; // 11 + config.timing_config.comp_mode_a = TIMER8BIT_CMOD_SET_OCnX; // 11 ASSERT_EQ(timer_8_bit_registers_stub.TCCRA & COMA_MSK, 0U); - ret = timer_8_bit_set_compare_match_A(DT_ID, config.timing_config.comp_match_a); + ret = timer_8_bit_set_compare_match_A(DT_ID, config.timing_config.comp_mode_a); ASSERT_EQ(TIMER_ERROR_OK, ret); ASSERT_EQ(timer_8_bit_registers_stub.TCCRA & COMA_MSK, 0x3 << COMA_BIT); @@ -333,16 +305,16 @@ TEST_F(Timer8BitFixture, test_timing_configuration_unitary_functions) uint8_t received_counter_val; timer_8_bit_prescaler_selection_t received_prescaler; timer_8_bit_waveform_generation_t received_waveform; - memcpy(&received_compare_mode_a, &config.timing_config.comp_match_a, sizeof(timer_8_bit_compare_output_mode_t)); - memcpy(&received_compare_mode_b, &config.timing_config.comp_match_b, sizeof(timer_8_bit_compare_output_mode_t)); + memcpy(&received_compare_mode_a, &config.timing_config.comp_mode_a, sizeof(timer_8_bit_compare_output_mode_t)); + memcpy(&received_compare_mode_b, &config.timing_config.comp_mode_b, sizeof(timer_8_bit_compare_output_mode_t)); memcpy(&received_ocra_val, &config.timing_config.ocra_val, sizeof(uint8_t)); memcpy(&received_ocrb_val, &config.timing_config.ocrb_val, sizeof(uint8_t)); memcpy(&received_counter_val, &config.timing_config.counter, sizeof(uint8_t)); memcpy(&received_prescaler, &config.timing_config.prescaler, sizeof(timer_8_bit_prescaler_selection_t)); memcpy(&received_waveform, &config.timing_config.waveform_mode, sizeof(timer_8_bit_waveform_generation_t)); - config.timing_config.comp_match_a = TIMER8BIT_CMOD_TOGGLE_OCnX; - config.timing_config.comp_match_b = TIMER8BIT_CMOD_SET_OCnX; + config.timing_config.comp_mode_a = TIMER8BIT_CMOD_TOGGLE_OCnX; + config.timing_config.comp_mode_b = TIMER8BIT_CMOD_SET_OCnX; config.timing_config.ocra_val = 33U; config.timing_config.ocrb_val = 156U; config.timing_config.prescaler = TIMER8BIT_CLK_PRESCALER_64; @@ -350,23 +322,23 @@ TEST_F(Timer8BitFixture, test_timing_configuration_unitary_functions) // Compare match A mode ASSERT_EQ(timer_8_bit_registers_stub.TCCRA & COMA_MSK, 0U); - ret = timer_8_bit_set_compare_match_A(DT_ID, config.timing_config.comp_match_a); + ret = timer_8_bit_set_compare_match_A(DT_ID, config.timing_config.comp_mode_a); ASSERT_EQ(TIMER_ERROR_OK, ret); - ASSERT_EQ(timer_8_bit_registers_stub.TCCRA & COMA_MSK, config.timing_config.comp_match_a << COMA_BIT); + ASSERT_EQ(timer_8_bit_registers_stub.TCCRA & COMA_MSK, config.timing_config.comp_mode_a << COMA_BIT); // Counter check value can also be read back from registers ... ret = timer_8_bit_get_compare_match_A(DT_ID,&received_compare_mode_a); ASSERT_EQ(TIMER_ERROR_OK, ret); - ASSERT_EQ(0, memcmp(&received_compare_mode_a, &config.timing_config.comp_match_a, sizeof(timer_8_bit_compare_output_mode_t))); + ASSERT_EQ(0, memcmp(&received_compare_mode_a, &config.timing_config.comp_mode_a, sizeof(timer_8_bit_compare_output_mode_t))); // Compare match B mode ASSERT_EQ(timer_8_bit_registers_stub.TCCRA & COMB_MSK, 0U); - ret = timer_8_bit_set_compare_match_B(DT_ID, config.timing_config.comp_match_b); + ret = timer_8_bit_set_compare_match_B(DT_ID, config.timing_config.comp_mode_b); ASSERT_EQ(TIMER_ERROR_OK, ret); - ASSERT_EQ(timer_8_bit_registers_stub.TCCRA & COMB_MSK, config.timing_config.comp_match_b << COMB_BIT); + ASSERT_EQ(timer_8_bit_registers_stub.TCCRA & COMB_MSK, config.timing_config.comp_mode_b << COMB_BIT); // Counter check value can also be read back from registers ... ret = timer_8_bit_get_compare_match_B(DT_ID,&received_compare_mode_b); ASSERT_EQ(TIMER_ERROR_OK, ret); - ASSERT_EQ(0, memcmp(&received_compare_mode_b, &config.timing_config.comp_match_b, sizeof(timer_8_bit_compare_output_mode_t))); + ASSERT_EQ(0, memcmp(&received_compare_mode_b, &config.timing_config.comp_mode_b, sizeof(timer_8_bit_compare_output_mode_t))); // Waveform modes ASSERT_EQ(timer_8_bit_registers_stub.TCCRA & (WGM0_MSK | WGM1_MSK), 0U); diff --git a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h index 5911d69..c9d5f5d 100644 --- a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h +++ b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h @@ -34,6 +34,7 @@ along with this program. If not, see . #include #include "timer_generic.h" #include "timer_8_bit_reg.h" +#include "config.h" #ifdef __cplusplus extern "C" @@ -154,6 +155,11 @@ timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt * TIMER_ERROR_NULL_POINTER : given it_config parameter points to NULL */ timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_config_t * it_flags); + +/** + * @brief Resets internal configuration of timer 8 bit driver + */ +void timer_8_bit_clear_init_states(void); #endif @@ -405,6 +411,8 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, uint8_t * const ocr, uint16_t * const accumulator); +#define TIMER_8_BIT_MAX_PRESCALER_COUNT 5U + /** * @brief Converts a single prescaler enum to its value-based counterpart. * Behaves as a lookup table diff --git a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c index 7894060..f0e2c8e 100644 --- a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c +++ b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c @@ -53,8 +53,6 @@ static struct bool is_initialised; } internal_config[TIMER_8_BIT_COUNT] = {0}; -#define TIMER_8_BIT_MAX_PRESCALER_COUNT 5U - const timer_generic_prescaler_pair_t timer_8_bit_prescaler_table[TIMER_8_BIT_MAX_PRESCALER_COUNT] = { {.value = 1U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_1 }, @@ -368,7 +366,14 @@ timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_ } return ret; +} +void timer_8_bit_clear_init_states(void) +{ + for (uint8_t i = 0 ; i < TIMER_8_BIT_COUNT ; i++) + { + internal_config[i].is_initialised = false; + } } #endif diff --git a/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c b/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c index 019f627..ccb0079 100644 --- a/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c +++ b/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -139,20 +139,12 @@ timer_error_t timer_8_bit_get_default_config(timer_8_bit_config_t * config) config->timing_config.ocrb_val = 0U; config->timing_config.prescaler = TIMER8BIT_CLK_NO_CLOCK; config->timing_config.waveform_mode = TIMER8BIT_WG_NORMAL; - config->timing_config.comp_match_a = TIMER8BIT_CMOD_NORMAL; - config->timing_config.comp_match_b = TIMER8BIT_CMOD_NORMAL; + config->timing_config.comp_mode_a = TIMER8BIT_CMOD_NORMAL; + config->timing_config.comp_mode_b = TIMER8BIT_CMOD_NORMAL; config->force_compare.force_comp_match_a = false; config->force_compare.force_comp_match_b = false; - /* Architecture and device dependent, must be set at configuration time */ - config->handle.OCRA = NULL; - config->handle.OCRB = NULL; - config->handle.TCCRA = NULL; - config->handle.TCCRB = NULL; - config->handle.TCNT = NULL; - config->handle.TIFR = NULL; - config->handle.TIMSK = NULL; return ret; } diff --git a/Modules/Timebase/Tests/inc/config.h b/Modules/Timebase/Tests/inc/config.h index 1c375ba..205bdc4 100644 --- a/Modules/Timebase/Tests/inc/config.h +++ b/Modules/Timebase/Tests/inc/config.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -32,5 +32,8 @@ along with this program. If not, see . #define CONFIG_HEADER_STUB #define TIMEBASE_MAX_MODULES 3U +#define TIMER_8_BIT_COUNT 1 +#define TIMER_8_BIT_ASYNC_COUNT 1 +#define TIMER_16_BIT_COUNT 1 #endif /* CONFIG_HEADER_STUB */ \ No newline at end of file From 13cb5f600d2e616d17c7a026a92f1cf76d44c339 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 23 Mar 2022 10:36:24 +0100 Subject: [PATCH 20/51] Refactored Timer 8 bit async to have static config Signed-off-by: bebenlebricolo --- .../Timer_8_bit_async/Tests/CMakeLists.txt | 1 + .../Stub/timer_8_bit_async_registers_stub.c | 26 +- .../Tests/timer_8_bit_async_tests.cpp | 79 ++--- .../Timer_8_bit_async/inc/timer_8_bit_async.h | 69 ++-- .../Timer_8_bit_async/src/timer_8_bit_async.c | 303 +++--------------- .../Tests/Stubs/timer_8_bit_async_stub.c | 11 +- 6 files changed, 122 insertions(+), 367 deletions(-) diff --git a/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt b/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt index 6739f90..1b44fee 100644 --- a/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt +++ b/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt @@ -27,6 +27,7 @@ target_include_directories(timer_8_bit_async_driver_tests PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Stub ${CMAKE_CURRENT_SOURCE_DIR}/../inc ${CMAKE_CURRENT_SOURCE_DIR}/../../Timer_generic/inc + ${CMAKE_CURRENT_SOURCE_DIR} ) target_include_directories(timer_8_bit_async_driver_tests SYSTEM PUBLIC diff --git a/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c b/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c index c6c6ecc..da81d79 100644 --- a/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c +++ b/Drivers/Timers/Timer_8_bit_async/Tests/Stub/timer_8_bit_async_registers_stub.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -28,8 +28,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "timer_8_bit_async_registers_stub.h" #include +#include "timer_8_bit_async.h" +#include "timer_8_bit_async_registers_stub.h" timer_8_bit_async_registers_stub_t timer_8_bit_async_registers_stub = {0}; @@ -38,19 +39,18 @@ void timer_8_bit_async_registers_stub_erase(void) memset(&timer_8_bit_async_registers_stub, 0, sizeof(timer_8_bit_async_registers_stub_t)); } -void timer_8_bit_async_registers_stub_init_handle(timer_8_bit_async_handle_t * handle) +timer_8_bit_async_handle_t timer_8_bit_async_static_handle[TIMER_8_BIT_ASYNC_COUNT] = { - if (NULL != handle) { - handle->OCRA = &timer_8_bit_async_registers_stub.OCRA; - handle->OCRB = &timer_8_bit_async_registers_stub.OCRB; - handle->TCCRA = &timer_8_bit_async_registers_stub.TCCRA; - handle->TCCRB = &timer_8_bit_async_registers_stub.TCCRB; - handle->TCNT = &timer_8_bit_async_registers_stub.TCNT; - handle->TIMSK = &timer_8_bit_async_registers_stub.TIMSK; - handle->TIFR = &timer_8_bit_async_registers_stub.TIFR; - handle->ASSR_REG = &timer_8_bit_async_registers_stub.ASSR_REG; + .OCRA = &timer_8_bit_async_registers_stub.OCRA, + .OCRB = &timer_8_bit_async_registers_stub.OCRB, + .TCCRA = &timer_8_bit_async_registers_stub.TCCRA, + .TCCRB = &timer_8_bit_async_registers_stub.TCCRB, + .TCNT = &timer_8_bit_async_registers_stub.TCNT, + .TIMSK = &timer_8_bit_async_registers_stub.TIMSK, + .TIFR = &timer_8_bit_async_registers_stub.TIFR, + .ASSR_REG = &timer_8_bit_async_registers_stub.ASSR_REG } -} +}; diff --git a/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp b/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp index fcd7578..42cc2c1 100644 --- a/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp +++ b/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -45,8 +45,7 @@ class Timer8BitAsyncFixture : public ::testing::Test { timer_8_bit_async_registers_stub_erase(); (void) timer_8_bit_async_get_default_config(&config); - timer_8_bit_async_registers_stub_init_handle(&config.handle); - (void) timer_8_bit_async_set_handle(DT_ID, &config.handle); + timer_8_bit_async_clear_init_states(); } void TearDown() override { @@ -59,92 +58,69 @@ TEST(timer_8_bit_async_driver_tests, guard_null_handle) timer_error_t ret = timer_8_bit_async_get_default_config(&config); ASSERT_EQ(TIMER_ERROR_OK, ret); - /* We should have a null handle at the moment */ - ASSERT_TRUE(NULL == config.handle.OCRA ); - ASSERT_TRUE(NULL == config.handle.OCRB ); - ASSERT_TRUE(NULL == config.handle.TCCRA ); - ASSERT_TRUE(NULL == config.handle.TCCRB ); - ASSERT_TRUE(NULL == config.handle.TCNT ); - ASSERT_TRUE(NULL == config.handle.TIFR ); - ASSERT_TRUE(NULL == config.handle.TIMSK ); - ASSERT_TRUE(NULL == config.handle.ASSR_REG ); - ret = timer_8_bit_async_init(DT_ID, &config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_async_reconfigure(DT_ID, &config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test compare match mode A get/set api */ ret = timer_8_bit_async_set_compare_match_A(DT_ID, config.timing_config.comp_match_a); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_async_get_compare_match_A(DT_ID, &config.timing_config.comp_match_a); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test compare match mode B get/set api */ ret = timer_8_bit_async_set_compare_match_B(DT_ID, config.timing_config.comp_match_b); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_async_get_compare_match_B(DT_ID, &config.timing_config.comp_match_b); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); - - /* Test handle setting function */ - ret = timer_8_bit_async_set_handle(DT_ID, &config.handle); ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test interrupt config get/set api */ ret = timer_8_bit_async_set_interrupt_config(DT_ID, &config.interrupt_config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_async_get_interrupt_config(DT_ID, &config.interrupt_config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test OCRA get/set api */ ret = timer_8_bit_async_set_ocra_register_value(DT_ID, config.timing_config.ocra_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_async_get_ocra_register_value(DT_ID, &config.timing_config.ocra_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test OCRB get/set api */ ret = timer_8_bit_async_set_ocrb_register_value(DT_ID, config.timing_config.ocrb_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_async_get_ocrb_register_value(DT_ID, &config.timing_config.ocrb_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test counter get/set api */ ret = timer_8_bit_async_set_counter_value(DT_ID, config.timing_config.counter); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_async_get_counter_value(DT_ID, &config.timing_config.counter); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test force compare flags get/set api */ ret = timer_8_bit_async_set_force_compare_config(DT_ID, &config.force_compare); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_async_get_force_compare_config(DT_ID, &config.force_compare); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test prescaler get/set api */ ret = timer_8_bit_async_set_prescaler(DT_ID, config.timing_config.prescaler); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_async_get_prescaler(DT_ID, &config.timing_config.prescaler); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test waveforme generation get/set api */ ret = timer_8_bit_async_set_waveform_generation(DT_ID, config.timing_config.waveform_mode); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_8_bit_async_get_waveform_generation(DT_ID, &config.timing_config.waveform_mode); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); } TEST_F(Timer8BitAsyncFixture, guard_reg_busy) { timer_error_t ret = TIMER_ERROR_OK; - /* We should have a null handle at the moment */ - ASSERT_TRUE(NULL != config.handle.OCRA ); - ASSERT_TRUE(NULL != config.handle.OCRB ); - ASSERT_TRUE(NULL != config.handle.TCCRA ); - ASSERT_TRUE(NULL != config.handle.TCCRB ); - ASSERT_TRUE(NULL != config.handle.TCNT ); - ASSERT_TRUE(NULL != config.handle.TIFR ); - ASSERT_TRUE(NULL != config.handle.TIMSK ); - ASSERT_TRUE(NULL != config.handle.ASSR_REG ); /* Test compare match mode A get/set api */ timer_8_bit_async_registers_stub.ASSR_REG |= TCRAUB_MSK; @@ -230,13 +206,6 @@ TEST(timer_8_bit_async_driver_tests, guard_null_pointer) ret = timer_8_bit_async_get_compare_match_B(DT_ID, nullptr_compare_output_mode); ASSERT_EQ(TIMER_ERROR_NULL_POINTER, ret); - timer_8_bit_async_handle_t * nullptr_handle = NULL; - /* Test handle setting function */ - ret = timer_8_bit_async_set_handle(DT_ID, nullptr_handle); - ASSERT_EQ(TIMER_ERROR_NULL_POINTER, ret); - ret = timer_8_bit_async_get_handle(DT_ID, nullptr_handle); - ASSERT_EQ(TIMER_ERROR_NULL_POINTER, ret); - /* Test interrupt config get/set api */ timer_8_bit_async_interrupt_config_t * nullptr_interrupt_config = NULL; ret = timer_8_bit_async_set_interrupt_config(DT_ID, nullptr_interrupt_config); @@ -293,12 +262,6 @@ TEST(timer_8_bit_async_driver_tests, guard_wrong_id) ret = timer_8_bit_async_get_compare_match_B(targeted_id, &config.timing_config.comp_match_b); ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); - /* Test handle setting function */ - ret = timer_8_bit_async_set_handle(targeted_id, &config.handle); - ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); - ret = timer_8_bit_async_get_handle(targeted_id, &config.handle); - ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); - /* Test interrupt config get/set api */ ret = timer_8_bit_async_set_interrupt_config(targeted_id, &config.interrupt_config); ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); diff --git a/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h b/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h index 2bd147d..e497120 100644 --- a/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h +++ b/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -34,6 +34,7 @@ along with this program. If not, see . #include #include "timer_generic.h" #include "timer_8_bit_async_reg.h" +#include "config.h" #ifdef __cplusplus extern "C" @@ -83,7 +84,6 @@ typedef struct timer_8_bit_async_timing_config_t timing_config; /**< Handles basic timing configuration for 8 bit timers */ timer_8_bit_async_interrupt_config_t interrupt_config; /**< Handles interrupt configuraitons for 8 bit timers */ timer_8_bit_async_force_compare_config_t force_compare; /**< Handles force compare flags on output A and B, generic configuration among timers */ - timer_8_bit_async_handle_t handle; /**< Stores pointer locations to peripheral registers */ } timer_8_bit_async_config_t; @@ -103,31 +103,6 @@ typedef struct */ timer_error_t timer_8_bit_async_get_default_config(timer_8_bit_async_config_t * config); -/** - * @brief sets the handle of timer_8_bit driver - * @param[in] id : targeted timer id (used to fetch internal configuration based on ids) - * @param[in] handle : handle to be copied into internal configuration - * @return - * TIMER_ERROR_OK : operation succeeded - * TIMER_ERROR_UNKNOWN_TIMER : given id is out of range - * TIMER_ERROR_NULL_POINTER : given force_comp_config parameter points to NULL -*/ -timer_error_t timer_8_bit_async_set_handle(uint8_t id, timer_8_bit_async_handle_t * const handle); - -/** - * @brief gets the handle of timer_8_bit driver - * @param[in] id : targeted timer id (used to fetch internal configuration based on ids) - * @param[in] handle : handle to be fetched from internal configuration - * @return - * TIMER_ERROR_OK : operation succeeded - * TIMER_ERROR_UNKNOWN_TIMER : given id is out of range - * TIMER_ERROR_NULL_POINTER : given force_comp_config parameter points to NULL -*/ -timer_error_t timer_8_bit_async_get_handle(uint8_t id, timer_8_bit_async_handle_t * const handle); - - - - /* ################################ Force compare flags configuration ############################### */ /** * @brief sets the given force compare configuration object to targeted timer @@ -191,6 +166,11 @@ timer_error_t timer_8_bit_async_get_interrupt_config(uint8_t id, timer_8_bit_asy * TIMER_ERROR_NULL_POINTER : given it_config parameter points to NULL */ timer_error_t timer_8_bit_async_get_interrupt_flags(uint8_t id, timer_8_bit_async_interrupt_config_t * it_flags); + +/** + * @brief Resets internal configuration of timer 8 bit async driver + */ +void timer_8_bit_async_clear_init_states(void); #endif @@ -428,23 +408,44 @@ timer_error_t timer_8_bit_async_start(uint8_t id); */ timer_error_t timer_8_bit_async_stop(uint8_t id); -#define TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT (7U) - /** - * @brief Timer 8 bit prescaler table, ascending order. Used to compute the closest prescaler - * which can be used to generate any given frequency -*/ -extern const timer_generic_prescaler_pair_t timer_8_bit_async_prescaler_table[TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT]; - + * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, + * using CPU main clock frequency as the time constraint. + * + * @param[in] cpu_freq : current CPU main clock frequency + * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) + * @param[out] prescaler : output prescaler parameter + * @param[out] ocr : output ocr value + * @param[out] accumulator : output accumulator value ; used by the timebase module for instance to count events and extend timer's counter capabilities + */ void timer_8_bit_async_compute_matching_parameters(const uint32_t * const cpu_freq, const uint32_t * const target_freq, timer_8_bit_async_prescaler_selection_t * const prescaler, uint8_t * const ocra, uint16_t * const accumulator); +#define TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT (7U) + +/** + * @brief Converts a single prescaler enum to its value-based counterpart. + * Behaves as a lookup table + * @param prescaler : input prescaler + * @return uint16_t : returns the translated value (from 1 to 1024) + */ uint16_t timer_8_bit_async_prescaler_to_value(const timer_8_bit_async_prescaler_selection_t prescaler); + +/** + * @brief Translates back a plain prescaler value to its enum counterpart. + * If no direct equivalent is found, returns the TIMER8BIT_CLK_NO_CLOCK enum value + * @param input_prescaler : input prescaler parameter + * @return enum value + */ timer_8_bit_async_prescaler_selection_t timer_8_bit_async_prescaler_from_value(uint16_t const * const input_prescaler); +/** + * @brief this handle has to be declared somewhere and initialised appropriately + */ +extern timer_8_bit_async_handle_t timer_8_bit_async_static_handle[TIMER_8_BIT_ASYNC_COUNT]; #ifdef __cplusplus } diff --git a/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c b/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c index 8498edd..dc42747 100644 --- a/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c +++ b/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -42,11 +42,11 @@ along with this program. If not, see . static struct { - timer_8_bit_async_handle_t handle; timer_8_bit_async_prescaler_selection_t prescaler; bool is_initialised; } internal_config[TIMER_8_BIT_ASYNC_COUNT] = {0}; + const timer_generic_prescaler_pair_t timer_8_bit_async_prescaler_table[TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT] = { {.value = 1, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_1 }, @@ -101,37 +101,10 @@ void timer_8_bit_async_compute_matching_parameters(const uint32_t * const cpu_fr }; timer_generic_compute_parameters(¶meters); *prescaler = timer_8_bit_async_prescaler_from_value(¶meters.output.prescaler); - *ocra = (uint8_t) parameters.output.ocra; + *ocra = (uint8_t) parameters.output.ocr; *accumulator = parameters.output.accumulator; } -static inline timer_error_t check_handle(timer_8_bit_async_handle_t * const handle) -{ - bool found_null = false; - if (NULL == handle) - { - /* Not the use case we really want to check, but this is a case of error anyway - which will generate segfaults errors if we let it propagate further ... */ - found_null = true; - } - else - { - found_null |= (NULL == handle->OCRA); - found_null |= (NULL == handle->OCRB); - found_null |= (NULL == handle->TCCRA); - found_null |= (NULL == handle->TCCRB); - found_null |= (NULL == handle->TCNT); - found_null |= (NULL == handle->TIFR); - found_null |= (NULL == handle->TIMSK); - found_null |= (NULL == handle->ASSR_REG); - } - if (found_null) - { - return TIMER_ERROR_NULL_HANDLE; - } - return TIMER_ERROR_OK;; -} - static inline timer_error_t check_id(uint8_t id) { if (id >= TIMER_8_BIT_ASYNC_COUNT) @@ -143,47 +116,13 @@ static inline timer_error_t check_id(uint8_t id) static inline timer_error_t check_reg_busy(uint8_t id, uint8_t mask) { - if (0 != (*internal_config[id].handle.ASSR_REG & mask)) + if (0 != (*(timer_8_bit_async_static_handle[id].ASSR_REG) & mask)) { return TIMER_ERROR_REGISTER_IS_BUSY; } return TIMER_ERROR_OK; } -timer_error_t timer_8_bit_async_set_handle(uint8_t id, timer_8_bit_async_handle_t * const handle) -{ - timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - if (NULL == handle) - { - return TIMER_ERROR_NULL_POINTER; - } - - memcpy(&internal_config[id].handle, handle, sizeof(timer_8_bit_async_handle_t)); - return ret; -} - -timer_error_t timer_8_bit_async_get_handle(uint8_t id, timer_8_bit_async_handle_t * const handle) -{ - timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - if (NULL == handle) - { - return TIMER_ERROR_NULL_POINTER; - } - - memcpy(handle, &internal_config[id].handle, sizeof(timer_8_bit_async_handle_t)); - return ret; -} - timer_error_t timer_8_bit_async_get_default_config(timer_8_bit_async_config_t * config) { timer_error_t ret = TIMER_ERROR_OK; @@ -214,15 +153,6 @@ timer_error_t timer_8_bit_async_get_default_config(timer_8_bit_async_config_t * config->force_compare.force_comp_match_a = false; config->force_compare.force_comp_match_b = false; - /* Architecture and device dependent, must be set at configuration time */ - config->handle.OCRA = NULL; - config->handle.OCRB = NULL; - config->handle.TCCRA = NULL; - config->handle.TCCRB = NULL; - config->handle.TCNT = NULL; - config->handle.TIFR = NULL; - config->handle.TIMSK = NULL; - config->handle.ASSR_REG = NULL; return ret; } @@ -239,13 +169,6 @@ timer_error_t timer_8_bit_async_set_force_compare_config(uint8_t id, timer_8_bit return TIMER_ERROR_NULL_POINTER; } - /* Not fully configured handle, do not attempt to write to it until configured !*/ - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation will be discarded. See datasheet for further details */ ret = check_reg_busy(id, TCRBUB_MSK); @@ -257,21 +180,21 @@ timer_error_t timer_8_bit_async_set_force_compare_config(uint8_t id, timer_8_bit /* Handles force output compare A flags */ if (true == force_comp_config->force_comp_match_a) { - *(internal_config[id].handle.TCCRB) |= (1U << FOCA_BIT) ; + *(timer_8_bit_async_static_handle[id].TCCRB) |= (1U << FOCA_BIT) ; } else { - *(internal_config[id].handle.TCCRB) &= ~(1U << FOCA_BIT) ; + *(timer_8_bit_async_static_handle[id].TCCRB) &= ~(1U << FOCA_BIT) ; } /* Handles force output compare A flags */ if (true == force_comp_config->force_comp_match_b) { - *(internal_config[id].handle.TCCRB) |= (1U << FOCB_BIT) ; + *(timer_8_bit_async_static_handle[id].TCCRB) |= (1U << FOCB_BIT) ; } else { - *(internal_config[id].handle.TCCRB) &= ~(1U << FOCB_BIT) ; + *(timer_8_bit_async_static_handle[id].TCCRB) &= ~(1U << FOCB_BIT) ; } return ret; } @@ -287,12 +210,6 @@ timer_error_t timer_8_bit_async_get_force_compare_config(uint8_t id, timer_8_bit { return TIMER_ERROR_NULL_POINTER; } - /* Not fully configured handle, do not attempt to write to it until configured !*/ - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } ret = check_reg_busy(id, TCRBUB_MSK); if (TIMER_ERROR_OK != ret) @@ -301,7 +218,7 @@ timer_error_t timer_8_bit_async_get_force_compare_config(uint8_t id, timer_8_bit } /* Handles Force Compare Output A flag */ - if (0U == (*(internal_config[id].handle.TCCRB) & FOCA_MSK)) + if (0U == (*(timer_8_bit_async_static_handle[id].TCCRB) & FOCA_MSK)) { force_comp_config->force_comp_match_a = false; } @@ -311,7 +228,7 @@ timer_error_t timer_8_bit_async_get_force_compare_config(uint8_t id, timer_8_bit } /* Handles Force Compare Output B flag */ - if (0U == (*(internal_config[id].handle.TCCRB) & FOCB_MSK)) + if (0U == (*(timer_8_bit_async_static_handle[id].TCCRB) & FOCB_MSK)) { force_comp_config->force_comp_match_b = false; } @@ -334,39 +251,34 @@ timer_error_t timer_8_bit_async_set_interrupt_config(uint8_t id, timer_8_bit_asy { return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } /* TIMSK register */ if (true == it_config->it_comp_match_a) { - *(internal_config[id].handle.TIMSK) |= 1U << OCIEA_BIT; + *(timer_8_bit_async_static_handle[id].TIMSK) |= 1U << OCIEA_BIT; } else { - *(internal_config[id].handle.TIMSK) &= ~(1U << OCIEA_BIT); + *(timer_8_bit_async_static_handle[id].TIMSK) &= ~(1U << OCIEA_BIT); } if (true == it_config->it_comp_match_b) { - *(internal_config[id].handle.TIMSK) |= 1U << OCIEB_BIT; + *(timer_8_bit_async_static_handle[id].TIMSK) |= 1U << OCIEB_BIT; } else { - *(internal_config[id].handle.TIMSK) &= ~(1U << OCIEB_BIT); + *(timer_8_bit_async_static_handle[id].TIMSK) &= ~(1U << OCIEB_BIT); } /* TOIE interrupt flag is the first bit, no need to bitshift it */ if (true == it_config->it_timer_overflow) { - *(internal_config[id].handle.TIMSK) |= 1U; + *(timer_8_bit_async_static_handle[id].TIMSK) |= 1U; } else { - *(internal_config[id].handle.TIMSK) &= ~1U; + *(timer_8_bit_async_static_handle[id].TIMSK) &= ~1U; } return ret; } @@ -385,14 +297,8 @@ timer_error_t timer_8_bit_async_get_interrupt_config(uint8_t id, timer_8_bit_asy return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* Output Compare Match A Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIMSK) & OCIEA_MSK)) + if (0U == (*(timer_8_bit_async_static_handle[id].TIMSK) & OCIEA_MSK)) { it_config->it_comp_match_a = false; } @@ -402,7 +308,7 @@ timer_error_t timer_8_bit_async_get_interrupt_config(uint8_t id, timer_8_bit_asy } /* Output Compare Match B Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIMSK) & OCIEB_MSK)) + if (0U == (*(timer_8_bit_async_static_handle[id].TIMSK) & OCIEB_MSK)) { it_config->it_comp_match_b = false; } @@ -412,7 +318,7 @@ timer_error_t timer_8_bit_async_get_interrupt_config(uint8_t id, timer_8_bit_asy } /* Timer Overflow Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIMSK) & 1U)) + if (0U == (*(timer_8_bit_async_static_handle[id].TIMSK) & 1U)) { it_config->it_timer_overflow = false; } @@ -437,15 +343,8 @@ timer_error_t timer_8_bit_async_get_interrupt_flags(uint8_t id, timer_8_bit_asyn return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - /* Output Compare Match A Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIFR) & OCIEA_MSK)) + if (0U == (*(timer_8_bit_async_static_handle[id].TIFR) & OCIEA_MSK)) { it_flags->it_comp_match_a = false; } @@ -455,7 +354,7 @@ timer_error_t timer_8_bit_async_get_interrupt_flags(uint8_t id, timer_8_bit_asyn } /* Output Compare Match B Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIFR) & OCIEB_MSK)) + if (0U == (*(timer_8_bit_async_static_handle[id].TIFR) & OCIEB_MSK)) { it_flags->it_comp_match_b = false; } @@ -465,7 +364,7 @@ timer_error_t timer_8_bit_async_get_interrupt_flags(uint8_t id, timer_8_bit_asyn } /* Timer Overflow Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIFR) & 1U)) + if (0U == (*(timer_8_bit_async_static_handle[id].TIFR) & 1U)) { it_flags->it_timer_overflow = false; } @@ -475,8 +374,16 @@ timer_error_t timer_8_bit_async_get_interrupt_flags(uint8_t id, timer_8_bit_asyn } return ret; +} +void timer_8_bit_async_clear_init_states(void) +{ + for (uint8_t i = 0 ; i < TIMER_8_BIT_ASYNC_COUNT ; i++) + { + internal_config[i].is_initialised = false; + } } + #endif @@ -489,12 +396,6 @@ timer_error_t timer_8_bit_async_set_prescaler(uint8_t id, const timer_8_bit_asyn return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation will be discarded. See datasheet for further details */ ret = check_reg_busy(id, TCRBUB_MSK); @@ -503,7 +404,7 @@ timer_error_t timer_8_bit_async_set_prescaler(uint8_t id, const timer_8_bit_asyn return ret; } - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~CS_MSK) | prescaler; + *(timer_8_bit_async_static_handle[id].TCCRB) = (*(timer_8_bit_async_static_handle[id].TCCRB) & ~CS_MSK) | prescaler; return ret; } @@ -520,12 +421,6 @@ timer_error_t timer_8_bit_async_get_prescaler(uint8_t id, timer_8_bit_async_pres return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation will be discarded. See datasheet for further details */ ret = check_reg_busy(id, TCRBUB_MSK); @@ -534,7 +429,7 @@ timer_error_t timer_8_bit_async_get_prescaler(uint8_t id, timer_8_bit_async_pres return ret; } - *prescaler = (*(internal_config[id].handle.TCCRB) & CS_MSK); + *prescaler = (*(timer_8_bit_async_static_handle[id].TCCRB) & CS_MSK); return ret; } @@ -546,13 +441,7 @@ timer_error_t timer_8_bit_async_set_compare_match_A(uint8_t id, const timer_8_bi return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation + /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation will be discarded. See datasheet for further details */ ret = check_reg_busy(id, TCRAUB_MSK); if (TIMER_ERROR_OK != ret) @@ -560,7 +449,7 @@ timer_error_t timer_8_bit_async_set_compare_match_A(uint8_t id, const timer_8_bi return ret; } - *(internal_config[id].handle.TCCRA) = (*(internal_config[id].handle.TCCRA) & ~COMA_MSK) | (compA << COMA_BIT); + *(timer_8_bit_async_static_handle[id].TCCRA) = (*(timer_8_bit_async_static_handle[id].TCCRA) & ~COMA_MSK) | (compA << COMA_BIT); return ret; } @@ -577,12 +466,6 @@ timer_error_t timer_8_bit_async_get_compare_match_A(uint8_t id, timer_8_bit_asyn return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation will be discarded. See datasheet for further details */ ret = check_reg_busy(id, TCRAUB_MSK); @@ -591,7 +474,7 @@ timer_error_t timer_8_bit_async_get_compare_match_A(uint8_t id, timer_8_bit_asyn return ret; } - *compA = ((*(internal_config[id].handle.TCCRA) & COMA_MSK) >> COMA_BIT); + *compA = ((*(timer_8_bit_async_static_handle[id].TCCRA) & COMA_MSK) >> COMA_BIT); return ret; } @@ -603,12 +486,6 @@ timer_error_t timer_8_bit_async_set_compare_match_B(uint8_t id, timer_8_bit_asyn return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation will be discarded. See datasheet for further details */ ret = check_reg_busy(id, TCRAUB_MSK); @@ -617,7 +494,7 @@ timer_error_t timer_8_bit_async_set_compare_match_B(uint8_t id, timer_8_bit_asyn return ret; } - *(internal_config[id].handle.TCCRA) = (*(internal_config[id].handle.TCCRA) & ~COMB_MSK) | (compB << COMB_BIT); + *(timer_8_bit_async_static_handle[id].TCCRA) = (*(timer_8_bit_async_static_handle[id].TCCRA) & ~COMB_MSK) | (compB << COMB_BIT); return ret; } @@ -634,12 +511,6 @@ timer_error_t timer_8_bit_async_get_compare_match_B(uint8_t id, timer_8_bit_asyn return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation * will be discarded. See datasheet for further details */ ret = check_reg_busy(id, TCRAUB_MSK); @@ -648,7 +519,7 @@ timer_error_t timer_8_bit_async_get_compare_match_B(uint8_t id, timer_8_bit_asyn return ret; } - *compB = ((*(internal_config[id].handle.TCCRA) & COMB_MSK) >> COMB_BIT); + *compB = ((*(timer_8_bit_async_static_handle[id].TCCRA) & COMB_MSK) >> COMB_BIT); return ret; } @@ -660,21 +531,15 @@ timer_error_t timer_8_bit_async_set_waveform_generation(uint8_t id, const timer_ return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - ret = check_reg_busy(id, TCRAUB_MSK | TCRBUB_MSK); if (TIMER_ERROR_OK != ret) { return ret; } - *(internal_config[id].handle.TCCRA) = (*(internal_config[id].handle.TCCRA) & ~(WGM0_MSK | WGM1_MSK)) | (waveform & (WGM0_MSK | WGM1_MSK)); + *(timer_8_bit_async_static_handle[id].TCCRA) = (*(timer_8_bit_async_static_handle[id].TCCRA) & ~(WGM0_MSK | WGM1_MSK)) | (waveform & (WGM0_MSK | WGM1_MSK)); /* Select bit index 2 of waveform mode (matches datasheet bit mapping) and store it to bit index 3 of TCCRB with one more bitshift */ - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~WGM2_MSK) | (waveform & (1U << 2U) << 1U); + *(timer_8_bit_async_static_handle[id].TCCRB) = (*(timer_8_bit_async_static_handle[id].TCCRB) & ~WGM2_MSK) | (waveform & (1U << 2U) << 1U); return ret; } @@ -691,12 +556,6 @@ timer_error_t timer_8_bit_async_get_waveform_generation(uint8_t id, timer_8_bit_ return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - ret = check_reg_busy(id, TCRAUB_MSK | TCRBUB_MSK); if (TIMER_ERROR_OK != ret) { @@ -704,8 +563,8 @@ timer_error_t timer_8_bit_async_get_waveform_generation(uint8_t id, timer_8_bit_ } *waveform = (timer_8_bit_async_waveform_generation_t)(0U); - *waveform |= (*(internal_config[id].handle.TCCRA) & (WGM0_MSK | WGM1_MSK)); - *waveform |= (*(internal_config[id].handle.TCCRB) & (WGM2_MSK)) >> 1U; + *waveform |= (*(timer_8_bit_async_static_handle[id].TCCRA) & (WGM0_MSK | WGM1_MSK)); + *waveform |= (*(timer_8_bit_async_static_handle[id].TCCRB) & (WGM2_MSK)) >> 1U; return ret; } @@ -717,12 +576,6 @@ timer_error_t timer_8_bit_async_set_counter_value(uint8_t id, const uint8_t tick return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation * will be discarded. See datasheet for further details */ ret = check_reg_busy(id, TCNUB_MSK); @@ -732,7 +585,7 @@ timer_error_t timer_8_bit_async_set_counter_value(uint8_t id, const uint8_t tick } /* Write new value to internal timer/counter register */ - *(internal_config[id].handle.TCNT) = ticks; + *(timer_8_bit_async_static_handle[id].TCNT) = ticks; return ret; } @@ -749,12 +602,6 @@ timer_error_t timer_8_bit_async_get_counter_value(uint8_t id, uint8_t * ticks) return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation * will be discarded. See datasheet for further details */ ret = check_reg_busy(id, TCNUB_MSK); @@ -764,7 +611,7 @@ timer_error_t timer_8_bit_async_get_counter_value(uint8_t id, uint8_t * ticks) } /* Transfer data from internal device's timer/count main register */ - *ticks = *internal_config[id].handle.TCNT; + *ticks = *(timer_8_bit_async_static_handle[id].TCNT); return ret; } @@ -776,12 +623,6 @@ timer_error_t timer_8_bit_async_set_ocra_register_value(uint8_t id, uint8_t ocra return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation * will be discarded. See datasheet for further details */ ret = check_reg_busy(id, OCRAUB_MSK); @@ -790,7 +631,7 @@ timer_error_t timer_8_bit_async_set_ocra_register_value(uint8_t id, uint8_t ocra return ret; } - *internal_config[id].handle.OCRA = ocra; + *(timer_8_bit_async_static_handle[id].OCRA) = ocra; return ret; } @@ -807,12 +648,6 @@ timer_error_t timer_8_bit_async_get_ocra_register_value(uint8_t id, uint8_t * oc return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation * will be discarded. See datasheet for further details */ ret = check_reg_busy(id, OCRAUB_MSK); @@ -821,7 +656,7 @@ timer_error_t timer_8_bit_async_get_ocra_register_value(uint8_t id, uint8_t * oc return ret; } - *ocra = *internal_config[id].handle.OCRA; + *ocra = *(timer_8_bit_async_static_handle[id].OCRA); return ret; } @@ -833,12 +668,6 @@ timer_error_t timer_8_bit_async_set_ocrb_register_value(uint8_t id, uint8_t ocrb return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation * will be discarded. See datasheet for further details */ ret = check_reg_busy(id, OCRBUB_MSK); @@ -847,7 +676,7 @@ timer_error_t timer_8_bit_async_set_ocrb_register_value(uint8_t id, uint8_t ocrb return ret; } - *internal_config[id].handle.OCRB = ocrb; + *(timer_8_bit_async_static_handle[id].OCRB) = ocrb; return ret; } @@ -864,12 +693,6 @@ timer_error_t timer_8_bit_async_get_ocrb_register_value(uint8_t id, uint8_t * oc return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation * will be discarded. See datasheet for further details */ ret = check_reg_busy(id, OCRBUB_MSK); @@ -878,14 +701,14 @@ timer_error_t timer_8_bit_async_get_ocrb_register_value(uint8_t id, uint8_t * oc return ret; } - *ocrb = *internal_config[id].handle.OCRB; + *ocrb = *(timer_8_bit_async_static_handle[id].OCRB); return ret; } static timer_error_t timer_8_bit_async_write_config(uint8_t id, timer_8_bit_async_config_t * const config) { timer_error_t ret = TIMER_ERROR_OK; - timer_8_bit_async_handle_t * handle = &internal_config[id].handle; + timer_8_bit_async_handle_t * handle = &timer_8_bit_async_static_handle[id]; /* If register is asynchronously updated, it will be blocked by hardware and any read/write operation * will be discarded. See datasheet for further details */ @@ -905,7 +728,7 @@ static timer_error_t timer_8_bit_async_write_config(uint8_t id, timer_8_bit_asyn /* Clear TCCRA register first, otherwise we can't reconfigure the OCRA/OCRB regs!*/ *(handle->TCCRA) = 0; - + /* TCCRA register */ *(handle->OCRA) = config->timing_config.ocra_val; *(handle->OCRB) = config->timing_config.ocrb_val; @@ -1014,12 +837,6 @@ timer_error_t timer_8_bit_async_deinit(uint8_t id) return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* Retrieve a config object to write back default configuration into timer registers */ timer_8_bit_async_config_t config; ret = timer_8_bit_async_stop(id); @@ -1051,18 +868,6 @@ timer_error_t timer_8_bit_async_reconfigure(uint8_t id, timer_8_bit_async_config return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&config->handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - ret = timer_8_bit_async_set_handle(id, &config->handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* Stop the timer before reconfiguring it */ if (true == internal_config[id].is_initialised) { @@ -1091,12 +896,6 @@ timer_error_t timer_8_bit_async_start(uint8_t id) return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - if (false == internal_config[id].is_initialised) { return TIMER_ERROR_NOT_INITIALISED; @@ -1111,7 +910,7 @@ timer_error_t timer_8_bit_async_start(uint8_t id) } /* This time, set the prescaler to start the timer, unless prescaler is set to NO_CLOCK source */ - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~CS_MSK) | internal_config[id].prescaler; + *(timer_8_bit_async_static_handle[id].TCCRB) = (*(timer_8_bit_async_static_handle[id].TCCRB) & ~CS_MSK) | internal_config[id].prescaler; return ret; } @@ -1137,6 +936,6 @@ timer_error_t timer_8_bit_async_stop(uint8_t id) } /* Reset prescaler to NO_CLOCK*/ - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~CS_MSK) | TIMER8BIT_ASYNC_CLK_NO_CLOCK; + *(timer_8_bit_async_static_handle[id].TCCRB) = (*(timer_8_bit_async_static_handle[id].TCCRB) & ~CS_MSK) | TIMER8BIT_ASYNC_CLK_NO_CLOCK; return ret; } diff --git a/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c b/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c index ecda04d..897743e 100644 --- a/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c +++ b/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -141,15 +141,6 @@ timer_error_t timer_8_bit_async_get_default_config(timer_8_bit_async_config_t * config->force_compare.force_comp_match_a = false; config->force_compare.force_comp_match_b = false; - /* Architecture and device dependent, must be set at configuration time */ - config->handle.OCRA = NULL; - config->handle.OCRB = NULL; - config->handle.TCCRA = NULL; - config->handle.TCCRB = NULL; - config->handle.TCNT = NULL; - config->handle.TIFR = NULL; - config->handle.TIMSK = NULL; - config->handle.ASSR_REG = NULL; return ret; } From 350c14807dee9d076d1070531162528796514e73 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 23 Mar 2022 10:36:40 +0100 Subject: [PATCH 21/51] Refactored Timer 16 bit to have static config Signed-off-by: bebenlebricolo --- .../Timers/Timer_16_bit/Tests/CMakeLists.txt | 2 + .../Tests/Stub/timer_16_bit_registers_stub.c | 36 +- .../Timer_16_bit/Tests/timer_16_bit_tests.cpp | 85 +--- .../Timers/Timer_16_bit/inc/timer_16_bit.h | 71 +-- .../Timers/Timer_16_bit/src/timer_16_bit.c | 429 +++++------------- .../Timebase/Tests/Stubs/timer_16_bit_stub.c | 16 +- 6 files changed, 204 insertions(+), 435 deletions(-) diff --git a/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt b/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt index 235f081..6dbb071 100644 --- a/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt +++ b/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt @@ -26,6 +26,8 @@ target_include_directories(timer_16_bit_driver_tests PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Stub ${CMAKE_CURRENT_SOURCE_DIR}/../inc ${CMAKE_CURRENT_SOURCE_DIR}/../../Timer_generic/inc + ${CMAKE_CURRENT_SOURCE_DIR} + ) target_include_directories(timer_16_bit_driver_tests SYSTEM PUBLIC diff --git a/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c b/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c index e1880ec..90cdea4 100644 --- a/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c +++ b/Drivers/Timers/Timer_16_bit/Tests/Stub/timer_16_bit_registers_stub.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -28,8 +28,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "timer_16_bit_registers_stub.h" #include +#include "timer_16_bit.h" +#include "timer_16_bit_registers_stub.h" timer_16_bit_registers_stub_t timer_16_bit_registers_stub = {0}; @@ -38,24 +39,23 @@ void timer_16_bit_registers_stub_erase(void) memset(&timer_16_bit_registers_stub, 0, sizeof(timer_16_bit_registers_stub_t)); } -void timer_16_bit_registers_stub_init_handle(timer_16_bit_handle_t * handle) +timer_16_bit_handle_t timer_16_bit_static_handle[TIMER_16_BIT_COUNT] = { - if (NULL != handle) { - handle->TCCRA = &timer_16_bit_registers_stub.TCCRA; - handle->TCCRB = &timer_16_bit_registers_stub.TCCRB; - handle->TCCRC = &timer_16_bit_registers_stub.TCCRC; - handle->OCRA_H = &timer_16_bit_registers_stub.OCRA_H; - handle->OCRA_L = &timer_16_bit_registers_stub.OCRA_L; - handle->OCRB_H = &timer_16_bit_registers_stub.OCRB_H; - handle->OCRB_L = &timer_16_bit_registers_stub.OCRB_L; - handle->TCNT_H = &timer_16_bit_registers_stub.TCNT_H; - handle->TCNT_L = &timer_16_bit_registers_stub.TCNT_L; - handle->ICR_H = &timer_16_bit_registers_stub.ICR_H; - handle->ICR_L = &timer_16_bit_registers_stub.ICR_L; - handle->TIMSK = &timer_16_bit_registers_stub.TIMSK; - handle->TIFR = &timer_16_bit_registers_stub.TIFR; + .TCCRA = &timer_16_bit_registers_stub.TCCRA, + .TCCRB = &timer_16_bit_registers_stub.TCCRB, + .TCCRC = &timer_16_bit_registers_stub.TCCRC, + .OCRA_H = &timer_16_bit_registers_stub.OCRA_H, + .OCRA_L = &timer_16_bit_registers_stub.OCRA_L, + .OCRB_H = &timer_16_bit_registers_stub.OCRB_H, + .OCRB_L = &timer_16_bit_registers_stub.OCRB_L, + .TCNT_H = &timer_16_bit_registers_stub.TCNT_H, + .TCNT_L = &timer_16_bit_registers_stub.TCNT_L, + .ICR_H = &timer_16_bit_registers_stub.ICR_H, + .ICR_L = &timer_16_bit_registers_stub.ICR_L, + .TIMSK = &timer_16_bit_registers_stub.TIMSK, + .TIFR = &timer_16_bit_registers_stub.TIFR } -} +}; diff --git a/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp b/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp index c7c55c9..a1d35dc 100644 --- a/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp +++ b/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -46,8 +46,7 @@ class Timer16BitFixture : public ::testing::Test { timer_16_bit_registers_stub_erase(); (void) timer_16_bit_get_default_config(&config); - timer_16_bit_registers_stub_init_handle(&config.handle); - (void) timer_16_bit_set_handle(DT_ID, &config.handle); + timer_16_bit_clear_init_states(); } void TearDown() override { @@ -60,97 +59,76 @@ TEST(timer_16_bit_driver_tests, guard_null_handle) timer_error_t ret = timer_16_bit_get_default_config(&config); ASSERT_EQ(TIMER_ERROR_OK, ret); - /* We should have a null handle at the moment */ - ASSERT_TRUE(NULL == (void*) (config.handle.OCRA_H)); - ASSERT_TRUE(NULL == (void*) (config.handle.OCRA_L)); - ASSERT_TRUE(NULL == (void*) (config.handle.OCRB_H)); - ASSERT_TRUE(NULL == (void*) (config.handle.OCRB_L)); - ASSERT_TRUE(NULL == (void*) (config.handle.TCCRA)); - ASSERT_TRUE(NULL == (void*) (config.handle.TCCRB)); - ASSERT_TRUE(NULL == (void*) (config.handle.TCCRC)); - ASSERT_TRUE(NULL == (void*) (config.handle.TCNT_H)); - ASSERT_TRUE(NULL == (void*) (config.handle.TCNT_L)); - ASSERT_TRUE(NULL == (void*) (config.handle.ICR_H)); - ASSERT_TRUE(NULL == (void*) (config.handle.ICR_L)); - ASSERT_TRUE(NULL == (void*) (config.handle.TIFR)); - ASSERT_TRUE(NULL == (void*) (config.handle.TIMSK)); - ret = timer_16_bit_init(DT_ID, &config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_16_bit_reconfigure(DT_ID, &config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test compare match mode A get/set api */ ret = timer_16_bit_set_compare_match_A(DT_ID, config.timing_config.comp_match_a); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_16_bit_get_compare_match_A(DT_ID, &config.timing_config.comp_match_a); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test compare match mode B get/set api */ ret = timer_16_bit_set_compare_match_B(DT_ID, config.timing_config.comp_match_b); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); - ret = timer_16_bit_get_compare_match_B(DT_ID, &config.timing_config.comp_match_b); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); - - /* Test handle setting function */ - ret = timer_16_bit_set_handle(DT_ID, &config.handle); ASSERT_EQ(TIMER_ERROR_OK, ret); - ret = timer_16_bit_get_handle(DT_ID, &config.handle); + ret = timer_16_bit_get_compare_match_B(DT_ID, &config.timing_config.comp_match_b); ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test interrupt config get/set api */ ret = timer_16_bit_set_interrupt_config(DT_ID, &config.interrupt_config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_16_bit_get_interrupt_config(DT_ID, &config.interrupt_config); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test OCRA get/set api */ ret = timer_16_bit_set_ocra_register_value(DT_ID, &config.timing_config.ocra_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_16_bit_get_ocra_register_value(DT_ID, &config.timing_config.ocra_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test OCRB get/set api */ ret = timer_16_bit_set_ocrb_register_value(DT_ID, &config.timing_config.ocrb_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_16_bit_get_ocrb_register_value(DT_ID, &config.timing_config.ocrb_val); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test counter get/set api */ ret = timer_16_bit_set_counter_value(DT_ID, &config.timing_config.counter); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_16_bit_get_counter_value(DT_ID, &config.timing_config.counter); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test force compare flags get/set api */ ret = timer_16_bit_set_force_compare_config(DT_ID, &config.force_compare); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_16_bit_get_force_compare_config(DT_ID, &config.force_compare); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test prescaler get/set api */ ret = timer_16_bit_set_prescaler(DT_ID, config.timing_config.prescaler); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_16_bit_get_prescaler(DT_ID, &config.timing_config.prescaler); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test waveform generation get/set api */ ret = timer_16_bit_set_waveform_generation(DT_ID, config.timing_config.waveform_mode); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_16_bit_get_waveform_generation(DT_ID, &config.timing_config.waveform_mode); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test input capture edge select get/set api */ ret = timer_16_bit_set_input_compare_edge_select(DT_ID, config.input_capture.edge_select); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_16_bit_get_input_compare_edge_select(DT_ID, &config.input_capture.edge_select); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); /* Test input capture noise canceler get/set api */ ret = timer_16_bit_set_input_compare_noise_canceler(DT_ID, config.input_capture.use_noise_canceler); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); ret = timer_16_bit_get_input_compare_noise_canceler(DT_ID, &config.input_capture.use_noise_canceler); - ASSERT_EQ(TIMER_ERROR_NULL_HANDLE, ret); + ASSERT_EQ(TIMER_ERROR_OK, ret); } TEST(timer_16_bit_driver_tests, guard_null_pointer) @@ -172,13 +150,6 @@ TEST(timer_16_bit_driver_tests, guard_null_pointer) ret = timer_16_bit_init(DT_ID, nullptr_config); ASSERT_EQ(TIMER_ERROR_NULL_POINTER, ret); - timer_16_bit_handle_t * nullptr_handle = NULL; - /* Test handle setting function */ - ret = timer_16_bit_set_handle(DT_ID, nullptr_handle); - ASSERT_EQ(TIMER_ERROR_NULL_POINTER, ret); - ret = timer_16_bit_get_handle(DT_ID, nullptr_handle); - ASSERT_EQ(TIMER_ERROR_NULL_POINTER, ret); - /* Test interrupt config get/set api */ timer_16_bit_interrupt_config_t * nullptr_interrupt_config = NULL; ret = timer_16_bit_set_interrupt_config(DT_ID, nullptr_interrupt_config); @@ -245,12 +216,6 @@ TEST(timer_16_bit_driver_tests, guard_wrong_id) ret = timer_16_bit_get_compare_match_B(targeted_id, &config.timing_config.comp_match_b); ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); - /* Test handle setting function */ - ret = timer_16_bit_set_handle(targeted_id, &config.handle); - ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); - ret = timer_16_bit_get_handle(targeted_id, &config.handle); - ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); - /* Test interrupt config get/set api */ ret = timer_16_bit_set_interrupt_config(targeted_id, &config.interrupt_config); ASSERT_EQ(TIMER_ERROR_UNKNOWN_TIMER, ret); diff --git a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h index ab2baa5..ebcca2d 100644 --- a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h +++ b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -33,6 +33,7 @@ along with this program. If not, see . #include #include "timer_16_bit_reg.h" +#include "config.h" #ifdef __cplusplus extern "C" @@ -77,7 +78,6 @@ typedef struct timer_16_bit_interrupt_config_t interrupt_config; /**< Handles interrupt configuraitons for 16 bit timers */ timer_16_bit_force_compare_config_t force_compare; /**< Handles force compare flags on output A and B, generic configuration among timers */ timer_16_bit_input_capture_noise_canceler_config_t input_capture; /**< Handles input capture noise canceler configuration for 16-bit timers */ - timer_16_bit_handle_t handle; /**< Stores pointer locations to peripheral registers */ } timer_16_bit_config_t; /* ############################################################################################################## @@ -96,30 +96,6 @@ typedef struct */ timer_error_t timer_16_bit_get_default_config(timer_16_bit_config_t * config); -/** - * @brief sets the handle of timer_16_bit driver - * @param[in] id : targeted timer id (used to fetch internal configuration based on ids) - * @param[in] handle : handle to be copied into internal configuration - * @return - * TIMER_ERROR_OK : operation succeeded - * TIMER_ERROR_UNKNOWN_TIMER : given id is out of range - * TIMER_ERROR_NULL_POINTER : given force_comp_config parameter points to NULL -*/ -timer_error_t timer_16_bit_set_handle(uint8_t id, timer_16_bit_handle_t * const handle); - -/** - * @brief gets the handle of timer_16_bit driver - * @param[in] id : targeted timer id (used to fetch internal configuration based on ids) - * @param[in] handle : handle to be copied from internal configuration - * @return - * TIMER_ERROR_OK : operation succeeded - * TIMER_ERROR_UNKNOWN_TIMER : given id is out of range - * TIMER_ERROR_NULL_POINTER : given force_comp_config parameter points to NULL -*/ -timer_error_t timer_16_bit_get_handle(uint8_t id, timer_16_bit_handle_t * const handle); - - - /* ################################ Force compare flags configuration ############################### */ /** * @brief sets the given force compare configuration object to targeted timer @@ -183,6 +159,11 @@ timer_error_t timer_16_bit_get_interrupt_config(uint8_t id, timer_16_bit_interru * TIMER_ERROR_NULL_POINTER : given it_config parameter points to NULL */ timer_error_t timer_16_bit_get_interrupt_flags(uint8_t id, timer_16_bit_interrupt_config_t * it_flags); + +/** + * @brief Resets internal configuration of timer 16 bit driver + */ +void timer_16_bit_clear_init_states(void); #endif /** @@ -473,24 +454,46 @@ timer_error_t timer_16_bit_start(uint8_t id); */ timer_error_t timer_16_bit_stop(uint8_t id); -#define TIMER_16_BIT_MAX_PRESCALER_COUNT (5U) - +/** + * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, + * using CPU main clock frequency as the time constraint. + * + * @param[in] cpu_freq : current CPU main clock frequency + * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) + * @param[out] prescaler : output prescaler parameter + * @param[out] ocr : output ocr value + * @param[out] accumulator : output accumulator value ; used by the timebase module for instance to count events and extend timer's counter capabilities + */ void timer_16_bit_compute_matching_parameters(const uint32_t * const cpu_freq, const uint32_t * const target_freq, timer_16_bit_prescaler_selection_t * const prescaler, - uint16_t * const ocra, + uint16_t * const ocr, uint16_t * const accumulator); -/** - * @brief Timer 16 bit prescaler table, ascending order. Used to compute the closest prescaler - * which can be used to generate any given frequency -*/ -extern const timer_generic_prescaler_pair_t timer_16_bit_prescaler_table[TIMER_16_BIT_MAX_PRESCALER_COUNT]; +#define TIMER_16_BIT_MAX_PRESCALER_COUNT (5U) +/** + * @brief Converts a single prescaler enum to its value-based counterpart. + * Behaves as a lookup table + * @param prescaler : input prescaler + * @return uint16_t : returns the translated value (from 1 to 1024) + */ uint16_t timer_16_bit_prescaler_to_value(const timer_16_bit_prescaler_selection_t prescaler); + +/** + * @brief Translates back a plain prescaler value to its enum counterpart. + * If no direct equivalent is found, returns the TIMER8BIT_CLK_NO_CLOCK enum value + * @param input_prescaler : input prescaler parameter + * @return enum value + */ timer_16_bit_prescaler_selection_t timer_16_bit_prescaler_from_value(uint16_t const * const input_prescaler); +/** + * @brief this handle has to be declared somewhere and initialised appropriately + */ +extern timer_16_bit_handle_t timer_16_bit_static_handle[TIMER_16_BIT_COUNT]; + #ifdef __cplusplus } #endif diff --git a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c index 0261274..4eb9a3b 100644 --- a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c +++ b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -42,7 +42,6 @@ along with this program. If not, see . static struct { - timer_16_bit_handle_t handle; timer_16_bit_prescaler_selection_t prescaler; bool is_initialised; } internal_config[TIMER_16_BIT_COUNT] = {0}; @@ -83,7 +82,7 @@ uint16_t timer_16_bit_prescaler_to_value(const timer_16_bit_prescaler_selection_ void timer_16_bit_compute_matching_parameters(const uint32_t * const cpu_freq, const uint32_t * const target_freq, timer_16_bit_prescaler_selection_t * const prescaler, - uint16_t * const ocra, + uint16_t * const ocr, uint16_t * const accumulator) { timer_generic_parameters_t parameters = @@ -99,46 +98,10 @@ void timer_16_bit_compute_matching_parameters(const uint32_t * const cpu_freq, }; timer_generic_compute_parameters(¶meters); *prescaler = timer_16_bit_prescaler_from_value(¶meters.output.prescaler); - *ocra = parameters.output.ocra; + *ocr = parameters.output.ocr; *accumulator = parameters.output.accumulator; } -static inline timer_error_t check_handle(timer_16_bit_handle_t * const handle) -{ - bool found_null = false; - if (NULL == handle) - { - /* Not the use case we really want to check, but this is a case of error anyway - which will generate segfaults errors if we let it propagate further ... */ - found_null = true; - } - else - { - found_null |= (NULL == handle->TCCRA); - found_null |= (NULL == handle->TCCRB); - found_null |= (NULL == handle->TCCRC); - - found_null |= (NULL == handle->OCRA_H); - found_null |= (NULL == handle->OCRA_L); - found_null |= (NULL == handle->OCRB_H); - found_null |= (NULL == handle->OCRB_L); - - found_null |= (NULL == handle->TCNT_H); - found_null |= (NULL == handle->TCNT_L); - - found_null |= (NULL == handle->ICR_H); - found_null |= (NULL == handle->ICR_L); - - found_null |= (NULL == handle->TIMSK); - found_null |= (NULL == handle->TIFR); - } - if (found_null) - { - return TIMER_ERROR_NULL_HANDLE; - } - return TIMER_ERROR_OK;; -} - static inline timer_error_t check_id(uint8_t id) { if (id >= TIMER_16_BIT_COUNT) @@ -148,40 +111,6 @@ static inline timer_error_t check_id(uint8_t id) return TIMER_ERROR_OK; } -timer_error_t timer_16_bit_set_handle(uint8_t id, timer_16_bit_handle_t * const handle) -{ - timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - if (NULL == handle) - { - return TIMER_ERROR_NULL_POINTER; - } - - memcpy(&internal_config[id].handle, handle, sizeof(timer_16_bit_handle_t)); - return ret; -} - -timer_error_t timer_16_bit_get_handle(uint8_t id, timer_16_bit_handle_t * const handle) -{ - timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - if (NULL == handle) - { - return TIMER_ERROR_NULL_POINTER; - } - - memcpy(handle, &internal_config[id].handle, sizeof(timer_16_bit_handle_t)); - return ret; -} - timer_error_t timer_16_bit_get_default_config(timer_16_bit_config_t * config) { timer_error_t ret = TIMER_ERROR_OK; @@ -214,26 +143,13 @@ timer_error_t timer_16_bit_get_default_config(timer_16_bit_config_t * config) config->input_capture.edge_select = TIMER16BIT_INPUT_CAPTURE_EDGE_FALLING_EDGE; config->input_capture.use_noise_canceler = false; - /* Architecture and device dependent, must be set at configuration time */ - config->handle.OCRA_H = NULL; - config->handle.OCRA_L = NULL; - config->handle.OCRB_H = NULL; - config->handle.OCRB_L = NULL; - config->handle.TCCRA = NULL; - config->handle.TCCRB = NULL; - config->handle.TCCRC = NULL; - config->handle.TCNT_H = NULL; - config->handle.TCNT_L = NULL; - config->handle.ICR_H = NULL; - config->handle.ICR_L = NULL; - config->handle.TIFR = NULL; - config->handle.TIMSK = NULL; return ret; } timer_error_t timer_16_bit_set_force_compare_config(uint8_t id, timer_16_bit_force_compare_config_t * const force_comp_config) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; if (TIMER_ERROR_OK != ret) { @@ -244,31 +160,24 @@ timer_error_t timer_16_bit_set_force_compare_config(uint8_t id, timer_16_bit_for return TIMER_ERROR_NULL_POINTER; } - /* Not fully configured handle, do not attempt to write to it until configured !*/ - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* Handles force output compare A flags */ if (true == force_comp_config->force_comp_match_a) { - *(internal_config[id].handle.TCCRC) |= FOCA_MSK ; + *(handle->TCCRC) |= FOCA_MSK ; } else { - *(internal_config[id].handle.TCCRC) &= ~FOCA_MSK ; + *(handle->TCCRC) &= ~FOCA_MSK ; } /* Handles force output compare A flags */ if (true == force_comp_config->force_comp_match_b) { - *(internal_config[id].handle.TCCRC) |= FOCB_MSK ; + *(handle->TCCRC) |= FOCB_MSK ; } else { - *(internal_config[id].handle.TCCRC) &= ~FOCB_MSK ; + *(handle->TCCRC) &= ~FOCB_MSK ; } return ret; } @@ -276,6 +185,8 @@ timer_error_t timer_16_bit_set_force_compare_config(uint8_t id, timer_16_bit_for timer_error_t timer_16_bit_get_force_compare_config(uint8_t id, timer_16_bit_force_compare_config_t * force_comp_config) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -284,15 +195,10 @@ timer_error_t timer_16_bit_get_force_compare_config(uint8_t id, timer_16_bit_for { return TIMER_ERROR_NULL_POINTER; } - /* Not fully configured handle, do not attempt to write to it until configured !*/ - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + /* Handles Force Compare Output A flag */ - if (0U == (*(internal_config[id].handle.TCCRC) & FOCA_MSK)) + if (0U == (*(handle->TCCRC) & FOCA_MSK)) { force_comp_config->force_comp_match_a = false; } @@ -302,7 +208,7 @@ timer_error_t timer_16_bit_get_force_compare_config(uint8_t id, timer_16_bit_for } /* Handles Force Compare Output B flag */ - if (0U == (*(internal_config[id].handle.TCCRC) & FOCB_MSK)) + if (0U == (*(handle->TCCRC) & FOCB_MSK)) { force_comp_config->force_comp_match_b = false; } @@ -316,6 +222,8 @@ timer_error_t timer_16_bit_get_force_compare_config(uint8_t id, timer_16_bit_for timer_error_t timer_16_bit_set_interrupt_config(uint8_t id, timer_16_bit_interrupt_config_t * const it_config) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -326,49 +234,45 @@ timer_error_t timer_16_bit_set_interrupt_config(uint8_t id, timer_16_bit_interru return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + /* Input capture interrupt enable bit */ if (true == it_config->it_input_capture) { - *(internal_config[id].handle.TIMSK) |= ICIE_MSK; + *(handle->TIMSK) |= ICIE_MSK; } else { - *(internal_config[id].handle.TIMSK) &= ~ICIE_MSK; + *(handle->TIMSK) &= ~ICIE_MSK; } /* TIMSK register */ if (true == it_config->it_comp_match_a) { - *(internal_config[id].handle.TIMSK) |= OCIEA_MSK; + *(handle->TIMSK) |= OCIEA_MSK; } else { - *(internal_config[id].handle.TIMSK) &= ~OCIEA_MSK; + *(handle->TIMSK) &= ~OCIEA_MSK; } if (true == it_config->it_comp_match_b) { - *(internal_config[id].handle.TIMSK) |= OCIEB_MSK; + *(handle->TIMSK) |= OCIEB_MSK; } else { - *(internal_config[id].handle.TIMSK) &= ~OCIEB_MSK; + *(handle->TIMSK) &= ~OCIEB_MSK; } /* TOIE interrupt flag is the first bit, no need to bitshift it */ if (true == it_config->it_timer_overflow) { - *(internal_config[id].handle.TIMSK) |= TOIE_MSK; + *(handle->TIMSK) |= TOIE_MSK; } else { - *(internal_config[id].handle.TIMSK) &= ~TOIE_MSK; + *(handle->TIMSK) &= ~TOIE_MSK; } return ret; @@ -378,6 +282,8 @@ timer_error_t timer_16_bit_set_interrupt_config(uint8_t id, timer_16_bit_interru timer_error_t timer_16_bit_get_interrupt_config(uint8_t id, timer_16_bit_interrupt_config_t * it_config) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -388,14 +294,10 @@ timer_error_t timer_16_bit_get_interrupt_config(uint8_t id, timer_16_bit_interru return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + /* Input capture interrupt enable flag */ - if (0U == (*(internal_config[id].handle.TIMSK) & ICIE_MSK)) + if (0U == (*(handle->TIMSK) & ICIE_MSK)) { it_config->it_input_capture = false; } @@ -405,7 +307,7 @@ timer_error_t timer_16_bit_get_interrupt_config(uint8_t id, timer_16_bit_interru } /* Output Compare Match A Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIMSK) & OCIEA_MSK)) + if (0U == (*(handle->TIMSK) & OCIEA_MSK)) { it_config->it_comp_match_a = false; } @@ -415,7 +317,7 @@ timer_error_t timer_16_bit_get_interrupt_config(uint8_t id, timer_16_bit_interru } /* Output Compare Match B Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIMSK) & OCIEB_MSK)) + if (0U == (*(handle->TIMSK) & OCIEB_MSK)) { it_config->it_comp_match_b = false; } @@ -425,7 +327,7 @@ timer_error_t timer_16_bit_get_interrupt_config(uint8_t id, timer_16_bit_interru } /* Timer Overflow Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIMSK) & TOV_MSK)) + if (0U == (*(handle->TIMSK) & TOV_MSK)) { it_config->it_timer_overflow = false; } @@ -440,6 +342,8 @@ timer_error_t timer_16_bit_get_interrupt_config(uint8_t id, timer_16_bit_interru timer_error_t timer_16_bit_get_interrupt_flags(uint8_t id, timer_16_bit_interrupt_config_t * it_flags) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -450,14 +354,10 @@ timer_error_t timer_16_bit_get_interrupt_flags(uint8_t id, timer_16_bit_interrup return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + /* Input capture interrupt flag */ - if (0U == (*(internal_config[id].handle.TIFR) & ICF_MSK)) + if (0U == (*(handle->TIFR) & ICF_MSK)) { it_flags->it_input_capture = false; } @@ -467,7 +367,7 @@ timer_error_t timer_16_bit_get_interrupt_flags(uint8_t id, timer_16_bit_interrup } /* Output Compare Match A Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIFR) & OCIEA_MSK)) + if (0U == (*(handle->TIFR) & OCIEA_MSK)) { it_flags->it_comp_match_a = false; } @@ -477,7 +377,7 @@ timer_error_t timer_16_bit_get_interrupt_flags(uint8_t id, timer_16_bit_interrup } /* Output Compare Match B Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIFR) & OCIEB_MSK)) + if (0U == (*(handle->TIFR) & OCIEB_MSK)) { it_flags->it_comp_match_b = false; } @@ -487,7 +387,7 @@ timer_error_t timer_16_bit_get_interrupt_flags(uint8_t id, timer_16_bit_interrup } /* Timer Overflow Interrupt Flag */ - if (0U == (*(internal_config[id].handle.TIFR) & TOV_MSK)) + if (0U == (*(handle->TIFR) & TOV_MSK)) { it_flags->it_timer_overflow = false; } @@ -499,31 +399,38 @@ timer_error_t timer_16_bit_get_interrupt_flags(uint8_t id, timer_16_bit_interrup return ret; } -#endif +void timer_16_bit_clear_init_states(void) +{ + for (uint8_t i = 0 ; i < TIMER_16_BIT_COUNT ; i++) + { + internal_config[i].is_initialised = false; + } +} +#endif timer_error_t timer_16_bit_set_prescaler(uint8_t id, const timer_16_bit_prescaler_selection_t prescaler) { timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; - ret = check_handle(&internal_config[id].handle); if (TIMER_ERROR_OK != ret) { return ret; } - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~CS_MSK) | prescaler; + + + *(handle->TCCRB) = (*(handle->TCCRB) & ~CS_MSK) | prescaler; return ret; } timer_error_t timer_16_bit_get_prescaler(uint8_t id, timer_16_bit_prescaler_selection_t * prescaler) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -534,37 +441,29 @@ timer_error_t timer_16_bit_get_prescaler(uint8_t id, timer_16_bit_prescaler_sele return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *prescaler = (*(internal_config[id].handle.TCCRB) & CS_MSK); + *prescaler = (*(handle->TCCRB) & CS_MSK); return ret; } timer_error_t timer_16_bit_set_compare_match_A(uint8_t id, const timer_16_bit_compare_output_mode_t compA) { timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; - ret = check_handle(&internal_config[id].handle); if (TIMER_ERROR_OK != ret) { return ret; } - *(internal_config[id].handle.TCCRA) = (*(internal_config[id].handle.TCCRA) & ~COMA_MSK) | (compA << COMA0_BIT); + *(handle->TCCRA) = (*(handle->TCCRA) & ~COMA_MSK) | (compA << COMA0_BIT); return ret; } timer_error_t timer_16_bit_get_compare_match_A(uint8_t id, timer_16_bit_compare_output_mode_t * compA) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -575,37 +474,29 @@ timer_error_t timer_16_bit_get_compare_match_A(uint8_t id, timer_16_bit_compare_ return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *compA = ((*(internal_config[id].handle.TCCRA) & COMA_MSK) >> COMA0_BIT); + *compA = ((*(handle->TCCRA) & COMA_MSK) >> COMA0_BIT); return ret; } timer_error_t timer_16_bit_set_compare_match_B(uint8_t id, timer_16_bit_compare_output_mode_t compB) { timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; - ret = check_handle(&internal_config[id].handle); if (TIMER_ERROR_OK != ret) { return ret; } - *(internal_config[id].handle.TCCRA) = (*(internal_config[id].handle.TCCRA) & ~COMB_MSK) | (compB << COMB0_BIT); + *(handle->TCCRA) = (*(handle->TCCRA) & ~COMB_MSK) | (compB << COMB0_BIT); return ret; } timer_error_t timer_16_bit_get_compare_match_B(uint8_t id, timer_16_bit_compare_output_mode_t * compB) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -616,33 +507,23 @@ timer_error_t timer_16_bit_get_compare_match_B(uint8_t id, timer_16_bit_compare_ return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *compB = ((*(internal_config[id].handle.TCCRA) & COMB_MSK) >> COMB0_BIT); + *compB = ((*(handle->TCCRA) & COMB_MSK) >> COMB0_BIT); return ret; } timer_error_t timer_16_bit_set_waveform_generation(uint8_t id, const timer_16_bit_waveform_generation_t waveform) { timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; - ret = check_handle(&internal_config[id].handle); if (TIMER_ERROR_OK != ret) { return ret; } - *(internal_config[id].handle.TCCRA) = (*(internal_config[id].handle.TCCRA) & ~(WGM0_MSK | WGM1_MSK)) | (waveform & (WGM0_MSK | WGM1_MSK)); + *(handle->TCCRA) = (*(handle->TCCRA) & ~(WGM0_MSK | WGM1_MSK)) | (waveform & (WGM0_MSK | WGM1_MSK)); /* Select bit index 2 and 3 (0x3 -> 0b11) of waveform mode (matches datasheet bit mapping) and store it to bit index 3 of TCCRB with one more bitshift */ - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~(WGM2_MSK | WGM3_MSK)) | ((waveform & 0x0C) << 1U); + *(handle->TCCRB) = (*(handle->TCCRB) & ~(WGM2_MSK | WGM3_MSK)) | ((waveform & 0x0C) << 1U); return ret; } @@ -650,12 +531,8 @@ timer_error_t timer_16_bit_set_waveform_generation(uint8_t id, const timer_16_bi timer_error_t timer_16_bit_set_input_compare_noise_canceler(uint8_t id, const bool enabled) { timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; - ret = check_handle(&internal_config[id].handle); if (TIMER_ERROR_OK != ret) { return ret; @@ -663,11 +540,11 @@ timer_error_t timer_16_bit_set_input_compare_noise_canceler(uint8_t id, const bo if (enabled) { - *(internal_config[id].handle.TCCRB) |= INC_MSK; + *(handle->TCCRB) |= INC_MSK; } else { - *(internal_config[id].handle.TCCRB) &= ~INC_MSK; + *(handle->TCCRB) &= ~INC_MSK; } return ret; @@ -676,6 +553,8 @@ timer_error_t timer_16_bit_set_input_compare_noise_canceler(uint8_t id, const bo timer_error_t timer_16_bit_get_input_compare_noise_canceler(uint8_t id, bool * const enabled) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -686,37 +565,29 @@ timer_error_t timer_16_bit_get_input_compare_noise_canceler(uint8_t id, bool * c return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *enabled = ((*(internal_config[id].handle.TCCRB) & INC_MSK) != 0U); + *enabled = ((*(handle->TCCRB) & INC_MSK) != 0U); return ret; } timer_error_t timer_16_bit_set_input_compare_edge_select(uint8_t id, const timer_16_bit_input_capture_edge_select_flag_t edge) { timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; - ret = check_handle(&internal_config[id].handle); if (TIMER_ERROR_OK != ret) { return ret; } - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~ICES_MSK) | (edge << ICES_BIT); + *(handle->TCCRB) = (*(handle->TCCRB) & ~ICES_MSK) | (edge << ICES_BIT); return ret; } timer_error_t timer_16_bit_get_input_compare_edge_select(uint8_t id, timer_16_bit_input_capture_edge_select_flag_t * const edge) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -727,13 +598,7 @@ timer_error_t timer_16_bit_get_input_compare_edge_select(uint8_t id, timer_16_bi return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - if (0 != (*(internal_config[id].handle.TCCRB) & ICES_MSK)) + if (0 != (*(handle->TCCRB) & ICES_MSK)) { *edge = TIMER16BIT_INPUT_CAPTURE_EDGE_RISING_EDGE; } @@ -747,6 +612,8 @@ timer_error_t timer_16_bit_get_input_compare_edge_select(uint8_t id, timer_16_bi timer_error_t timer_16_bit_get_input_capture_value(uint8_t id, uint16_t * ticks) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -757,14 +624,8 @@ timer_error_t timer_16_bit_get_input_capture_value(uint8_t id, uint16_t * ticks) return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *ticks = *(internal_config[id].handle.TCNT_L); - *ticks |= *(internal_config[id].handle.TCNT_H) << 8U; + *ticks = *(handle->TCNT_L); + *ticks |= *(handle->TCNT_H) << 8U; return ret; } @@ -772,6 +633,8 @@ timer_error_t timer_16_bit_get_input_capture_value(uint8_t id, uint16_t * ticks) timer_error_t timer_16_bit_get_waveform_generation(uint8_t id, timer_16_bit_waveform_generation_t * waveform) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -782,35 +645,25 @@ timer_error_t timer_16_bit_get_waveform_generation(uint8_t id, timer_16_bit_wave return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - *waveform = (timer_16_bit_waveform_generation_t)(0U); - *waveform |= (*(internal_config[id].handle.TCCRA) & (WGM0_MSK | WGM1_MSK)); - *waveform |= (*(internal_config[id].handle.TCCRB) & (WGM2_MSK | WGM3_MSK)) >> 1U; + *waveform |= (*(handle->TCCRA) & (WGM0_MSK | WGM1_MSK)); + *waveform |= (*(handle->TCCRB) & (WGM2_MSK | WGM3_MSK)) >> 1U; return ret; } timer_error_t timer_16_bit_set_counter_value(uint8_t id, const uint16_t * const ticks) { timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; - ret = check_handle(&internal_config[id].handle); if (TIMER_ERROR_OK != ret) { return ret; } /* Write new value to internal timer/counter register */ - *(internal_config[id].handle.TCNT_L) = *ticks & 0xFF; - *(internal_config[id].handle.TCNT_H) = (*ticks & 0xFF00) >> 8U; + *(handle->TCNT_L) = *ticks & 0xFF; + *(handle->TCNT_H) = (*ticks & 0xFF00) >> 8U; return ret; } @@ -818,6 +671,8 @@ timer_error_t timer_16_bit_set_counter_value(uint8_t id, const uint16_t * const timer_error_t timer_16_bit_get_counter_value(uint8_t id, uint16_t * const ticks) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -828,40 +683,32 @@ timer_error_t timer_16_bit_get_counter_value(uint8_t id, uint16_t * const ticks) return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* Transfer data from internal device's timer/count main register */ - *ticks = (*internal_config[id].handle.TCNT_L); - *ticks |= (*internal_config[id].handle.TCNT_H) << 8U; + *ticks = (*handle->TCNT_L); + *ticks |= (*handle->TCNT_H) << 8U; return ret; } timer_error_t timer_16_bit_set_ocra_register_value(uint8_t id, const uint16_t * const ocra) { timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; - ret = check_handle(&internal_config[id].handle); if (TIMER_ERROR_OK != ret) { return ret; } - *(internal_config[id].handle.OCRA_H) = (*ocra & 0xFF00) >> 8U; - *(internal_config[id].handle.OCRA_L) = (*ocra & 0xFF); + *(handle->OCRA_H) = (*ocra & 0xFF00) >> 8U; + *(handle->OCRA_L) = (*ocra & 0xFF); return ret; } timer_error_t timer_16_bit_get_ocra_register_value(uint8_t id, uint16_t * const ocra) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -872,39 +719,31 @@ timer_error_t timer_16_bit_get_ocra_register_value(uint8_t id, uint16_t * const return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *ocra = (*internal_config[id].handle.OCRA_L); - *ocra |= (*internal_config[id].handle.OCRA_H << 8U); + *ocra = (*handle->OCRA_L); + *ocra |= (*handle->OCRA_H << 8U); return ret; } timer_error_t timer_16_bit_set_ocrb_register_value(uint8_t id, const uint16_t * const ocrb) { timer_error_t ret = check_id(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; - ret = check_handle(&internal_config[id].handle); if (TIMER_ERROR_OK != ret) { return ret; } - *internal_config[id].handle.OCRB_H = (*ocrb & 0xFF00) >> 8U; - *internal_config[id].handle.OCRB_L = (*ocrb & 0xFF);; + *handle->OCRB_H = (*ocrb & 0xFF00) >> 8U; + *handle->OCRB_L = (*ocrb & 0xFF);; return ret; } timer_error_t timer_16_bit_get_ocrb_register_value(uint8_t id, uint16_t * const ocrb) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if (TIMER_ERROR_OK != ret) { return ret; @@ -915,21 +754,15 @@ timer_error_t timer_16_bit_get_ocrb_register_value(uint8_t id, uint16_t * const return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - *ocrb = (*internal_config[id].handle.OCRB_L); - *ocrb |= (*internal_config[id].handle.OCRB_H << 8U); + *ocrb = (*handle->OCRB_L); + *ocrb |= (*handle->OCRB_H << 8U); return ret; } static timer_error_t timer_16_bit_write_config(uint8_t id, timer_16_bit_config_t * const config) { timer_error_t ret = TIMER_ERROR_OK; - timer_16_bit_handle_t * handle = &internal_config[id].handle; + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; internal_config[id].prescaler = config->timing_config.prescaler; @@ -941,7 +774,7 @@ static timer_error_t timer_16_bit_write_config(uint8_t id, timer_16_bit_config_t *(handle->TCNT_L) = (config->timing_config.counter & 0xFF); /* Clear TCCRA register first, otherwise we can't reconfigure the OCRA/OCRB regs!*/ - *(handle->TCCRA) = 0; + *(handle->TCCRA) = 0; /* TCCRA register */ *(handle->OCRA_H) = (config->timing_config.ocra_val & 0xFF00) >> 8U; @@ -1046,12 +879,6 @@ timer_error_t timer_16_bit_deinit(uint8_t id) return ret; } - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - /* Retrieve a config object to write back default configuration into timer registers */ timer_16_bit_config_t config; ret = timer_16_bit_stop(id); @@ -1083,28 +910,16 @@ timer_error_t timer_16_bit_reconfigure(uint8_t id, timer_16_bit_config_t * const return TIMER_ERROR_NULL_POINTER; } - ret = check_handle(&config->handle); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - - ret = timer_16_bit_set_handle(id, &config->handle); - if (TIMER_ERROR_OK != ret) + /* Stop the timer before reconfiguring it */ + if (true == internal_config[id].is_initialised) { - return ret; + ret = timer_16_bit_stop(id); + if (TIMER_ERROR_OK != ret) + { + return ret; + } } - /* Stop the timer before reconfiguring it */ - if (true == internal_config[id].is_initialised) - { - ret = timer_16_bit_stop(id); - if (TIMER_ERROR_OK != ret) - { - return ret; - } - } - ret = timer_16_bit_write_config(id,config); if (TIMER_ERROR_OK == ret) { @@ -1118,13 +933,9 @@ timer_error_t timer_16_bit_reconfigure(uint8_t id, timer_16_bit_config_t * const timer_error_t timer_16_bit_start(uint8_t id) { timer_error_t ret = check_id(id); - if(TIMER_ERROR_OK != ret) - { - return ret; - } + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; - ret = check_handle(&internal_config[id].handle); - if (TIMER_ERROR_OK != ret) + if(TIMER_ERROR_OK != ret) { return ret; } @@ -1135,13 +946,15 @@ timer_error_t timer_16_bit_start(uint8_t id) } /* This time, set the prescaler to start the timer, unless prescaler is set to NO_CLOCK source */ - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~CS_MSK) | internal_config[id].prescaler; + *(handle->TCCRB) = (*(handle->TCCRB) & ~CS_MSK) | internal_config[id].prescaler; return ret; } timer_error_t timer_16_bit_stop(uint8_t id) { timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + if(TIMER_ERROR_OK != ret) { return ret; @@ -1153,7 +966,7 @@ timer_error_t timer_16_bit_stop(uint8_t id) } /* Reset prescaler to NO_CLOCK*/ - *(internal_config[id].handle.TCCRB) = (*(internal_config[id].handle.TCCRB) & ~CS_MSK) | TIMER16BIT_CLK_NO_CLOCK; + *(handle->TCCRB) = (*(handle->TCCRB) & ~CS_MSK) | TIMER16BIT_CLK_NO_CLOCK; return ret; } diff --git a/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c b/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c index 320970d..f2f5de3 100644 --- a/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c +++ b/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -141,20 +141,6 @@ timer_error_t timer_16_bit_get_default_config(timer_16_bit_config_t * config) config->input_capture.edge_select = TIMER16BIT_INPUT_CAPTURE_EDGE_FALLING_EDGE; config->input_capture.use_noise_canceler = false; - /* Architecture and device dependent, must be set at configuration time */ - config->handle.OCRA_H = NULL; - config->handle.OCRA_L = NULL; - config->handle.OCRB_H = NULL; - config->handle.OCRB_L = NULL; - config->handle.TCCRA = NULL; - config->handle.TCCRB = NULL; - config->handle.TCCRC = NULL; - config->handle.TCNT_H = NULL; - config->handle.TCNT_L = NULL; - config->handle.ICR_H = NULL; - config->handle.ICR_L = NULL; - config->handle.TIFR = NULL; - config->handle.TIMSK = NULL; return ret; } From 7f2b8addd798609ad379897249ad6380a4036a61 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 23 Mar 2022 10:37:24 +0100 Subject: [PATCH 22/51] Updated timer generic to latest changes Signed-off-by: bebenlebricolo --- .../Timers/Timer_generic/Tests/CMakeLists.txt | 1 + Drivers/Timers/Timer_generic/Tests/config.h | 39 +++++++++++++++++++ .../Tests/timer_generic_tests.cpp | 10 ++--- .../Timers/Timer_generic/inc/timer_generic.h | 1 - Modules/Timebase/Tests/Stubs/config.c | 18 +++++++++ 5 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 Drivers/Timers/Timer_generic/Tests/config.h diff --git a/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt b/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt index 436e986..056b137 100644 --- a/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt +++ b/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt @@ -25,6 +25,7 @@ target_include_directories(timer_generic_driver_tests PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../Timer_8_bit/inc ${CMAKE_CURRENT_SOURCE_DIR}/../../Timer_8_bit_async/inc ${CMAKE_CURRENT_SOURCE_DIR}/../../Timer_16_bit/inc + ${CMAKE_CURRENT_SOURCE_DIR} ) target_include_directories(timer_generic_driver_tests SYSTEM PUBLIC diff --git a/Drivers/Timers/Timer_generic/Tests/config.h b/Drivers/Timers/Timer_generic/Tests/config.h new file mode 100644 index 0000000..e76babc --- /dev/null +++ b/Drivers/Timers/Timer_generic/Tests/config.h @@ -0,0 +1,39 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_HEADER +#define CONFIG_HEADER + +/* Tells timer 8 bit driver to allocate space for 1 timer 8 bit */ +#define TIMER_8_BIT_COUNT 1 +#define TIMER_8_BIT_ASYNC_COUNT 1 +#define TIMER_16_BIT_COUNT 1 + +#endif /* CONFIG_HEADER */ \ No newline at end of file diff --git a/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp b/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp index 0a9a9e1..1bede56 100644 --- a/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp +++ b/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -57,28 +57,28 @@ TEST(timer_generic_driver_tests, test_compute_parameters) timer_generic_compute_parameters(¶meters); ASSERT_EQ(parameters.output.prescaler, 1U); - ASSERT_EQ(parameters.output.ocra, 15U); + ASSERT_EQ(parameters.output.ocr, 15U); ASSERT_EQ(parameters.output.accumulator, 0U); parameters.input.cpu_frequency = 16'000'000U; parameters.input.target_frequency = 1'000U; timer_generic_compute_parameters(¶meters); ASSERT_EQ(parameters.output.prescaler, 64U); - ASSERT_EQ(parameters.output.ocra, 249U); + ASSERT_EQ(parameters.output.ocr, 249U); ASSERT_EQ(parameters.output.accumulator, 0U); parameters.input.cpu_frequency = 16'000'000U; parameters.input.target_frequency = 1U; timer_generic_compute_parameters(¶meters); ASSERT_EQ(parameters.output.prescaler, 1024U); - ASSERT_EQ(parameters.output.ocra, 124U); + ASSERT_EQ(parameters.output.ocr, 124U); ASSERT_EQ(parameters.output.accumulator, 124U); parameters.input.cpu_frequency = 24'000'000U; parameters.input.target_frequency = 1U; timer_generic_compute_parameters(¶meters); ASSERT_EQ(parameters.output.prescaler, 1024U); - ASSERT_EQ(parameters.output.ocra, 22U); + ASSERT_EQ(parameters.output.ocr, 22U); ASSERT_EQ(parameters.output.accumulator, 1018U); } diff --git a/Drivers/Timers/Timer_generic/inc/timer_generic.h b/Drivers/Timers/Timer_generic/inc/timer_generic.h index 0603222..1a27c36 100644 --- a/Drivers/Timers/Timer_generic/inc/timer_generic.h +++ b/Drivers/Timers/Timer_generic/inc/timer_generic.h @@ -52,7 +52,6 @@ typedef enum TIMER_ERROR_OK, /**< Everything went well so far */ TIMER_ERROR_CONFIG, /**< Given configuration is not well-formed */ TIMER_ERROR_NULL_POINTER, /**< One or more parameters were set to NULL */ - TIMER_ERROR_NULL_HANDLE, /**< Timer handle still points to NULL */ TIMER_ERROR_UNKNOWN_TIMER, /**< Given timer id exceeds the range of registered timers */ TIMER_ERROR_NOT_INITIALISED, /**< Given configuration is not well-formed */ TIMER_ERROR_REGISTER_IS_BUSY, /**< Selected register cannot be written/read : register is busy */ diff --git a/Modules/Timebase/Tests/Stubs/config.c b/Modules/Timebase/Tests/Stubs/config.c index e121f33..9a28121 100644 --- a/Modules/Timebase/Tests/Stubs/config.c +++ b/Modules/Timebase/Tests/Stubs/config.c @@ -1,6 +1,9 @@ #include "config.h" #include "timebase.h" #include "timer_generic.h" +#include "timer_8_bit.h" +#include "timer_8_bit_async.h" +#include "timer_16_bit.h" timebase_config_t timebase_static_config[TIMEBASE_MAX_MODULES] = { @@ -11,3 +14,18 @@ timebase_config_t timebase_static_config[TIMEBASE_MAX_MODULES] = .timer = {.index = 0, .type = TIMER_ARCH_8_BIT_ASYNC} } }; + +timer_8_bit_handle_t timer_8_bit_static_handle[TIMER_8_BIT_COUNT] = +{ + {0} +}; + +timer_8_bit_async_handle_t timer_8_bit_async_static_handle[TIMER_8_BIT_ASYNC_COUNT] = +{ + {0} +}; + +timer_16_bit_handle_t timer_16_bit_static_handle[TIMER_16_BIT_COUNT] = +{ + {0} +}; \ No newline at end of file From f8fdbd8aa55a9df019e6173941ccee5fea01b555 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Fri, 25 Mar 2022 09:12:46 +0100 Subject: [PATCH 23/51] Updated parts of PWM driver Signed-off-by: bebenlebricolo --- ExampleApp/inc/config.h | 2 + Modules/Pwm/CMakeLists.txt | 1 + Modules/Pwm/src/pwm.c | 102 +++++++++++++++++--------------- Modules/Timebase/src/timebase.c | 19 ++---- 4 files changed, 61 insertions(+), 63 deletions(-) diff --git a/ExampleApp/inc/config.h b/ExampleApp/inc/config.h index 64b5a7e..1b99dee 100644 --- a/ExampleApp/inc/config.h +++ b/ExampleApp/inc/config.h @@ -38,6 +38,8 @@ along with this program. If not, see . #define TIMEBASE_MAX_MODULES 3U #define I2C_DEVICES_COUNT 1U +#define PWM_MAX_SOFT_INSTANCES 2U +#define PWM_MAX_HARD_INSTANCES 2U // Only implement master tx driver #define I2C_IMPLEM_MASTER_TX diff --git a/Modules/Pwm/CMakeLists.txt b/Modules/Pwm/CMakeLists.txt index 2218a91..13a240d 100644 --- a/Modules/Pwm/CMakeLists.txt +++ b/Modules/Pwm/CMakeLists.txt @@ -22,6 +22,7 @@ add_library(pwm_driver STATIC target_include_directories(pwm_driver PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/inc ${AVR_INCLUDES} + ${CONFIG_FILE_DIR} ) target_link_libraries(pwm_driver diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 0aab5a6..8654d9d 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -62,24 +62,30 @@ static pwm_error_t check_initialisation(const uint8_t index) pwm_error_t err = PWM_ERR_OK; bool timer_initialised = false; pwm_hard_static_config_t * config = &pwm_config[index].config.hard; - switch(config->targeted_timer) + timer_error_t timerr = TIMER_ERROR_OK; + switch(config->arch) { - case TIMEBASE_TIMER_8_BIT: - err = timer_8_bit_is_initialised(config->timer_index, &timer_initialised); + case TIMER_ARCH_8_BIT: + timerr = timer_8_bit_is_initialised(config->timer_index, &timer_initialised); break; - case TIMEBASE_TIMER_8_BIT_ASYNC: - err = timer_8_bit_async_is_initialised(config->timer_index, &timer_initialised); + case TIMER_ARCH_8_BIT_ASYNC: + timerr = timer_8_bit_async_is_initialised(config->timer_index, &timer_initialised); break; - case TIMEBASE_TIMER_16_BIT: - err = timer_16_bit_is_initialised(config->timer_index, &timer_initialised); + case TIMER_ARCH_16_BIT: + timerr = timer_16_bit_is_initialised(config->timer_index, &timer_initialised); break; default: err = PWM_ERR_CONFIG; break; } + // Handle the valid timer arch cases when api failed + if ((PWM_ERR_OK == err) && (TIMER_ERROR_OK != timerr)) + { + err = PWM_ERR_CONFIG; + } // Reject requests if timer drivers are not initialised beforehand if(false == timer_initialised) @@ -101,18 +107,18 @@ static pwm_error_t pwm_init_single_hard(const uint8_t index) ret = check_initialisation(index); if(PWM_ERR_OK == ret) { - switch(config->targeted_timer) + switch(config->arch) { - case TIMEBASE_TIMER_8_BIT: + case TIMER_ARCH_8_BIT: timerr = timer_8_bit_stop(config->timer_index); break; // TODO report implementation to 8 bit async and 16 bit - case TIMEBASE_TIMER_8_BIT_ASYNC: + case TIMER_ARCH_8_BIT_ASYNC: timerr = timer_8_bit_async_stop(config->timer_index); break; - case TIMEBASE_TIMER_16_BIT: + case TIMER_ARCH_16_BIT: timerr = timer_16_bit_stop(config->timer_index); break; @@ -133,35 +139,31 @@ static pwm_error_t pwm_init_single_hard(const uint8_t index) return ret; } -static inline pwm_error_t pwm_init_single_soft(const uint8_t index) -{ - // Pull the targeted pin up or down dependending on the required initial state - io_write(pwm_config[index].config.soft.io_index, pwm_config[index].config.soft.initial_state); - return PWM_ERR_OK; -} - pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq) { pwm_error_t ret = PWM_ERR_OK; if (PWM_TYPE_HARDWARE == pwm_config[index].type) { timebase_config_t config; - timebase_error_t timerr = TIMEBASE_ERROR_OK; - uint16_t prescaler_val = 0; - uint16_t ocr_value = 0; + timer_error_t timerr = TIMER_ERROR_OK; uint16_t accumulator = 0; config.cpu_freq = *cpu_freq; - config.custom_target_freq = *frequency; + config.custom_target_freq = properties->frequency; config.timescale = TIMEBASE_TIMESCALE_CUSTOM; // At this point the accumulator should be 0, otherwise it means the generated PWM is not slow enough // and this driver does not support it for now - timerr = timebase_compute_timer_parameters(&config, &prescaler_val, &ocr_value, &accumulator); - switch(pwm_config[index].config.hard.targeted_timer) + switch(pwm_config[index].config.hard.arch) { - case TIMEBASE_TIMER_8_BIT: - timerr = timer_8_bit_set_prescaler(index, prescaler_val); + case TIMER_ARCH_8_BIT: + { + timer_8_bit_prescaler_selection_t prescaler; + uint8_t ocr_value = 0; + timer_8_bit_waveform_generation_t waveform = TIMER8BIT_WG_NORMAL; + timer_8_bit_compute_matching_parameters(cpu_freq, &properties->frequency, &prescaler, &ocr_value, &accumulator); + timerr = timer_8_bit_set_prescaler(index, prescaler); + timerr = timer_8_bit_get_waveform_generation(pwm_config[index].config.hard.timer_index, &waveform); if ( PWM_HARD_TIMER_UNIT_A == pwm_config[index].config.hard.unit) { timerr = timer_8_bit_set_ocra_register_value(index, ocr_value); @@ -170,31 +172,32 @@ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const pro { timerr = timer_8_bit_set_ocrb_register_value(index, ocr_value); } - break; - - case TIMEBASE_TIMER_8_BIT_ASYNC: - timerr = timer_8_bit_set_prescaler(index, prescaler_val); - if ( PWM_HARD_TIMER_UNIT_A == pwm_config[index].config.hard.unit) - { - timerr = timer_8_bit_async_set_ocra_register_value(index, ocr_value); - } - else - { - timerr = timer_8_bit_async_set_ocrb_register_value(index, ocr_value); } break; - case TIMEBASE_TIMER_16_BIT: - timerr = timer_16_bit_set_prescaler(index, prescaler_val); - if ( PWM_HARD_TIMER_UNIT_A == pwm_config[index].config.hard.unit) - { - timerr = timer_16_bit_set_ocra_register_value(index, ocr_value); - } - else - { - timerr = timer_16_bit_set_ocrb_register_value(index, ocr_value); - } - break; + case TIMER_ARCH_8_BIT_ASYNC: + // timerr = timer_8_bit_set_prescaler(index, prescaler_val); + // if ( PWM_HARD_TIMER_UNIT_A == pwm_config[index].config.hard.unit) + // { + // timerr = timer_8_bit_async_set_ocra_register_value(index, ocr_value); + // } + // else + // { + // timerr = timer_8_bit_async_set_ocrb_register_value(index, ocr_value); + // } + // break; + + case TIMER_ARCH_16_BIT: + // timerr = timer_16_bit_set_prescaler(index, prescaler_val); + // if ( PWM_HARD_TIMER_UNIT_A == pwm_config[index].config.hard.unit) + // { + // timerr = timer_16_bit_set_ocra_register_value(index, ocr_value); + // } + // else + // { + // timerr = timer_16_bit_set_ocrb_register_value(index, ocr_value); + // } + // break; default: ret = PWM_ERR_CONFIG; @@ -204,7 +207,8 @@ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const pro } else { - soft_config[index].frequency = *frequency; + soft_config[index].frequency = properties->frequency; + soft_config[index].duty_cycle = properties->duty_cycle; } return ret; diff --git a/Modules/Timebase/src/timebase.c b/Modules/Timebase/src/timebase.c index 60848de..5442888 100644 --- a/Modules/Timebase/src/timebase.c +++ b/Modules/Timebase/src/timebase.c @@ -71,6 +71,8 @@ static inline timebase_error_t setup_8_bit_timer(const uint8_t timebase_id, uint { bool initialised = false; timer_error_t err = timer_8_bit_is_initialised(timebase_internal_config[timebase_id].timer_id, &initialised); + uint8_t timer_id = timebase_internal_config[timebase_id].timer_id; + if (TIMER_ERROR_OK != err) { return TIMEBASE_ERROR_TIMER_ERROR; @@ -90,7 +92,7 @@ static inline timebase_error_t setup_8_bit_timer(const uint8_t timebase_id, uint &ocra, &timebase_internal_config[timebase_id].accumulator.programmed); - timer_error_t ret = timer_8_bit_stop(timebase_internal_config[timebase_id].timer_id); + timer_error_t ret = timer_8_bit_stop(timer_id); timer_8_bit_config_t config = {0}; ret = timer_8_bit_get_default_config(&config); @@ -119,6 +121,7 @@ static inline timebase_error_t setup_8_bit_async_timer(const uint8_t timebase_id { bool initialised = false; timer_error_t err = timer_8_bit_async_is_initialised(timebase_internal_config[timebase_id].timer_id, &initialised); + uint8_t timer_id = timebase_internal_config[timebase_id].timer_id; if (TIMER_ERROR_OK != err) { return TIMEBASE_ERROR_TIMER_ERROR; @@ -138,15 +141,7 @@ static inline timebase_error_t setup_8_bit_async_timer(const uint8_t timebase_id &ocra, &timebase_internal_config[timebase_id].accumulator.programmed); - timer_error_t ret = timer_8_bit_async_stop(timebase_internal_config[timebase_id].timer_id); - timer_8_bit_async_handle_t handle = {0}; - ret = timer_8_bit_async_get_handle(timebase_internal_config[timebase_id].timer_id, &handle); - - if (TIMER_ERROR_OK != ret) - { - return TIMEBASE_ERROR_TIMER_ERROR; - } - + timer_error_t ret = timer_8_bit_async_stop(timer_id); timer_8_bit_async_config_t config = {0}; ret = timer_8_bit_async_get_default_config(&config); if (TIMER_ERROR_OK != ret) @@ -155,7 +150,6 @@ static inline timebase_error_t setup_8_bit_async_timer(const uint8_t timebase_id } // Use old handle - config.handle = handle; config.timing_config.comp_match_a = TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX; config.timing_config.comp_match_b = TIMER8BIT_ASYNC_CMOD_NORMAL; config.timing_config.ocra_val = ocra; @@ -195,8 +189,6 @@ static inline timebase_error_t setup_16_bit_timer(const uint8_t timebase_id, uin &timebase_internal_config[timebase_id].accumulator.programmed); timer_error_t ret = timer_16_bit_stop(timebase_internal_config[timebase_id].timer_id); - timer_16_bit_handle_t handle = {0}; - ret = timer_16_bit_get_handle(timebase_internal_config[timebase_id].timer_id, &handle); if (TIMER_ERROR_OK != ret) { @@ -211,7 +203,6 @@ static inline timebase_error_t setup_16_bit_timer(const uint8_t timebase_id, uin } // Use old handle - config.handle = handle; config.timing_config.comp_match_a = TIMER16BIT_CMOD_CLEAR_OCnX; config.timing_config.comp_match_b = TIMER16BIT_CMOD_NORMAL; config.timing_config.ocra_val = ocra; From c275aa239ad69812caa7942c7732048c319742a0 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Fri, 25 Mar 2022 11:04:53 +0100 Subject: [PATCH 24/51] Added proto support for timer 8 bit configuration in PWM config single Signed-off-by: bebenlebricolo --- Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h | 12 + Drivers/Timers/Timer_8_bit/src/timer_8_bit.c | 18 ++ .../Tests/timer_generic_tests.cpp | 41 +++ .../Timers/Timer_generic/inc/timer_generic.h | 11 + .../Timers/Timer_generic/src/timer_generic.c | 47 ++-- ExampleApp/src/config.c | 18 +- ExampleApp/src/driver_setup.c | 24 -- Modules/Pwm/src/pwm.c | 247 ++++++++++++++---- 8 files changed, 316 insertions(+), 102 deletions(-) diff --git a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h index c9d5f5d..7b45ed4 100644 --- a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h +++ b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h @@ -411,6 +411,18 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, uint8_t * const ocr, uint16_t * const accumulator); +/** + * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, + * using CPU main clock frequency as the time constraint. + * + * @param[in] cpu_freq : current CPU main clock frequency + * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) + * @param[out] prescaler : output prescaler parameter + */ +void timer_8_bit_compute_closest_prescaler(const uint32_t * const cpu_freq, + const uint32_t * const target_freq, + timer_8_bit_prescaler_selection_t * const prescaler); + #define TIMER_8_BIT_MAX_PRESCALER_COUNT 5U /** diff --git a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c index f0e2c8e..61d367c 100644 --- a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c +++ b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c @@ -109,6 +109,24 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, *accumulator = parameters.output.accumulator; } +void timer_8_bit_compute_closest_prescaler(const uint32_t * const cpu_freq, + const uint32_t * const target_freq, + timer_8_bit_prescaler_selection_t * const prescaler) +{ + timer_generic_parameters_t parameters = + { + .input = + { + .cpu_frequency = *cpu_freq, + .target_frequency = *target_freq, + .resolution = TIMER_GENERIC_RESOLUTION_8_BIT, + .prescaler_lookup_array.array = timer_8_bit_prescaler_table, + .prescaler_lookup_array.size = TIMER_8_BIT_MAX_PRESCALER_COUNT, + }, + }; + timer_generic_find_closest_prescaler(¶meters); + *prescaler = parameters.output.prescaler; +} static inline timer_error_t check_id(uint8_t id) { diff --git a/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp b/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp index 1bede56..6f906a7 100644 --- a/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp +++ b/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp @@ -83,6 +83,47 @@ TEST(timer_generic_driver_tests, test_compute_parameters) } +TEST(timer_generic_driver_tests, test_compute_prescaler) +{ + const uint8_t max_size = 7U; + const uint8_t array_size = 5U; + timer_generic_prescaler_pair_t array[max_size] = + { + {1U, 1U}, + {8U, 2U}, + {64U, 3U}, + {256U, 4U}, + {1024U, 5U}, + {0,0}, + {0,0} + }; + timer_generic_parameters_t parameters; + parameters.input.cpu_frequency = 16'000'000U; + parameters.input.target_frequency = 1'000'000U; + parameters.input.resolution = TIMER_GENERIC_RESOLUTION_8_BIT; + parameters.input.prescaler_lookup_array.array = array; + parameters.input.prescaler_lookup_array.size = array_size; + + timer_generic_find_closest_prescaler(¶meters); + ASSERT_EQ(parameters.output.prescaler, 1U); + + parameters.input.cpu_frequency = 16'000'000U; + parameters.input.target_frequency = 1'000U; + timer_generic_find_closest_prescaler(¶meters); + ASSERT_EQ(parameters.output.prescaler, 64U); + + parameters.input.cpu_frequency = 16'000'000U; + parameters.input.target_frequency = 1U; + timer_generic_find_closest_prescaler(¶meters); + ASSERT_EQ(parameters.output.prescaler, 1024U); + + parameters.input.cpu_frequency = 24'000'000U; + parameters.input.target_frequency = 1U; + timer_generic_find_closest_prescaler(¶meters); + ASSERT_EQ(parameters.output.prescaler, 1024U); + +} + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); diff --git a/Drivers/Timers/Timer_generic/inc/timer_generic.h b/Drivers/Timers/Timer_generic/inc/timer_generic.h index 1a27c36..f7bc001 100644 --- a/Drivers/Timers/Timer_generic/inc/timer_generic.h +++ b/Drivers/Timers/Timer_generic/inc/timer_generic.h @@ -106,8 +106,19 @@ typedef struct } output; } timer_generic_parameters_t; +/** + * @brief Finds the timer parameters in order to get the closest frequency out of the a given Timer + * @param parameters : takes the .input field and computes closest values for prescaler, ocr and accumulator values + */ void timer_generic_compute_parameters(timer_generic_parameters_t * const parameters); +/** + * @brief finds the closest prescaler value that allows the selected timer to achieve the requested frequency. + * Note that its implementation is independent of hardware timer limitations and only results from calculations on frequencies. + * @param parameters : input parameters, also serves as output parameter block + */ +void timer_generic_find_closest_prescaler(timer_generic_parameters_t * const parameters); + #ifdef __cplusplus } #endif diff --git a/Drivers/Timers/Timer_generic/src/timer_generic.c b/Drivers/Timers/Timer_generic/src/timer_generic.c index 6c16a75..d1780ac 100644 --- a/Drivers/Timers/Timer_generic/src/timer_generic.c +++ b/Drivers/Timers/Timer_generic/src/timer_generic.c @@ -35,30 +35,15 @@ void timer_generic_compute_parameters(timer_generic_parameters_t * const paramet const uint32_t freq_ratio = parameters->input.cpu_frequency / parameters->input.target_frequency; const uint16_t limit_value = (parameters->input.resolution == TIMER_GENERIC_RESOLUTION_8_BIT) ? (TIMER_GENERIC_8_BIT_LIMIT_VALUE - 1) : (TIMER_GENERIC_16_BIT_LIMIT_VALUE - 1); - // It is possible that this operation produces aliasing because we do not check if - // the remainder of this division is exactly 0 (no remainder, clean euclidean division) - const uint32_t min_prescaler = freq_ratio / (uint32_t) limit_value; - - parameters->output.prescaler = 1U; - uint16_t target_prescaler = 1U; - - for (uint8_t i = 0 ; i < parameters->input.prescaler_lookup_array.size ; i++) - { - parameters->output.prescaler = parameters->input.prescaler_lookup_array.array[i].value; - target_prescaler = parameters->input.prescaler_lookup_array.array[i].value; - if (parameters->input.prescaler_lookup_array.array[i].value >= min_prescaler) - { - break; - } - } + timer_generic_find_closest_prescaler(parameters); uint32_t computed_ocra = 0; parameters->output.accumulator = 0; - if (0 != target_prescaler) + if (0 != parameters->output.prescaler) { // It is possible that this operation produces aliasing because we do not check if // the remainder of this division is exactly 0 (no remainder, clean euclidean division) - computed_ocra = freq_ratio / (uint32_t) target_prescaler; + computed_ocra = freq_ratio / (uint32_t) parameters->output.prescaler; } // Happens when timescale is really large compared to CPU frequency @@ -67,7 +52,6 @@ void timer_generic_compute_parameters(timer_generic_parameters_t * const paramet { // Select a remainder arbitrarily high to start the algorithm uint16_t min_remainder = 50U; - parameters->output.prescaler = target_prescaler; // linear search, starting from the end of the resolution range // This will select the greatest value of OCRA while trying to minize the remainder. @@ -108,3 +92,28 @@ void timer_generic_compute_parameters(timer_generic_parameters_t * const paramet parameters->output.ocr = computed_ocra; } } + + +void timer_generic_find_closest_prescaler(timer_generic_parameters_t * const parameters) +{ + const uint32_t freq_ratio = parameters->input.cpu_frequency / parameters->input.target_frequency; + const uint16_t limit_value = (parameters->input.resolution == TIMER_GENERIC_RESOLUTION_8_BIT) ? (TIMER_GENERIC_8_BIT_LIMIT_VALUE - 1) : (TIMER_GENERIC_16_BIT_LIMIT_VALUE - 1); + + // It is possible that this operation produces aliasing because we do not check if + // the remainder of this division is exactly 0 (no remainder, clean euclidean division) + const uint32_t min_prescaler = freq_ratio / (uint32_t) limit_value; + + parameters->output.prescaler = 1U; + uint16_t target_prescaler = 1U; + + for (uint8_t i = 0 ; i < parameters->input.prescaler_lookup_array.size ; i++) + { + parameters->output.prescaler = parameters->input.prescaler_lookup_array.array[i].value; + target_prescaler = parameters->input.prescaler_lookup_array.array[i].value; + if (parameters->input.prescaler_lookup_array.array[i].value >= min_prescaler) + { + break; + } + } + parameters->output.prescaler = target_prescaler; +} diff --git a/ExampleApp/src/config.c b/ExampleApp/src/config.c index 3dc3019..9f2afdf 100644 --- a/ExampleApp/src/config.c +++ b/ExampleApp/src/config.c @@ -24,13 +24,15 @@ timebase_config_t timebase_static_config[TIMEBASE_MAX_MODULES] = } }; -timer_8_bit_handle_t timer_8_bit_static_handle = +timer_8_bit_handle_t timer_8_bit_static_handle[TIMER_8_BIT_COUNT] = { - .OCRA = &OCR0A, - .OCRB = &OCR0B, - .TCCRA = &TCCR0A, - .TCCRB = &TCCR0B, - .TCNT = &TCNT0, - .TIFR = &TIFR0, - .TIMSK = &TIMSK0 + { + .OCRA = &OCR0A, + .OCRB = &OCR0B, + .TCCRA = &TCCR0A, + .TCCRB = &TCCR0B, + .TCNT = &TCNT0, + .TIFR = &TIFR0, + .TIMSK = &TIMSK0 + } }; \ No newline at end of file diff --git a/ExampleApp/src/driver_setup.c b/ExampleApp/src/driver_setup.c index 923e00f..56cf0de 100644 --- a/ExampleApp/src/driver_setup.c +++ b/ExampleApp/src/driver_setup.c @@ -114,20 +114,6 @@ driver_setup_error_t driver_init_timer_1(void) } } - /* Configuring handle */ - config.handle.OCRA_H = &OCR1AH; - config.handle.OCRA_L = &OCR1AL; - config.handle.OCRB_H = &OCR1BH; - config.handle.OCRB_L = &OCR1BL; - config.handle.TCCRA = &TCCR1A; - config.handle.TCCRB = &TCCR1B; - config.handle.TCCRC = &TCCR1C; - config.handle.TCNT_H = &TCNT1H; - config.handle.TCNT_L = &TCNT1L; - config.handle.TIFR = &TIFR1; - config.handle.TIMSK = &TIMSK1; - config.handle.ICR_H = &ICR1H; - config.handle.ICR_L = &ICR1L; /* Enable OC0A and OC0B as outputs */ /* PD6 = OC0A on arduino nano */ @@ -175,16 +161,6 @@ driver_setup_error_t driver_init_timer_2(void) } } - /* Configuring handle */ - config.handle.OCRA = &OCR2A; - config.handle.OCRB = &OCR2B; - config.handle.TCCRA = &TCCR2A; - config.handle.TCCRB = &TCCR2B; - config.handle.TCNT = &TCNT2; - config.handle.TIFR = &TIFR2; - config.handle.TIMSK = &TIMSK2; - config.handle.ASSR_REG = &ASSR; - /* Enable OC0A and OC0B as outputs */ OC2A_DDR_REG |= (1 << OC2A_PIN_NUMBER); OC2B_DDR_REG |= (1 << OC2B_PIN_NUMBER); diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 8654d9d..839a99e 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -31,9 +31,41 @@ static struct } soft_config[PWM_MAX_SOFT_INSTANCES] = {0}; -static inline pwm_error_t pwm_init_single_soft(const uint8_t index); static pwm_error_t pwm_init_single_hard(const uint8_t index); +/** + * @brief Configures a single timer 8 bit instance based on common parameters + * @param index : pwm instance index + * @param properties : pwm specifications (aka properties) + * @param cpu_freq : current CPU frequency + * @return pwm_error_t : + * PWM_ERROR_OK : operation succeeded + * PWM_ERROR_CONFIG : encountered issues when configuring underlying timer, probably a global configuration error + */ +static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); + +/** + * @brief Configures a single timer 8 bit asynchronous instance based on common parameters + * @param index : pwm instance index + * @param properties : pwm specifications (aka properties) + * @param cpu_freq : current CPU frequency + * @return pwm_error_t : + * PWM_ERROR_OK : operation succeeded + * PWM_ERROR_CONFIG : encountered issues when configuring underlying timer, probably a global configuration error + */ +static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); + +/** + * @brief Configures a single timer 16 bit instance based on common parameters + * @param index : pwm instance index + * @param properties : pwm specifications (aka properties) + * @param cpu_freq : current CPU frequency + * @return pwm_error_t : + * PWM_ERROR_OK : operation succeeded + * PWM_ERROR_CONFIG : encountered issues when configuring underlying timer, probably a global configuration error + */ +static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); + pwm_error_t pwm_init(void) { pwm_error_t err = PWM_ERR_OK; @@ -42,12 +74,6 @@ pwm_error_t pwm_init(void) err |= pwm_init_single_hard(i); } - // Software PWM has very little work to do (put pins in their default state) - for (uint8_t i = 0 ; i < PWM_MAX_HARD_INSTANCES ; i++) - { - err |= pwm_init_single_soft(i); - } - if (err != PWM_ERR_OK) { err = PWM_ERR_CONFIG; @@ -144,60 +170,23 @@ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const pro pwm_error_t ret = PWM_ERR_OK; if (PWM_TYPE_HARDWARE == pwm_config[index].type) { - timebase_config_t config; - timer_error_t timerr = TIMER_ERROR_OK; - uint16_t accumulator = 0; - - config.cpu_freq = *cpu_freq; - config.custom_target_freq = properties->frequency; - config.timescale = TIMEBASE_TIMESCALE_CUSTOM; + pwm_hard_static_config_t * timer_config = &pwm_config[index].config.hard; // At this point the accumulator should be 0, otherwise it means the generated PWM is not slow enough // and this driver does not support it for now - switch(pwm_config[index].config.hard.arch) + switch(timer_config->arch) { case TIMER_ARCH_8_BIT: - { - timer_8_bit_prescaler_selection_t prescaler; - uint8_t ocr_value = 0; - timer_8_bit_waveform_generation_t waveform = TIMER8BIT_WG_NORMAL; - timer_8_bit_compute_matching_parameters(cpu_freq, &properties->frequency, &prescaler, &ocr_value, &accumulator); - timerr = timer_8_bit_set_prescaler(index, prescaler); - timerr = timer_8_bit_get_waveform_generation(pwm_config[index].config.hard.timer_index, &waveform); - if ( PWM_HARD_TIMER_UNIT_A == pwm_config[index].config.hard.unit) - { - timerr = timer_8_bit_set_ocra_register_value(index, ocr_value); - } - else - { - timerr = timer_8_bit_set_ocrb_register_value(index, ocr_value); - } - } + ret = configure_timer_8_bit_single(index, properties, cpu_freq) ; break; case TIMER_ARCH_8_BIT_ASYNC: - // timerr = timer_8_bit_set_prescaler(index, prescaler_val); - // if ( PWM_HARD_TIMER_UNIT_A == pwm_config[index].config.hard.unit) - // { - // timerr = timer_8_bit_async_set_ocra_register_value(index, ocr_value); - // } - // else - // { - // timerr = timer_8_bit_async_set_ocrb_register_value(index, ocr_value); - // } - // break; + ret = configure_timer_8_bit_async_single(index, properties, cpu_freq) ; + break; case TIMER_ARCH_16_BIT: - // timerr = timer_16_bit_set_prescaler(index, prescaler_val); - // if ( PWM_HARD_TIMER_UNIT_A == pwm_config[index].config.hard.unit) - // { - // timerr = timer_16_bit_set_ocra_register_value(index, ocr_value); - // } - // else - // { - // timerr = timer_16_bit_set_ocrb_register_value(index, ocr_value); - // } - // break; + ret = configure_timer_16_bit_single(index, properties, cpu_freq) ; + break; default: ret = PWM_ERR_CONFIG; @@ -213,3 +202,159 @@ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const pro return ret; } + + +static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq) +{ + timer_error_t timerr = TIMER_ERROR_OK; + pwm_error_t ret = PWM_ERR_OK; + uint8_t ocr_value = 0; + timer_8_bit_prescaler_selection_t prescaler = TIMER8BIT_CLK_NO_CLOCK; + timer_8_bit_waveform_generation_t waveform = TIMER8BIT_WG_NORMAL; + pwm_hard_static_config_t * timer_config = &pwm_config[index].config.hard; + + // Compute closest prescaler first + timer_8_bit_compute_closest_prescaler(cpu_freq, &properties->frequency, &prescaler); + timerr = timer_8_bit_set_prescaler(index, prescaler); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_CONFIG; + } + + timerr = timer_8_bit_get_waveform_generation(timer_config->timer_index, &waveform); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_CONFIG; + } + + // Handles the hardware PWM unit A or B + if ( PWM_HARD_TIMER_UNIT_A == timer_config->unit) + { + // The waveform selection mode tells us about the kind of desired PWM + switch(waveform) + { + // TOP value is set to 255 + case TIMER8BIT_WG_PWM_FAST_FULL_RANGE: + case TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE: + // Select the polarity + if(properties->pol == PWM_POLARITY_NORMAL) + { + // When OCRA is hit, output pin should be cleared (means that output pin is SET high when counter reaches TOP) + timerr = timer_8_bit_set_compare_match_A(timer_config->timer_index, TIMER8BIT_CMOD_CLEAR_OCnX); + } + else + { + // When OCRA is hit, output pin should be set (means that output pin is CLEARED low when counter reaches TOP) + timerr = timer_8_bit_set_compare_match_A(timer_config->timer_index, TIMER8BIT_CMOD_SET_OCnX); + } + break; + + // TOP value is controlled by OCRA value + case TIMER8BIT_WG_PWM_FAST_OCRA_MAX: + case TIMER8BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX: + timerr = timer_8_bit_set_ocra_register_value(index, ocr_value); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_CONFIG; + } + + // Here, the only configuration that will make the pin work as a real PWM output (wihtout glitches) is the TIMER8BIT_CMOD_TOGGLE_OCnX + // So it will effectively divide the output frequency by 2 in both Fast PWM mode and Phase correct PWM mode (which already divides output frequency by 2) + timerr = timer_8_bit_set_compare_match_A(timer_config->timer_index, TIMER8BIT_CMOD_TOGGLE_OCnX); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_CONFIG; + } + break; + + // Misconfigured Timer, could not proceed further + case TIMER8BIT_WG_CTC: + case TIMER8BIT_WG_NORMAL: + default: + return PWM_ERR_CONFIG; + } + + } + else + { + // The waveform selection mode tells us about the kind of desired PWM + switch(waveform) + { + // TOP value is set to 255 + // This configuration is valid for fixed frequency PWM with precise control over duty_cycle + case TIMER8BIT_WG_PWM_FAST_FULL_RANGE: + case TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE: + { + // Compute OCRB duty_cycle value + uint8_t ocrb_value = 0; + // Set timer ocrb value, to control duty_cycle + timerr = timer_8_bit_set_ocrb_register_value(index, ocrb_value); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_CONFIG; + } + + // Select the polarity + if(properties->pol == PWM_POLARITY_NORMAL) + { + // When OCRB is hit, output pin should be cleared (means that output pin is SET high when counter reaches TOP) + timerr = timer_8_bit_set_compare_match_B(timer_config->timer_index, TIMER8BIT_CMOD_CLEAR_OCnX); + } + else + { + // When OCRB is hit, output pin should be set (means that output pin is CLEARED low when counter reaches TOP) + timerr = timer_8_bit_set_compare_match_B(timer_config->timer_index, TIMER8BIT_CMOD_SET_OCnX); + } + break; + } + + // TOP value is controlled by OCRA value + case TIMER8BIT_WG_PWM_FAST_OCRA_MAX: + case TIMER8BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX: + { + + // Compute exact frequency value for OCRA + uint8_t ocra_value = 0; + // Compute exact duty cycle value for OCRB + uint8_t ocrb_value = 0; + + // Set timer ocra value, to control output frequency + timerr = timer_8_bit_set_ocra_register_value(index, ocra_value); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_CONFIG; + } + + // Set timer ocrb value, to control duty_cycle + timerr = timer_8_bit_set_ocrb_register_value(index, ocrb_value); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_CONFIG; + } + break; + } + // Misconfigured Timer, could not proceed further + case TIMER8BIT_WG_CTC: + case TIMER8BIT_WG_NORMAL: + default: + return PWM_ERR_CONFIG; + } + } + return ret; +} + +static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq) +{ + (void) index; + (void) properties; + (void) cpu_freq; + return PWM_ERR_CONFIG; +} + +static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq) +{ + (void) index; + (void) properties; + (void) cpu_freq; + return PWM_ERR_CONFIG; +} From 8265a168087f77b5a08477af4e48f7dab333b55a Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Fri, 25 Mar 2022 16:55:06 +0100 Subject: [PATCH 25/51] Implemented 8 bit configuration with all use cases (not tested yet) Signed-off-by: bebenlebricolo --- Modules/Pwm/inc/pwm.h | 1 + Modules/Pwm/src/pwm.c | 118 ++++++++++++++++++++++++++++-------------- 2 files changed, 80 insertions(+), 39 deletions(-) diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index 80114fa..a76572e 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -242,6 +242,7 @@ pwm_error_t pwm_stop_all(void); * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors + * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly */ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 839a99e..5e98d70 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -40,7 +40,8 @@ static pwm_error_t pwm_init_single_hard(const uint8_t index); * @param cpu_freq : current CPU frequency * @return pwm_error_t : * PWM_ERROR_OK : operation succeeded - * PWM_ERROR_CONFIG : encountered issues when configuring underlying timer, probably a global configuration error + * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly + * PWM_ERR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); @@ -51,7 +52,8 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t * @param cpu_freq : current CPU frequency * @return pwm_error_t : * PWM_ERROR_OK : operation succeeded - * PWM_ERROR_CONFIG : encountered issues when configuring underlying timer, probably a global configuration error + * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly + * PWM_ERR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); @@ -62,7 +64,8 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p * @param cpu_freq : current CPU frequency * @return pwm_error_t : * PWM_ERROR_OK : operation succeeded - * PWM_ERROR_CONFIG : encountered issues when configuring underlying timer, probably a global configuration error + * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly + * PWM_ERR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); @@ -177,15 +180,15 @@ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const pro switch(timer_config->arch) { case TIMER_ARCH_8_BIT: - ret = configure_timer_8_bit_single(index, properties, cpu_freq) ; + ret = configure_timer_8_bit_single(index, properties, cpu_freq); break; case TIMER_ARCH_8_BIT_ASYNC: - ret = configure_timer_8_bit_async_single(index, properties, cpu_freq) ; + ret = configure_timer_8_bit_async_single(index, properties, cpu_freq); break; case TIMER_ARCH_16_BIT: - ret = configure_timer_16_bit_single(index, properties, cpu_freq) ; + ret = configure_timer_16_bit_single(index, properties, cpu_freq); break; default: @@ -208,23 +211,29 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t { timer_error_t timerr = TIMER_ERROR_OK; pwm_error_t ret = PWM_ERR_OK; + uint8_t ocr_value = 0; + uint16_t prescaler_value = 1U; + timer_8_bit_prescaler_selection_t prescaler = TIMER8BIT_CLK_NO_CLOCK; timer_8_bit_waveform_generation_t waveform = TIMER8BIT_WG_NORMAL; pwm_hard_static_config_t * timer_config = &pwm_config[index].config.hard; // Compute closest prescaler first timer_8_bit_compute_closest_prescaler(cpu_freq, &properties->frequency, &prescaler); + prescaler_value = timer_8_bit_prescaler_to_value(prescaler); timerr = timer_8_bit_set_prescaler(index, prescaler); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_CONFIG; + return PWM_ERR_TIMER_ISSUE; } + // We need to probe the waveform generation modes from Timer driver because it drives the way we configure a PWM afterwards + // (Because timer8 bit has some limitations when it comes to having PWMs with full frequency and duty cycle control, a lot depends on the Waveform Generation) timerr = timer_8_bit_get_waveform_generation(timer_config->timer_index, &waveform); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_CONFIG; + return PWM_ERR_TIMER_ISSUE; } // Handles the hardware PWM unit A or B @@ -236,6 +245,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t // TOP value is set to 255 case TIMER8BIT_WG_PWM_FAST_FULL_RANGE: case TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE: + { // Select the polarity if(properties->pol == PWM_POLARITY_NORMAL) { @@ -247,23 +257,43 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t // When OCRA is hit, output pin should be set (means that output pin is CLEARED low when counter reaches TOP) timerr = timer_8_bit_set_compare_match_A(timer_config->timer_index, TIMER8BIT_CMOD_SET_OCnX); } - break; + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + // OCRA value represents the duty_cycle value now + ocr_value = (properties->duty_cycle * (TIMER_GENERIC_8_BIT_LIMIT_VALUE - 1)) / 100U; + timerr = timer_8_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + break; + } // TOP value is controlled by OCRA value case TIMER8BIT_WG_PWM_FAST_OCRA_MAX: case TIMER8BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX: - timerr = timer_8_bit_set_ocra_register_value(index, ocr_value); + // Here, the only configuration that will make the pin work as a real PWM output (wihtout glitches) is the TIMER8BIT_CMOD_TOGGLE_OCnX + // So it will effectively divide the output frequency by 2 in both Fast PWM mode and Phase correct PWM mode (which already divides output frequency by 2) + timerr = timer_8_bit_set_compare_match_A(timer_config->timer_index, TIMER8BIT_CMOD_TOGGLE_OCnX); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_CONFIG; + return PWM_ERR_TIMER_ISSUE; } - // Here, the only configuration that will make the pin work as a real PWM output (wihtout glitches) is the TIMER8BIT_CMOD_TOGGLE_OCnX - // So it will effectively divide the output frequency by 2 in both Fast PWM mode and Phase correct PWM mode (which already divides output frequency by 2) - timerr = timer_8_bit_set_compare_match_A(timer_config->timer_index, TIMER8BIT_CMOD_TOGGLE_OCnX); + ocr_value = (*cpu_freq / (prescaler_value * properties->frequency)) - 1; + // Trying to compensate for the 50% duty cycle and toggling mode which halves the output frequency + if(ocr_value > 2 ) + { + ocr_value /= 2; + } + // TODO : consider using the prescaler as well, for instance if ocra is too small, we might be able to use a higher prescaler + // E.g : ocra can be divided by 8 (say 248 / 8 => 31) and prescaler = 1 then we can use a prescaler of 8 and have ocra at 31, and vice-versa if needed. + timerr = timer_8_bit_set_ocra_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_CONFIG; + return PWM_ERR_TIMER_ISSUE; } break; @@ -275,8 +305,21 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t } } - else + // UNIT B has a different treatment than UNIT A on timer 8 bit and variants + else /* UNIT B */ { + // Select the polarity + if(properties->pol == PWM_POLARITY_NORMAL) + { + // When OCRB is hit, output pin should be cleared (means that output pin is SET high when counter reaches TOP) + timerr = timer_8_bit_set_compare_match_B(timer_config->timer_index, TIMER8BIT_CMOD_CLEAR_OCnX); + } + else + { + // When OCRB is hit, output pin should be set (means that output pin is CLEARED low when counter reaches TOP) + timerr = timer_8_bit_set_compare_match_B(timer_config->timer_index, TIMER8BIT_CMOD_SET_OCnX); + } + // The waveform selection mode tells us about the kind of desired PWM switch(waveform) { @@ -285,26 +328,22 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t case TIMER8BIT_WG_PWM_FAST_FULL_RANGE: case TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE: { - // Compute OCRB duty_cycle value - uint8_t ocrb_value = 0; - // Set timer ocrb value, to control duty_cycle - timerr = timer_8_bit_set_ocrb_register_value(index, ocrb_value); - if (TIMER_ERROR_OK != timerr) + // OCRA value represents the duty_cycle value now + ocr_value = (properties->duty_cycle * (TIMER_GENERIC_8_BIT_LIMIT_VALUE - 1)) / 100U; + timerr = timer_8_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); + if(TIMER_ERROR_OK != timerr) { - return PWM_ERR_CONFIG; + return PWM_ERR_TIMER_ISSUE; } + break; - // Select the polarity - if(properties->pol == PWM_POLARITY_NORMAL) - { - // When OCRB is hit, output pin should be cleared (means that output pin is SET high when counter reaches TOP) - timerr = timer_8_bit_set_compare_match_B(timer_config->timer_index, TIMER8BIT_CMOD_CLEAR_OCnX); - } - else + // Set timer ocrb value, to control duty_cycle + timerr = timer_8_bit_set_ocrb_register_value(index, ocr_value); + if (TIMER_ERROR_OK != timerr) { - // When OCRB is hit, output pin should be set (means that output pin is CLEARED low when counter reaches TOP) - timerr = timer_8_bit_set_compare_match_B(timer_config->timer_index, TIMER8BIT_CMOD_SET_OCnX); + return PWM_ERR_TIMER_ISSUE; } + break; } @@ -314,22 +353,23 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t { // Compute exact frequency value for OCRA - uint8_t ocra_value = 0; - // Compute exact duty cycle value for OCRB - uint8_t ocrb_value = 0; - + // We don't try to modify OCRA value to compensate for 50% output frequency, because in this case + // the output pin is not toggled + ocr_value = (*cpu_freq / (prescaler_value * properties->frequency)) - 1; // Set timer ocra value, to control output frequency - timerr = timer_8_bit_set_ocra_register_value(index, ocra_value); + timerr = timer_8_bit_set_ocra_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_CONFIG; + return PWM_ERR_TIMER_ISSUE; } + // Compute exact duty cycle value for OCRB (reuse the ocr_value variable) + ocr_value = (properties->duty_cycle * ocr_value) / 100U; // Set timer ocrb value, to control duty_cycle - timerr = timer_8_bit_set_ocrb_register_value(index, ocrb_value); + timerr = timer_8_bit_set_ocrb_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_CONFIG; + return PWM_ERR_TIMER_ISSUE; } break; } From de856d008be60f61208660fa1ae9c91dbf690d48 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 30 Mar 2022 11:56:25 +0200 Subject: [PATCH 26/51] Refactored cpu_freq into clock_freq, which is more accurate Signed-off-by: bebenlebricolo --- .../Examples/App/src/module_setup.c | 2 +- .../Timer_16_bit/Tests/timer_16_bit_tests.cpp | 16 +++++------ .../Timers/Timer_16_bit/inc/timer_16_bit.h | 4 +-- .../Timers/Timer_16_bit/src/timer_16_bit.c | 4 +-- .../Timer_8_bit/Tests/timer_8_bit_tests.cpp | 18 ++++++------ Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h | 8 +++--- Drivers/Timers/Timer_8_bit/src/timer_8_bit.c | 8 +++--- .../Tests/timer_8_bit_async_tests.cpp | 18 ++++++------ .../Timer_8_bit_async/inc/timer_8_bit_async.h | 4 +-- .../Timer_8_bit_async/src/timer_8_bit_async.c | 4 +-- .../Tests/timer_generic_tests.cpp | 16 +++++------ .../Timers/Timer_generic/src/timer_generic.c | 8 ++---- ExampleApp/src/config.c | 2 +- Modules/Pwm/examples/config.c | 2 +- Modules/Pwm/inc/pwm.h | 8 +++--- Modules/Pwm/src/pwm.c | 28 +++++++++---------- Modules/Timebase/Tests/Stubs/config.c | 2 +- .../Timebase/Tests/Stubs/timer_16_bit_stub.c | 4 +-- .../Tests/Stubs/timer_8_bit_async_stub.c | 4 +-- .../Timebase/Tests/Stubs/timer_8_bit_stub.c | 4 +-- Modules/Timebase/Tests/timebase_tests.cpp | 8 +++--- Modules/Timebase/inc/timebase.h | 2 +- Modules/Timebase/src/timebase.c | 24 ++++++++-------- 23 files changed, 98 insertions(+), 100 deletions(-) diff --git a/Drivers/Lcd_screen/Examples/App/src/module_setup.c b/Drivers/Lcd_screen/Examples/App/src/module_setup.c index 81a4d1d..ba4b89d 100644 --- a/Drivers/Lcd_screen/Examples/App/src/module_setup.c +++ b/Drivers/Lcd_screen/Examples/App/src/module_setup.c @@ -4,7 +4,7 @@ module_setup_error_t module_init_timebase(void) { timebase_config_t config = {0}; - config.cpu_freq = 16000000; + config.clock_freq = 16000000; config.timer.index = 0; config.timer.type = TIMEBASE_TIMER_8_BIT_ASYNC; config.timescale = TIMEBASE_TIMESCALE_MILLISECONDS; diff --git a/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp b/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp index a1d35dc..95a1b4c 100644 --- a/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp +++ b/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp @@ -577,19 +577,19 @@ TEST_F(Timer16BitFixture, test_initialisation_deinitialisation) TEST(timer_16_bit_driver_tests, test_parameters_computation_prescaler) { - uint32_t cpu_freq = 16'000'000; + uint32_t clock_freq = 16'000'000; uint32_t target_freq = 1'000; uint16_t ocra = 0; uint16_t accumulator = 0; timer_16_bit_prescaler_selection_t prescaler = TIMER16BIT_CLK_PRESCALER_1; - timer_16_bit_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_1); ASSERT_EQ(ocra, 15999U); ASSERT_EQ(accumulator, 0U); target_freq = 12'000'000; - timer_16_bit_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); // This timer could not achieve such a target frequency because even in its fastest configuration, // with a prescaler of 1 and ocra of 0, the timer will tick at 16 MHz. // As output frequency is dependent on ocra, an ocra of 1 divides input cpu frequency by 2, which gives 8 MHz. @@ -599,21 +599,21 @@ TEST(timer_16_bit_driver_tests, test_parameters_computation_prescaler) ASSERT_EQ(accumulator, 0U); target_freq = 8'000'000; - timer_16_bit_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_1); ASSERT_EQ(ocra, 1U); ASSERT_EQ(accumulator, 0U); - cpu_freq = 8'000'000; + clock_freq = 8'000'000; target_freq = 3'000; - timer_16_bit_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_1); ASSERT_EQ(ocra, 2665U); ASSERT_EQ(accumulator, 0U); - cpu_freq = 16'000'000; + clock_freq = 16'000'000; target_freq = 1U; - timer_16_bit_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_256); ASSERT_EQ(ocra, 62499U); ASSERT_EQ(accumulator, 0U); diff --git a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h index ebcca2d..82ecf68 100644 --- a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h +++ b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h @@ -459,13 +459,13 @@ timer_error_t timer_16_bit_stop(uint8_t id); * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, * using CPU main clock frequency as the time constraint. * - * @param[in] cpu_freq : current CPU main clock frequency + * @param[in] clock_freq : current CPU main clock frequency * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) * @param[out] prescaler : output prescaler parameter * @param[out] ocr : output ocr value * @param[out] accumulator : output accumulator value ; used by the timebase module for instance to count events and extend timer's counter capabilities */ -void timer_16_bit_compute_matching_parameters(const uint32_t * const cpu_freq, +void timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_16_bit_prescaler_selection_t * const prescaler, uint16_t * const ocr, diff --git a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c index 4eb9a3b..a0aebf6 100644 --- a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c +++ b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c @@ -79,7 +79,7 @@ uint16_t timer_16_bit_prescaler_to_value(const timer_16_bit_prescaler_selection_ return 0; } -void timer_16_bit_compute_matching_parameters(const uint32_t * const cpu_freq, +void timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_16_bit_prescaler_selection_t * const prescaler, uint16_t * const ocr, @@ -89,7 +89,7 @@ void timer_16_bit_compute_matching_parameters(const uint32_t * const cpu_freq, { .input = { - .cpu_frequency = *cpu_freq, + .clock_freq = *clock_freq, .target_frequency = *target_freq, .resolution = TIMER_GENERIC_RESOLUTION_16_BIT, .prescaler_lookup_array.array = timer_16_bit_prescaler_table, diff --git a/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp b/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp index 14744ac..bc678a1 100644 --- a/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp +++ b/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp @@ -478,46 +478,46 @@ TEST_F(Timer8BitFixture, test_initialisation_deinitialisation) TEST(timer_8_bit_driver_tests, test_parameters_computation_prescaler) { - uint32_t cpu_freq = 16'000'000; + uint32_t clock_freq = 16'000'000; uint32_t target_freq = 1'000; uint8_t ocra = 0; uint16_t accumulator = 0; timer_8_bit_prescaler_selection_t prescaler = TIMER8BIT_CLK_PRESCALER_1; - timer_8_bit_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_64); ASSERT_EQ(ocra, 249U); ASSERT_EQ(accumulator, 0U); target_freq = 3'000; - timer_8_bit_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_64); ASSERT_EQ(ocra, 82U); ASSERT_EQ(accumulator, 0U); target_freq = 5'000; - timer_8_bit_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_64); ASSERT_EQ(ocra, 49U); ASSERT_EQ(accumulator, 0U); target_freq = 1'000'000; - timer_8_bit_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_1); ASSERT_EQ(ocra, 15U); ASSERT_EQ(accumulator, 0U); - cpu_freq = 8'000'000; + clock_freq = 8'000'000; target_freq = 440; - timer_8_bit_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_256); ASSERT_EQ(ocra, 70U); ASSERT_EQ(accumulator, 0U); - cpu_freq = 16'000'000; + clock_freq = 16'000'000; target_freq = 1; - timer_8_bit_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_1024); ASSERT_EQ(ocra, 124U); ASSERT_EQ(accumulator, 124U); diff --git a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h index 7b45ed4..13066df 100644 --- a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h +++ b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h @@ -399,13 +399,13 @@ timer_error_t timer_8_bit_stop(uint8_t id); * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, * using CPU main clock frequency as the time constraint. * - * @param[in] cpu_freq : current CPU main clock frequency + * @param[in] clock_freq : current CPU main clock frequency * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) * @param[out] prescaler : output prescaler parameter * @param[out] ocr : output ocr value * @param[out] accumulator : output accumulator value ; used by the timebase module for instance to count events and extend timer's counter capabilities */ -void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, +void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_8_bit_prescaler_selection_t * const prescaler, uint8_t * const ocr, @@ -415,11 +415,11 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, * using CPU main clock frequency as the time constraint. * - * @param[in] cpu_freq : current CPU main clock frequency + * @param[in] clock_freq : current CPU main clock frequency * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) * @param[out] prescaler : output prescaler parameter */ -void timer_8_bit_compute_closest_prescaler(const uint32_t * const cpu_freq, +void timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_8_bit_prescaler_selection_t * const prescaler); diff --git a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c index 61d367c..f02c3ed 100644 --- a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c +++ b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c @@ -86,7 +86,7 @@ uint16_t timer_8_bit_prescaler_to_value(const timer_8_bit_prescaler_selection_t return 0; } -void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, +void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_8_bit_prescaler_selection_t * const prescaler, uint8_t * const ocr, @@ -96,7 +96,7 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, { .input = { - .cpu_frequency = *cpu_freq, + .clock_freq = *clock_freq, .target_frequency = *target_freq, .resolution = TIMER_GENERIC_RESOLUTION_8_BIT, .prescaler_lookup_array.array = timer_8_bit_prescaler_table, @@ -109,7 +109,7 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, *accumulator = parameters.output.accumulator; } -void timer_8_bit_compute_closest_prescaler(const uint32_t * const cpu_freq, +void timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_8_bit_prescaler_selection_t * const prescaler) { @@ -117,7 +117,7 @@ void timer_8_bit_compute_closest_prescaler(const uint32_t * const cpu_freq, { .input = { - .cpu_frequency = *cpu_freq, + .clock_freq = *clock_freq, .target_frequency = *target_freq, .resolution = TIMER_GENERIC_RESOLUTION_8_BIT, .prescaler_lookup_array.array = timer_8_bit_prescaler_table, diff --git a/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp b/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp index 42cc2c1..3dc4ae3 100644 --- a/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp +++ b/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp @@ -550,46 +550,46 @@ TEST_F(Timer8BitAsyncFixture, test_initialisation_deinitialisation) TEST(timer_8_bit_async_driver_tests, test_parameters_computation_prescaler) { - uint32_t cpu_freq = 16'000'000; + uint32_t clock_freq = 16'000'000; uint32_t target_freq = 1'000; uint8_t ocra = 0; uint16_t accumulator = 0; timer_8_bit_async_prescaler_selection_t prescaler = TIMER8BIT_ASYNC_CLK_PRESCALER_1; - timer_8_bit_async_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_async_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_64); ASSERT_EQ(ocra, 249U); ASSERT_EQ(accumulator, 0U); target_freq = 3'000; - timer_8_bit_async_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_async_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_32); ASSERT_EQ(ocra, 165U); ASSERT_EQ(accumulator, 0U); target_freq = 5'000; - timer_8_bit_async_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_async_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_32); ASSERT_EQ(ocra, 99U); ASSERT_EQ(accumulator, 0U); target_freq = 1'000'000; - timer_8_bit_async_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_async_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); ASSERT_EQ(ocra, 15U); ASSERT_EQ(accumulator, 0U); - cpu_freq = 8'000'000; + clock_freq = 8'000'000; target_freq = 440; - timer_8_bit_async_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_async_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_128); ASSERT_EQ(ocra, 141U); ASSERT_EQ(accumulator, 0U); - cpu_freq = 16'000'000; + clock_freq = 16'000'000; target_freq = 1; - timer_8_bit_async_compute_matching_parameters(&cpu_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_8_bit_async_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1024); ASSERT_EQ(ocra, 124U); ASSERT_EQ(accumulator, 124U); diff --git a/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h b/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h index e497120..a2018ce 100644 --- a/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h +++ b/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h @@ -412,13 +412,13 @@ timer_error_t timer_8_bit_async_stop(uint8_t id); * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, * using CPU main clock frequency as the time constraint. * - * @param[in] cpu_freq : current CPU main clock frequency + * @param[in] clock_freq : current CPU main clock frequency * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) * @param[out] prescaler : output prescaler parameter * @param[out] ocr : output ocr value * @param[out] accumulator : output accumulator value ; used by the timebase module for instance to count events and extend timer's counter capabilities */ -void timer_8_bit_async_compute_matching_parameters(const uint32_t * const cpu_freq, +void timer_8_bit_async_compute_matching_parameters(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_8_bit_async_prescaler_selection_t * const prescaler, uint8_t * const ocra, diff --git a/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c b/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c index dc42747..140ac04 100644 --- a/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c +++ b/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c @@ -82,7 +82,7 @@ uint16_t timer_8_bit_async_prescaler_to_value(const timer_8_bit_async_prescaler_ return 0; } -void timer_8_bit_async_compute_matching_parameters(const uint32_t * const cpu_freq, +void timer_8_bit_async_compute_matching_parameters(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_8_bit_async_prescaler_selection_t * const prescaler, uint8_t * const ocra, @@ -92,7 +92,7 @@ void timer_8_bit_async_compute_matching_parameters(const uint32_t * const cpu_fr { .input = { - .cpu_frequency = *cpu_freq, + .clock_freq = *clock_freq, .target_frequency = *target_freq, .resolution = TIMER_GENERIC_RESOLUTION_8_BIT, .prescaler_lookup_array.array = timer_8_bit_async_prescaler_table, diff --git a/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp b/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp index 6f906a7..6bdddfe 100644 --- a/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp +++ b/Drivers/Timers/Timer_generic/Tests/timer_generic_tests.cpp @@ -49,7 +49,7 @@ TEST(timer_generic_driver_tests, test_compute_parameters) {0,0} }; timer_generic_parameters_t parameters; - parameters.input.cpu_frequency = 16'000'000U; + parameters.input.clock_freq = 16'000'000U; parameters.input.target_frequency = 1'000'000U; parameters.input.resolution = TIMER_GENERIC_RESOLUTION_8_BIT; parameters.input.prescaler_lookup_array.array = array; @@ -60,21 +60,21 @@ TEST(timer_generic_driver_tests, test_compute_parameters) ASSERT_EQ(parameters.output.ocr, 15U); ASSERT_EQ(parameters.output.accumulator, 0U); - parameters.input.cpu_frequency = 16'000'000U; + parameters.input.clock_freq = 16'000'000U; parameters.input.target_frequency = 1'000U; timer_generic_compute_parameters(¶meters); ASSERT_EQ(parameters.output.prescaler, 64U); ASSERT_EQ(parameters.output.ocr, 249U); ASSERT_EQ(parameters.output.accumulator, 0U); - parameters.input.cpu_frequency = 16'000'000U; + parameters.input.clock_freq = 16'000'000U; parameters.input.target_frequency = 1U; timer_generic_compute_parameters(¶meters); ASSERT_EQ(parameters.output.prescaler, 1024U); ASSERT_EQ(parameters.output.ocr, 124U); ASSERT_EQ(parameters.output.accumulator, 124U); - parameters.input.cpu_frequency = 24'000'000U; + parameters.input.clock_freq = 24'000'000U; parameters.input.target_frequency = 1U; timer_generic_compute_parameters(¶meters); ASSERT_EQ(parameters.output.prescaler, 1024U); @@ -98,7 +98,7 @@ TEST(timer_generic_driver_tests, test_compute_prescaler) {0,0} }; timer_generic_parameters_t parameters; - parameters.input.cpu_frequency = 16'000'000U; + parameters.input.clock_freq = 16'000'000U; parameters.input.target_frequency = 1'000'000U; parameters.input.resolution = TIMER_GENERIC_RESOLUTION_8_BIT; parameters.input.prescaler_lookup_array.array = array; @@ -107,17 +107,17 @@ TEST(timer_generic_driver_tests, test_compute_prescaler) timer_generic_find_closest_prescaler(¶meters); ASSERT_EQ(parameters.output.prescaler, 1U); - parameters.input.cpu_frequency = 16'000'000U; + parameters.input.clock_freq = 16'000'000U; parameters.input.target_frequency = 1'000U; timer_generic_find_closest_prescaler(¶meters); ASSERT_EQ(parameters.output.prescaler, 64U); - parameters.input.cpu_frequency = 16'000'000U; + parameters.input.clock_freq = 16'000'000U; parameters.input.target_frequency = 1U; timer_generic_find_closest_prescaler(¶meters); ASSERT_EQ(parameters.output.prescaler, 1024U); - parameters.input.cpu_frequency = 24'000'000U; + parameters.input.clock_freq = 24'000'000U; parameters.input.target_frequency = 1U; timer_generic_find_closest_prescaler(¶meters); ASSERT_EQ(parameters.output.prescaler, 1024U); diff --git a/Drivers/Timers/Timer_generic/src/timer_generic.c b/Drivers/Timers/Timer_generic/src/timer_generic.c index d1780ac..b43d42e 100644 --- a/Drivers/Timers/Timer_generic/src/timer_generic.c +++ b/Drivers/Timers/Timer_generic/src/timer_generic.c @@ -32,8 +32,7 @@ along with this program. If not, see . void timer_generic_compute_parameters(timer_generic_parameters_t * const parameters) { - const uint32_t freq_ratio = parameters->input.cpu_frequency / parameters->input.target_frequency; - const uint16_t limit_value = (parameters->input.resolution == TIMER_GENERIC_RESOLUTION_8_BIT) ? (TIMER_GENERIC_8_BIT_LIMIT_VALUE - 1) : (TIMER_GENERIC_16_BIT_LIMIT_VALUE - 1); + const uint32_t freq_ratio = parameters->input.clock_freq / parameters->input.target_frequency; timer_generic_find_closest_prescaler(parameters); @@ -96,12 +95,11 @@ void timer_generic_compute_parameters(timer_generic_parameters_t * const paramet void timer_generic_find_closest_prescaler(timer_generic_parameters_t * const parameters) { - const uint32_t freq_ratio = parameters->input.cpu_frequency / parameters->input.target_frequency; - const uint16_t limit_value = (parameters->input.resolution == TIMER_GENERIC_RESOLUTION_8_BIT) ? (TIMER_GENERIC_8_BIT_LIMIT_VALUE - 1) : (TIMER_GENERIC_16_BIT_LIMIT_VALUE - 1); + const uint32_t freq_ratio = parameters->input.clock_freq / parameters->input.target_frequency; // It is possible that this operation produces aliasing because we do not check if // the remainder of this division is exactly 0 (no remainder, clean euclidean division) - const uint32_t min_prescaler = freq_ratio / (uint32_t) limit_value; + const uint32_t min_prescaler = freq_ratio / (uint32_t) parameters->input.top_value; parameters->output.prescaler = 1U; uint16_t target_prescaler = 1U; diff --git a/ExampleApp/src/config.c b/ExampleApp/src/config.c index 9f2afdf..92a1a7f 100644 --- a/ExampleApp/src/config.c +++ b/ExampleApp/src/config.c @@ -19,7 +19,7 @@ timebase_config_t timebase_static_config[TIMEBASE_MAX_MODULES] = .type = TIMER_ARCH_8_BIT_ASYNC, .index = 0, }, - .cpu_freq = F_CPU, + .clock_freq = F_CPU, .timescale = TIMEBASE_TIMESCALE_MILLISECONDS } }; diff --git a/Modules/Pwm/examples/config.c b/Modules/Pwm/examples/config.c index a65efe5..fe3048b 100644 --- a/Modules/Pwm/examples/config.c +++ b/Modules/Pwm/examples/config.c @@ -19,7 +19,7 @@ timebase_config_t timebase_static_config[TIMEBASE_MAX_INSTANCES] = .type = TIMER_ARCH_8_BIT, .index = TIMEBASE_TARGETED_TIMER_IDX, }, - .cpu_freq = F_CPU, + .clock_freq = F_CPU, .timescale = TIMEBASE_TIMESCALE_MILLISECONDS } }; diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index a76572e..58bf5ab 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -237,14 +237,14 @@ pwm_error_t pwm_stop_all(void); * you, this is the responsibility of the Timer initialisation steps. * @param pwm_instance_index : pwm instance index as per given in config.c file * @param frequency : targeted PWM frequency - * @param cpu_freq : current CPU frequency (note that if CPU frequency changes, output PWM will be off as well) + * @param clock_freq : current CPU frequency (note that if CPU frequency changes, output PWM will be off as well) * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly */ -pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); +pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq); /** * @brief Configures a particular timer to output complementary PWM with dead time generation. @@ -252,12 +252,12 @@ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const pro * and symmetrical PWM output signals. * @see pwm_hard_compl_config_t structure for more details. * @param config : input configuration structure - * @param cpu_freq : current CPU frequency, used to calculate timer's configuration parameters + * @param clock_freq : current CPU frequency, used to calculate timer's configuration parameters * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ -pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const config, const uint32_t * cpu_freq ); +pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const config, const uint32_t * clock_freq ); // Static configuration for both software based and hardware based pwms diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 5e98d70..b1971e5 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -37,37 +37,37 @@ static pwm_error_t pwm_init_single_hard(const uint8_t index); * @brief Configures a single timer 8 bit instance based on common parameters * @param index : pwm instance index * @param properties : pwm specifications (aka properties) - * @param cpu_freq : current CPU frequency + * @param clock_freq : current CPU frequency * @return pwm_error_t : * PWM_ERROR_OK : operation succeeded * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly * PWM_ERR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ -static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); +static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq); /** * @brief Configures a single timer 8 bit asynchronous instance based on common parameters * @param index : pwm instance index * @param properties : pwm specifications (aka properties) - * @param cpu_freq : current CPU frequency + * @param clock_freq : current CPU frequency * @return pwm_error_t : * PWM_ERROR_OK : operation succeeded * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly * PWM_ERR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ -static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); +static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq); /** * @brief Configures a single timer 16 bit instance based on common parameters * @param index : pwm instance index * @param properties : pwm specifications (aka properties) - * @param cpu_freq : current CPU frequency + * @param clock_freq : current CPU frequency * @return pwm_error_t : * PWM_ERROR_OK : operation succeeded * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly * PWM_ERR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ -static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq); +static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq); pwm_error_t pwm_init(void) { @@ -168,7 +168,7 @@ static pwm_error_t pwm_init_single_hard(const uint8_t index) return ret; } -pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq) +pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) { pwm_error_t ret = PWM_ERR_OK; if (PWM_TYPE_HARDWARE == pwm_config[index].type) @@ -180,15 +180,15 @@ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const pro switch(timer_config->arch) { case TIMER_ARCH_8_BIT: - ret = configure_timer_8_bit_single(index, properties, cpu_freq); + ret = configure_timer_8_bit_single(index, properties, clock_freq); break; case TIMER_ARCH_8_BIT_ASYNC: - ret = configure_timer_8_bit_async_single(index, properties, cpu_freq); + ret = configure_timer_8_bit_async_single(index, properties, clock_freq); break; case TIMER_ARCH_16_BIT: - ret = configure_timer_16_bit_single(index, properties, cpu_freq); + ret = configure_timer_16_bit_single(index, properties, clock_freq); break; default: @@ -207,7 +207,7 @@ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const pro } -static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq) +static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) { timer_error_t timerr = TIMER_ERROR_OK; pwm_error_t ret = PWM_ERR_OK; @@ -220,7 +220,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t pwm_hard_static_config_t * timer_config = &pwm_config[index].config.hard; // Compute closest prescaler first - timer_8_bit_compute_closest_prescaler(cpu_freq, &properties->frequency, &prescaler); + timer_8_bit_compute_closest_prescaler(clock_freq, &properties->frequency, &prescaler); prescaler_value = timer_8_bit_prescaler_to_value(prescaler); timerr = timer_8_bit_set_prescaler(index, prescaler); if (TIMER_ERROR_OK != timerr) @@ -282,7 +282,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t return PWM_ERR_TIMER_ISSUE; } - ocr_value = (*cpu_freq / (prescaler_value * properties->frequency)) - 1; + ocr_value = (*clock_freq / (prescaler_value * properties->frequency)) - 1; // Trying to compensate for the 50% duty cycle and toggling mode which halves the output frequency if(ocr_value > 2 ) { @@ -355,7 +355,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t // Compute exact frequency value for OCRA // We don't try to modify OCRA value to compensate for 50% output frequency, because in this case // the output pin is not toggled - ocr_value = (*cpu_freq / (prescaler_value * properties->frequency)) - 1; + ocr_value = (*clock_freq / (prescaler_value * properties->frequency)) - 1; // Set timer ocra value, to control output frequency timerr = timer_8_bit_set_ocra_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) diff --git a/Modules/Timebase/Tests/Stubs/config.c b/Modules/Timebase/Tests/Stubs/config.c index 9a28121..bda98f5 100644 --- a/Modules/Timebase/Tests/Stubs/config.c +++ b/Modules/Timebase/Tests/Stubs/config.c @@ -8,7 +8,7 @@ timebase_config_t timebase_static_config[TIMEBASE_MAX_MODULES] = { { - .cpu_freq = 16000000UL, + .clock_freq = 16000000UL, .custom_target_freq = 0, .timescale = TIMEBASE_TIMESCALE_MICROSECONDS, .timer = {.index = 0, .type = TIMER_ARCH_8_BIT_ASYNC} diff --git a/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c b/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c index f2f5de3..3d383b1 100644 --- a/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c +++ b/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c @@ -63,13 +63,13 @@ void timer_16_bit_stub_reset(void) memset(&configuration, 0, sizeof(configuration_t)); } -void timer_16_bit_compute_matching_parameters(const uint32_t * const cpu_freq, +void timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_16_bit_prescaler_selection_t * const prescaler, uint16_t * const ocra, uint16_t * const accumulator) { - (void) cpu_freq; + (void) clock_freq; (void) target_freq; *prescaler = configuration.prescaler; *ocra = configuration.ocra; diff --git a/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c b/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c index 897743e..fe919f8 100644 --- a/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c +++ b/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c @@ -63,13 +63,13 @@ void timer_8_bit_async_stub_reset(void) memset(&configuration, 0, sizeof(configuration_t)); } -void timer_8_bit_async_compute_matching_parameters( const uint32_t * const cpu_freq, +void timer_8_bit_async_compute_matching_parameters( const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_8_bit_async_prescaler_selection_t * const prescaler, uint8_t * const ocra, uint16_t * const accumulator) { - (void) cpu_freq; + (void) clock_freq; (void) target_freq; *prescaler = configuration.prescaler; *ocra = configuration.ocra; diff --git a/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c b/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c index ccb0079..d5e4141 100644 --- a/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c +++ b/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c @@ -70,13 +70,13 @@ void timer_8_bit_stub_get_driver_configuration(timer_8_bit_config_t * const conf *config = configuration.driver_config; } -void timer_8_bit_compute_matching_parameters(const uint32_t * const cpu_freq, +void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_8_bit_prescaler_selection_t * const prescaler, uint8_t * const ocra, uint16_t * const accumulator) { - (void) cpu_freq; + (void) clock_freq; (void) target_freq; *prescaler = configuration.prescaler; *ocra = configuration.ocra; diff --git a/Modules/Timebase/Tests/timebase_tests.cpp b/Modules/Timebase/Tests/timebase_tests.cpp index c68dbd1..924febf 100644 --- a/Modules/Timebase/Tests/timebase_tests.cpp +++ b/Modules/Timebase/Tests/timebase_tests.cpp @@ -50,7 +50,7 @@ class TimebaseModuleBasicConfig : public ::testing::Test timer_8_bit_async_stub_reset(); timer_16_bit_stub_reset(); - timebase_static_config[0].cpu_freq = 16'000'000; + timebase_static_config[0].clock_freq = 16'000'000; timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_MILLISECONDS; timebase_static_config[0].timer.type = TIMER_ARCH_16_BIT; timebase_static_config[0].timer.index = 0U; @@ -86,7 +86,7 @@ class TimebaseModule8BitInitialised : public TimebaseModuleBasicConfig TEST(timebase_module_tests, test_compute_timer_parameters) { - timebase_static_config[0].cpu_freq = 16'000'000; + timebase_static_config[0].clock_freq = 16'000'000; timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_MILLISECONDS; timebase_static_config[0].timer.type = TIMER_ARCH_16_BIT; timebase_static_config[0].timer.index = 0U; @@ -204,7 +204,7 @@ TEST(timebase_module_test, test_guard_wrong_parameters) TEST(timebase_module_tests, test_wrong_index_error_forwarding) { - timebase_static_config[0].cpu_freq = 16'000'000; + timebase_static_config[0].clock_freq = 16'000'000; timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_MILLISECONDS; // This index should break execution as this timer driver does not exist (only '0' is declared) @@ -230,7 +230,7 @@ TEST(timebase_module_tests, test_wrong_index_error_forwarding) TEST(timebase_module_tests, test_uninitialised_timer_error) { - timebase_static_config[0].cpu_freq = 16'000'000; + timebase_static_config[0].clock_freq = 16'000'000; timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_MILLISECONDS; timebase_static_config[0].timer.type = TIMER_ARCH_16_BIT; timebase_static_config[0].timer.index = 0U; diff --git a/Modules/Timebase/inc/timebase.h b/Modules/Timebase/inc/timebase.h index fa4e437..f03c86e 100644 --- a/Modules/Timebase/inc/timebase.h +++ b/Modules/Timebase/inc/timebase.h @@ -81,7 +81,7 @@ typedef struct timer_arch_t type; /**< Used to select a timer from its type */ uint8_t index; /**< Used to select a particular timer from the available ones */ } timer; - uint32_t cpu_freq; /**< Gives the CPU frequency to compute the right prescaler for the timebase */ + uint32_t clock_freq; /**< Gives the CPU frequency to compute the right prescaler for the timebase */ struct { diff --git a/Modules/Timebase/src/timebase.c b/Modules/Timebase/src/timebase.c index 5442888..225dbcb 100644 --- a/Modules/Timebase/src/timebase.c +++ b/Modules/Timebase/src/timebase.c @@ -67,7 +67,7 @@ static void reset_internal_config(const uint8_t id) timebase_internal_config[id].initialised = false; } -static inline timebase_error_t setup_8_bit_timer(const uint8_t timebase_id, uint32_t const * const cpu_freq, uint32_t const * const target_freq) +static inline timebase_error_t setup_8_bit_timer(const uint8_t timebase_id, uint32_t const * const clock_freq, uint32_t const * const target_freq) { bool initialised = false; timer_error_t err = timer_8_bit_is_initialised(timebase_internal_config[timebase_id].timer_id, &initialised); @@ -86,7 +86,7 @@ static inline timebase_error_t setup_8_bit_timer(const uint8_t timebase_id, uint uint8_t ocra = 0; timebase_internal_config[timebase_id].accumulator.programmed = 0; timer_8_bit_prescaler_selection_t prescaler; - timer_8_bit_compute_matching_parameters(cpu_freq, + timer_8_bit_compute_matching_parameters(clock_freq, target_freq, &prescaler, &ocra, @@ -117,7 +117,7 @@ static inline timebase_error_t setup_8_bit_timer(const uint8_t timebase_id, uint return TIMEBASE_ERROR_OK; } -static inline timebase_error_t setup_8_bit_async_timer(const uint8_t timebase_id, uint32_t const * const cpu_freq, uint32_t const * const target_freq) +static inline timebase_error_t setup_8_bit_async_timer(const uint8_t timebase_id, uint32_t const * const clock_freq, uint32_t const * const target_freq) { bool initialised = false; timer_error_t err = timer_8_bit_async_is_initialised(timebase_internal_config[timebase_id].timer_id, &initialised); @@ -135,7 +135,7 @@ static inline timebase_error_t setup_8_bit_async_timer(const uint8_t timebase_id uint8_t ocra = 0; timebase_internal_config[timebase_id].accumulator.programmed = 0; timer_8_bit_async_prescaler_selection_t prescaler; - timer_8_bit_async_compute_matching_parameters(cpu_freq, + timer_8_bit_async_compute_matching_parameters(clock_freq, target_freq, &prescaler, &ocra, @@ -165,7 +165,7 @@ static inline timebase_error_t setup_8_bit_async_timer(const uint8_t timebase_id return TIMEBASE_ERROR_OK; } -static inline timebase_error_t setup_16_bit_timer(const uint8_t timebase_id, uint32_t const * const cpu_freq, uint32_t const * const target_freq) +static inline timebase_error_t setup_16_bit_timer(const uint8_t timebase_id, uint32_t const * const clock_freq, uint32_t const * const target_freq) { bool initialised = false; timer_error_t err = timer_16_bit_is_initialised(timebase_internal_config[timebase_id].timer_id, &initialised); @@ -182,7 +182,7 @@ static inline timebase_error_t setup_16_bit_timer(const uint8_t timebase_id, uin uint16_t ocra = 0; timebase_internal_config[timebase_id].accumulator.programmed = 0; timer_16_bit_prescaler_selection_t prescaler; - timer_16_bit_compute_matching_parameters(cpu_freq, + timer_16_bit_compute_matching_parameters(clock_freq, target_freq, &prescaler, &ocra, @@ -261,7 +261,7 @@ timebase_error_t timebase_compute_timer_parameters(const uint8_t id, uint16_t * switch(timebase_static_config[id].timer.type) { case TIMER_ARCH_8_BIT: - timer_8_bit_compute_matching_parameters(&timebase_static_config[id].cpu_freq, + timer_8_bit_compute_matching_parameters(&timebase_static_config[id].clock_freq, &target_frequency, &prescaler, (uint8_t*) &ocra, @@ -271,7 +271,7 @@ timebase_error_t timebase_compute_timer_parameters(const uint8_t id, uint16_t * break; case TIMER_ARCH_8_BIT_ASYNC: - timer_8_bit_async_compute_matching_parameters(&timebase_static_config[id].cpu_freq, + timer_8_bit_async_compute_matching_parameters(&timebase_static_config[id].clock_freq, &target_frequency, (timer_8_bit_async_prescaler_selection_t *) &prescaler, (uint8_t*) &ocra, @@ -281,7 +281,7 @@ timebase_error_t timebase_compute_timer_parameters(const uint8_t id, uint16_t * break; case TIMER_ARCH_16_BIT: - timer_16_bit_compute_matching_parameters(&timebase_static_config[id].cpu_freq, + timer_16_bit_compute_matching_parameters(&timebase_static_config[id].clock_freq, &target_frequency, (timer_16_bit_prescaler_selection_t *)&prescaler, &ocra, @@ -319,15 +319,15 @@ timebase_error_t timebase_init(const uint8_t id) switch(timebase_static_config[id].timer.type) { case TIMER_ARCH_8_BIT: - ret = setup_8_bit_timer(id, &(timebase_static_config[id].cpu_freq), &target_freq); + ret = setup_8_bit_timer(id, &(timebase_static_config[id].clock_freq), &target_freq); break; case TIMER_ARCH_8_BIT_ASYNC: - ret = setup_8_bit_async_timer(id, &(timebase_static_config[id].cpu_freq), &target_freq); + ret = setup_8_bit_async_timer(id, &(timebase_static_config[id].clock_freq), &target_freq); break; case TIMER_ARCH_16_BIT: - ret = setup_16_bit_timer(id, &(timebase_static_config[id].cpu_freq), &target_freq); + ret = setup_16_bit_timer(id, &(timebase_static_config[id].clock_freq), &target_freq); break; default: From c6e12c616de1caafe35185bc90dfeae1ee8662d1 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 30 Mar 2022 11:57:55 +0200 Subject: [PATCH 27/51] Ported prescaler single computation to timer 8 bit async and 16 bit Signed-off-by: bebenlebricolo --- .../Timers/Timer_16_bit/inc/timer_16_bit.h | 12 ++++++++++++ .../Timers/Timer_16_bit/src/timer_16_bit.c | 19 +++++++++++++++++++ .../Timer_8_bit_async/inc/timer_8_bit_async.h | 12 ++++++++++++ .../Timer_8_bit_async/src/timer_8_bit_async.c | 19 +++++++++++++++++++ 4 files changed, 62 insertions(+) diff --git a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h index 82ecf68..30e3d3d 100644 --- a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h +++ b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h @@ -471,6 +471,18 @@ void timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, uint16_t * const ocr, uint16_t * const accumulator); +/** + * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, + * using CPU main clock frequency as the time constraint. + * + * @param[in] clock_freq : current CPU main clock frequency + * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) + * @param[out] prescaler : output prescaler parameter + */ +void timer_16_bit_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_16_bit_prescaler_selection_t * const prescaler); + #define TIMER_16_BIT_MAX_PRESCALER_COUNT (5U) /** diff --git a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c index a0aebf6..2446f85 100644 --- a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c +++ b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c @@ -102,6 +102,25 @@ void timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, *accumulator = parameters.output.accumulator; } +void timer_16_bit_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_16_bit_prescaler_selection_t * const prescaler) +{ + timer_generic_parameters_t parameters = + { + .input = + { + .clock_freq = *clock_freq, + .target_frequency = *target_freq, + .resolution = TIMER_GENERIC_RESOLUTION_16_BIT, + .prescaler_lookup_array.array = timer_16_bit_prescaler_table, + .prescaler_lookup_array.size = TIMER_16_BIT_MAX_PRESCALER_COUNT, + }, + }; + timer_generic_find_closest_prescaler(¶meters); + *prescaler = parameters.output.prescaler; +} + static inline timer_error_t check_id(uint8_t id) { if (id >= TIMER_16_BIT_COUNT) diff --git a/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h b/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h index a2018ce..dd841b5 100644 --- a/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h +++ b/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h @@ -424,6 +424,18 @@ void timer_8_bit_async_compute_matching_parameters(const uint32_t * const clock_ uint8_t * const ocra, uint16_t * const accumulator); +/** + * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, + * using CPU main clock frequency as the time constraint. + * + * @param[in] clock_freq : current CPU main clock frequency + * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) + * @param[out] prescaler : output prescaler parameter + */ +void timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_async_prescaler_selection_t * const prescaler); + #define TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT (7U) /** diff --git a/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c b/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c index 140ac04..d8a7fe9 100644 --- a/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c +++ b/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c @@ -105,6 +105,25 @@ void timer_8_bit_async_compute_matching_parameters(const uint32_t * const clock_ *accumulator = parameters.output.accumulator; } +void timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_async_prescaler_selection_t * const prescaler) +{ + timer_generic_parameters_t parameters = + { + .input = + { + .clock_freq = *clock_freq, + .target_frequency = *target_freq, + .resolution = TIMER_GENERIC_RESOLUTION_8_BIT, + .prescaler_lookup_array.array = timer_8_bit_async_prescaler_table, + .prescaler_lookup_array.size = TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT, + }, + }; + timer_generic_find_closest_prescaler(¶meters); + *prescaler = parameters.output.prescaler; +} + static inline timer_error_t check_id(uint8_t id) { if (id >= TIMER_8_BIT_ASYNC_COUNT) From a59182aa4e1804eb0fec90a7600e1f3bbaa1f844 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 30 Mar 2022 11:59:06 +0200 Subject: [PATCH 28/51] Ported pwm implementation to timer 8 bit async Signed-off-by: bebenlebricolo --- .../Timers/Timer_generic/inc/timer_generic.h | 67 ++- .../Timers/Timer_generic/src/timer_generic.c | 4 +- Modules/Pwm/src/pwm.c | 393 +++++++++++++++++- 3 files changed, 435 insertions(+), 29 deletions(-) diff --git a/Drivers/Timers/Timer_generic/inc/timer_generic.h b/Drivers/Timers/Timer_generic/inc/timer_generic.h index f7bc001..e8347a6 100644 --- a/Drivers/Timers/Timer_generic/inc/timer_generic.h +++ b/Drivers/Timers/Timer_generic/inc/timer_generic.h @@ -58,13 +58,22 @@ typedef enum TIMER_ERROR_ALREADY_INITIALISED, /**< Timer has already been initialised */ } timer_error_t; -#define TIMER_GENERIC_8_BIT_LIMIT_VALUE (256U) -#define TIMER_GENERIC_16_BIT_LIMIT_VALUE (65536U) +#define TIMER_GENERIC_8_BIT_LIMIT_VALUE (255U) +#define TIMER_GENERIC_9_BIT_LIMIT_VALUE (511U) +#define TIMER_GENERIC_10_BIT_LIMIT_VALUE (1023U) +#define TIMER_GENERIC_16_BIT_LIMIT_VALUE (65535U) +/** + * @brief Encodes the various resolutions that are available in the hardware timer implementations. + * @note both 8 bit and 8 bit async timer share the same counter interface, and 16 bit timer can be configured to act as + * an 8bit, 9bit, 10bit or 16bit timer depending on the selected PWM modes. + */ typedef enum { - TIMER_GENERIC_RESOLUTION_8_BIT, - TIMER_GENERIC_RESOLUTION_16_BIT, + TIMER_GENERIC_RESOLUTION_8_BIT, /**< Used by all three hardware timer implementations, 8 bit counter */ + TIMER_GENERIC_RESOLUTION_9_BIT, /**< Used only by 16 bit timer, reduced counter span mode (9bits) */ + TIMER_GENERIC_RESOLUTION_10_BIT, /**< Used only by 16 bit timer, reduced counter span mode (10bits) */ + TIMER_GENERIC_RESOLUTION_16_BIT, /**< Used only by 16 bit timer, full span 16 bits counter resolution */ } timer_generic_resolution_t; /** @@ -78,32 +87,60 @@ typedef enum TIMER_ARCH_16_BIT /**< Enhanced 16 bit timer counter architecture */ } timer_arch_t; +/** + * @brief this bitfield structure is used to pack both prescaler value and + * its enum representation altogether in a tight space. It is mainly used to perform prescaler calculations + * and conversions/mapping + */ typedef struct { uint16_t value : 11; uint16_t type : 5; } timer_generic_prescaler_pair_t; +/** + * @brief this structure represents a basic parameter set used to compute a basic timer configuration. + * The input field represents the timing characteristics, current system clock frequency, etc. + * The output field yields the results of the conducted calculations. + * + * It is used as the interface to the generic compute parameters function, which in turn is used by each specific timer driver in order to compute a timer configuration + * matching as closely as possible the user provided timing characteristics. + */ typedef struct { struct { - uint32_t cpu_frequency; - uint32_t target_frequency; - timer_generic_resolution_t resolution; + uint32_t clock_freq; /**< Current clock frequency used as timer clocking system. */ + /**< Note that asynchronous timers can be clocked by an external + clock source. Upon such cases, the clock_freq field + should match the frequency of the external clock source in order to yield + adequate results */ + uint32_t target_frequency; /**< Expected resulting frequency of underlying timer (represents the number of counter cycles per second) */ + uint16_t top_value; /**< Encodes the maximum value achievable with the targeted hardware timer, based on current hardware configuration */ + timer_generic_resolution_t resolution; /**< Underlying timer resolution. Can be 8, 9, 10 or 16 bits or custom (ie : governed by either ICR or OCRA dependending + on the selected timer hardware configuration) */ struct { - timer_generic_prescaler_pair_t const * array; - uint8_t size; - } prescaler_lookup_array; - } input; + timer_generic_prescaler_pair_t const * array; /**< Internal prescaler lookup table, implemented in each specific timer driver variants */ + uint8_t size; /**< States the size of the prescaler array so that we do not do a buffer overflow */ + } prescaler_lookup_array; /**< Prescaler lookup array is used by timing computing algorithm in order to select the + closest prescaler value which matches the desired output timing characteristics */ + } input; /**< Input field of this whole parameters structure, consumed as read-only by the this timer driver */ struct { - uint16_t prescaler; - uint16_t ocr; - uint32_t accumulator; - } output; + uint16_t prescaler; /**< Calculated prescaler, which tries to match output frequency as closely as possible while trying to + use the maximum counter capacity (in order to provide greater control over duty cycle and frequency, + if possible */ + + uint16_t ocr; /**< Calculated trigger value, usually represents either OCRA or OCRB values, but for timer 16 bits implementations + it can represent ICR values as well */ + + uint16_t accumulator; /**< Software accumulator limit value, this value is set to 0 if accumulator is not required but switches to + a real value in case requested frequency is slower than what hardware timer can achieve using prescalers alone. + It is effectively used as a software extension to the hardware based timer counters and as a result allows far + lower frequencies */ + } output; /**< Ouput field of this struvture is used to provide results of computations to the caller of timer_generic_compute_parameters */ } timer_generic_parameters_t; /** diff --git a/Drivers/Timers/Timer_generic/src/timer_generic.c b/Drivers/Timers/Timer_generic/src/timer_generic.c index b43d42e..a4267f7 100644 --- a/Drivers/Timers/Timer_generic/src/timer_generic.c +++ b/Drivers/Timers/Timer_generic/src/timer_generic.c @@ -47,7 +47,7 @@ void timer_generic_compute_parameters(timer_generic_parameters_t * const paramet // Happens when timescale is really large compared to CPU frequency // We have to create an accumulator which will act as a second-stage prescaler - if (computed_ocra >= limit_value) + if (computed_ocra >= parameters->input.top_value) { // Select a remainder arbitrarily high to start the algorithm uint16_t min_remainder = 50U; @@ -57,7 +57,7 @@ void timer_generic_compute_parameters(timer_generic_parameters_t * const paramet // Note that 1 is the only candidate for which the remainder will always be 0. // If this takes too long / too much computing power, fallback using 1 and use the accumulator value to // account for the remaining values. - for (uint16_t i = limit_value ; i >= 1 ; i--) + for (uint16_t i = parameters->input.top_value ; i >= 1 ; i--) { uint16_t remainder = (computed_ocra % i); if ((0 != remainder) && (remainder < min_remainder)) diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index b1971e5..6775faa 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -16,6 +16,12 @@ #warning "PWM_MAX_HARD_INSTANCES macro not defined in config.h, fallsback to 1U by default" #endif + +#define COUNTER_MAX_VALUE_8_BIT 255U +#define COUNTER_MAX_VALUE_9_BIT 511U +#define COUNTER_MAX_VALUE_10_BIT 1023U +#define COUNTER_MAX_VALUE_16_BIT 65535U + /** * @brief Static storage for pwm configuration * This is done this way to enhance the dynamic nature of PWMs, so that we can @@ -263,7 +269,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t } // OCRA value represents the duty_cycle value now - ocr_value = (properties->duty_cycle * (TIMER_GENERIC_8_BIT_LIMIT_VALUE - 1)) / 100U; + ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U; timerr = timer_8_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); if(TIMER_ERROR_OK != timerr) { @@ -329,7 +335,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t case TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE: { // OCRA value represents the duty_cycle value now - ocr_value = (properties->duty_cycle * (TIMER_GENERIC_8_BIT_LIMIT_VALUE - 1)) / 100U; + ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U; timerr = timer_8_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); if(TIMER_ERROR_OK != timerr) { @@ -383,18 +389,381 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t return ret; } -static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq) +// Timer 8 bit async share the same infrastructure as the 8 bit one +static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) { - (void) index; - (void) properties; - (void) cpu_freq; - return PWM_ERR_CONFIG; + timer_error_t timerr = TIMER_ERROR_OK; + pwm_error_t ret = PWM_ERR_OK; + + uint8_t ocr_value = 0; + uint16_t prescaler_value = 1U; + + timer_8_bit_async_prescaler_selection_t prescaler = TIMER8BIT_ASYNC_CLK_NO_CLOCK; + timer_8_bit_async_waveform_generation_t waveform = TIMER8BIT_ASYNC_WG_NORMAL; + pwm_hard_static_config_t * timer_config = &pwm_config[index].config.hard; + + // Compute closest prescaler first + timer_8_bit_async_compute_closest_prescaler(clock_freq, &properties->frequency, &prescaler); + prescaler_value = timer_8_bit_async_prescaler_to_value(prescaler); + timerr = timer_8_bit_async_set_prescaler(index, prescaler); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + // We need to probe the waveform generation modes from Timer driver because it drives the way we configure a PWM afterwards + // (Because timer8 bit has some limitations when it comes to having PWMs with full frequency and duty cycle control, a lot depends on the Waveform Generation) + timerr = timer_8_bit_async_get_waveform_generation(timer_config->timer_index, &waveform); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + // Handles the hardware PWM unit A or B + if ( PWM_HARD_TIMER_UNIT_A == timer_config->unit) + { + // The waveform selection mode tells us about the kind of desired PWM + switch(waveform) + { + // TOP value is set to 255 + case TIMER8BIT_ASYNC_WG_PWM_FAST_FULL_RANGE: + case TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_FULL_RANGE: + { + // Select the polarity + if(properties->pol == PWM_POLARITY_NORMAL) + { + // When OCRA is hit, output pin should be cleared (means that output pin is SET high when counter reaches TOP) + timerr = timer_8_bit_async_set_compare_match_A(timer_config->timer_index, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); + } + else + { + // When OCRA is hit, output pin should be set (means that output pin is CLEARED low when counter reaches TOP) + timerr = timer_8_bit_async_set_compare_match_A(timer_config->timer_index, TIMER8BIT_ASYNC_CMOD_SET_OCnX); + } + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + // OCRA value represents the duty_cycle value now + ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U; + timerr = timer_8_bit_async_set_ocra_register_value(timer_config->timer_index, ocr_value); + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + break; + } + // TOP value is controlled by OCRA value + case TIMER8BIT_ASYNC_WG_PWM_FAST_OCRA_MAX: + case TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_OCRA_MAX: + // Here, the only configuration that will make the pin work as a real PWM output (wihtout glitches) is the TIMER8BIT_CMOD_TOGGLE_OCnX + // So it will effectively divide the output frequency by 2 in both Fast PWM mode and Phase correct PWM mode (which already divides output frequency by 2) + timerr = timer_8_bit_async_set_compare_match_A(timer_config->timer_index, TIMER8BIT_ASYNC_CMOD_TOGGLE_OCnX); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + ocr_value = (*clock_freq / (prescaler_value * properties->frequency)) - 1; + // Trying to compensate for the 50% duty cycle and toggling mode which halves the output frequency + if(ocr_value > 2 ) + { + ocr_value /= 2; + } + // TODO : consider using the prescaler as well, for instance if ocra is too small, we might be able to use a higher prescaler + // E.g : ocra can be divided by 8 (say 248 / 8 => 31) and prescaler = 1 then we can use a prescaler of 8 and have ocra at 31, and vice-versa if needed. + timerr = timer_8_bit_async_set_ocra_register_value(index, ocr_value); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + break; + + // Misconfigured Timer, could not proceed further + case TIMER8BIT_ASYNC_WG_CTC: + case TIMER8BIT_ASYNC_WG_NORMAL: + default: + return PWM_ERR_CONFIG; + } + + } + // UNIT B has a different treatment than UNIT A on timer 8 bit and variants + else /* UNIT B */ + { + // Select the polarity + if(properties->pol == PWM_POLARITY_NORMAL) + { + // When OCRB is hit, output pin should be cleared (means that output pin is SET high when counter reaches TOP) + timerr = timer_8_bit_async_set_compare_match_B(timer_config->timer_index, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); + } + else + { + // When OCRB is hit, output pin should be set (means that output pin is CLEARED low when counter reaches TOP) + timerr = timer_8_bit_async_set_compare_match_B(timer_config->timer_index, TIMER8BIT_ASYNC_CMOD_SET_OCnX); + } + + // The waveform selection mode tells us about the kind of desired PWM + switch(waveform) + { + // TOP value is set to 255 + // This configuration is valid for fixed frequency PWM with precise control over duty_cycle + case TIMER8BIT_ASYNC_WG_PWM_FAST_FULL_RANGE: + case TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_FULL_RANGE: + { + // OCRA value represents the duty_cycle value now + ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U; + timerr = timer_8_bit_async_set_ocra_register_value(timer_config->timer_index, ocr_value); + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + break; + + // Set timer ocrb value, to control duty_cycle + timerr = timer_8_bit_async_set_ocrb_register_value(index, ocr_value); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + break; + } + + // TOP value is controlled by OCRA value + case TIMER8BIT_ASYNC_WG_PWM_FAST_OCRA_MAX: + case TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_OCRA_MAX: + { + + // Compute exact frequency value for OCRA + // We don't try to modify OCRA value to compensate for 50% output frequency, because in this case + // the output pin is not toggled + ocr_value = (*clock_freq / (prescaler_value * properties->frequency)) - 1; + // Set timer ocra value, to control output frequency + timerr = timer_8_bit_async_set_ocra_register_value(index, ocr_value); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + // Compute exact duty cycle value for OCRB (reuse the ocr_value variable) + ocr_value = (properties->duty_cycle * ocr_value) / 100U; + // Set timer ocrb value, to control duty_cycle + timerr = timer_8_bit_async_set_ocrb_register_value(index, ocr_value); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + break; + } + // Misconfigured Timer, could not proceed further + case TIMER8BIT_ASYNC_WG_CTC: + case TIMER8BIT_ASYNC_WG_NORMAL: + default: + return PWM_ERR_CONFIG; + } + } + return ret; } -static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * cpu_freq) +static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) { - (void) index; - (void) properties; - (void) cpu_freq; - return PWM_ERR_CONFIG; + timer_error_t timerr = TIMER_ERROR_OK; + pwm_error_t ret = PWM_ERR_OK; + + uint16_t ocr_value = 0; + uint16_t prescaler_value = 1U; + + timer_16_bit_prescaler_selection_t prescaler = TIMER16BIT_CLK_NO_CLOCK; + timer_16_bit_waveform_generation_t waveform = TIMER16BIT_WG_NORMAL; + pwm_hard_static_config_t * timer_config = &pwm_config[index].config.hard; + + + // Compute closest prescaler first + timer_16_bit_compute_closest_prescaler(clock_freq, &properties->frequency, &prescaler); + prescaler_value = timer_16_bit_prescaler_to_value(prescaler); + timerr = timer_16_bit_set_prescaler(index, prescaler); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + // We need to probe the waveform generation modes from Timer driver because it drives the way we configure a PWM afterwards + // (Because timer8 bit has some limitations when it comes to having PWMs with full frequency and duty cycle control, a lot depends on the Waveform Generation) + timerr = timer_16_bit_get_waveform_generation(timer_config->timer_index, &waveform); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + // Select the polarity globally, checking special cases later on + if( PWM_HARD_TIMER_UNIT_A == timer_config->unit) + { + if(properties->pol == PWM_POLARITY_NORMAL) + { + // When OCRA is hit, output pin should be cleared (means that output pin is SET high when counter reaches TOP) + timerr = timer_16_bit_set_compare_match_A(timer_config->timer_index, TIMER16BIT_CMOD_CLEAR_OCnX); + } + else + { + // When OCRA is hit, output pin should be set (means that output pin is CLEARED low when counter reaches TOP) + timerr = timer_16_bit_set_compare_match_A(timer_config->timer_index, TIMER16BIT_CMOD_SET_OCnX); + } + } + else + { + if(properties->pol == PWM_POLARITY_NORMAL) + { + // When OCRA is hit, output pin should be cleared (means that output pin is SET high when counter reaches TOP) + timerr = timer_16_bit_set_compare_match_B(timer_config->timer_index, TIMER16BIT_CMOD_CLEAR_OCnX); + } + else + { + // When OCRA is hit, output pin should be set (means that output pin is CLEARED low when counter reaches TOP) + timerr = timer_16_bit_set_compare_match_B(timer_config->timer_index, TIMER16BIT_CMOD_SET_OCnX); + } + } + + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + // The waveform selection mode tells us about the kind of desired PWM + switch(waveform) + { + // TOP value is set to 255 + case TIMER16BIT_WG_PWM_FAST_8_bit_FULL_RANGE: + case TIMER16BIT_WG_PWM_PHASE_CORRECT_8_bit_FULL_RANGE: + ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U; + if ( PWM_HARD_TIMER_UNIT_A == timer_config->unit) + { + // OCRA value represents the duty_cycle value now + timerr = timer_16_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); + } + else + { + // OCRB value represents the duty_cycle value now + timerr = timer_16_bit_set_ocrb_register_value(timer_config->timer_index, ocr_value); + } + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + break; + + // TOP value is set to 511 + case TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE: + case TIMER16BIT_WG_PWM_PHASE_CORRECT_9_bit_FULL_RANGE: + ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_9_BIT) / 100U; + if ( PWM_HARD_TIMER_UNIT_A == timer_config->unit) + { + // OCRA value represents the duty_cycle value now + timerr = timer_16_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); + } + else + { + // OCRB value represents the duty_cycle value now + timerr = timer_16_bit_set_ocrb_register_value(timer_config->timer_index, ocr_value); + } + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + break; + + // Top value is set to 1023 + case TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE: + case TIMER16BIT_WG_PWM_PHASE_CORRECT_10_bit_FULL_RANGE: + ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_10_BIT) / 100U; + if ( PWM_HARD_TIMER_UNIT_A == timer_config->unit) + { + // OCRA value represents the duty_cycle value now + timerr = timer_16_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); + } + else + { + // OCRB value represents the duty_cycle value now + timerr = timer_16_bit_set_ocrb_register_value(timer_config->timer_index, ocr_value); + } + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + break; + // TOP value is governed by ICR register + case TIMER16BIT_WG_PWM_FAST_ICR_MAX: + case TIMER16BIT_WG_PWM_PHASE_CORRECT_ICR_MAX: + case TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_ICR_MAX: + break; + + // TOP value is governed by OCRA value + case TIMER16BIT_WG_PWM_FAST_OCRA_MAX: + case TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX: + case TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_OCRA_MAX: + break; + { + // Select the polarity + if(properties->pol == PWM_POLARITY_NORMAL) + { + // When OCRA is hit, output pin should be cleared (means that output pin is SET high when counter reaches TOP) + timerr = timer_8_bit_async_set_compare_match_A(timer_config->timer_index, TIMER8BIT_CMOD_CLEAR_OCnX); + } + else + { + // When OCRA is hit, output pin should be set (means that output pin is CLEARED low when counter reaches TOP) + timerr = timer_8_bit_async_set_compare_match_A(timer_config->timer_index, TIMER8BIT_CMOD_SET_OCnX); + } + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + // OCRA value represents the duty_cycle value now + ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U; + timerr = timer_8_bit_async_set_ocra_register_value(timer_config->timer_index, ocr_value); + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + break; + } + + // TOP value is controlled by OCRA value + { // Here, the only configuration that will make the pin work as a real PWM output (wihtout glitches) is the TIMER8BIT_CMOD_TOGGLE_OCnX + // So it will effectively divide the output frequency by 2 in both Fast PWM mode and Phase correct PWM mode (which already divides output frequency by 2) + timerr = timer_8_bit_async_set_compare_match_A(timer_config->timer_index, TIMER8BIT_ASYNC_CMOD_TOGGLE_OCnX); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + + ocr_value = (*clock_freq / (prescaler_value * properties->frequency)) - 1; + // Trying to compensate for the 50% duty cycle and toggling mode which halves the output frequency + if(ocr_value > 2 ) + { + ocr_value /= 2; + } + // TODO : consider using the prescaler as well, for instance if ocra is too small, we might be able to use a higher prescaler + // E.g : ocra can be divided by 8 (say 248 / 8 => 31) and prescaler = 1 then we can use a prescaler of 8 and have ocra at 31, and vice-versa if needed. + timerr = timer_8_bit_async_set_ocra_register_value(index, ocr_value); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + break; + } + + // Misconfigured Timer, could not proceed further + // The following modes are generally used to trigger interrupts and are not used as PWM modes + case TIMER16BIT_WG_NORMAL: + case TIMER16BIT_WG_CTC_ICR_MAX: + case TIMER16BIT_WG_CTC_OCRA_MAX: + default: + return PWM_ERR_CONFIG; + } + + + return ret; } From 954efe2cd7a7dac6661c90ae91e44068a17a9c09 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 30 Mar 2022 13:08:36 +0200 Subject: [PATCH 29/51] Reworked a bit how generic timer treat resolution calculations Signed-off-by: bebenlebricolo --- .../Timers/Timer_16_bit/inc/timer_16_bit.h | 21 ++++--- .../Timers/Timer_16_bit/src/timer_16_bit.c | 35 +++++++---- Drivers/Timers/Timer_8_bit/src/timer_8_bit.c | 4 +- .../Timers/Timer_generic/inc/timer_generic.h | 31 +++++++--- .../Timers/Timer_generic/src/timer_generic.c | 58 ++++++++++++++++--- Modules/Timebase/src/timebase.c | 2 + 6 files changed, 115 insertions(+), 36 deletions(-) diff --git a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h index 30e3d3d..0e14ca0 100644 --- a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h +++ b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h @@ -459,17 +459,19 @@ timer_error_t timer_16_bit_stop(uint8_t id); * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, * using CPU main clock frequency as the time constraint. * - * @param[in] clock_freq : current CPU main clock frequency + * @param[in] clock_freq : current CPU main clock frequency * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) + * @param[in] resolution : encodes the resolution of the hardware timer : 8,9,10 or 16 bits resolutions are supported * @param[out] prescaler : output prescaler parameter * @param[out] ocr : output ocr value * @param[out] accumulator : output accumulator value ; used by the timebase module for instance to count events and extend timer's counter capabilities */ -void timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_16_bit_prescaler_selection_t * const prescaler, - uint16_t * const ocr, - uint16_t * const accumulator); +timer_error_t timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + const timer_generic_resolution_t resolution, + timer_16_bit_prescaler_selection_t * const prescaler, + uint16_t * const ocr, + uint16_t * const accumulator); /** * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, @@ -479,9 +481,10 @@ void timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) * @param[out] prescaler : output prescaler parameter */ -void timer_16_bit_compute_closest_prescaler(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_16_bit_prescaler_selection_t * const prescaler); +timer_error_t timer_16_bit_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + const timer_generic_resolution_t resolution, + timer_16_bit_prescaler_selection_t * const prescaler); #define TIMER_16_BIT_MAX_PRESCALER_COUNT (5U) diff --git a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c index 2446f85..b78f97a 100644 --- a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c +++ b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c @@ -79,11 +79,12 @@ uint16_t timer_16_bit_prescaler_to_value(const timer_16_bit_prescaler_selection_ return 0; } -void timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_16_bit_prescaler_selection_t * const prescaler, - uint16_t * const ocr, - uint16_t * const accumulator) +timer_error_t timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + const timer_generic_resolution_t resolution, + timer_16_bit_prescaler_selection_t * const prescaler, + uint16_t * const ocr, + uint16_t * const accumulator) { timer_generic_parameters_t parameters = { @@ -91,19 +92,27 @@ void timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, { .clock_freq = *clock_freq, .target_frequency = *target_freq, - .resolution = TIMER_GENERIC_RESOLUTION_16_BIT, + .resolution = resolution, .prescaler_lookup_array.array = timer_16_bit_prescaler_table, .prescaler_lookup_array.size = TIMER_16_BIT_MAX_PRESCALER_COUNT, }, }; - timer_generic_compute_parameters(¶meters); + + if( TIMER_ERROR_OK != timer_generic_compute_parameters(¶meters)) + { + return TIMER_ERROR_CONFIG; + } + *prescaler = timer_16_bit_prescaler_from_value(¶meters.output.prescaler); *ocr = parameters.output.ocr; *accumulator = parameters.output.accumulator; + + return TIMER_ERROR_OK; } -void timer_16_bit_compute_closest_prescaler(const uint32_t * const clock_freq, +timer_error_t timer_16_bit_compute_closest_prescaler(const uint32_t * const clock_freq, const uint32_t * const target_freq, + const timer_generic_resolution_t resolution, timer_16_bit_prescaler_selection_t * const prescaler) { timer_generic_parameters_t parameters = @@ -112,13 +121,19 @@ void timer_16_bit_compute_closest_prescaler(const uint32_t * const clock_freq, { .clock_freq = *clock_freq, .target_frequency = *target_freq, - .resolution = TIMER_GENERIC_RESOLUTION_16_BIT, + .resolution = resolution, .prescaler_lookup_array.array = timer_16_bit_prescaler_table, .prescaler_lookup_array.size = TIMER_16_BIT_MAX_PRESCALER_COUNT, }, }; - timer_generic_find_closest_prescaler(¶meters); + + if(TIMER_ERROR_OK != timer_generic_find_closest_prescaler(¶meters)) + { + return TIMER_ERROR_CONFIG; + } + *prescaler = parameters.output.prescaler; + return TIMER_ERROR_OK; } static inline timer_error_t check_id(uint8_t id) diff --git a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c index f02c3ed..5c561c6 100644 --- a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c +++ b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c @@ -110,8 +110,8 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, } void timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_prescaler_selection_t * const prescaler) + const uint32_t * const target_freq, + timer_8_bit_prescaler_selection_t * const prescaler) { timer_generic_parameters_t parameters = { diff --git a/Drivers/Timers/Timer_generic/inc/timer_generic.h b/Drivers/Timers/Timer_generic/inc/timer_generic.h index e8347a6..3cbf016 100644 --- a/Drivers/Timers/Timer_generic/inc/timer_generic.h +++ b/Drivers/Timers/Timer_generic/inc/timer_generic.h @@ -70,12 +70,29 @@ typedef enum */ typedef enum { - TIMER_GENERIC_RESOLUTION_8_BIT, /**< Used by all three hardware timer implementations, 8 bit counter */ - TIMER_GENERIC_RESOLUTION_9_BIT, /**< Used only by 16 bit timer, reduced counter span mode (9bits) */ - TIMER_GENERIC_RESOLUTION_10_BIT, /**< Used only by 16 bit timer, reduced counter span mode (10bits) */ - TIMER_GENERIC_RESOLUTION_16_BIT, /**< Used only by 16 bit timer, full span 16 bits counter resolution */ + TIMER_GENERIC_RESOLUTION_UNDEFINED, /**< Default state for this resolution enum */ + TIMER_GENERIC_RESOLUTION_8_BIT, /**< Used by all three hardware timer implementations, 8 bit counter */ + TIMER_GENERIC_RESOLUTION_9_BIT, /**< Used only by 16 bit timer, reduced counter span mode (9bits) */ + TIMER_GENERIC_RESOLUTION_10_BIT, /**< Used only by 16 bit timer, reduced counter span mode (10bits) */ + TIMER_GENERIC_RESOLUTION_16_BIT, /**< Used only by 16 bit timer, full span 16 bits counter resolution */ + TIMER_GENERIC_RESOLUTION_COUNT, /**< Gives the end of the enum values scope, internal use only */ } timer_generic_resolution_t; +/** + * @brief Converts the enum version of timer_generic_resolution_t into its numeric representation + * @param resolution : input resolution, enum form + * @return uint16_t : translated value. If input resolution is set to TIMER_GENERIC_RESOLUTION_UNDEFINED, 0 is returned. + */ +uint16_t timer_generic_resolution_to_top_value(const timer_generic_resolution_t resolution); + +/** + * @brief Converts the a counter top value into its enum representation + * @param top_value : counter top value + * @return timer_generic_resolution_t -> matching enum value, or TIMER_GENERIC_RESOLUTION_UNDEFINED if top_value does not map to + * an existing enum value counterpart + */ +timer_generic_resolution_t timer_generic_resolution_from_top_value(const uint16_t top_value); + /** * @brief Encodes the various timer architecture found in AVR world */ @@ -116,7 +133,6 @@ typedef struct should match the frequency of the external clock source in order to yield adequate results */ uint32_t target_frequency; /**< Expected resulting frequency of underlying timer (represents the number of counter cycles per second) */ - uint16_t top_value; /**< Encodes the maximum value achievable with the targeted hardware timer, based on current hardware configuration */ timer_generic_resolution_t resolution; /**< Underlying timer resolution. Can be 8, 9, 10 or 16 bits or custom (ie : governed by either ICR or OCRA dependending on the selected timer hardware configuration) */ struct @@ -140,6 +156,7 @@ typedef struct a real value in case requested frequency is slower than what hardware timer can achieve using prescalers alone. It is effectively used as a software extension to the hardware based timer counters and as a result allows far lower frequencies */ + uint16_t top_value; /**< Stores the top value of the counter based on resolution enum input parameter */ } output; /**< Ouput field of this struvture is used to provide results of computations to the caller of timer_generic_compute_parameters */ } timer_generic_parameters_t; @@ -147,14 +164,14 @@ typedef struct * @brief Finds the timer parameters in order to get the closest frequency out of the a given Timer * @param parameters : takes the .input field and computes closest values for prescaler, ocr and accumulator values */ -void timer_generic_compute_parameters(timer_generic_parameters_t * const parameters); +timer_error_t timer_generic_compute_parameters(timer_generic_parameters_t * const parameters); /** * @brief finds the closest prescaler value that allows the selected timer to achieve the requested frequency. * Note that its implementation is independent of hardware timer limitations and only results from calculations on frequencies. * @param parameters : input parameters, also serves as output parameter block */ -void timer_generic_find_closest_prescaler(timer_generic_parameters_t * const parameters); +timer_error_t timer_generic_find_closest_prescaler(timer_generic_parameters_t * const parameters); #ifdef __cplusplus } diff --git a/Drivers/Timers/Timer_generic/src/timer_generic.c b/Drivers/Timers/Timer_generic/src/timer_generic.c index a4267f7..e94a219 100644 --- a/Drivers/Timers/Timer_generic/src/timer_generic.c +++ b/Drivers/Timers/Timer_generic/src/timer_generic.c @@ -30,24 +30,57 @@ along with this program. If not, see . #include "timer_generic.h" -void timer_generic_compute_parameters(timer_generic_parameters_t * const parameters) +static const uint16_t resolution_lookup_table[TIMER_GENERIC_RESOLUTION_COUNT] = +{ + [TIMER_GENERIC_RESOLUTION_UNDEFINED] = 0, + [TIMER_GENERIC_RESOLUTION_8_BIT] = TIMER_GENERIC_8_BIT_LIMIT_VALUE, + [TIMER_GENERIC_RESOLUTION_9_BIT] = TIMER_GENERIC_9_BIT_LIMIT_VALUE, + [TIMER_GENERIC_RESOLUTION_10_BIT] = TIMER_GENERIC_10_BIT_LIMIT_VALUE, + [TIMER_GENERIC_RESOLUTION_16_BIT] = TIMER_GENERIC_16_BIT_LIMIT_VALUE, +}; + +uint16_t timer_generic_resolution_to_top_value(const timer_generic_resolution_t resolution) +{ + if((uint8_t)resolution < TIMER_GENERIC_RESOLUTION_COUNT) + { + return resolution_lookup_table[(uint8_t) resolution]; + } + return 0U; +} + +timer_generic_resolution_t timer_generic_resolution_from_top_value(const uint16_t top_value) +{ + for(uint8_t i = 0 ; i < TIMER_GENERIC_RESOLUTION_COUNT ; i++) + { + if(resolution_lookup_table[i] == top_value) + { + return (timer_generic_resolution_t) i; + } + } + return TIMER_GENERIC_RESOLUTION_UNDEFINED; +} + +timer_error_t timer_generic_compute_parameters(timer_generic_parameters_t * const parameters) { const uint32_t freq_ratio = parameters->input.clock_freq / parameters->input.target_frequency; - timer_generic_find_closest_prescaler(parameters); + if (TIMER_ERROR_OK != timer_generic_find_closest_prescaler(parameters)) + { + return TIMER_ERROR_CONFIG; + } - uint32_t computed_ocra = 0; + uint16_t computed_ocra = 0; parameters->output.accumulator = 0; if (0 != parameters->output.prescaler) { // It is possible that this operation produces aliasing because we do not check if // the remainder of this division is exactly 0 (no remainder, clean euclidean division) - computed_ocra = freq_ratio / (uint32_t) parameters->output.prescaler; + computed_ocra = (uint16_t) (freq_ratio / (uint32_t) parameters->output.prescaler); } // Happens when timescale is really large compared to CPU frequency // We have to create an accumulator which will act as a second-stage prescaler - if (computed_ocra >= parameters->input.top_value) + if (computed_ocra >= parameters->output.top_value) { // Select a remainder arbitrarily high to start the algorithm uint16_t min_remainder = 50U; @@ -57,7 +90,7 @@ void timer_generic_compute_parameters(timer_generic_parameters_t * const paramet // Note that 1 is the only candidate for which the remainder will always be 0. // If this takes too long / too much computing power, fallback using 1 and use the accumulator value to // account for the remaining values. - for (uint16_t i = parameters->input.top_value ; i >= 1 ; i--) + for (uint16_t i = parameters->output.top_value ; i >= 1 ; i--) { uint16_t remainder = (computed_ocra % i); if ((0 != remainder) && (remainder < min_remainder)) @@ -90,16 +123,24 @@ void timer_generic_compute_parameters(timer_generic_parameters_t * const paramet //TODO : We might be a bit off. In this case, normally we would have to raise the prescaler one step further and recompute ocra value. parameters->output.ocr = computed_ocra; } + + return TIMER_ERROR_OK; } -void timer_generic_find_closest_prescaler(timer_generic_parameters_t * const parameters) +timer_error_t timer_generic_find_closest_prescaler(timer_generic_parameters_t * const parameters) { const uint32_t freq_ratio = parameters->input.clock_freq / parameters->input.target_frequency; // It is possible that this operation produces aliasing because we do not check if // the remainder of this division is exactly 0 (no remainder, clean euclidean division) - const uint32_t min_prescaler = freq_ratio / (uint32_t) parameters->input.top_value; + uint16_t top_value = timer_generic_resolution_to_top_value(parameters->input.resolution); + if (top_value == 0) + { + return TIMER_ERROR_CONFIG; + } + + const uint16_t min_prescaler = (uint16_t) (freq_ratio / (uint32_t) top_value); parameters->output.prescaler = 1U; uint16_t target_prescaler = 1U; @@ -114,4 +155,5 @@ void timer_generic_find_closest_prescaler(timer_generic_parameters_t * const par } } parameters->output.prescaler = target_prescaler; + return TIMER_ERROR_OK; } diff --git a/Modules/Timebase/src/timebase.c b/Modules/Timebase/src/timebase.c index 225dbcb..2e01aaf 100644 --- a/Modules/Timebase/src/timebase.c +++ b/Modules/Timebase/src/timebase.c @@ -184,6 +184,7 @@ static inline timebase_error_t setup_16_bit_timer(const uint8_t timebase_id, uin timer_16_bit_prescaler_selection_t prescaler; timer_16_bit_compute_matching_parameters(clock_freq, target_freq, + TIMER_GENERIC_RESOLUTION_16_BIT, &prescaler, &ocra, &timebase_internal_config[timebase_id].accumulator.programmed); @@ -283,6 +284,7 @@ timebase_error_t timebase_compute_timer_parameters(const uint8_t id, uint16_t * case TIMER_ARCH_16_BIT: timer_16_bit_compute_matching_parameters(&timebase_static_config[id].clock_freq, &target_frequency, + TIMER_GENERIC_RESOLUTION_16_BIT, (timer_16_bit_prescaler_selection_t *)&prescaler, &ocra, accumulator); From b9af87d5ca47da2bf3d53ed17ba446aa384cd8b7 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Mon, 4 Apr 2022 09:16:33 +0200 Subject: [PATCH 30/51] Almost finished 16 bit PWM devs Signed-off-by: bebenlebricolo --- .../Timers/Timer_16_bit/inc/timer_16_bit.h | 18 ++ .../Timers/Timer_16_bit/src/timer_16_bit.c | 35 +++ Modules/Pwm/src/pwm.c | 221 ++++++++++-------- 3 files changed, 178 insertions(+), 96 deletions(-) diff --git a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h index 0e14ca0..2a28eac 100644 --- a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h +++ b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit.h @@ -346,7 +346,25 @@ timer_error_t timer_16_bit_set_ocrb_register_value(uint8_t id, const uint16_t * */ timer_error_t timer_16_bit_get_ocrb_register_value(uint8_t id, uint16_t * const ocrb); +/** + * @brief sets the targeted timer Input Capture Register value + * @param[in] id : targeted timer id (used to fetch internal configuration based on ids) + * @param[in] icr : icr value to be set + * @return + * TIMER_ERROR_OK : operation succeeded + * TIMER_ERROR_UNKNOWN_TIMER : given id is out of range +*/ +timer_error_t timer_16_bit_set_icr_register_value(uint8_t id, const uint16_t icr); +/** + * @brief fetches given timer Input Capture Register value from memory + * @param[in] id : targeted timer id (used to fetch internal configuration based on ids) + * @param[in] icr : pointer to icr value + * @return + * TIMER_ERROR_OK : operation succeeded + * TIMER_ERROR_UNKNOWN_TIMER : given id is out of range +*/ +timer_error_t timer_16_bit_get_icr_register_value(uint8_t id, uint16_t * const icr); diff --git a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c index b78f97a..4b94084 100644 --- a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c +++ b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c @@ -793,6 +793,41 @@ timer_error_t timer_16_bit_get_ocrb_register_value(uint8_t id, uint16_t * const return ret; } +timer_error_t timer_16_bit_set_icr_register_value(uint8_t id, const uint16_t icr) +{ + timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + + if (TIMER_ERROR_OK != ret) + { + return ret; + } + + *handle->ICR_H = (icr & 0xFF00) >> 8U; + *handle->ICR_L = (icr & 0xFF);; + return ret; +} + +timer_error_t timer_16_bit_get_icr_register_value(uint8_t id, uint16_t * const icr) +{ + timer_error_t ret = check_id(id); + timer_16_bit_handle_t * handle = &timer_16_bit_static_handle[id]; + + if (TIMER_ERROR_OK != ret) + { + return ret; + } + + if ( NULL == icr) + { + return TIMER_ERROR_NULL_POINTER; + } + + *icr = (*handle->ICR_L); + *icr |= (*handle->ICR_H << 8U); + return ret; +} + static timer_error_t timer_16_bit_write_config(uint8_t id, timer_16_bit_config_t * const config) { timer_error_t ret = TIMER_ERROR_OK; diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 6775faa..ee4fe41 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -566,6 +566,68 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p return ret; } +/** + * @brief Retrieves the current time resolution (either 8, 9, 10 or 16 bits) based on the given waveform generation mode + * + * @param waveform : waveform generation mode used by hardware timer implementation + * @return converted value, or TIMER_GENERIC_RESOLUTION_UNDEFINED if input waveform does not match a valid selection + */ +static timer_generic_resolution_t derive_16_bit_timer_resolution_from_waveform_selection(const timer_16_bit_waveform_generation_t waveform) +{ + timer_generic_resolution_t resolution = TIMER_GENERIC_RESOLUTION_UNDEFINED; + switch(waveform) + { + // TOP value is set to 255 + case TIMER16BIT_WG_PWM_FAST_8_bit_FULL_RANGE: + case TIMER16BIT_WG_PWM_PHASE_CORRECT_8_bit_FULL_RANGE: + resolution = TIMER_GENERIC_RESOLUTION_8_BIT; + break; + + // TOP value is set to 511 + case TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE: + case TIMER16BIT_WG_PWM_PHASE_CORRECT_9_bit_FULL_RANGE: + resolution = TIMER_GENERIC_RESOLUTION_9_BIT; + break; + + // Top value is set to 1023 + case TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE: + case TIMER16BIT_WG_PWM_PHASE_CORRECT_10_bit_FULL_RANGE: + resolution = TIMER_GENERIC_RESOLUTION_10_BIT; + break; + // TOP value is governed by ICR register + case TIMER16BIT_WG_PWM_FAST_ICR_MAX: + case TIMER16BIT_WG_PWM_PHASE_CORRECT_ICR_MAX: + case TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_ICR_MAX: + case TIMER16BIT_WG_PWM_FAST_OCRA_MAX: + case TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX: + case TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_OCRA_MAX: + resolution = TIMER_GENERIC_RESOLUTION_16_BIT; + break; + + // Misconfigured Timer, could not proceed further + // The following modes are generally used to trigger interrupts and are not used as PWM modes + // In this context, those values are not valid + case TIMER16BIT_WG_NORMAL: + case TIMER16BIT_WG_CTC_ICR_MAX: + case TIMER16BIT_WG_CTC_OCRA_MAX: + default : + break; + } + + return resolution; +} + +/** + * @brief Specifically targets and configures a single 16 bit hardware timer using PWM expected properties, PWM instance and current timer's input clock frequency + * + * @param index : index of the referenced PWM instance as per configured in static PWM driver configuration table + * @param properties : expected (or desired) PWM properties + * @param clock_freq : current timer's input clock frequency + * @return pwm_error_t + * PWM_ERR_OK : configuration is successful + * PWM_ERR_TIMER_ISSUE : encountered an issue with the underlying timer's capabilities and / or configuration + * PWM_ERR_CONFIG : something is off in the base configuration of either PWM driver or underlying timer 16 bit driver (waveform generation can be off for instance) + */ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) { timer_error_t timerr = TIMER_ERROR_OK; @@ -578,24 +640,27 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ timer_16_bit_waveform_generation_t waveform = TIMER16BIT_WG_NORMAL; pwm_hard_static_config_t * timer_config = &pwm_config[index].config.hard; - - // Compute closest prescaler first - timer_16_bit_compute_closest_prescaler(clock_freq, &properties->frequency, &prescaler); - prescaler_value = timer_16_bit_prescaler_to_value(prescaler); - timerr = timer_16_bit_set_prescaler(index, prescaler); + // We need to probe the waveform generation modes from Timer driver because it drives the way we configure a PWM afterwards + // (Because timer8 bit has some limitations when it comes to having PWMs with full frequency and duty cycle control, a lot depends on the Waveform Generation) + timerr = timer_16_bit_get_waveform_generation(timer_config->timer_index, &waveform); if (TIMER_ERROR_OK != timerr) { return PWM_ERR_TIMER_ISSUE; } - // We need to probe the waveform generation modes from Timer driver because it drives the way we configure a PWM afterwards - // (Because timer8 bit has some limitations when it comes to having PWMs with full frequency and duty cycle control, a lot depends on the Waveform Generation) - timerr = timer_16_bit_get_waveform_generation(timer_config->timer_index, &waveform); + // Retrieve actual current timer resolution based on current waveform generation mode as per set in timer 16 bit registers + timer_generic_resolution_t resolution = derive_16_bit_timer_resolution_from_waveform_selection(waveform); + + // Compute closest prescaler first + timer_16_bit_compute_closest_prescaler(clock_freq, &properties->frequency, resolution, &prescaler); + prescaler_value = timer_16_bit_prescaler_to_value(prescaler); + timerr = timer_16_bit_set_prescaler(index, prescaler); if (TIMER_ERROR_OK != timerr) { return PWM_ERR_TIMER_ISSUE; } + // Select the polarity globally, checking special cases later on if( PWM_HARD_TIMER_UNIT_A == timer_config->unit) { @@ -635,125 +700,84 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ // TOP value is set to 255 case TIMER16BIT_WG_PWM_FAST_8_bit_FULL_RANGE: case TIMER16BIT_WG_PWM_PHASE_CORRECT_8_bit_FULL_RANGE: + // OCR value represents duty_cycle ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U; - if ( PWM_HARD_TIMER_UNIT_A == timer_config->unit) - { - // OCRA value represents the duty_cycle value now - timerr = timer_16_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); - } - else - { - // OCRB value represents the duty_cycle value now - timerr = timer_16_bit_set_ocrb_register_value(timer_config->timer_index, ocr_value); - } - if(TIMER_ERROR_OK != timerr) - { - return PWM_ERR_TIMER_ISSUE; - } - break; // TOP value is set to 511 case TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE: case TIMER16BIT_WG_PWM_PHASE_CORRECT_9_bit_FULL_RANGE: + // OCR value represents duty_cycle ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_9_BIT) / 100U; - if ( PWM_HARD_TIMER_UNIT_A == timer_config->unit) - { - // OCRA value represents the duty_cycle value now - timerr = timer_16_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); - } - else - { - // OCRB value represents the duty_cycle value now - timerr = timer_16_bit_set_ocrb_register_value(timer_config->timer_index, ocr_value); - } - if(TIMER_ERROR_OK != timerr) - { - return PWM_ERR_TIMER_ISSUE; - } break; // Top value is set to 1023 case TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE: case TIMER16BIT_WG_PWM_PHASE_CORRECT_10_bit_FULL_RANGE: + // OCR value represents duty_cycle ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_10_BIT) / 100U; - if ( PWM_HARD_TIMER_UNIT_A == timer_config->unit) - { - // OCRA value represents the duty_cycle value now - timerr = timer_16_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); - } - else - { - // OCRB value represents the duty_cycle value now - timerr = timer_16_bit_set_ocrb_register_value(timer_config->timer_index, ocr_value); - } - if(TIMER_ERROR_OK != timerr) - { - return PWM_ERR_TIMER_ISSUE; - } break; + // TOP value is governed by ICR register case TIMER16BIT_WG_PWM_FAST_ICR_MAX: case TIMER16BIT_WG_PWM_PHASE_CORRECT_ICR_MAX: case TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_ICR_MAX: + // ICR value governs frequency, wheras OCRA/B govern duty cycle + { + uint16_t icr_value = (*clock_freq / (prescaler * properties->frequency)) - 1; + ocr_value = (properties->duty_cycle * icr_value) / 100U; + timerr = timer_16_bit_set_icr_register_value(timer_config->timer_index, icr_value); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + if( PWM_HARD_TIMER_UNIT_A == timer_config->unit) + { + timerr |= timer_16_bit_set_ocra_register_value(timer_config->timer_index, &ocr_value); + } + else + { + timerr |= timer_16_bit_set_ocrb_register_value(timer_config->timer_index, &ocr_value); + } + } break; // TOP value is governed by OCRA value case TIMER16BIT_WG_PWM_FAST_OCRA_MAX: case TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX: case TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_OCRA_MAX: - break; - { - // Select the polarity - if(properties->pol == PWM_POLARITY_NORMAL) - { - // When OCRA is hit, output pin should be cleared (means that output pin is SET high when counter reaches TOP) - timerr = timer_8_bit_async_set_compare_match_A(timer_config->timer_index, TIMER8BIT_CMOD_CLEAR_OCnX); - } - else - { - // When OCRA is hit, output pin should be set (means that output pin is CLEARED low when counter reaches TOP) - timerr = timer_8_bit_async_set_compare_match_A(timer_config->timer_index, TIMER8BIT_CMOD_SET_OCnX); - } - if(TIMER_ERROR_OK != timerr) - { - return PWM_ERR_TIMER_ISSUE; - } - - // OCRA value represents the duty_cycle value now - ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U; - timerr = timer_8_bit_async_set_ocra_register_value(timer_config->timer_index, ocr_value); - if(TIMER_ERROR_OK != timerr) + ocr_value = (*clock_freq / (prescaler * properties->frequency)) - 1; + if ( PWM_HARD_TIMER_UNIT_A == timer_config->unit) { - return PWM_ERR_TIMER_ISSUE; - } - break; - } + // We need to explicitely check that ocr value is greater than 4, because the OCR value has + // to be greater than one, as written in the datasheets + if(ocr_value >= 4U) + { + ocr_value = ocr_value / 2U; + } + else + { + return PWM_ERR_CONFIG; + } + timerr = timer_16_bit_set_ocra_register_value(timer_config->timer_index, &ocr_value); - // TOP value is controlled by OCRA value - { // Here, the only configuration that will make the pin work as a real PWM output (wihtout glitches) is the TIMER8BIT_CMOD_TOGGLE_OCnX - // So it will effectively divide the output frequency by 2 in both Fast PWM mode and Phase correct PWM mode (which already divides output frequency by 2) - timerr = timer_8_bit_async_set_compare_match_A(timer_config->timer_index, TIMER8BIT_ASYNC_CMOD_TOGGLE_OCnX); - if (TIMER_ERROR_OK != timerr) - { - return PWM_ERR_TIMER_ISSUE; - } + // Frequency is governed by OCRA, duty cycle is 50% and frequency is halved because output pin is toggled + // So divide OCRA by 2 (multiplying resulting frequency) in order to still get a 50% duty cycle PWM with the right frequency + timerr |= timer_16_bit_set_compare_match_A(timer_config->timer_index, TIMER16BIT_CMOD_TOGGLE_OCnX); - ocr_value = (*clock_freq / (prescaler_value * properties->frequency)) - 1; - // Trying to compensate for the 50% duty cycle and toggling mode which halves the output frequency - if(ocr_value > 2 ) - { - ocr_value /= 2; } - // TODO : consider using the prescaler as well, for instance if ocra is too small, we might be able to use a higher prescaler - // E.g : ocra can be divided by 8 (say 248 / 8 => 31) and prescaler = 1 then we can use a prescaler of 8 and have ocra at 31, and vice-versa if needed. - timerr = timer_8_bit_async_set_ocra_register_value(index, ocr_value); - if (TIMER_ERROR_OK != timerr) + else { - return PWM_ERR_TIMER_ISSUE; + // OCRA is used to control output frequency, + // OCRB fine tunes the duty_cycle + + // Ocr value will become the OCRB value, using OCRA as the limit counter value (TOP) + ocr_value = (properties->duty_cycle * ocr_value) / 100U; + timerr = timer_16_bit_set_ocra_register_value(timer_config->timer_index, &ocr_value); + timerr |= timer_16_bit_set_ocrb_register_value(timer_config->timer_index, &ocr_value); + timerr |= timer_16_bit_set_compare_match_B(timer_config->timer_index, TIMER16BIT_CMOD_TOGGLE_OCnX); } break; - } // Misconfigured Timer, could not proceed further // The following modes are generally used to trigger interrupts and are not used as PWM modes @@ -764,6 +788,11 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ return PWM_ERR_CONFIG; } + if(TIMER_ERROR_OK != timerr) + { + return PWM_ERR_TIMER_ISSUE; + } + return ret; } From 353ecd8a8a5158290e5fb7bb3597a09b53d843e0 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Tue, 5 Apr 2022 09:13:52 +0200 Subject: [PATCH 31/51] Fixed timer_16_bit tests Signed-off-by: bebenlebricolo --- .../Timer_16_bit/Tests/timer_16_bit_tests.cpp | 12 ++++++------ Drivers/Timers/Timer_generic/src/timer_generic.c | 4 +++- Modules/Pwm/src/pwm.c | 2 -- Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c | 16 ++++++++++------ 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp b/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp index 95a1b4c..c1467db 100644 --- a/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp +++ b/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp @@ -581,15 +581,15 @@ TEST(timer_16_bit_driver_tests, test_parameters_computation_prescaler) uint32_t target_freq = 1'000; uint16_t ocra = 0; uint16_t accumulator = 0; - + timer_generic_resolution_t resolution = TIMER_GENERIC_RESOLUTION_16_BIT; timer_16_bit_prescaler_selection_t prescaler = TIMER16BIT_CLK_PRESCALER_1; - timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, resolution, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_1); ASSERT_EQ(ocra, 15999U); ASSERT_EQ(accumulator, 0U); target_freq = 12'000'000; - timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq , resolution, &prescaler, &ocra, &accumulator); // This timer could not achieve such a target frequency because even in its fastest configuration, // with a prescaler of 1 and ocra of 0, the timer will tick at 16 MHz. // As output frequency is dependent on ocra, an ocra of 1 divides input cpu frequency by 2, which gives 8 MHz. @@ -599,21 +599,21 @@ TEST(timer_16_bit_driver_tests, test_parameters_computation_prescaler) ASSERT_EQ(accumulator, 0U); target_freq = 8'000'000; - timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, resolution, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_1); ASSERT_EQ(ocra, 1U); ASSERT_EQ(accumulator, 0U); clock_freq = 8'000'000; target_freq = 3'000; - timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, resolution, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_1); ASSERT_EQ(ocra, 2665U); ASSERT_EQ(accumulator, 0U); clock_freq = 16'000'000; target_freq = 1U; - timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, &prescaler, &ocra, &accumulator); + timer_16_bit_compute_matching_parameters(&clock_freq, &target_freq, resolution, &prescaler, &ocra, &accumulator); ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_256); ASSERT_EQ(ocra, 62499U); ASSERT_EQ(accumulator, 0U); diff --git a/Drivers/Timers/Timer_generic/src/timer_generic.c b/Drivers/Timers/Timer_generic/src/timer_generic.c index e94a219..9bb2c99 100644 --- a/Drivers/Timers/Timer_generic/src/timer_generic.c +++ b/Drivers/Timers/Timer_generic/src/timer_generic.c @@ -63,6 +63,8 @@ timer_generic_resolution_t timer_generic_resolution_from_top_value(const uint16_ timer_error_t timer_generic_compute_parameters(timer_generic_parameters_t * const parameters) { const uint32_t freq_ratio = parameters->input.clock_freq / parameters->input.target_frequency; + uint16_t top_value = timer_generic_resolution_to_top_value(parameters->input.resolution); + parameters->output.top_value = top_value; if (TIMER_ERROR_OK != timer_generic_find_closest_prescaler(parameters)) { @@ -80,7 +82,7 @@ timer_error_t timer_generic_compute_parameters(timer_generic_parameters_t * cons // Happens when timescale is really large compared to CPU frequency // We have to create an accumulator which will act as a second-stage prescaler - if (computed_ocra >= parameters->output.top_value) + if (computed_ocra >= top_value) { // Select a remainder arbitrarily high to start the algorithm uint16_t min_remainder = 50U; diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index ee4fe41..d5cef9c 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -634,7 +634,6 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ pwm_error_t ret = PWM_ERR_OK; uint16_t ocr_value = 0; - uint16_t prescaler_value = 1U; timer_16_bit_prescaler_selection_t prescaler = TIMER16BIT_CLK_NO_CLOCK; timer_16_bit_waveform_generation_t waveform = TIMER16BIT_WG_NORMAL; @@ -653,7 +652,6 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ // Compute closest prescaler first timer_16_bit_compute_closest_prescaler(clock_freq, &properties->frequency, resolution, &prescaler); - prescaler_value = timer_16_bit_prescaler_to_value(prescaler); timerr = timer_16_bit_set_prescaler(index, prescaler); if (TIMER_ERROR_OK != timerr) { diff --git a/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c b/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c index 3d383b1..f34d14b 100644 --- a/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c +++ b/Modules/Timebase/Tests/Stubs/timer_16_bit_stub.c @@ -63,17 +63,21 @@ void timer_16_bit_stub_reset(void) memset(&configuration, 0, sizeof(configuration_t)); } -void timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_16_bit_prescaler_selection_t * const prescaler, - uint16_t * const ocra, - uint16_t * const accumulator) +timer_error_t timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + const timer_generic_resolution_t resolution, + timer_16_bit_prescaler_selection_t * const prescaler, + uint16_t * const ocr, + uint16_t * const accumulator) { (void) clock_freq; (void) target_freq; + (void) resolution; *prescaler = configuration.prescaler; - *ocra = configuration.ocra; + *ocr = configuration.ocra; *accumulator = configuration.accumulator; + + return TIMER_ERROR_OK; } const timer_generic_prescaler_pair_t timer_16_bit_prescaler_table[TIMER_16_BIT_MAX_PRESCALER_COUNT] = From 0fe435d4d82139c59af169b9f0bf03f210fee108 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 6 Apr 2022 12:28:38 +0200 Subject: [PATCH 32/51] Added pwm module testing skeleton Signed-off-by: bebenlebricolo --- Modules/Pwm/Tests/CMakeLists.txt | 63 +++ Modules/Pwm/Tests/Stubs/config.c | 35 ++ Modules/Pwm/Tests/Stubs/config.h | 12 + Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c | 499 ++++++++++++++++++ Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h | 50 ++ .../Pwm/Tests/Stubs/timer_8_bit_async_stub.c | 432 +++++++++++++++ .../Pwm/Tests/Stubs/timer_8_bit_async_stub.h | 50 ++ Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c | 433 +++++++++++++++ Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h | 52 ++ Modules/Pwm/Tests/pwm_tests.cpp | 55 ++ Modules/Pwm/inc/pwm.h | 4 +- Modules/Pwm/src/pwm.c | 28 +- Tests/CMakeLists.txt | 5 + 13 files changed, 1709 insertions(+), 9 deletions(-) create mode 100644 Modules/Pwm/Tests/CMakeLists.txt create mode 100644 Modules/Pwm/Tests/Stubs/config.c create mode 100644 Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c create mode 100644 Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h create mode 100644 Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c create mode 100644 Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h create mode 100644 Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c create mode 100644 Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h create mode 100644 Modules/Pwm/Tests/pwm_tests.cpp diff --git a/Modules/Pwm/Tests/CMakeLists.txt b/Modules/Pwm/Tests/CMakeLists.txt new file mode 100644 index 0000000..15df423 --- /dev/null +++ b/Modules/Pwm/Tests/CMakeLists.txt @@ -0,0 +1,63 @@ +cmake_minimum_required(VERSION 3.0) + +project(pwm_module_tests C CXX) + +######### Compile tested modules as individual libraries ######### + +if(WIN32) + set(THREAD_LIB "") +else() + set(THREAD_LIB pthread) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weffc++") +endif() + +### timebase_module library ### +add_library(pwm_module STATIC +../src/pwm.c +) +target_include_directories(pwm_module PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/inc + ${CMAKE_CURRENT_SOURCE_DIR}/../inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../Drivers/Timers/Timer_generic/inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../Drivers/Timers/Timer_8_bit/inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../Drivers/Timers/Timer_8_bit_async/inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../Drivers/Timers/Timer_16_bit/inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../Drivers/Io/inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../Timebase/inc + ${CMAKE_CURRENT_SOURCE_DIR}/Stubs +) + +########## Timebase module tests ########## + +add_executable(pwm_module_tests + pwm_tests.cpp + Stubs/timer_8_bit_async_stub.c + Stubs/timer_8_bit_stub.c + Stubs/timer_16_bit_stub.c + Stubs/config.c +) + +target_include_directories(pwm_module_tests PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/inc + ${CMAKE_CURRENT_SOURCE_DIR}/Stubs + ${CMAKE_CURRENT_SOURCE_DIR}/../inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../Drivers/Timers/Timer_generic/inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../Drivers/Timers/Timer_8_bit/inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../Drivers/Timers/Timer_8_bit_async/inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../Drivers/Timers/Timer_16_bit/inc +) + +target_include_directories(pwm_module_tests SYSTEM PUBLIC + ${GTEST_INCLUDE_DIRS} +) + +target_link_libraries(pwm_module_tests + pwm_module + ${GTEST_LIBRARIES} + ${THREAD_LIB} +) + +set_target_properties(pwm_module_tests + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/Modules/Pwm +) \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/config.c b/Modules/Pwm/Tests/Stubs/config.c new file mode 100644 index 0000000..9ff488f --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/config.c @@ -0,0 +1,35 @@ +#include "config.h" + +#include "pwm.h" + +pwm_static_config_t pwm_config[PWM_TOTAL_INSTANCES] = +{ + // Motors usually require fast PWMs signals in order to fully take advantage of + // their inductances's current smoothing capabilities. + // Also, a good timing might be observed in order to keep the motor in sync, so we need a predictable/repeatable + // PWM signal generation scheme, which is achievable through the use of a hardware PWM channel. + [PWM_MOTOR_INDEX] = + { + .type = PWM_TYPE_HARDWARE, + .config.hard = + { + .arch = TIMER_ARCH_8_BIT, + .timer_index = 0U, + .unit = PWM_HARD_TIMER_UNIT_A + } + }, + + // Fans usually require slow PWMs and can easily be handled by software PWM module + // so that we don't waste hardware PWM channels. + // As a result, it requires the IO index as per written in IO driver static configuration + // and the timebase used by this program, so we can select different timebases if necessary + [PWM_FAN_INDEX] = + { + .type = PWM_TYPE_SOFTWARE, + .config.soft = + { + .io_index = PWM_FAN_IO_INDEX, + .timebase_index = PWM_FAN_TIMEBASE_INDEX + } + } +}; \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/config.h b/Modules/Pwm/Tests/Stubs/config.h index 3477d5a..dd3b117 100644 --- a/Modules/Pwm/Tests/Stubs/config.h +++ b/Modules/Pwm/Tests/Stubs/config.h @@ -8,6 +8,18 @@ extern "C" #define PWM_MAX_HARD_INSTANCES 1U #define PWM_MAX_SOFT_INSTANCES 1U +#define TIMEBASE_MAX_MODULES 1U +#define TIMER_8_BIT_COUNT 1U +#define TIMER_8_BIT_ASYNC_COUNT 1U +#define TIMER_16_BIT_COUNT 1U +#define IO_MAX_PINS 28U + + +// Mapping of PWM signals as per configured in pwm_config, in config.c file +#define PWM_MOTOR_INDEX 0U +#define PWM_FAN_INDEX 1U +#define PWM_FAN_IO_INDEX 0U /**< Gives the index of the IO pin in IO driver static configuration */ +#define PWM_FAN_TIMEBASE_INDEX 0U /**< Gives the index of the reference timebase as per written in timebase static configuration */ #ifdef __cplusplus } diff --git a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c new file mode 100644 index 0000000..ecc79a8 --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c @@ -0,0 +1,499 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "timer_16_bit_stub.h" +#include "string.h" + +typedef struct +{ + timer_16_bit_prescaler_selection_t prescaler; + uint16_t ocra; + uint16_t ocrb; + uint16_t icr; + uint32_t accumulator; + bool initialised; +} configuration_t; + +static configuration_t configuration = {0}; + +static inline bool id_is_valid(const uint8_t id) +{ + return (id < TIMER_16_BIT_STUB_MAX_INSTANCES); +} + +void timer_16_bit_stub_set_next_parameters(const timer_16_bit_prescaler_selection_t prescaler, const uint16_t ocra, const uint32_t accumulator) +{ + configuration.prescaler = prescaler; + configuration.ocra = ocra; + configuration.accumulator = accumulator; +} + +void timer_16_bit_stub_set_initialised(const bool initialised) +{ + configuration.initialised = initialised; +} + +void timer_16_bit_stub_reset(void) +{ + memset(&configuration, 0, sizeof(configuration_t)); +} + +timer_error_t timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + const timer_generic_resolution_t resolution, + timer_16_bit_prescaler_selection_t * const prescaler, + uint16_t * const ocr, + uint16_t * const accumulator) +{ + (void) clock_freq; + (void) target_freq; + (void) resolution; + *prescaler = configuration.prescaler; + *ocr = configuration.ocra; + *accumulator = configuration.accumulator; + + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + const timer_generic_resolution_t resolution, + timer_16_bit_prescaler_selection_t * const prescaler) +{ + timer_generic_parameters_t parameters = + { + .input = + { + .clock_freq = *clock_freq, + .target_frequency = *target_freq, + .resolution = resolution, + .prescaler_lookup_array.size = TIMER_16_BIT_MAX_PRESCALER_COUNT, + }, + }; + + *prescaler = parameters.output.prescaler; + return TIMER_ERROR_OK; +} + +const timer_generic_prescaler_pair_t timer_16_bit_prescaler_table[TIMER_16_BIT_MAX_PRESCALER_COUNT] = +{ + {.value = 1, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_1 }, + {.value = 8, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_8 }, + {.value = 64, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_64 }, + {.value = 256, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_256 }, + {.value = 1024, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_1024 }, +}; + +timer_16_bit_prescaler_selection_t timer_16_bit_prescaler_from_value(uint16_t const * const input_prescaler) +{ + for (uint8_t i = 0 ; i < TIMER_16_BIT_MAX_PRESCALER_COUNT ; i++) + { + if (*input_prescaler == timer_16_bit_prescaler_table[i].value) + { + return (timer_16_bit_prescaler_selection_t) timer_16_bit_prescaler_table[i].type; + } + } + return TIMER16BIT_CLK_NO_CLOCK; +} + +uint16_t timer_16_bit_prescaler_to_value(const timer_16_bit_prescaler_selection_t prescaler) +{ + for (uint8_t i = 0 ; i < TIMER_16_BIT_MAX_PRESCALER_COUNT ; i++) + { + if (prescaler == timer_16_bit_prescaler_table[i].type) + { + return timer_16_bit_prescaler_table[i].value; + } + } + return 0; +} + +timer_error_t timer_16_bit_set_icr_register_value(uint8_t id, const uint16_t icr) +{ + (void) id; + configuration.icr = icr; + return TIMER_ERROR_OK; +} + + +timer_error_t timer_16_bit_get_default_config(timer_16_bit_config_t * config) +{ + timer_error_t ret = TIMER_ERROR_OK; + if (TIMER_ERROR_OK != ret) + { + return ret; + } + + if (NULL == config) + { + return TIMER_ERROR_NULL_POINTER; + } + + /* Resets everything */ + config->interrupt_config.it_comp_match_a = false; + config->interrupt_config.it_comp_match_b = false; + config->interrupt_config.it_timer_overflow = false; + config->interrupt_config.it_input_capture = false ; + + config->timing_config.counter = 0U; + config->timing_config.ocra_val = 0U; + config->timing_config.ocrb_val = 0U; + config->timing_config.prescaler = TIMER16BIT_CLK_NO_CLOCK; + config->timing_config.waveform_mode = TIMER16BIT_WG_NORMAL; + config->timing_config.comp_match_a = TIMER16BIT_CMOD_NORMAL; + config->timing_config.comp_match_b = TIMER16BIT_CMOD_NORMAL; + + config->force_compare.force_comp_match_a = false; + config->force_compare.force_comp_match_b = false; + config->input_capture.edge_select = TIMER16BIT_INPUT_CAPTURE_EDGE_FALLING_EDGE; + config->input_capture.use_noise_canceler = false; + + return ret; +} + +timer_error_t timer_16_bit_set_handle(uint8_t id, timer_16_bit_handle_t * const handle) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) handle; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_handle(uint8_t id, timer_16_bit_handle_t * const handle) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) handle; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_set_force_compare_config(uint8_t id, timer_16_bit_force_compare_config_t * const force_comp_config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) force_comp_config; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_force_compare_config(uint8_t id, timer_16_bit_force_compare_config_t * force_comp_config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) force_comp_config; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_set_interrupt_config(uint8_t id, timer_16_bit_interrupt_config_t * const it_config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) it_config; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_interrupt_config(uint8_t id, timer_16_bit_interrupt_config_t * it_config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) it_config; + return TIMER_ERROR_OK; +} + +#ifdef UNIT_TESTING +timer_error_t timer_16_bit_get_interrupt_flags(uint8_t id, timer_16_bit_interrupt_config_t * it_flags) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) it_flags; + return TIMER_ERROR_OK; +} +#endif + +timer_error_t timer_16_bit_set_prescaler(uint8_t id, const timer_16_bit_prescaler_selection_t prescaler) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) prescaler; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_prescaler(uint8_t id, timer_16_bit_prescaler_selection_t * prescaler) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) prescaler; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_set_compare_match_A(uint8_t id, const timer_16_bit_compare_output_mode_t compA) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) compA; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_compare_match_A(uint8_t id, timer_16_bit_compare_output_mode_t * compA) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) compA; + return TIMER_ERROR_OK; +} + + +timer_error_t timer_16_bit_set_input_compare_noise_canceler(uint8_t id, const bool enabled) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) enabled; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_input_compare_noise_canceler(uint8_t id, bool * const enabled) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) enabled; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_set_input_compare_edge_select(uint8_t id, const timer_16_bit_input_capture_edge_select_flag_t edge) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) edge; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_input_compare_edge_select(uint8_t id, timer_16_bit_input_capture_edge_select_flag_t * const edge) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) edge; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_input_capture_value(uint8_t id, uint16_t * ticks) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ticks; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_set_compare_match_B(uint8_t id, timer_16_bit_compare_output_mode_t compB) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) compB; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_compare_match_B(uint8_t id, timer_16_bit_compare_output_mode_t * compB) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) compB; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_set_waveform_generation(uint8_t id, const timer_16_bit_waveform_generation_t waveform) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) waveform; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_waveform_generation(uint8_t id, timer_16_bit_waveform_generation_t * waveform) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) waveform; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_set_counter_value(uint8_t id, const uint16_t * const ticks) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ticks; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_counter_value(uint8_t id, uint16_t * const ticks) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ticks; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_set_ocra_register_value(uint8_t id, const uint16_t * const ocra) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ocra; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_ocra_register_value(uint8_t id, uint16_t * const ocra) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ocra; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_set_ocrb_register_value(uint8_t id, const uint16_t * const ocrb) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ocrb; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_get_ocrb_register_value(uint8_t id, uint16_t * const ocrb) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ocrb; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_init(uint8_t id, timer_16_bit_config_t * const config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) config; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_reconfigure(uint8_t id, timer_16_bit_config_t * const config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) config; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_deinit(uint8_t id) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_start(uint8_t id) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_stop(uint8_t id) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_16_bit_is_initialised(const uint8_t id, bool * const initialised) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + *initialised = configuration.initialised; + return TIMER_ERROR_OK; +} \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h new file mode 100644 index 0000000..4c17e53 --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h @@ -0,0 +1,50 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef TIMER_16_BIT_STUB_HEADER +#define TIMER_16_BIT_STUB_HEADER + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "timer_16_bit.h" +#define TIMER_16_BIT_STUB_MAX_INSTANCES (1U) + +void timer_16_bit_stub_set_next_parameters(const timer_16_bit_prescaler_selection_t prescaler, const uint16_t ocra, const uint32_t accumulator); +void timer_16_bit_stub_set_initialised(const bool initialised); +void timer_16_bit_stub_reset(void); +#ifdef __cplusplus +} +#endif + + +#endif /* TIMER_16_BIT_STUB_HEADER */ \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c new file mode 100644 index 0000000..655a688 --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c @@ -0,0 +1,432 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "timer_8_bit_async_stub.h" +#include "string.h" + +typedef struct +{ + timer_8_bit_async_prescaler_selection_t prescaler; + uint8_t ocra; + uint32_t accumulator; + bool initialised; +} configuration_t; + +static configuration_t configuration = {0}; + +static inline bool id_is_valid(const uint8_t id) +{ + return (id < TIMER_8_BIT_ASYNC_STUB_MAX_INSTANCES); +} + +void timer_8_bit_async_stub_set_next_parameters(const timer_8_bit_async_prescaler_selection_t prescaler, const uint8_t ocra, const uint32_t accumulator) +{ + configuration.prescaler = prescaler; + configuration.ocra = ocra; + configuration.accumulator = accumulator; +} + +void timer_8_bit_async_stub_set_initialised(const bool initialised) +{ + configuration.initialised = initialised; +} + +void timer_8_bit_async_stub_reset(void) +{ + memset(&configuration, 0, sizeof(configuration_t)); +} + +void timer_8_bit_async_compute_matching_parameters( const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_async_prescaler_selection_t * const prescaler, + uint8_t * const ocra, + uint16_t * const accumulator) +{ + (void) clock_freq; + (void) target_freq; + *prescaler = configuration.prescaler; + *ocra = configuration.ocra; + *accumulator = configuration.accumulator; +} + +void timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_async_prescaler_selection_t * const prescaler) +{ + timer_generic_parameters_t parameters = + { + .input = + { + .clock_freq = *clock_freq, + .target_frequency = *target_freq, + .resolution = TIMER_GENERIC_RESOLUTION_8_BIT, + .prescaler_lookup_array.size = TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT, + }, + }; + *prescaler = parameters.output.prescaler; +} + + +const timer_generic_prescaler_pair_t timer_8_bit_async_prescaler_table[TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT] = +{ + {.value = 1, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_1 }, + {.value = 8, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_8 }, + {.value = 32, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_32 }, + {.value = 64, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_64 }, + {.value = 128, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_128 }, + {.value = 256, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_256 }, + {.value = 1024, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_1024 }, +}; + +timer_8_bit_async_prescaler_selection_t timer_8_bit_async_prescaler_from_value(uint16_t const * const input_prescaler) +{ + for (uint8_t i = 0 ; i < TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT ; i++) + { + if (*input_prescaler == timer_8_bit_async_prescaler_table[i].value) + { + return (timer_8_bit_async_prescaler_selection_t) timer_8_bit_async_prescaler_table[i].type; + } + } + return TIMER8BIT_ASYNC_CLK_NO_CLOCK; +} + +uint16_t timer_8_bit_async_prescaler_to_value(const timer_8_bit_async_prescaler_selection_t prescaler) +{ + for (uint8_t i = 0 ; i < TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT ; i++) + { + if (prescaler == timer_8_bit_async_prescaler_table[i].type) + { + return timer_8_bit_async_prescaler_table[i].value; + } + } + return 0; +} + +timer_error_t timer_8_bit_async_get_default_config(timer_8_bit_async_config_t * config) +{ + timer_error_t ret = TIMER_ERROR_OK; + if (TIMER_ERROR_OK != ret) + { + return ret; + } + + if (NULL == config) + { + return TIMER_ERROR_NULL_POINTER; + } + + /* Resets everything */ + config->interrupt_config.it_comp_match_a = false; + config->interrupt_config.it_comp_match_b = false; + config->interrupt_config.it_timer_overflow = false; + + config->timing_config.counter = 0U; + config->timing_config.ocra_val = 0U; + config->timing_config.ocrb_val = 0U; + config->timing_config.prescaler = TIMER8BIT_ASYNC_CLK_NO_CLOCK; + config->timing_config.waveform_mode = TIMER8BIT_ASYNC_WG_NORMAL; + config->timing_config.comp_match_a = TIMER8BIT_ASYNC_CMOD_NORMAL; + config->timing_config.comp_match_b = TIMER8BIT_ASYNC_CMOD_NORMAL; + config->timing_config.clock_source = TIMER8BIT_ASYNC_CLK_SOURCE_INTERNAL; + + config->force_compare.force_comp_match_a = false; + config->force_compare.force_comp_match_b = false; + + return ret; +} + +timer_error_t timer_8_bit_async_set_handle(uint8_t id, timer_8_bit_async_handle_t * const handle) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) handle; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_get_handle(uint8_t id, timer_8_bit_async_handle_t * const handle) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) handle; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_set_force_compare_config(uint8_t id, timer_8_bit_async_force_compare_config_t * const force_comp_config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) force_comp_config; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_get_force_compare_config(uint8_t id, timer_8_bit_async_force_compare_config_t * force_comp_config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) force_comp_config; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_set_interrupt_config(uint8_t id, timer_8_bit_async_interrupt_config_t * const it_config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) it_config; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_get_interrupt_config(uint8_t id, timer_8_bit_async_interrupt_config_t * it_config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) it_config; + return TIMER_ERROR_OK; +} + +#ifdef UNIT_TESTING +timer_error_t timer_8_bit_async_get_interrupt_flags(uint8_t id, timer_8_bit_async_interrupt_config_t * it_flags) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) it_flags; + return TIMER_ERROR_OK; +} +#endif + +timer_error_t timer_8_bit_async_set_prescaler(uint8_t id, const timer_8_bit_async_prescaler_selection_t prescaler) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) prescaler; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_get_prescaler(uint8_t id, timer_8_bit_async_prescaler_selection_t * prescaler) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) prescaler; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_set_compare_match_A(uint8_t id, const timer_8_bit_async_compare_output_mode_t compA) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) compA; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_get_compare_match_A(uint8_t id, timer_8_bit_async_compare_output_mode_t * compA) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) compA; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_set_compare_match_B(uint8_t id, timer_8_bit_async_compare_output_mode_t compB) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) compB; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_get_compare_match_B(uint8_t id, timer_8_bit_async_compare_output_mode_t * compB) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) compB; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_set_waveform_generation(uint8_t id, const timer_8_bit_async_waveform_generation_t waveform) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) waveform; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_get_waveform_generation(uint8_t id, timer_8_bit_async_waveform_generation_t * const waveform) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) waveform; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_set_counter_value(uint8_t id, const uint8_t ticks) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ticks; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_get_counter_value(uint8_t id, uint8_t * ticks) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ticks; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_set_ocra_register_value(uint8_t id, uint8_t ocra) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ocra; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_get_ocra_register_value(uint8_t id, uint8_t * ocra) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ocra; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_set_ocrb_register_value(uint8_t id, uint8_t ocrb) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ocrb; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_get_ocrb_register_value(uint8_t id, uint8_t * ocrb) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) ocrb; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_init(uint8_t id, timer_8_bit_async_config_t * const config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) config; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_reconfigure(uint8_t id, timer_8_bit_async_config_t * const config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + (void) config; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_deinit(uint8_t id) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_start(uint8_t id) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_stop(uint8_t id) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_async_is_initialised(const uint8_t id, bool * const initialised) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + *initialised = configuration.initialised; + return TIMER_ERROR_OK; +} \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h new file mode 100644 index 0000000..bc9d96c --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h @@ -0,0 +1,50 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef TIMER_8_BIT_ASYNC_STUB_HEADER +#define TIMER_8_BIT_ASYNC_STUB_HEADER + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "timer_8_bit_async.h" +#define TIMER_8_BIT_ASYNC_STUB_MAX_INSTANCES (1U) + +void timer_8_bit_async_stub_set_next_parameters(const timer_8_bit_async_prescaler_selection_t prescaler, const uint8_t ocra, const uint32_t accumulator); +void timer_8_bit_async_stub_set_initialised(const bool initialised); +void timer_8_bit_async_stub_reset(void); +#ifdef __cplusplus +} +#endif + + +#endif /* TIMER_8_BIT_ASYNC_STUB_HEADER */ \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c new file mode 100644 index 0000000..5850863 --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c @@ -0,0 +1,433 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "timer_8_bit_stub.h" +#include "string.h" + + +typedef struct +{ + timer_8_bit_prescaler_selection_t prescaler; + uint8_t ocra; + uint32_t accumulator; + bool initialised; + timer_8_bit_config_t driver_config; +} configuration_t; + +static configuration_t configuration = {0}; + +static inline bool id_is_valid(const uint8_t id) +{ + return (id < TIMER_8_BIT_STUB_MAX_INSTANCES); +} + +void timer_8_bit_stub_set_next_parameters(const timer_8_bit_prescaler_selection_t prescaler, const uint8_t ocra, const uint32_t accumulator) +{ + configuration.prescaler = prescaler; + configuration.ocra = ocra; + configuration.accumulator = accumulator; +} + +void timer_8_bit_stub_set_initialised(const bool initialised) +{ + configuration.initialised = initialised; +} + +void timer_8_bit_stub_reset(void) +{ + memset(&configuration, 0, sizeof(configuration_t)); +} + +void timer_8_bit_stub_get_driver_configuration(timer_8_bit_config_t * const config) +{ + *config = configuration.driver_config; +} + +void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_prescaler_selection_t * const prescaler, + uint8_t * const ocra, + uint16_t * const accumulator) +{ + (void) clock_freq; + (void) target_freq; + *prescaler = configuration.prescaler; + *ocra = configuration.ocra; + *accumulator = configuration.accumulator; +} + +void timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_prescaler_selection_t * const prescaler) +{ + timer_generic_parameters_t parameters = + { + .input = + { + .clock_freq = *clock_freq, + .target_frequency = *target_freq, + .resolution = TIMER_GENERIC_RESOLUTION_8_BIT, + .prescaler_lookup_array.size = TIMER_8_BIT_MAX_PRESCALER_COUNT, + }, + }; + *prescaler = parameters.output.prescaler; +} + +const timer_generic_prescaler_pair_t timer_8_bit_prescaler_table[TIMER_8_BIT_MAX_PRESCALER_COUNT] = +{ + {.value = 1U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_1 }, + {.value = 8U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_8 }, + {.value = 64U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_64 }, + {.value = 256U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_256 }, + {.value = 1024U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_1024 }, +}; + +timer_8_bit_prescaler_selection_t timer_8_bit_prescaler_from_value(uint16_t const * const input_prescaler) +{ + for (uint8_t i = 0 ; i < TIMER_8_BIT_MAX_PRESCALER_COUNT ; i++) + { + if (*input_prescaler == timer_8_bit_prescaler_table[i].value) + { + return (timer_8_bit_prescaler_selection_t) timer_8_bit_prescaler_table[i].type; + } + } + return TIMER8BIT_CLK_NO_CLOCK; +} + +uint16_t timer_8_bit_prescaler_to_value(const timer_8_bit_prescaler_selection_t prescaler) +{ + for (uint8_t i = 0 ; i < TIMER_8_BIT_MAX_PRESCALER_COUNT ; i++) + { + if (prescaler == timer_8_bit_prescaler_table[i].type) + { + return timer_8_bit_prescaler_table[i].value; + } + } + return 0; +} + +timer_error_t timer_8_bit_get_default_config(timer_8_bit_config_t * config) +{ + timer_error_t ret = TIMER_ERROR_OK; + if (TIMER_ERROR_OK != ret) + { + return ret; + } + + if (NULL == config) + { + return TIMER_ERROR_NULL_POINTER; + } + + /* Resets everything */ + config->interrupt_config.it_comp_match_a = false; + config->interrupt_config.it_comp_match_b = false; + config->interrupt_config.it_timer_overflow = false; + + config->timing_config.counter = 0U; + config->timing_config.ocra_val = 0U; + config->timing_config.ocrb_val = 0U; + config->timing_config.prescaler = TIMER8BIT_CLK_NO_CLOCK; + config->timing_config.waveform_mode = TIMER8BIT_WG_NORMAL; + config->timing_config.comp_mode_a = TIMER8BIT_CMOD_NORMAL; + config->timing_config.comp_mode_b = TIMER8BIT_CMOD_NORMAL; + + config->force_compare.force_comp_match_a = false; + config->force_compare.force_comp_match_b = false; + + return ret; +} + +timer_error_t timer_8_bit_set_handle(uint8_t id, timer_8_bit_handle_t * const handle) +{ + (void) handle; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_get_handle(uint8_t id, timer_8_bit_handle_t * const handle) +{ + (void) handle; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + } + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_set_force_compare_config(uint8_t id, timer_8_bit_force_compare_config_t * const force_comp_config) +{ + (void) force_comp_config; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_get_force_compare_config(uint8_t id, timer_8_bit_force_compare_config_t * force_comp_config) +{ + (void) force_comp_config; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_set_interrupt_config(uint8_t id, timer_8_bit_interrupt_config_t * const it_config) +{ + (void) it_config; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt_config_t * it_config) +{ + (void) it_config; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +#ifdef UNIT_TESTING +timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_config_t * it_flags) +{ + (void) it_flags; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} +#endif + +timer_error_t timer_8_bit_set_prescaler(uint8_t id, const timer_8_bit_prescaler_selection_t prescaler) +{ + (void) prescaler; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_get_prescaler(uint8_t id, timer_8_bit_prescaler_selection_t * prescaler) +{ + (void) prescaler; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_set_compare_match_A(uint8_t id, const timer_8_bit_compare_output_mode_t compA) +{ + (void) compA; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_get_compare_match_A(uint8_t id, timer_8_bit_compare_output_mode_t * compA) +{ + (void) compA; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_set_compare_match_B(uint8_t id, timer_8_bit_compare_output_mode_t compB) +{ + (void) compB; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_get_compare_match_B(uint8_t id, timer_8_bit_compare_output_mode_t * compB) +{ + (void) compB; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_set_waveform_generation(uint8_t id, const timer_8_bit_waveform_generation_t waveform) +{ + (void) waveform; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_get_waveform_generation(uint8_t id, timer_8_bit_waveform_generation_t * waveform) +{ + (void) waveform; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_set_counter_value(uint8_t id, const uint8_t ticks) +{ + (void) ticks; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_get_counter_value(uint8_t id, uint8_t * ticks) +{ + (void) ticks; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_set_ocra_register_value(uint8_t id, uint8_t ocra) +{ + (void) ocra; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_get_ocra_register_value(uint8_t id, uint8_t * ocra) +{ + (void) ocra; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_set_ocrb_register_value(uint8_t id, uint8_t ocrb) +{ + (void) id; + (void) ocrb; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_get_ocrb_register_value(uint8_t id, uint8_t * ocrb) +{ + (void) ocrb; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_init(uint8_t id, timer_8_bit_config_t * const config) +{ + (void) config; + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_reconfigure(uint8_t id, timer_8_bit_config_t * const config) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + configuration.driver_config = *config; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_deinit(uint8_t id) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_start(uint8_t id) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_stop(uint8_t id) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + return TIMER_ERROR_OK; +} + +timer_error_t timer_8_bit_is_initialised(const uint8_t id, bool * const initialised) +{ + if (!id_is_valid(id)) + { + return TIMER_ERROR_UNKNOWN_TIMER; + }; + *initialised = configuration.initialised; + return TIMER_ERROR_OK; +} \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h new file mode 100644 index 0000000..22d9562 --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h @@ -0,0 +1,52 @@ +/* + +------------------ +@ +FreeMyCode version : 1.0 RC alpha + Author : bebenlebricolo + License : + name : GPLv3 + url : https://www.gnu.org/licenses/quick-guide-gplv3.html + Date : 12/02/2021 + Project : LabBenchPowerSupply + Description : The Lab Bench Power Supply provides a simple design based around an Arduino Nano board to convert AC main voltage into + smaller ones, ranging from 0V to 16V, with voltage and current regulations +@ +------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef TIMER_8_BIT_STUB_HEADER +#define TIMER_8_BIT_STUB_HEADER + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "timer_8_bit.h" +#define TIMER_8_BIT_STUB_MAX_INSTANCES (1U) + +void timer_8_bit_stub_set_next_parameters(const timer_8_bit_prescaler_selection_t prescaler, const uint8_t ocra, const uint32_t accumulator); +void timer_8_bit_stub_set_initialised(const bool initialised); +void timer_8_bit_stub_reset(void); +void timer_8_bit_stub_get_driver_configuration(timer_8_bit_config_t * const config); + +#ifdef __cplusplus +} +#endif + + +#endif /* TIMER_8_BIT_STUB_HEADER */ \ No newline at end of file diff --git a/Modules/Pwm/Tests/pwm_tests.cpp b/Modules/Pwm/Tests/pwm_tests.cpp new file mode 100644 index 0000000..6231866 --- /dev/null +++ b/Modules/Pwm/Tests/pwm_tests.cpp @@ -0,0 +1,55 @@ +#include + +#include "pwm.h" +#include "timebase.h" + +#include "timer_8_bit.h" +#include "timer_8_bit_stub.h" + +#include "timer_16_bit.h" +#include "timer_16_bit_stub.h" + +#include "timer_8_bit_async.h" +#include "timer_8_bit_async_stub.h" + + +class PwmModuleTestSuite : public ::testing::Test +{ +public: + void SetUp(void) override + { + } + + void TearDown(void) override + { + } +}; + +TEST_F(PwmModuleTestSuite, test_single_hard_config) +{ + // Rewritting parts of pwm_config + pwm_config[0].type = PWM_TYPE_HARDWARE; + pwm_config[0].config.hard.arch = TIMER_ARCH_8_BIT; + pwm_config[0].config.hard.timer_index = 0U; + pwm_config[0].config.hard.unit = PWM_HARD_TIMER_UNIT_A; + + pwm_error_t error = PWM_ERR_OK; + + //Should return a PWM_ERR_CONFIG as underlying timers are not initialised yet + error = pwm_init(); + ASSERT_EQ(PWM_ERR_CONFIG, error); + + // Init the timer_8_bit beforehand + timer_8_bit_stub_set_initialised(true); + error = pwm_init(); + ASSERT_EQ(PWM_ERR_OK, error); + +} + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + + diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index 58bf5ab..8e5ec66 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -22,6 +22,8 @@ extern "C" #warning "PWM_MAX_HARD_INSTANCES macro not defined in config.h, fallsback to 1U by default" #endif +#define PWM_TOTAL_INSTANCES (PWM_MAX_SOFT_INSTANCES + PWM_MAX_SOFT_INSTANCES) + /** * @brief PWM module error types used to inform caller how operations performed. */ @@ -261,7 +263,7 @@ pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const // Static configuration for both software based and hardware based pwms -extern pwm_static_config_t pwm_config[PWM_MAX_SOFT_INSTANCES + PWM_MAX_HARD_INSTANCES]; /** Static compile-time configuration used by this driver (needs to be implemented in config.c)*/ +extern pwm_static_config_t pwm_config[PWM_TOTAL_INSTANCES]; /** Static compile-time configuration used by this driver (needs to be implemented in config.c)*/ #ifdef __cplusplus diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index d5cef9c..033d651 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -37,7 +37,7 @@ static struct } soft_config[PWM_MAX_SOFT_INSTANCES] = {0}; -static pwm_error_t pwm_init_single_hard(const uint8_t index); +static pwm_error_t pwm_init_single_hard(pwm_hard_static_config_t const * const config); /** * @brief Configures a single timer 8 bit instance based on common parameters @@ -78,9 +78,23 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ pwm_error_t pwm_init(void) { pwm_error_t err = PWM_ERR_OK; - for (uint8_t i = 0 ; i < PWM_MAX_HARD_INSTANCES ; i++) + + uint8_t hard_config_count = 0; + pwm_hard_static_config_t const * hard_config[PWM_MAX_HARD_INSTANCES] = {0}; + // Iterate over pwm_config and search hard configurations + for (uint8_t i = 0 ; i < PWM_TOTAL_INSTANCES ; i++) + { + if(PWM_TYPE_HARDWARE == pwm_config[i].type) + { + hard_config[hard_config_count] = &pwm_config[i].config.hard; + hard_config_count++; + } + } + + // Configure all retrieved hard configs now + for (uint8_t i = 0 ; i < hard_config_count ; i++) { - err |= pwm_init_single_hard(i); + err |= pwm_init_single_hard(hard_config[i]); } if (err != PWM_ERR_OK) @@ -92,11 +106,10 @@ pwm_error_t pwm_init(void) } -static pwm_error_t check_initialisation(const uint8_t index) +static pwm_error_t check_initialisation(pwm_hard_static_config_t const * const config) { pwm_error_t err = PWM_ERR_OK; bool timer_initialised = false; - pwm_hard_static_config_t * config = &pwm_config[index].config.hard; timer_error_t timerr = TIMER_ERROR_OK; switch(config->arch) { @@ -133,13 +146,12 @@ static pwm_error_t check_initialisation(const uint8_t index) // This function essentially checks timer are setup correctly // and initialisation steps were performed prior to use the pwm driver. -static pwm_error_t pwm_init_single_hard(const uint8_t index) +static pwm_error_t pwm_init_single_hard(pwm_hard_static_config_t const * const config) { pwm_error_t ret = PWM_ERR_OK; - pwm_hard_static_config_t * config = &pwm_config[index].config.hard; timer_error_t timerr = TIMER_ERROR_OK; - ret = check_initialisation(index); + ret = check_initialisation(config); if(PWM_ERR_OK == ret) { switch(config->arch) diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 923ebee..5c705cc 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -72,4 +72,9 @@ add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Drivers/Io/Tests # Modules add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Modules/Timebase/Tests ${CMAKE_CURRENT_BINARY_DIR}/Tests/Modules/Timebase +) + +# Modules +add_subdirectory( ${CMAKE_CURRENT_SOURCE_DIR}/../Modules/Pwm/Tests + ${CMAKE_CURRENT_BINARY_DIR}/Tests/Modules/Pwm ) \ No newline at end of file From 4bdf53d17b50c94fde55640a07295d67c28f63c6 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Fri, 8 Apr 2022 17:06:07 +0200 Subject: [PATCH 33/51] Implemented some configuration tests + small refacto Signed-off-by: bebenlebricolo --- Modules/Pwm/Tests/CMakeLists.txt | 1 + Modules/Pwm/Tests/Stubs/config.c | 39 ++- Modules/Pwm/Tests/Stubs/config.h | 8 +- Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c | 51 ++-- .../Pwm/Tests/Stubs/timer_8_bit_async_stub.c | 24 +- Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c | 253 +++++++----------- Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h | 19 +- Modules/Pwm/Tests/pwm_tests.cpp | 110 +++++++- Modules/Pwm/examples/config.c | 65 ++--- Modules/Pwm/examples/config.h | 8 +- Modules/Pwm/inc/pwm.h | 48 ++-- Modules/Pwm/src/pwm.c | 245 ++++++++++++----- 12 files changed, 514 insertions(+), 357 deletions(-) diff --git a/Modules/Pwm/Tests/CMakeLists.txt b/Modules/Pwm/Tests/CMakeLists.txt index 15df423..4bed5d8 100644 --- a/Modules/Pwm/Tests/CMakeLists.txt +++ b/Modules/Pwm/Tests/CMakeLists.txt @@ -53,6 +53,7 @@ target_include_directories(pwm_module_tests SYSTEM PUBLIC target_link_libraries(pwm_module_tests pwm_module + timer_generic_driver ${GTEST_LIBRARIES} ${THREAD_LIB} ) diff --git a/Modules/Pwm/Tests/Stubs/config.c b/Modules/Pwm/Tests/Stubs/config.c index 9ff488f..c028903 100644 --- a/Modules/Pwm/Tests/Stubs/config.c +++ b/Modules/Pwm/Tests/Stubs/config.c @@ -2,34 +2,31 @@ #include "pwm.h" -pwm_static_config_t pwm_config[PWM_TOTAL_INSTANCES] = +pwm_static_config_t pwm_config = { - // Motors usually require fast PWMs signals in order to fully take advantage of - // their inductances's current smoothing capabilities. - // Also, a good timing might be observed in order to keep the motor in sync, so we need a predictable/repeatable - // PWM signal generation scheme, which is achievable through the use of a hardware PWM channel. - [PWM_MOTOR_INDEX] = + .soft = { - .type = PWM_TYPE_HARDWARE, - .config.hard = + // Fans usually require slow PWMs and can easily be handled by software PWM module + // so that we don't waste hardware PWM channels. + // As a result, it requires the IO index as per written in IO driver static configuration + // and the timebase used by this program, so we can select different timebases if necessary + [FAN_SOFT_PWM_INDEX] = { - .arch = TIMER_ARCH_8_BIT, - .timer_index = 0U, - .unit = PWM_HARD_TIMER_UNIT_A + .io_index = FAN_IO_INDEX, + .timebase_index = FAN_TIMEBASE_INDEX } }, - - // Fans usually require slow PWMs and can easily be handled by software PWM module - // so that we don't waste hardware PWM channels. - // As a result, it requires the IO index as per written in IO driver static configuration - // and the timebase used by this program, so we can select different timebases if necessary - [PWM_FAN_INDEX] = + .hard = { - .type = PWM_TYPE_SOFTWARE, - .config.soft = + // Motors usually require fast PWMs signals in order to fully take advantage of + // their inductances's current smoothing capabilities. + // Also, a good timing might be observed in order to keep the motor in sync, so we need a predictable/repeatable + // PWM signal generation scheme, which is achievable through the use of a hardware PWM channel. + [MOTOR_HARD_PWM_INDEX] = { - .io_index = PWM_FAN_IO_INDEX, - .timebase_index = PWM_FAN_TIMEBASE_INDEX + .arch = TIMER_ARCH_8_BIT, + .timer_index = 0U, + .unit = PWM_HARD_TIMER_UNIT_A } } }; \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/config.h b/Modules/Pwm/Tests/Stubs/config.h index dd3b117..c2c1006 100644 --- a/Modules/Pwm/Tests/Stubs/config.h +++ b/Modules/Pwm/Tests/Stubs/config.h @@ -16,10 +16,10 @@ extern "C" // Mapping of PWM signals as per configured in pwm_config, in config.c file -#define PWM_MOTOR_INDEX 0U -#define PWM_FAN_INDEX 1U -#define PWM_FAN_IO_INDEX 0U /**< Gives the index of the IO pin in IO driver static configuration */ -#define PWM_FAN_TIMEBASE_INDEX 0U /**< Gives the index of the reference timebase as per written in timebase static configuration */ +#define MOTOR_HARD_PWM_INDEX 0U +#define FAN_SOFT_PWM_INDEX 0U +#define FAN_IO_INDEX 0U /**< Gives the index of the IO pin in IO driver static configuration */ +#define FAN_TIMEBASE_INDEX 0U /**< Gives the index of the reference timebase as per written in timebase static configuration */ #ifdef __cplusplus } diff --git a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c index ecc79a8..bdf0fc1 100644 --- a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c @@ -65,6 +65,16 @@ void timer_16_bit_stub_reset(void) memset(&configuration, 0, sizeof(configuration_t)); } + +const timer_generic_prescaler_pair_t timer_16_bit_prescaler_table[TIMER_16_BIT_MAX_PRESCALER_COUNT] = +{ + {.value = 1, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_1 }, + {.value = 8, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_8 }, + {.value = 64, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_64 }, + {.value = 256, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_256 }, + {.value = 1024, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_1024 }, +}; + timer_error_t timer_16_bit_compute_matching_parameters(const uint32_t * const clock_freq, const uint32_t * const target_freq, const timer_generic_resolution_t resolution, @@ -72,12 +82,26 @@ timer_error_t timer_16_bit_compute_matching_parameters(const uint32_t * const cl uint16_t * const ocr, uint16_t * const accumulator) { - (void) clock_freq; - (void) target_freq; - (void) resolution; - *prescaler = configuration.prescaler; - *ocr = configuration.ocra; - *accumulator = configuration.accumulator; + timer_generic_parameters_t parameters = + { + .input = + { + .clock_freq = *clock_freq, + .target_frequency = *target_freq, + .resolution = resolution, + .prescaler_lookup_array.array = timer_16_bit_prescaler_table, + .prescaler_lookup_array.size = TIMER_16_BIT_MAX_PRESCALER_COUNT, + }, + }; + + if( TIMER_ERROR_OK != timer_generic_compute_parameters(¶meters)) + { + return TIMER_ERROR_CONFIG; + } + + *prescaler = timer_16_bit_prescaler_from_value(¶meters.output.prescaler); + *ocr = parameters.output.ocr; + *accumulator = parameters.output.accumulator; return TIMER_ERROR_OK; } @@ -94,23 +118,20 @@ timer_error_t timer_16_bit_compute_closest_prescaler(const uint32_t * const cloc .clock_freq = *clock_freq, .target_frequency = *target_freq, .resolution = resolution, + .prescaler_lookup_array.array = timer_16_bit_prescaler_table, .prescaler_lookup_array.size = TIMER_16_BIT_MAX_PRESCALER_COUNT, }, }; + if(TIMER_ERROR_OK != timer_generic_find_closest_prescaler(¶meters)) + { + return TIMER_ERROR_CONFIG; + } + *prescaler = parameters.output.prescaler; return TIMER_ERROR_OK; } -const timer_generic_prescaler_pair_t timer_16_bit_prescaler_table[TIMER_16_BIT_MAX_PRESCALER_COUNT] = -{ - {.value = 1, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_1 }, - {.value = 8, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_8 }, - {.value = 64, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_64 }, - {.value = 256, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_256 }, - {.value = 1024, .type = (uint8_t) TIMER16BIT_CLK_PRESCALER_1024 }, -}; - timer_16_bit_prescaler_selection_t timer_16_bit_prescaler_from_value(uint16_t const * const input_prescaler) { for (uint8_t i = 0 ; i < TIMER_16_BIT_MAX_PRESCALER_COUNT ; i++) diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c index 655a688..6552f8d 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c @@ -76,6 +76,17 @@ void timer_8_bit_async_compute_matching_parameters( const uint32_t * const clock *accumulator = configuration.accumulator; } +const timer_generic_prescaler_pair_t timer_8_bit_async_prescaler_table[TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT] = +{ + {.value = 1, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_1 }, + {.value = 8, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_8 }, + {.value = 32, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_32 }, + {.value = 64, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_64 }, + {.value = 128, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_128 }, + {.value = 256, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_256 }, + {.value = 1024, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_1024 }, +}; + void timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_8_bit_async_prescaler_selection_t * const prescaler) @@ -87,24 +98,15 @@ void timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_fr .clock_freq = *clock_freq, .target_frequency = *target_freq, .resolution = TIMER_GENERIC_RESOLUTION_8_BIT, + .prescaler_lookup_array.array = timer_8_bit_async_prescaler_table, .prescaler_lookup_array.size = TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT, }, }; + timer_generic_find_closest_prescaler(¶meters); *prescaler = parameters.output.prescaler; } -const timer_generic_prescaler_pair_t timer_8_bit_async_prescaler_table[TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT] = -{ - {.value = 1, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_1 }, - {.value = 8, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_8 }, - {.value = 32, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_32 }, - {.value = 64, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_64 }, - {.value = 128, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_128 }, - {.value = 256, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_256 }, - {.value = 1024, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_1024 }, -}; - timer_8_bit_async_prescaler_selection_t timer_8_bit_async_prescaler_from_value(uint16_t const * const input_prescaler) { for (uint8_t i = 0 ; i < TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT ; i++) diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c index 5850863..a4647d7 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c @@ -32,22 +32,20 @@ along with this program. If not, see . #include "string.h" -typedef struct -{ - timer_8_bit_prescaler_selection_t prescaler; - uint8_t ocra; - uint32_t accumulator; - bool initialised; - timer_8_bit_config_t driver_config; -} configuration_t; -static configuration_t configuration = {0}; +timer_8_bit_stub_configuration_t configuration = {0}; +static timer_error_t next_error = TIMER_ERROR_OK; static inline bool id_is_valid(const uint8_t id) { return (id < TIMER_8_BIT_STUB_MAX_INSTANCES); } +timer_8_bit_stub_configuration_t* timer_8_bit_stub_get_config(void) +{ + return &configuration; +} + void timer_8_bit_stub_set_next_parameters(const timer_8_bit_prescaler_selection_t prescaler, const uint8_t ocra, const uint32_t accumulator) { configuration.prescaler = prescaler; @@ -62,7 +60,7 @@ void timer_8_bit_stub_set_initialised(const bool initialised) void timer_8_bit_stub_reset(void) { - memset(&configuration, 0, sizeof(configuration_t)); + memset(&configuration, 0, sizeof(timer_8_bit_stub_configuration_t)); } void timer_8_bit_stub_get_driver_configuration(timer_8_bit_config_t * const config) @@ -83,6 +81,15 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, *accumulator = configuration.accumulator; } +const timer_generic_prescaler_pair_t timer_8_bit_prescaler_table[TIMER_8_BIT_MAX_PRESCALER_COUNT] = +{ + {.value = 1U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_1 }, + {.value = 8U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_8 }, + {.value = 64U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_64 }, + {.value = 256U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_256 }, + {.value = 1024U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_1024 }, +}; + void timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_8_bit_prescaler_selection_t * const prescaler) @@ -94,20 +101,14 @@ void timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, .clock_freq = *clock_freq, .target_frequency = *target_freq, .resolution = TIMER_GENERIC_RESOLUTION_8_BIT, + .prescaler_lookup_array.array = timer_8_bit_prescaler_table, .prescaler_lookup_array.size = TIMER_8_BIT_MAX_PRESCALER_COUNT, }, }; + timer_generic_find_closest_prescaler(¶meters); *prescaler = parameters.output.prescaler; } -const timer_generic_prescaler_pair_t timer_8_bit_prescaler_table[TIMER_8_BIT_MAX_PRESCALER_COUNT] = -{ - {.value = 1U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_1 }, - {.value = 8U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_8 }, - {.value = 64U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_64 }, - {.value = 256U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_256 }, - {.value = 1024U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_1024 }, -}; timer_8_bit_prescaler_selection_t timer_8_bit_prescaler_from_value(uint16_t const * const input_prescaler) { @@ -168,11 +169,8 @@ timer_error_t timer_8_bit_get_default_config(timer_8_bit_config_t * config) timer_error_t timer_8_bit_set_handle(uint8_t id, timer_8_bit_handle_t * const handle) { (void) handle; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + (void) id; + return next_error; } timer_error_t timer_8_bit_get_handle(uint8_t id, timer_8_bit_handle_t * const handle) @@ -182,252 +180,185 @@ timer_error_t timer_8_bit_get_handle(uint8_t id, timer_8_bit_handle_t * const ha { return TIMER_ERROR_UNKNOWN_TIMER; } - return TIMER_ERROR_OK; + return next_error; } timer_error_t timer_8_bit_set_force_compare_config(uint8_t id, timer_8_bit_force_compare_config_t * const force_comp_config) { - (void) force_comp_config; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + configuration.force_comp = *force_comp_config; + (void) id; + return next_error; } timer_error_t timer_8_bit_get_force_compare_config(uint8_t id, timer_8_bit_force_compare_config_t * force_comp_config) { - (void) force_comp_config; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + *force_comp_config = configuration.force_comp; + (void) id; + return next_error; } timer_error_t timer_8_bit_set_interrupt_config(uint8_t id, timer_8_bit_interrupt_config_t * const it_config) { (void) it_config; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + (void) id; + return next_error; } timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt_config_t * it_config) { (void) it_config; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + (void) id; + return next_error; } #ifdef UNIT_TESTING timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_config_t * it_flags) { (void) it_flags; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + (void) id; + return next_error; } #endif timer_error_t timer_8_bit_set_prescaler(uint8_t id, const timer_8_bit_prescaler_selection_t prescaler) { - (void) prescaler; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + configuration.prescaler = prescaler; + (void) id; + return next_error; } timer_error_t timer_8_bit_get_prescaler(uint8_t id, timer_8_bit_prescaler_selection_t * prescaler) { - (void) prescaler; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + *prescaler = configuration.prescaler; + (void) id; + return next_error; } timer_error_t timer_8_bit_set_compare_match_A(uint8_t id, const timer_8_bit_compare_output_mode_t compA) { - (void) compA; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + configuration.compA = compA; + (void) id; + return next_error; } timer_error_t timer_8_bit_get_compare_match_A(uint8_t id, timer_8_bit_compare_output_mode_t * compA) { - (void) compA; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + *compA = configuration.compA; + (void) id; + return next_error; } timer_error_t timer_8_bit_set_compare_match_B(uint8_t id, timer_8_bit_compare_output_mode_t compB) { - (void) compB; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + configuration.compB = compB; + (void) id; + return next_error; } timer_error_t timer_8_bit_get_compare_match_B(uint8_t id, timer_8_bit_compare_output_mode_t * compB) { - (void) compB; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + *compB = configuration.compB; + (void) id; + return next_error; } timer_error_t timer_8_bit_set_waveform_generation(uint8_t id, const timer_8_bit_waveform_generation_t waveform) { - (void) waveform; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + configuration.waveform = waveform; + (void) id; + return next_error; } timer_error_t timer_8_bit_get_waveform_generation(uint8_t id, timer_8_bit_waveform_generation_t * waveform) { - (void) waveform; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + *waveform = configuration.waveform; + (void) id; + return next_error; } timer_error_t timer_8_bit_set_counter_value(uint8_t id, const uint8_t ticks) { - (void) ticks; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + configuration.counter = ticks; + (void) id; + return next_error; } timer_error_t timer_8_bit_get_counter_value(uint8_t id, uint8_t * ticks) { - (void) ticks; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + *ticks = configuration.counter; + (void) id; + return next_error; } timer_error_t timer_8_bit_set_ocra_register_value(uint8_t id, uint8_t ocra) { - (void) ocra; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + configuration.ocra = ocra; + (void) id; + + return next_error; } timer_error_t timer_8_bit_get_ocra_register_value(uint8_t id, uint8_t * ocra) { - (void) ocra; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + *ocra = configuration.ocra; + (void) id; + + return next_error; } timer_error_t timer_8_bit_set_ocrb_register_value(uint8_t id, uint8_t ocrb) { (void) id; - (void) ocrb; - return TIMER_ERROR_OK; + configuration.ocrb = ocrb; + return next_error; } timer_error_t timer_8_bit_get_ocrb_register_value(uint8_t id, uint8_t * ocrb) { - (void) ocrb; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + (void) id; + *ocrb = configuration.ocrb; + return next_error; } timer_error_t timer_8_bit_init(uint8_t id, timer_8_bit_config_t * const config) { (void) config; - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; + (void) id; - return TIMER_ERROR_OK; + return next_error; } timer_error_t timer_8_bit_reconfigure(uint8_t id, timer_8_bit_config_t * const config) { - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; + (void) id; configuration.driver_config = *config; - return TIMER_ERROR_OK; + return next_error; } timer_error_t timer_8_bit_deinit(uint8_t id) { - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + (void) id; + timer_8_bit_stub_reset(); + return next_error; } timer_error_t timer_8_bit_start(uint8_t id) { - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + configuration.started = true; + (void) id; + return next_error; } timer_error_t timer_8_bit_stop(uint8_t id) { - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; - return TIMER_ERROR_OK; + configuration.started = false; + (void) id; + return next_error; } timer_error_t timer_8_bit_is_initialised(const uint8_t id, bool * const initialised) { - if (!id_is_valid(id)) - { - return TIMER_ERROR_UNKNOWN_TIMER; - }; + (void) id; *initialised = configuration.initialised; - return TIMER_ERROR_OK; + return next_error; } \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h index 22d9562..b142bef 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -39,10 +39,27 @@ extern "C" #include "timer_8_bit.h" #define TIMER_8_BIT_STUB_MAX_INSTANCES (1U) +typedef struct +{ + bool initialised; + bool started; + timer_8_bit_prescaler_selection_t prescaler; + uint8_t counter; + uint8_t ocra; + uint8_t ocrb; + uint32_t accumulator; + timer_8_bit_config_t driver_config; + timer_8_bit_waveform_generation_t waveform; + timer_8_bit_compare_output_mode_t compA; + timer_8_bit_compare_output_mode_t compB; + timer_8_bit_force_compare_config_t force_comp; +} timer_8_bit_stub_configuration_t; + void timer_8_bit_stub_set_next_parameters(const timer_8_bit_prescaler_selection_t prescaler, const uint8_t ocra, const uint32_t accumulator); void timer_8_bit_stub_set_initialised(const bool initialised); void timer_8_bit_stub_reset(void); void timer_8_bit_stub_get_driver_configuration(timer_8_bit_config_t * const config); +timer_8_bit_stub_configuration_t* timer_8_bit_stub_get_config(void); #ifdef __cplusplus } diff --git a/Modules/Pwm/Tests/pwm_tests.cpp b/Modules/Pwm/Tests/pwm_tests.cpp index 6231866..ffbe640 100644 --- a/Modules/Pwm/Tests/pwm_tests.cpp +++ b/Modules/Pwm/Tests/pwm_tests.cpp @@ -22,27 +22,123 @@ class PwmModuleTestSuite : public ::testing::Test void TearDown(void) override { + timer_8_bit_stub_reset(); + timer_16_bit_stub_reset(); + timer_8_bit_async_stub_reset(); } }; TEST_F(PwmModuleTestSuite, test_single_hard_config) { // Rewritting parts of pwm_config - pwm_config[0].type = PWM_TYPE_HARDWARE; - pwm_config[0].config.hard.arch = TIMER_ARCH_8_BIT; - pwm_config[0].config.hard.timer_index = 0U; - pwm_config[0].config.hard.unit = PWM_HARD_TIMER_UNIT_A; + pwm_config.hard[0].arch = TIMER_ARCH_8_BIT; + pwm_config.hard[0].timer_index = 0U; + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; - pwm_error_t error = PWM_ERR_OK; + pwm_error_t error = PWM_ERROR_OK; //Should return a PWM_ERR_CONFIG as underlying timers are not initialised yet error = pwm_init(); - ASSERT_EQ(PWM_ERR_CONFIG, error); + ASSERT_EQ(PWM_ERROR_CONFIG, error); // Init the timer_8_bit beforehand timer_8_bit_stub_set_initialised(true); error = pwm_init(); - ASSERT_EQ(PWM_ERR_OK, error); + ASSERT_EQ(PWM_ERROR_OK, error); + +} + +TEST_F(PwmModuleTestSuite, test_single_soft_init) +{ + // Rewritting parts of pwm_config + pwm_config.soft[0].io_index = 0U; + pwm_config.soft[0].timebase_index = 0U; + + pwm_config.hard[0].arch = TIMER_ARCH_8_BIT; + pwm_config.hard[0].timer_index = 0U; + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; + + pwm_error_t error = PWM_ERROR_OK; + + // Should not return an error config, as the + // pwm_config does not contain hardware configuration anymore + error = pwm_init(); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + timer_8_bit_stub_set_initialised(true); + error = pwm_init(); + ASSERT_EQ(PWM_ERROR_OK, error); +} + + +TEST_F(PwmModuleTestSuite, test_configuration) +{ + // Rewritting parts of pwm_config + pwm_config.hard[0].arch = TIMER_ARCH_8_BIT; + pwm_config.hard[0].timer_index = 0U; + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; + + // Setting up a software PWM + pwm_config.soft[0].io_index = 0U; + pwm_config.soft[0].timebase_index = 0U; + + pwm_error_t error = PWM_ERROR_OK; + + // Init the timer_8_bit beforehand + timer_8_bit_stub_set_initialised(true); + + // Init the timer_8_bit beforehand + timer_8_bit_stub_set_initialised(true); + error = pwm_init(); + ASSERT_EQ(PWM_ERROR_OK, error); + + pwm_props_t properties = + { + .frequency = 1 MHz, + .duty_cycle = 50U, + .pol = PWM_POLARITY_INVERTED + }; + const uint32_t cpu_freq = 1 MHz; + + // Normal Waveform generation should return an error, this pwm module does not want + // to interfere with other components using Timers, such as a timebase for instance. + (void) timer_8_bit_set_waveform_generation(0U, TIMER8BIT_WG_NORMAL); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + // Same goes for CTC mode + (void) timer_8_bit_set_waveform_generation(0U, TIMER8BIT_WG_CTC); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + + // Check that all 4 waveform modes are correct + const timer_8_bit_waveform_generation_t valid_modes[] = + { + TIMER8BIT_WG_PWM_FAST_FULL_RANGE, + TIMER8BIT_WG_PWM_FAST_OCRA_MAX, + TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE, + TIMER8BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX, + }; + + // Select a valid waveform generation mode + for (const auto mode : valid_modes) + { + (void) timer_8_bit_set_waveform_generation(0U, mode); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + EXPECT_EQ(PWM_ERROR_OK, error); + } + + // Start the timer + ASSERT_FALSE(timer_8_bit_stub_get_config()->started); + error = pwm_start(0U, PWM_TYPE_HARDWARE); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_TRUE(timer_8_bit_stub_get_config()->started); + + // Check that timer is indeed stopped + error = pwm_stop(0U, PWM_TYPE_HARDWARE); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_FALSE(timer_8_bit_stub_get_config()->started); } diff --git a/Modules/Pwm/examples/config.c b/Modules/Pwm/examples/config.c index fe3048b..e38844c 100644 --- a/Modules/Pwm/examples/config.c +++ b/Modules/Pwm/examples/config.c @@ -24,44 +24,37 @@ timebase_config_t timebase_static_config[TIMEBASE_MAX_INSTANCES] = } }; -pwm_static_config_t pwm_config[PWM_MAX_HARD_INSTANCES + PWM_MAX_SOFT_INSTANCES] = +pwm_static_config_t pwm_config = { - // Software based PWM configuration block - [FAN_1_PWM_IDX] = - {.type = PWM_TYPE_SOFTWARE, - .config.soft = - { - .io_index = FAN_1_IO_IDX, - .timebase_index = FAN_1_TIMEBASE_IDX - } - }, - [FAN_2_PWM_IDX] = - {.type = PWM_TYPE_SOFTWARE, - .config.soft = - { - .io_index = FAN_2_IO_IDX, - .timebase_index = FAN_2_TIMEBASE_IDX - } - }, - - // Hardware based PWM configuration block - [MOTOR_1_PWM_IDX] = - {.type = PWM_TYPE_HARDWARE, - .config.hard = - { - .arch = TIMER_ARCH_16_BIT, - .unit = PWM_HARD_TIMER_UNIT_A, - .timer_index = MOTOR_1_TIMER_IDX - } + .hard = + { + // Hardware based PWM configuration block + [MOTOR_1_HARD_PWM_IDX] = + { + .arch = TIMER_ARCH_16_BIT, + .unit = PWM_HARD_TIMER_UNIT_A, + .timer_index = MOTOR_1_TIMER_IDX + }, + [MOTOR_2_HARD_PWM_IDX] = + { + .arch = TIMER_ARCH_16_BIT, + .unit = PWM_HARD_TIMER_UNIT_B, + .timer_index = MOTOR_2_TIMER_IDX + } }, - [MOTOR_2_PWM_IDX] = - {.type = PWM_TYPE_HARDWARE, - .config.hard = - { - .arch = TIMER_ARCH_16_BIT, - .unit = PWM_HARD_TIMER_UNIT_B, - .timer_index = MOTOR_2_TIMER_IDX - } + .soft = + { + // Software based PWM configuration block + [FAN_1_SOFT_PWM_IDX] = + { + .io_index = FAN_1_IO_IDX, + .timebase_index = FAN_1_TIMEBASE_IDX + }, + [FAN_2_SOFT_PWM_IDX] = + { + .io_index = FAN_2_IO_IDX, + .timebase_index = FAN_2_TIMEBASE_IDX + } } }; diff --git a/Modules/Pwm/examples/config.h b/Modules/Pwm/examples/config.h index 1e164db..d106cab 100644 --- a/Modules/Pwm/examples/config.h +++ b/Modules/Pwm/examples/config.h @@ -33,10 +33,10 @@ extern "C" { #define PWM_MAX_SOFT_INSTANCES 2 // Pseudo PWM mapping -#define FAN_1_PWM_IDX 0 -#define FAN_2_PWM_IDX 1 -#define MOTOR_1_PWM_IDX 2 -#define MOTOR_2_PWM_IDX 3 +#define FAN_1_SOFT_PWM_IDX 0 +#define FAN_2_SOFT_PWM_IDX 1 +#define MOTOR_1_HARD_PWM_IDX 0 +#define MOTOR_2_HARD_PWM_IDX 1 diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index 8e5ec66..476f15b 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -22,17 +22,19 @@ extern "C" #warning "PWM_MAX_HARD_INSTANCES macro not defined in config.h, fallsback to 1U by default" #endif -#define PWM_TOTAL_INSTANCES (PWM_MAX_SOFT_INSTANCES + PWM_MAX_SOFT_INSTANCES) +#define MHz * 1000000UL +#define kHz * 1000U /** * @brief PWM module error types used to inform caller how operations performed. */ typedef enum { - PWM_ERR_OK = 0, /**< Operation succeeded, no issues */ - PWM_ERR_CONFIG, /**< Something is wrong with the configuration */ - PWM_ERR_TIMEBASE_ISSUE, /**< Software timebase has encountered some errors */ - PWM_ERR_TIMER_ISSUE /**< Timer drivers encountered some errors */ + PWM_ERROR_OK = 0, /**< Operation succeeded, no issues */ + PWM_ERROR_CONFIG, /**< Something is wrong with the configuration */ + PWM_ERROR_TIMEBASE_ISSUE, /**< Software timebase has encountered some errors */ + PWM_ERROR_TIMER_ISSUE, /**< Timer drivers encountered some errors */ + PWM_ERROR_INDEX_OUT_OF_RANGE /**< Given pwm instance index is out of range */ } pwm_error_t; /** @@ -91,12 +93,8 @@ typedef struct */ typedef struct { - pwm_type_t type; /**< Encodes the underlying type of configuration */ - union - { - pwm_hard_static_config_t hard; /**< Encodes the hardware static configuration */ - pwm_soft_static_config_t soft; /**< Encodes the software static configuration */ - } config; + pwm_hard_static_config_t hard[PWM_MAX_HARD_INSTANCES]; /**< Encodes the hardware static configuration */ + pwm_soft_static_config_t soft[PWM_MAX_SOFT_INSTANCES]; /**< Encodes the software static configuration */ } pwm_static_config_t; /** @@ -175,7 +173,7 @@ typedef struct * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors - * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors + * PWM_ERROR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ pwm_error_t pwm_init(void); @@ -184,43 +182,47 @@ pwm_error_t pwm_init(void); * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors - * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors + * PWM_ERROR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ pwm_error_t pwm_process(void); /** * @brief Starts a single PWM. Has no effect if the PWM is already started + * @param index : index of targeted PWM instance within configuration structure @see pwm_config. + * @param type : states the type of PWM, either software or hardware. + * This is needed because configurations are separated in two different configuration arrays * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors - * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors + * PWM_ERROR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ -pwm_error_t pwm_start(const pwm_type_t type, const uint8_t index); +pwm_error_t pwm_start(const uint8_t index, const pwm_type_t type); /** * @brief Starts all registered PWMs in a row * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors - * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors + * PWM_ERROR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ pwm_error_t pwm_start_all(void); /** * @brief Stops a single PWM. Has no effect if the PWM is already stopped + * @param index : index of targeted PWM instance within configuration structure @see pwm_config. * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors - * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors + * PWM_ERROR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ -pwm_error_t pwm_stop(const pwm_type_t type, const uint8_t index); +pwm_error_t pwm_stop(const uint8_t index, const pwm_type_t type); /** * @brief Stops all registered PWM instances in a row. * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors - * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors + * PWM_ERROR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ pwm_error_t pwm_stop_all(void); @@ -243,10 +245,10 @@ pwm_error_t pwm_stop_all(void); * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors - * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors + * PWM_ERROR_TIMER_ISSUE : operation did not succeed because of timer drivers errors * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly */ -pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq); +pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_props_t const * const properties, const uint32_t * clock_freq); /** * @brief Configures a particular timer to output complementary PWM with dead time generation. @@ -257,13 +259,13 @@ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const pro * @param clock_freq : current CPU frequency, used to calculate timer's configuration parameters * @return pwm_error_t: * PWM_ERR_OK : operation succeeded - * PWM_ERR_TIMER_ISSUE : operation did not succeed because of timer drivers errors + * PWM_ERROR_TIMER_ISSUE : operation did not succeed because of timer drivers errors */ pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const config, const uint32_t * clock_freq ); // Static configuration for both software based and hardware based pwms -extern pwm_static_config_t pwm_config[PWM_TOTAL_INSTANCES]; /** Static compile-time configuration used by this driver (needs to be implemented in config.c)*/ +extern pwm_static_config_t pwm_config; /** Static compile-time configuration used by this driver (needs to be implemented in config.c)*/ #ifdef __cplusplus diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 033d651..6bc97a6 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -47,7 +47,7 @@ static pwm_error_t pwm_init_single_hard(pwm_hard_static_config_t const * const c * @return pwm_error_t : * PWM_ERROR_OK : operation succeeded * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly - * PWM_ERR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error + * PWM_ERROR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq); @@ -59,7 +59,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t * @return pwm_error_t : * PWM_ERROR_OK : operation succeeded * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly - * PWM_ERR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error + * PWM_ERROR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq); @@ -71,35 +71,32 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p * @return pwm_error_t : * PWM_ERROR_OK : operation succeeded * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly - * PWM_ERR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error + * PWM_ERROR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq); +/** + * @brief Verifies that pwm index fits within the range + * + * @param index : index to be checked + * @return true : index is valid and can be used without buffer overflow issues + * @return false : index is out of range and cannot be used as is. + */ +static inline bool index_valid(const uint8_t index, const pwm_type_t type); + pwm_error_t pwm_init(void) { - pwm_error_t err = PWM_ERR_OK; + pwm_error_t err = PWM_ERROR_OK; - uint8_t hard_config_count = 0; - pwm_hard_static_config_t const * hard_config[PWM_MAX_HARD_INSTANCES] = {0}; // Iterate over pwm_config and search hard configurations - for (uint8_t i = 0 ; i < PWM_TOTAL_INSTANCES ; i++) - { - if(PWM_TYPE_HARDWARE == pwm_config[i].type) - { - hard_config[hard_config_count] = &pwm_config[i].config.hard; - hard_config_count++; - } - } - - // Configure all retrieved hard configs now - for (uint8_t i = 0 ; i < hard_config_count ; i++) + for (uint8_t i = 0 ; i < PWM_MAX_HARD_INSTANCES ; i++) { - err |= pwm_init_single_hard(hard_config[i]); + err |= pwm_init_single_hard(&pwm_config.hard[i]); } - if (err != PWM_ERR_OK) + if (err != PWM_ERROR_OK) { - err = PWM_ERR_CONFIG; + err = PWM_ERROR_CONFIG; } return err; @@ -108,7 +105,7 @@ pwm_error_t pwm_init(void) static pwm_error_t check_initialisation(pwm_hard_static_config_t const * const config) { - pwm_error_t err = PWM_ERR_OK; + pwm_error_t err = PWM_ERROR_OK; bool timer_initialised = false; timer_error_t timerr = TIMER_ERROR_OK; switch(config->arch) @@ -126,19 +123,19 @@ static pwm_error_t check_initialisation(pwm_hard_static_config_t const * const c break; default: - err = PWM_ERR_CONFIG; + err = PWM_ERROR_CONFIG; break; } // Handle the valid timer arch cases when api failed - if ((PWM_ERR_OK == err) && (TIMER_ERROR_OK != timerr)) + if ((PWM_ERROR_OK == err) && (TIMER_ERROR_OK != timerr)) { - err = PWM_ERR_CONFIG; + err = PWM_ERROR_CONFIG; } // Reject requests if timer drivers are not initialised beforehand if(false == timer_initialised) { - err = PWM_ERR_CONFIG; + err = PWM_ERROR_CONFIG; } return err; @@ -148,11 +145,11 @@ static pwm_error_t check_initialisation(pwm_hard_static_config_t const * const c // and initialisation steps were performed prior to use the pwm driver. static pwm_error_t pwm_init_single_hard(pwm_hard_static_config_t const * const config) { - pwm_error_t ret = PWM_ERR_OK; + pwm_error_t ret = PWM_ERROR_OK; timer_error_t timerr = TIMER_ERROR_OK; ret = check_initialisation(config); - if(PWM_ERR_OK == ret) + if(PWM_ERROR_OK == ret) { switch(config->arch) { @@ -170,7 +167,7 @@ static pwm_error_t pwm_init_single_hard(pwm_hard_static_config_t const * const c break; default: - ret = PWM_ERR_CONFIG; + ret = PWM_ERROR_CONFIG; break; } } @@ -180,18 +177,108 @@ static pwm_error_t pwm_init_single_hard(pwm_hard_static_config_t const * const c // that might not behave as we expect. if (TIMER_ERROR_OK != timerr) { - ret = PWM_ERR_CONFIG; + ret = PWM_ERROR_CONFIG; + } + + return ret; +} + +pwm_error_t pwm_start(const uint8_t index, const pwm_type_t type) +{ + pwm_error_t ret = PWM_ERROR_OK; + if (!index_valid(index, type)) + { + return PWM_ERROR_INDEX_OUT_OF_RANGE; + } + + if( PWM_TYPE_SOFTWARE == type) + { + // Start software PWM + } + else + { + pwm_hard_static_config_t * config = &pwm_config.hard[index]; + timer_error_t timerr = TIMER_ERROR_OK; + switch(config->arch) + { + case TIMER_ARCH_8_BIT : + timerr = timer_8_bit_start(config->timer_index); + break; + + case TIMER_ARCH_8_BIT_ASYNC : + timerr = timer_8_bit_async_start(config->timer_index); + break; + + case TIMER_ARCH_16_BIT : + timerr = timer_16_bit_start(config->timer_index); + break; + + default: + ret = PWM_ERROR_CONFIG; + break; + } + + // Caught some issue with the timer drivers + if(TIMER_ERROR_OK != timerr) + { + ret = PWM_ERROR_TIMER_ISSUE; + } + } + + return ret; +} + +pwm_error_t pwm_stop(const uint8_t index, const pwm_type_t type) +{ + pwm_error_t ret = PWM_ERROR_OK; + if (!index_valid(index, type)) + { + return PWM_ERROR_INDEX_OUT_OF_RANGE; + } + + if( PWM_TYPE_SOFTWARE == type) + { + // Stop software pwm + } + else + { + pwm_hard_static_config_t * config = &pwm_config.hard[index]; + timer_error_t timerr = TIMER_ERROR_OK; + switch(config->arch) + { + case TIMER_ARCH_8_BIT : + timerr = timer_8_bit_stop(config->timer_index); + break; + + case TIMER_ARCH_8_BIT_ASYNC : + timerr = timer_8_bit_async_stop(config->timer_index); + break; + + case TIMER_ARCH_16_BIT : + timerr = timer_16_bit_stop(config->timer_index); + break; + + default: + ret = PWM_ERROR_CONFIG; + break; + } + + // Caught some issue with the timer drivers + if(TIMER_ERROR_OK != timerr) + { + ret = PWM_ERROR_TIMER_ISSUE; + } } return ret; } -pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) +pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_props_t const * const properties, const uint32_t * clock_freq) { - pwm_error_t ret = PWM_ERR_OK; - if (PWM_TYPE_HARDWARE == pwm_config[index].type) + pwm_error_t ret = PWM_ERROR_OK; + if (PWM_TYPE_HARDWARE == type) { - pwm_hard_static_config_t * timer_config = &pwm_config[index].config.hard; + pwm_hard_static_config_t * timer_config = &pwm_config.hard[index]; // At this point the accumulator should be 0, otherwise it means the generated PWM is not slow enough // and this driver does not support it for now @@ -210,7 +297,7 @@ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const pro break; default: - ret = PWM_ERR_CONFIG; + ret = PWM_ERROR_CONFIG; break; } @@ -228,14 +315,14 @@ pwm_error_t pwm_config_single(const uint8_t index, pwm_props_t const * const pro static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) { timer_error_t timerr = TIMER_ERROR_OK; - pwm_error_t ret = PWM_ERR_OK; + pwm_error_t ret = PWM_ERROR_OK; uint8_t ocr_value = 0; uint16_t prescaler_value = 1U; timer_8_bit_prescaler_selection_t prescaler = TIMER8BIT_CLK_NO_CLOCK; timer_8_bit_waveform_generation_t waveform = TIMER8BIT_WG_NORMAL; - pwm_hard_static_config_t * timer_config = &pwm_config[index].config.hard; + pwm_hard_static_config_t * timer_config = &pwm_config.hard[index]; // Compute closest prescaler first timer_8_bit_compute_closest_prescaler(clock_freq, &properties->frequency, &prescaler); @@ -243,7 +330,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t timerr = timer_8_bit_set_prescaler(index, prescaler); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } // We need to probe the waveform generation modes from Timer driver because it drives the way we configure a PWM afterwards @@ -251,7 +338,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t timerr = timer_8_bit_get_waveform_generation(timer_config->timer_index, &waveform); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } // Handles the hardware PWM unit A or B @@ -277,7 +364,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t } if(TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } // OCRA value represents the duty_cycle value now @@ -285,7 +372,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t timerr = timer_8_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); if(TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } break; } @@ -297,7 +384,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t timerr = timer_8_bit_set_compare_match_A(timer_config->timer_index, TIMER8BIT_CMOD_TOGGLE_OCnX); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } ocr_value = (*clock_freq / (prescaler_value * properties->frequency)) - 1; @@ -311,7 +398,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t timerr = timer_8_bit_set_ocra_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } break; @@ -319,7 +406,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t case TIMER8BIT_WG_CTC: case TIMER8BIT_WG_NORMAL: default: - return PWM_ERR_CONFIG; + return PWM_ERROR_CONFIG; } } @@ -351,7 +438,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t timerr = timer_8_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); if(TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } break; @@ -359,7 +446,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t timerr = timer_8_bit_set_ocrb_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } break; @@ -378,7 +465,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t timerr = timer_8_bit_set_ocra_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } // Compute exact duty cycle value for OCRB (reuse the ocr_value variable) @@ -387,7 +474,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t timerr = timer_8_bit_set_ocrb_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } break; } @@ -395,7 +482,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t case TIMER8BIT_WG_CTC: case TIMER8BIT_WG_NORMAL: default: - return PWM_ERR_CONFIG; + return PWM_ERROR_CONFIG; } } return ret; @@ -405,14 +492,14 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) { timer_error_t timerr = TIMER_ERROR_OK; - pwm_error_t ret = PWM_ERR_OK; + pwm_error_t ret = PWM_ERROR_OK; uint8_t ocr_value = 0; uint16_t prescaler_value = 1U; timer_8_bit_async_prescaler_selection_t prescaler = TIMER8BIT_ASYNC_CLK_NO_CLOCK; timer_8_bit_async_waveform_generation_t waveform = TIMER8BIT_ASYNC_WG_NORMAL; - pwm_hard_static_config_t * timer_config = &pwm_config[index].config.hard; + pwm_hard_static_config_t * timer_config = &pwm_config.hard[index]; // Compute closest prescaler first timer_8_bit_async_compute_closest_prescaler(clock_freq, &properties->frequency, &prescaler); @@ -420,7 +507,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p timerr = timer_8_bit_async_set_prescaler(index, prescaler); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } // We need to probe the waveform generation modes from Timer driver because it drives the way we configure a PWM afterwards @@ -428,7 +515,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p timerr = timer_8_bit_async_get_waveform_generation(timer_config->timer_index, &waveform); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } // Handles the hardware PWM unit A or B @@ -454,7 +541,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p } if(TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } // OCRA value represents the duty_cycle value now @@ -462,7 +549,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p timerr = timer_8_bit_async_set_ocra_register_value(timer_config->timer_index, ocr_value); if(TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } break; } @@ -474,7 +561,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p timerr = timer_8_bit_async_set_compare_match_A(timer_config->timer_index, TIMER8BIT_ASYNC_CMOD_TOGGLE_OCnX); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } ocr_value = (*clock_freq / (prescaler_value * properties->frequency)) - 1; @@ -488,7 +575,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p timerr = timer_8_bit_async_set_ocra_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } break; @@ -496,7 +583,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p case TIMER8BIT_ASYNC_WG_CTC: case TIMER8BIT_ASYNC_WG_NORMAL: default: - return PWM_ERR_CONFIG; + return PWM_ERROR_CONFIG; } } @@ -528,7 +615,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p timerr = timer_8_bit_async_set_ocra_register_value(timer_config->timer_index, ocr_value); if(TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } break; @@ -536,7 +623,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p timerr = timer_8_bit_async_set_ocrb_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } break; @@ -555,7 +642,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p timerr = timer_8_bit_async_set_ocra_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } // Compute exact duty cycle value for OCRB (reuse the ocr_value variable) @@ -564,7 +651,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p timerr = timer_8_bit_async_set_ocrb_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } break; } @@ -572,7 +659,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p case TIMER8BIT_ASYNC_WG_CTC: case TIMER8BIT_ASYNC_WG_NORMAL: default: - return PWM_ERR_CONFIG; + return PWM_ERROR_CONFIG; } } return ret; @@ -636,27 +723,27 @@ static timer_generic_resolution_t derive_16_bit_timer_resolution_from_waveform_s * @param properties : expected (or desired) PWM properties * @param clock_freq : current timer's input clock frequency * @return pwm_error_t - * PWM_ERR_OK : configuration is successful - * PWM_ERR_TIMER_ISSUE : encountered an issue with the underlying timer's capabilities and / or configuration - * PWM_ERR_CONFIG : something is off in the base configuration of either PWM driver or underlying timer 16 bit driver (waveform generation can be off for instance) + * PWM_ERROR_OK : configuration is successful + * PWM_ERROR_TIMER_ISSUE : encountered an issue with the underlying timer's capabilities and / or configuration + * PWM_ERROR_CONFIG : something is off in the base configuration of either PWM driver or underlying timer 16 bit driver (waveform generation can be off for instance) */ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) { timer_error_t timerr = TIMER_ERROR_OK; - pwm_error_t ret = PWM_ERR_OK; + pwm_error_t ret = PWM_ERROR_OK; uint16_t ocr_value = 0; timer_16_bit_prescaler_selection_t prescaler = TIMER16BIT_CLK_NO_CLOCK; timer_16_bit_waveform_generation_t waveform = TIMER16BIT_WG_NORMAL; - pwm_hard_static_config_t * timer_config = &pwm_config[index].config.hard; + pwm_hard_static_config_t * timer_config = &pwm_config.hard[index]; // We need to probe the waveform generation modes from Timer driver because it drives the way we configure a PWM afterwards // (Because timer8 bit has some limitations when it comes to having PWMs with full frequency and duty cycle control, a lot depends on the Waveform Generation) timerr = timer_16_bit_get_waveform_generation(timer_config->timer_index, &waveform); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } // Retrieve actual current timer resolution based on current waveform generation mode as per set in timer 16 bit registers @@ -667,7 +754,7 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ timerr = timer_16_bit_set_prescaler(index, prescaler); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } @@ -701,7 +788,7 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ if(TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } // The waveform selection mode tells us about the kind of desired PWM @@ -739,7 +826,7 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ timerr = timer_16_bit_set_icr_register_value(timer_config->timer_index, icr_value); if (TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } if( PWM_HARD_TIMER_UNIT_A == timer_config->unit) { @@ -767,7 +854,7 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ } else { - return PWM_ERR_CONFIG; + return PWM_ERROR_CONFIG; } timerr = timer_16_bit_set_ocra_register_value(timer_config->timer_index, &ocr_value); @@ -795,14 +882,24 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ case TIMER16BIT_WG_CTC_ICR_MAX: case TIMER16BIT_WG_CTC_OCRA_MAX: default: - return PWM_ERR_CONFIG; + return PWM_ERROR_CONFIG; } if(TIMER_ERROR_OK != timerr) { - return PWM_ERR_TIMER_ISSUE; + return PWM_ERROR_TIMER_ISSUE; } return ret; } + + +static inline bool index_valid(const uint8_t index, const pwm_type_t type) +{ + if (PWM_TYPE_HARDWARE == type) + { + return index < PWM_MAX_HARD_INSTANCES; + } + return index < PWM_MAX_SOFT_INSTANCES; +} From cefb03598a4142ffd72ba9e0930e951210721a68 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 13 Apr 2022 10:25:06 +0200 Subject: [PATCH 34/51] Added optional support for coverage report in Tests Signed-off-by: bebenlebricolo --- Tests/CMakeLists.txt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 5c705cc..6f41873 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -12,12 +12,20 @@ add_definitions( -DI2C_IMPLEM_FULL_DRIVER ) +option(COVERAGE OFF) + +if(COVERAGE) + set(COVERAGE_FLAGS "--coverage --ftest-coverage -fprofile-arcs") +else() + set(COVERAGE_FLAGS "") +endif() + if(UNIX) set(AVR_INCLUDES /usr/avr/include) - set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -Wall -Wextra --coverage") - set(CMAKE_C_FLAGS_DEBUG "-O0 -g3 -Wall -Wextra --coverage") - set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -Wextra --coverage") - set(CMAKE_C_FLAGS_RELEASE "-O3 -Wall -Wextra --coverage") + set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -Wall -Wextra ${COVERAGE_FLAGS}") + set(CMAKE_C_FLAGS_DEBUG "-O0 -g3 -Wall -Wextra ${COVERAGE_FLAGS}") + set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -Wextra ${COVERAGE_FLAGS}") + set(CMAKE_C_FLAGS_RELEASE "-O3 -Wall -Wextra ${COVERAGE_FLAGS}") else() if (NOT DEFINED AVR_INCLUDES) message(FATAL_ERROR "AVR_INCLUDES variable not set, please provide the path to avr includes") From 478f28e523463af7bf2f82b7208dba04bdf8efaf Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 13 Apr 2022 10:48:13 +0200 Subject: [PATCH 35/51] Added stubbed config export in timer stubs (PWM module) Signed-off-by: bebenlebricolo --- Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c | 20 +-- Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h | 21 ++- .../Pwm/Tests/Stubs/timer_8_bit_async_stub.c | 18 +- .../Pwm/Tests/Stubs/timer_8_bit_async_stub.h | 20 ++- Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c | 2 +- Modules/Pwm/Tests/pwm_tests.cpp | 164 +++++++++++++++++- Modules/Pwm/src/pwm.c | 1 - 7 files changed, 218 insertions(+), 28 deletions(-) diff --git a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c index bdf0fc1..ad765aa 100644 --- a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c @@ -31,23 +31,19 @@ along with this program. If not, see . #include "timer_16_bit_stub.h" #include "string.h" -typedef struct -{ - timer_16_bit_prescaler_selection_t prescaler; - uint16_t ocra; - uint16_t ocrb; - uint16_t icr; - uint32_t accumulator; - bool initialised; -} configuration_t; - -static configuration_t configuration = {0}; +static timer_16_bit_stub_configuration_t configuration = {0}; +static timer_error_t next_error = TIMER_ERROR_OK; static inline bool id_is_valid(const uint8_t id) { return (id < TIMER_16_BIT_STUB_MAX_INSTANCES); } +timer_16_bit_stub_configuration_t* timer_16_bit_stub_get_config(void) +{ + return &configuration; +} + void timer_16_bit_stub_set_next_parameters(const timer_16_bit_prescaler_selection_t prescaler, const uint16_t ocra, const uint32_t accumulator) { configuration.prescaler = prescaler; @@ -62,7 +58,7 @@ void timer_16_bit_stub_set_initialised(const bool initialised) void timer_16_bit_stub_reset(void) { - memset(&configuration, 0, sizeof(configuration_t)); + memset(&configuration, 0, sizeof(timer_16_bit_stub_configuration_t)); } diff --git a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h index 4c17e53..87e354c 100644 --- a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h +++ b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -39,9 +39,28 @@ extern "C" #include "timer_16_bit.h" #define TIMER_16_BIT_STUB_MAX_INSTANCES (1U) +typedef struct +{ + bool initialised; + bool started; + timer_16_bit_prescaler_selection_t prescaler; + uint16_t counter; + uint16_t ocra; + uint16_t ocrb; + uint16_t icr; + uint32_t accumulator; + timer_16_bit_config_t driver_config; + timer_16_bit_waveform_generation_t waveform; + timer_16_bit_compare_output_mode_t compA; + timer_16_bit_compare_output_mode_t compB; + timer_16_bit_force_compare_config_t force_comp; +} timer_16_bit_stub_configuration_t; + void timer_16_bit_stub_set_next_parameters(const timer_16_bit_prescaler_selection_t prescaler, const uint16_t ocra, const uint32_t accumulator); void timer_16_bit_stub_set_initialised(const bool initialised); void timer_16_bit_stub_reset(void); +timer_16_bit_stub_configuration_t* timer_16_bit_stub_get_config(void); + #ifdef __cplusplus } #endif diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c index 6552f8d..39f0011 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c @@ -31,21 +31,19 @@ along with this program. If not, see . #include "timer_8_bit_async_stub.h" #include "string.h" -typedef struct -{ - timer_8_bit_async_prescaler_selection_t prescaler; - uint8_t ocra; - uint32_t accumulator; - bool initialised; -} configuration_t; - -static configuration_t configuration = {0}; +static timer_8_bit_async_stub_configuration_t configuration = {0}; +static timer_error_t next_error = TIMER_ERROR_OK; static inline bool id_is_valid(const uint8_t id) { return (id < TIMER_8_BIT_ASYNC_STUB_MAX_INSTANCES); } +timer_8_bit_async_stub_configuration_t* timer_8_bit_async_stub_get_config(void) +{ + return &configuration; +} + void timer_8_bit_async_stub_set_next_parameters(const timer_8_bit_async_prescaler_selection_t prescaler, const uint8_t ocra, const uint32_t accumulator) { configuration.prescaler = prescaler; @@ -60,7 +58,7 @@ void timer_8_bit_async_stub_set_initialised(const bool initialised) void timer_8_bit_async_stub_reset(void) { - memset(&configuration, 0, sizeof(configuration_t)); + memset(&configuration, 0, sizeof(timer_8_bit_async_stub_configuration_t)); } void timer_8_bit_async_compute_matching_parameters( const uint32_t * const clock_freq, diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h index bc9d96c..3632644 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -39,9 +39,27 @@ extern "C" #include "timer_8_bit_async.h" #define TIMER_8_BIT_ASYNC_STUB_MAX_INSTANCES (1U) +typedef struct +{ + bool initialised; + bool started; + timer_8_bit_async_prescaler_selection_t prescaler; + uint8_t counter; + uint8_t ocra; + uint8_t ocrb; + uint32_t accumulator; + timer_8_bit_async_config_t driver_config; + timer_8_bit_async_waveform_generation_t waveform; + timer_8_bit_async_compare_output_mode_t compA; + timer_8_bit_async_compare_output_mode_t compB; + timer_8_bit_async_force_compare_config_t force_comp; +} timer_8_bit_async_stub_configuration_t; + void timer_8_bit_async_stub_set_next_parameters(const timer_8_bit_async_prescaler_selection_t prescaler, const uint8_t ocra, const uint32_t accumulator); void timer_8_bit_async_stub_set_initialised(const bool initialised); void timer_8_bit_async_stub_reset(void); +timer_8_bit_async_stub_configuration_t* timer_8_bit_async_stub_get_config(void); + #ifdef __cplusplus } #endif diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c index a4647d7..a64d168 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c @@ -33,7 +33,7 @@ along with this program. If not, see . -timer_8_bit_stub_configuration_t configuration = {0}; +static timer_8_bit_stub_configuration_t configuration = {0}; static timer_error_t next_error = TIMER_ERROR_OK; static inline bool id_is_valid(const uint8_t id) diff --git a/Modules/Pwm/Tests/pwm_tests.cpp b/Modules/Pwm/Tests/pwm_tests.cpp index ffbe640..6b0e55d 100644 --- a/Modules/Pwm/Tests/pwm_tests.cpp +++ b/Modules/Pwm/Tests/pwm_tests.cpp @@ -66,12 +66,18 @@ TEST_F(PwmModuleTestSuite, test_single_soft_init) ASSERT_EQ(PWM_ERROR_CONFIG, error); timer_8_bit_stub_set_initialised(true); + + // Forcing this timer to started state + timer_8_bit_stub_get_config()->started = true; + error = pwm_init(); ASSERT_EQ(PWM_ERROR_OK, error); -} + // Timer should be forcibly stopped at this point + ASSERT_FALSE(timer_8_bit_stub_get_config()->started); +} -TEST_F(PwmModuleTestSuite, test_configuration) +TEST_F(PwmModuleTestSuite, single_8_bit_pwm_hard_configuration) { // Rewritting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_8_BIT; @@ -139,9 +145,163 @@ TEST_F(PwmModuleTestSuite, test_configuration) error = pwm_stop(0U, PWM_TYPE_HARDWARE); ASSERT_EQ(PWM_ERROR_OK, error); ASSERT_FALSE(timer_8_bit_stub_get_config()->started); +} + +TEST_F(PwmModuleTestSuite, single_8_bit_async_pwm_hard_configuration) +{ + // Rewritting parts of pwm_config + pwm_config.hard[0].arch = TIMER_ARCH_8_BIT_ASYNC; + pwm_config.hard[0].timer_index = 0U; + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; + + // Setting up a software PWM + pwm_config.soft[0].io_index = 0U; + pwm_config.soft[0].timebase_index = 0U; + + pwm_error_t error = PWM_ERROR_OK; + + // Init the timer_8_bit beforehand + timer_8_bit_async_stub_set_initialised(true); + + // Init the timer_8_bit beforehand + timer_8_bit_async_stub_set_initialised(true); + error = pwm_init(); + ASSERT_EQ(PWM_ERROR_OK, error); + + pwm_props_t properties = + { + .frequency = 1 MHz, + .duty_cycle = 50U, + .pol = PWM_POLARITY_INVERTED + }; + const uint32_t cpu_freq = 1 MHz; + + // Normal Waveform generation should return an error, this pwm module does not want + // to interfere with other components using Timers, such as a timebase for instance. + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_NORMAL); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + // Same goes for CTC mode + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_CTC); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + + // Check that all 4 waveform modes are correct + const timer_8_bit_async_waveform_generation_t valid_modes[] = + { + TIMER8BIT_ASYNC_WG_PWM_FAST_FULL_RANGE, + TIMER8BIT_ASYNC_WG_PWM_FAST_OCRA_MAX, + TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_FULL_RANGE, + TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_OCRA_MAX, + }; + + // Select a valid waveform generation mode + for (const auto mode : valid_modes) + { + (void) timer_8_bit_async_set_waveform_generation(0U, mode); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + EXPECT_EQ(PWM_ERROR_OK, error); + } + + // Start the timer + ASSERT_FALSE(timer_8_bit_async_stub_get_config()->started); + error = pwm_start(0U, PWM_TYPE_HARDWARE); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_TRUE(timer_8_bit_async_stub_get_config()->started); + + // Check that timer is indeed stopped + error = pwm_stop(0U, PWM_TYPE_HARDWARE); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_FALSE(timer_8_bit_async_stub_get_config()->started); +} + +TEST_F(PwmModuleTestSuite, single_16_bit_pwm_hard_configuration) +{ + // Rewritting parts of pwm_config + pwm_config.hard[0].arch = TIMER_ARCH_16_BIT; + pwm_config.hard[0].timer_index = 0U; + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; + + // Setting up a software PWM + pwm_config.soft[0].io_index = 0U; + pwm_config.soft[0].timebase_index = 0U; + + pwm_error_t error = PWM_ERROR_OK; + + // Init the timer_16_bit beforehand + timer_16_bit_stub_set_initialised(true); + + // Init the timer_16_bit beforehand + timer_16_bit_stub_set_initialised(true); + error = pwm_init(); + ASSERT_EQ(PWM_ERROR_OK, error); + + pwm_props_t properties = + { + .frequency = 1 MHz, + .duty_cycle = 50U, + .pol = PWM_POLARITY_INVERTED + }; + const uint32_t cpu_freq = 1 MHz; + + // Normal Waveform generation should return an error, this pwm module does not want + // to interfere with other components using Timers, such as a timebase for instance. + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_NORMAL); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + // Same goes for CTC mode + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_CTC_ICR_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_CTC_OCRA_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + + // Check that all 4 waveform modes are correct + const timer_16_bit_waveform_generation_t valid_modes[] = + { + TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_FAST_8_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_FAST_ICR_MAX, + TIMER16BIT_WG_PWM_FAST_OCRA_MAX, + + TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_ICR_MAX, + TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_OCRA_MAX, + + TIMER16BIT_WG_PWM_PHASE_CORRECT_10_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_9_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_8_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_ICR_MAX, + TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX, + }; + + // Select a valid waveform generation mode + for (const auto mode : valid_modes) + { + (void) timer_16_bit_set_waveform_generation(0U, mode); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + EXPECT_EQ(PWM_ERROR_OK, error); + } + + // Start the timer + ASSERT_FALSE(timer_16_bit_stub_get_config()->started); + error = pwm_start(0U, PWM_TYPE_HARDWARE); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_TRUE(timer_16_bit_stub_get_config()->started); + + // Check that timer is indeed stopped + error = pwm_stop(0U, PWM_TYPE_HARDWARE); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_FALSE(timer_16_bit_stub_get_config()->started); } + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 6bc97a6..cdae612 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -157,7 +157,6 @@ static pwm_error_t pwm_init_single_hard(pwm_hard_static_config_t const * const c timerr = timer_8_bit_stop(config->timer_index); break; - // TODO report implementation to 8 bit async and 16 bit case TIMER_ARCH_8_BIT_ASYNC: timerr = timer_8_bit_async_stop(config->timer_index); break; From 7b75fa6938a134f4c4cebe9b3be6275481b9ff30 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Thu, 21 Apr 2022 09:21:08 +0200 Subject: [PATCH 36/51] Tooled stubbed timers Signed-off-by: bebenlebricolo --- .../Timer_16_bit/inc/timer_16_bit_reg.h | 4 +- Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c | 123 +++++++++--------- Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h | 28 ++-- .../Pwm/Tests/Stubs/timer_8_bit_async_stub.c | 98 +++++++------- .../Pwm/Tests/Stubs/timer_8_bit_async_stub.h | 3 +- Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c | 7 +- Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h | 1 + Modules/Pwm/Tests/pwm_tests.cpp | 8 +- 8 files changed, 143 insertions(+), 129 deletions(-) diff --git a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h index 4e2aeec..9c78bcf 100644 --- a/Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h +++ b/Drivers/Timers/Timer_16_bit/inc/timer_16_bit_reg.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -172,7 +172,7 @@ typedef struct timer_16_bit_compare_output_mode_t comp_match_a; /**< Equivalent to TCCRnA COMnA0 and COMnA1 bits */ timer_16_bit_compare_output_mode_t comp_match_b; /**< Equivalent to TCCRnA COMnB0 and COMnB1 bits */ timer_16_bit_waveform_generation_t waveform_mode; /**< Selects the right waveform mode and dispatch it to the right registers */ - timer_16_bit_prescaler_selection_t prescaler; /**< Selects the right prescaler to be fed in the timer */ + timer_16_bit_prescaler_selection_t prescaler; /**< Selects the right prescaler to be fed in the timer */ uint16_t counter; /**< Gives the starting counter value when configured */ uint16_t ocra_val; /**< Selects the OCRA value to be used for timer events triggering */ uint16_t ocrb_val; /**< Selects the OCRB value to be used for timer events triggering */ diff --git a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c index ad765aa..3817be1 100644 --- a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c @@ -99,7 +99,7 @@ timer_error_t timer_16_bit_compute_matching_parameters(const uint32_t * const cl *ocr = parameters.output.ocr; *accumulator = parameters.output.accumulator; - return TIMER_ERROR_OK; + return next_error; } timer_error_t timer_16_bit_compute_closest_prescaler(const uint32_t * const clock_freq, @@ -125,7 +125,7 @@ timer_error_t timer_16_bit_compute_closest_prescaler(const uint32_t * const cloc } *prescaler = parameters.output.prescaler; - return TIMER_ERROR_OK; + return next_error; } timer_16_bit_prescaler_selection_t timer_16_bit_prescaler_from_value(uint16_t const * const input_prescaler) @@ -156,7 +156,7 @@ timer_error_t timer_16_bit_set_icr_register_value(uint8_t id, const uint16_t icr { (void) id; configuration.icr = icr; - return TIMER_ERROR_OK; + return next_error; } @@ -202,7 +202,7 @@ timer_error_t timer_16_bit_set_handle(uint8_t id, timer_16_bit_handle_t * const return TIMER_ERROR_UNKNOWN_TIMER; }; (void) handle; - return TIMER_ERROR_OK; + return next_error; } timer_error_t timer_16_bit_get_handle(uint8_t id, timer_16_bit_handle_t * const handle) @@ -212,7 +212,7 @@ timer_error_t timer_16_bit_get_handle(uint8_t id, timer_16_bit_handle_t * const return TIMER_ERROR_UNKNOWN_TIMER; }; (void) handle; - return TIMER_ERROR_OK; + return next_error; } timer_error_t timer_16_bit_set_force_compare_config(uint8_t id, timer_16_bit_force_compare_config_t * const force_comp_config) @@ -221,8 +221,8 @@ timer_error_t timer_16_bit_set_force_compare_config(uint8_t id, timer_16_bit_for { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) force_comp_config; - return TIMER_ERROR_OK; + configuration.force_comp = *force_comp_config; + return next_error; } timer_error_t timer_16_bit_get_force_compare_config(uint8_t id, timer_16_bit_force_compare_config_t * force_comp_config) @@ -231,8 +231,8 @@ timer_error_t timer_16_bit_get_force_compare_config(uint8_t id, timer_16_bit_for { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) force_comp_config; - return TIMER_ERROR_OK; + *force_comp_config = configuration.force_comp; + return next_error; } timer_error_t timer_16_bit_set_interrupt_config(uint8_t id, timer_16_bit_interrupt_config_t * const it_config) @@ -241,8 +241,8 @@ timer_error_t timer_16_bit_set_interrupt_config(uint8_t id, timer_16_bit_interru { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) it_config; - return TIMER_ERROR_OK; + configuration.it_config = *it_config; + return next_error; } timer_error_t timer_16_bit_get_interrupt_config(uint8_t id, timer_16_bit_interrupt_config_t * it_config) @@ -251,8 +251,8 @@ timer_error_t timer_16_bit_get_interrupt_config(uint8_t id, timer_16_bit_interru { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) it_config; - return TIMER_ERROR_OK; + *it_config = configuration.it_config; + return next_error; } #ifdef UNIT_TESTING @@ -262,8 +262,8 @@ timer_error_t timer_16_bit_get_interrupt_flags(uint8_t id, timer_16_bit_interrup { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) it_flags; - return TIMER_ERROR_OK; + *it_flags = configuration.it_config; + return next_error; } #endif @@ -273,8 +273,8 @@ timer_error_t timer_16_bit_set_prescaler(uint8_t id, const timer_16_bit_prescale { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) prescaler; - return TIMER_ERROR_OK; + configuration.prescaler = prescaler; + return next_error; } timer_error_t timer_16_bit_get_prescaler(uint8_t id, timer_16_bit_prescaler_selection_t * prescaler) @@ -283,8 +283,8 @@ timer_error_t timer_16_bit_get_prescaler(uint8_t id, timer_16_bit_prescaler_sele { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) prescaler; - return TIMER_ERROR_OK; + *prescaler = configuration.prescaler; + return next_error; } timer_error_t timer_16_bit_set_compare_match_A(uint8_t id, const timer_16_bit_compare_output_mode_t compA) @@ -293,8 +293,8 @@ timer_error_t timer_16_bit_set_compare_match_A(uint8_t id, const timer_16_bit_co { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) compA; - return TIMER_ERROR_OK; + configuration.compA = compA; + return next_error; } timer_error_t timer_16_bit_get_compare_match_A(uint8_t id, timer_16_bit_compare_output_mode_t * compA) @@ -303,8 +303,8 @@ timer_error_t timer_16_bit_get_compare_match_A(uint8_t id, timer_16_bit_compare_ { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) compA; - return TIMER_ERROR_OK; + *compA = configuration.compA; + return next_error; } @@ -314,8 +314,8 @@ timer_error_t timer_16_bit_set_input_compare_noise_canceler(uint8_t id, const bo { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) enabled; - return TIMER_ERROR_OK; + configuration.noise_canceler_config.use_noise_canceler = enabled; + return next_error; } timer_error_t timer_16_bit_get_input_compare_noise_canceler(uint8_t id, bool * const enabled) @@ -324,8 +324,8 @@ timer_error_t timer_16_bit_get_input_compare_noise_canceler(uint8_t id, bool * c { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) enabled; - return TIMER_ERROR_OK; + *enabled = configuration.noise_canceler_config.use_noise_canceler; + return next_error; } timer_error_t timer_16_bit_set_input_compare_edge_select(uint8_t id, const timer_16_bit_input_capture_edge_select_flag_t edge) @@ -334,8 +334,8 @@ timer_error_t timer_16_bit_set_input_compare_edge_select(uint8_t id, const timer { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) edge; - return TIMER_ERROR_OK; + configuration.noise_canceler_config.edge_select = edge; + return next_error; } timer_error_t timer_16_bit_get_input_compare_edge_select(uint8_t id, timer_16_bit_input_capture_edge_select_flag_t * const edge) @@ -344,8 +344,8 @@ timer_error_t timer_16_bit_get_input_compare_edge_select(uint8_t id, timer_16_bi { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) edge; - return TIMER_ERROR_OK; + *edge = configuration.noise_canceler_config.edge_select; + return next_error; } timer_error_t timer_16_bit_get_input_capture_value(uint8_t id, uint16_t * ticks) @@ -354,8 +354,8 @@ timer_error_t timer_16_bit_get_input_capture_value(uint8_t id, uint16_t * ticks) { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ticks; - return TIMER_ERROR_OK; + *ticks = configuration.icr; + return next_error; } timer_error_t timer_16_bit_set_compare_match_B(uint8_t id, timer_16_bit_compare_output_mode_t compB) @@ -364,8 +364,8 @@ timer_error_t timer_16_bit_set_compare_match_B(uint8_t id, timer_16_bit_compare_ { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) compB; - return TIMER_ERROR_OK; + configuration.compB = compB; + return next_error; } timer_error_t timer_16_bit_get_compare_match_B(uint8_t id, timer_16_bit_compare_output_mode_t * compB) @@ -374,8 +374,8 @@ timer_error_t timer_16_bit_get_compare_match_B(uint8_t id, timer_16_bit_compare_ { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) compB; - return TIMER_ERROR_OK; + *compB = configuration.compB; + return next_error; } timer_error_t timer_16_bit_set_waveform_generation(uint8_t id, const timer_16_bit_waveform_generation_t waveform) @@ -384,8 +384,8 @@ timer_error_t timer_16_bit_set_waveform_generation(uint8_t id, const timer_16_bi { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) waveform; - return TIMER_ERROR_OK; + configuration.waveform = waveform; + return next_error; } timer_error_t timer_16_bit_get_waveform_generation(uint8_t id, timer_16_bit_waveform_generation_t * waveform) @@ -394,8 +394,8 @@ timer_error_t timer_16_bit_get_waveform_generation(uint8_t id, timer_16_bit_wave { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) waveform; - return TIMER_ERROR_OK; + *waveform = configuration.waveform; + return next_error; } timer_error_t timer_16_bit_set_counter_value(uint8_t id, const uint16_t * const ticks) @@ -404,8 +404,8 @@ timer_error_t timer_16_bit_set_counter_value(uint8_t id, const uint16_t * const { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ticks; - return TIMER_ERROR_OK; + configuration.counter = *ticks; + return next_error; } timer_error_t timer_16_bit_get_counter_value(uint8_t id, uint16_t * const ticks) @@ -414,8 +414,8 @@ timer_error_t timer_16_bit_get_counter_value(uint8_t id, uint16_t * const ticks) { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ticks; - return TIMER_ERROR_OK; + *ticks = configuration.counter; + return next_error; } timer_error_t timer_16_bit_set_ocra_register_value(uint8_t id, const uint16_t * const ocra) @@ -424,8 +424,8 @@ timer_error_t timer_16_bit_set_ocra_register_value(uint8_t id, const uint16_t * { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ocra; - return TIMER_ERROR_OK; + configuration.ocra = *ocra; + return next_error; } timer_error_t timer_16_bit_get_ocra_register_value(uint8_t id, uint16_t * const ocra) @@ -434,8 +434,8 @@ timer_error_t timer_16_bit_get_ocra_register_value(uint8_t id, uint16_t * const { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ocra; - return TIMER_ERROR_OK; + *ocra = configuration.ocra; + return next_error; } timer_error_t timer_16_bit_set_ocrb_register_value(uint8_t id, const uint16_t * const ocrb) @@ -444,8 +444,8 @@ timer_error_t timer_16_bit_set_ocrb_register_value(uint8_t id, const uint16_t * { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ocrb; - return TIMER_ERROR_OK; + configuration.ocrb = *ocrb; + return next_error; } timer_error_t timer_16_bit_get_ocrb_register_value(uint8_t id, uint16_t * const ocrb) @@ -454,8 +454,8 @@ timer_error_t timer_16_bit_get_ocrb_register_value(uint8_t id, uint16_t * const { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ocrb; - return TIMER_ERROR_OK; + *ocrb = configuration.ocrb; + return next_error; } timer_error_t timer_16_bit_init(uint8_t id, timer_16_bit_config_t * const config) @@ -465,7 +465,9 @@ timer_error_t timer_16_bit_init(uint8_t id, timer_16_bit_config_t * const config return TIMER_ERROR_UNKNOWN_TIMER; }; (void) config; - return TIMER_ERROR_OK; + timer_16_bit_stub_reset(); + + return next_error; } timer_error_t timer_16_bit_reconfigure(uint8_t id, timer_16_bit_config_t * const config) @@ -475,7 +477,7 @@ timer_error_t timer_16_bit_reconfigure(uint8_t id, timer_16_bit_config_t * const return TIMER_ERROR_UNKNOWN_TIMER; }; (void) config; - return TIMER_ERROR_OK; + return next_error; } timer_error_t timer_16_bit_deinit(uint8_t id) @@ -484,7 +486,8 @@ timer_error_t timer_16_bit_deinit(uint8_t id) { return TIMER_ERROR_UNKNOWN_TIMER; }; - return TIMER_ERROR_OK; + timer_16_bit_stub_reset(); + return next_error; } timer_error_t timer_16_bit_start(uint8_t id) @@ -493,7 +496,8 @@ timer_error_t timer_16_bit_start(uint8_t id) { return TIMER_ERROR_UNKNOWN_TIMER; }; - return TIMER_ERROR_OK; + configuration.started = true; + return next_error; } timer_error_t timer_16_bit_stop(uint8_t id) @@ -502,7 +506,8 @@ timer_error_t timer_16_bit_stop(uint8_t id) { return TIMER_ERROR_UNKNOWN_TIMER; }; - return TIMER_ERROR_OK; + configuration.started = false; + return next_error; } timer_error_t timer_16_bit_is_initialised(const uint8_t id, bool * const initialised) @@ -512,5 +517,5 @@ timer_error_t timer_16_bit_is_initialised(const uint8_t id, bool * const initial return TIMER_ERROR_UNKNOWN_TIMER; }; *initialised = configuration.initialised; - return TIMER_ERROR_OK; + return next_error; } \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h index 87e354c..e090415 100644 --- a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h +++ b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.h @@ -41,19 +41,21 @@ extern "C" typedef struct { - bool initialised; - bool started; - timer_16_bit_prescaler_selection_t prescaler; - uint16_t counter; - uint16_t ocra; - uint16_t ocrb; - uint16_t icr; - uint32_t accumulator; - timer_16_bit_config_t driver_config; - timer_16_bit_waveform_generation_t waveform; - timer_16_bit_compare_output_mode_t compA; - timer_16_bit_compare_output_mode_t compB; - timer_16_bit_force_compare_config_t force_comp; + bool initialised; + bool started; + uint16_t counter; + uint16_t ocra; + uint16_t ocrb; + uint16_t icr; + uint32_t accumulator; + timer_16_bit_prescaler_selection_t prescaler; + timer_16_bit_config_t driver_config; + timer_16_bit_waveform_generation_t waveform; + timer_16_bit_compare_output_mode_t compA; + timer_16_bit_compare_output_mode_t compB; + timer_16_bit_force_compare_config_t force_comp; + timer_16_bit_interrupt_config_t it_config; + timer_16_bit_input_capture_noise_canceler_config_t noise_canceler_config; } timer_16_bit_stub_configuration_t; void timer_16_bit_stub_set_next_parameters(const timer_16_bit_prescaler_selection_t prescaler, const uint16_t ocra, const uint32_t accumulator); diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c index 39f0011..0031d74 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c @@ -159,7 +159,7 @@ timer_error_t timer_8_bit_async_get_default_config(timer_8_bit_async_config_t * config->force_compare.force_comp_match_a = false; config->force_compare.force_comp_match_b = false; - return ret; + return next_error; } timer_error_t timer_8_bit_async_set_handle(uint8_t id, timer_8_bit_async_handle_t * const handle) @@ -169,7 +169,7 @@ timer_error_t timer_8_bit_async_set_handle(uint8_t id, timer_8_bit_async_handle_ return TIMER_ERROR_UNKNOWN_TIMER; }; (void) handle; - return TIMER_ERROR_OK; + return next_error; } timer_error_t timer_8_bit_async_get_handle(uint8_t id, timer_8_bit_async_handle_t * const handle) @@ -179,7 +179,7 @@ timer_error_t timer_8_bit_async_get_handle(uint8_t id, timer_8_bit_async_handle_ return TIMER_ERROR_UNKNOWN_TIMER; }; (void) handle; - return TIMER_ERROR_OK; + return next_error; } timer_error_t timer_8_bit_async_set_force_compare_config(uint8_t id, timer_8_bit_async_force_compare_config_t * const force_comp_config) @@ -188,8 +188,8 @@ timer_error_t timer_8_bit_async_set_force_compare_config(uint8_t id, timer_8_bit { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) force_comp_config; - return TIMER_ERROR_OK; + configuration.force_comp = *force_comp_config; + return next_error; } timer_error_t timer_8_bit_async_get_force_compare_config(uint8_t id, timer_8_bit_async_force_compare_config_t * force_comp_config) @@ -198,8 +198,8 @@ timer_error_t timer_8_bit_async_get_force_compare_config(uint8_t id, timer_8_bit { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) force_comp_config; - return TIMER_ERROR_OK; + *force_comp_config = configuration.force_comp; + return next_error; } timer_error_t timer_8_bit_async_set_interrupt_config(uint8_t id, timer_8_bit_async_interrupt_config_t * const it_config) @@ -208,8 +208,8 @@ timer_error_t timer_8_bit_async_set_interrupt_config(uint8_t id, timer_8_bit_asy { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) it_config; - return TIMER_ERROR_OK; + configuration.it_config = *it_config; + return next_error; } timer_error_t timer_8_bit_async_get_interrupt_config(uint8_t id, timer_8_bit_async_interrupt_config_t * it_config) @@ -218,8 +218,8 @@ timer_error_t timer_8_bit_async_get_interrupt_config(uint8_t id, timer_8_bit_asy { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) it_config; - return TIMER_ERROR_OK; + *it_config = configuration.it_config; + return next_error; } #ifdef UNIT_TESTING @@ -229,8 +229,8 @@ timer_error_t timer_8_bit_async_get_interrupt_flags(uint8_t id, timer_8_bit_asyn { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) it_flags; - return TIMER_ERROR_OK; + *it_flags = configuration.it_config; + return next_error; } #endif @@ -240,8 +240,8 @@ timer_error_t timer_8_bit_async_set_prescaler(uint8_t id, const timer_8_bit_asyn { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) prescaler; - return TIMER_ERROR_OK; + configuration.prescaler = prescaler; + return next_error; } timer_error_t timer_8_bit_async_get_prescaler(uint8_t id, timer_8_bit_async_prescaler_selection_t * prescaler) @@ -250,8 +250,8 @@ timer_error_t timer_8_bit_async_get_prescaler(uint8_t id, timer_8_bit_async_pres { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) prescaler; - return TIMER_ERROR_OK; + *prescaler = configuration.prescaler; + return next_error; } timer_error_t timer_8_bit_async_set_compare_match_A(uint8_t id, const timer_8_bit_async_compare_output_mode_t compA) @@ -260,8 +260,8 @@ timer_error_t timer_8_bit_async_set_compare_match_A(uint8_t id, const timer_8_bi { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) compA; - return TIMER_ERROR_OK; + configuration.compA = compA; + return next_error; } timer_error_t timer_8_bit_async_get_compare_match_A(uint8_t id, timer_8_bit_async_compare_output_mode_t * compA) @@ -270,8 +270,8 @@ timer_error_t timer_8_bit_async_get_compare_match_A(uint8_t id, timer_8_bit_asyn { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) compA; - return TIMER_ERROR_OK; + *compA = configuration.compA; + return next_error; } timer_error_t timer_8_bit_async_set_compare_match_B(uint8_t id, timer_8_bit_async_compare_output_mode_t compB) @@ -280,8 +280,8 @@ timer_error_t timer_8_bit_async_set_compare_match_B(uint8_t id, timer_8_bit_asyn { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) compB; - return TIMER_ERROR_OK; + configuration.compB = compB; + return next_error; } timer_error_t timer_8_bit_async_get_compare_match_B(uint8_t id, timer_8_bit_async_compare_output_mode_t * compB) @@ -290,8 +290,8 @@ timer_error_t timer_8_bit_async_get_compare_match_B(uint8_t id, timer_8_bit_asyn { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) compB; - return TIMER_ERROR_OK; + *compB = configuration.compB; + return next_error; } timer_error_t timer_8_bit_async_set_waveform_generation(uint8_t id, const timer_8_bit_async_waveform_generation_t waveform) @@ -300,8 +300,8 @@ timer_error_t timer_8_bit_async_set_waveform_generation(uint8_t id, const timer_ { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) waveform; - return TIMER_ERROR_OK; + configuration.waveform = waveform; + return next_error; } timer_error_t timer_8_bit_async_get_waveform_generation(uint8_t id, timer_8_bit_async_waveform_generation_t * const waveform) @@ -310,8 +310,8 @@ timer_error_t timer_8_bit_async_get_waveform_generation(uint8_t id, timer_8_bit_ { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) waveform; - return TIMER_ERROR_OK; + *waveform = configuration.waveform; + return next_error; } timer_error_t timer_8_bit_async_set_counter_value(uint8_t id, const uint8_t ticks) @@ -320,8 +320,8 @@ timer_error_t timer_8_bit_async_set_counter_value(uint8_t id, const uint8_t tick { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ticks; - return TIMER_ERROR_OK; + configuration.counter = ticks; + return next_error; } timer_error_t timer_8_bit_async_get_counter_value(uint8_t id, uint8_t * ticks) @@ -330,8 +330,8 @@ timer_error_t timer_8_bit_async_get_counter_value(uint8_t id, uint8_t * ticks) { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ticks; - return TIMER_ERROR_OK; + *ticks = configuration.counter; + return next_error; } timer_error_t timer_8_bit_async_set_ocra_register_value(uint8_t id, uint8_t ocra) @@ -340,8 +340,8 @@ timer_error_t timer_8_bit_async_set_ocra_register_value(uint8_t id, uint8_t ocra { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ocra; - return TIMER_ERROR_OK; + configuration.ocra = ocra; + return next_error; } timer_error_t timer_8_bit_async_get_ocra_register_value(uint8_t id, uint8_t * ocra) @@ -350,8 +350,8 @@ timer_error_t timer_8_bit_async_get_ocra_register_value(uint8_t id, uint8_t * oc { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ocra; - return TIMER_ERROR_OK; + *ocra = configuration.ocra; + return next_error; } timer_error_t timer_8_bit_async_set_ocrb_register_value(uint8_t id, uint8_t ocrb) @@ -360,8 +360,8 @@ timer_error_t timer_8_bit_async_set_ocrb_register_value(uint8_t id, uint8_t ocrb { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ocrb; - return TIMER_ERROR_OK; + configuration.ocrb = ocrb; + return next_error; } timer_error_t timer_8_bit_async_get_ocrb_register_value(uint8_t id, uint8_t * ocrb) @@ -370,8 +370,8 @@ timer_error_t timer_8_bit_async_get_ocrb_register_value(uint8_t id, uint8_t * oc { return TIMER_ERROR_UNKNOWN_TIMER; }; - (void) ocrb; - return TIMER_ERROR_OK; + *ocrb = configuration.ocrb; + return next_error; } timer_error_t timer_8_bit_async_init(uint8_t id, timer_8_bit_async_config_t * const config) @@ -380,8 +380,9 @@ timer_error_t timer_8_bit_async_init(uint8_t id, timer_8_bit_async_config_t * co { return TIMER_ERROR_UNKNOWN_TIMER; }; + timer_8_bit_async_stub_reset(); (void) config; - return TIMER_ERROR_OK; + return next_error; } timer_error_t timer_8_bit_async_reconfigure(uint8_t id, timer_8_bit_async_config_t * const config) @@ -391,7 +392,7 @@ timer_error_t timer_8_bit_async_reconfigure(uint8_t id, timer_8_bit_async_config return TIMER_ERROR_UNKNOWN_TIMER; }; (void) config; - return TIMER_ERROR_OK; + return next_error; } timer_error_t timer_8_bit_async_deinit(uint8_t id) @@ -400,7 +401,8 @@ timer_error_t timer_8_bit_async_deinit(uint8_t id) { return TIMER_ERROR_UNKNOWN_TIMER; }; - return TIMER_ERROR_OK; + timer_8_bit_async_stub_reset(); + return next_error; } timer_error_t timer_8_bit_async_start(uint8_t id) @@ -409,7 +411,8 @@ timer_error_t timer_8_bit_async_start(uint8_t id) { return TIMER_ERROR_UNKNOWN_TIMER; }; - return TIMER_ERROR_OK; + configuration.started = true; + return next_error; } timer_error_t timer_8_bit_async_stop(uint8_t id) @@ -418,7 +421,8 @@ timer_error_t timer_8_bit_async_stop(uint8_t id) { return TIMER_ERROR_UNKNOWN_TIMER; }; - return TIMER_ERROR_OK; + configuration.started = false; + return next_error; } timer_error_t timer_8_bit_async_is_initialised(const uint8_t id, bool * const initialised) @@ -428,5 +432,5 @@ timer_error_t timer_8_bit_async_is_initialised(const uint8_t id, bool * const in return TIMER_ERROR_UNKNOWN_TIMER; }; *initialised = configuration.initialised; - return TIMER_ERROR_OK; + return next_error; } \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h index 3632644..514d55e 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.h @@ -43,16 +43,17 @@ typedef struct { bool initialised; bool started; - timer_8_bit_async_prescaler_selection_t prescaler; uint8_t counter; uint8_t ocra; uint8_t ocrb; uint32_t accumulator; + timer_8_bit_async_prescaler_selection_t prescaler; timer_8_bit_async_config_t driver_config; timer_8_bit_async_waveform_generation_t waveform; timer_8_bit_async_compare_output_mode_t compA; timer_8_bit_async_compare_output_mode_t compB; timer_8_bit_async_force_compare_config_t force_comp; + timer_8_bit_async_interrupt_config_t it_config; } timer_8_bit_async_stub_configuration_t; void timer_8_bit_async_stub_set_next_parameters(const timer_8_bit_async_prescaler_selection_t prescaler, const uint8_t ocra, const uint32_t accumulator); diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c index a64d168..c086005 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c @@ -199,14 +199,14 @@ timer_error_t timer_8_bit_get_force_compare_config(uint8_t id, timer_8_bit_force timer_error_t timer_8_bit_set_interrupt_config(uint8_t id, timer_8_bit_interrupt_config_t * const it_config) { - (void) it_config; + configuration.it_config = *it_config; (void) id; return next_error; } timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt_config_t * it_config) { - (void) it_config; + *it_config = configuration.it_config; (void) id; return next_error; } @@ -214,7 +214,7 @@ timer_error_t timer_8_bit_get_interrupt_config(uint8_t id, timer_8_bit_interrupt #ifdef UNIT_TESTING timer_error_t timer_8_bit_get_interrupt_flags(uint8_t id, timer_8_bit_interrupt_config_t * it_flags) { - (void) it_flags; + *it_flags = configuration.it_config; (void) id; return next_error; } @@ -324,6 +324,7 @@ timer_error_t timer_8_bit_init(uint8_t id, timer_8_bit_config_t * const config) { (void) config; (void) id; + timer_8_bit_stub_reset(); return next_error; } diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h index b142bef..7354f2d 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.h @@ -53,6 +53,7 @@ typedef struct timer_8_bit_compare_output_mode_t compA; timer_8_bit_compare_output_mode_t compB; timer_8_bit_force_compare_config_t force_comp; + timer_8_bit_interrupt_config_t it_config; } timer_8_bit_stub_configuration_t; void timer_8_bit_stub_set_next_parameters(const timer_8_bit_prescaler_selection_t prescaler, const uint8_t ocra, const uint32_t accumulator); diff --git a/Modules/Pwm/Tests/pwm_tests.cpp b/Modules/Pwm/Tests/pwm_tests.cpp index 6b0e55d..09cd135 100644 --- a/Modules/Pwm/Tests/pwm_tests.cpp +++ b/Modules/Pwm/Tests/pwm_tests.cpp @@ -244,7 +244,7 @@ TEST_F(PwmModuleTestSuite, single_16_bit_pwm_hard_configuration) .duty_cycle = 50U, .pol = PWM_POLARITY_INVERTED }; - const uint32_t cpu_freq = 1 MHz; + const uint32_t cpu_freq = 16 MHz; // Normal Waveform generation should return an error, this pwm module does not want // to interfere with other components using Timers, such as a timebase for instance. @@ -269,16 +269,16 @@ TEST_F(PwmModuleTestSuite, single_16_bit_pwm_hard_configuration) TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE, TIMER16BIT_WG_PWM_FAST_8_bit_FULL_RANGE, TIMER16BIT_WG_PWM_FAST_ICR_MAX, - TIMER16BIT_WG_PWM_FAST_OCRA_MAX, + TIMER16BIT_WG_PWM_FAST_OCRA_MAX, // Error TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_ICR_MAX, - TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_OCRA_MAX, + TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_OCRA_MAX, //Error TIMER16BIT_WG_PWM_PHASE_CORRECT_10_bit_FULL_RANGE, TIMER16BIT_WG_PWM_PHASE_CORRECT_9_bit_FULL_RANGE, TIMER16BIT_WG_PWM_PHASE_CORRECT_8_bit_FULL_RANGE, TIMER16BIT_WG_PWM_PHASE_CORRECT_ICR_MAX, - TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX, + TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX, // Error }; // Select a valid waveform generation mode From 9ddde91df826b0dc6f9fc2cbc7f5e6c3dd7d37ea Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 27 Apr 2022 11:01:28 +0200 Subject: [PATCH 37/51] Modified PWM driver to output actual frequency and duty cycle at config time Signed-off-by: bebenlebricolo --- Drivers/Io/inc/io.h | 10 +- Drivers/Io/src/io.c | 15 +- Modules/Pwm/Tests/pwm_tests.cpp | 251 +++++++++++++++++++++++++++++++- Modules/Pwm/inc/pwm.h | 19 ++- Modules/Pwm/src/pwm.c | 73 ++++++---- 5 files changed, 327 insertions(+), 41 deletions(-) diff --git a/Drivers/Io/inc/io.h b/Drivers/Io/inc/io.h index 5d640e5..2438c80 100644 --- a/Drivers/Io/inc/io.h +++ b/Drivers/Io/inc/io.h @@ -33,8 +33,14 @@ typedef enum */ typedef enum { - IO_STATE_LOW = 0U, - IO_STATE_HIGH = 1U + IO_STATE_LOW = 0U, + IO_STATE_HIGH = 1U, + IO_STATE_UNDEFINED = 2U, /**< Undefined state is used by client code (drivers, modules, application) to tell IO driver to leave this pin untouched */ + // This is useful when client code provides the ability to set a given pin to a predefined state when starting operation. + // For instance, the software PWM driver may initialise a given IO pin to a predefined state when PWM is not running + // to prevent hardware/electrical issues such as overheating, etc. + // In such cases, the "safe" state for a pin can be specified either by LOW or HIGH state, and sometimes we can use UNDEFINED + // state to indicate to the client code not to interact with the pin and leave it in its current state } io_state_t; /** diff --git a/Drivers/Io/src/io.c b/Drivers/Io/src/io.c index 8f8e83a..da2b163 100644 --- a/Drivers/Io/src/io.c +++ b/Drivers/Io/src/io.c @@ -65,13 +65,20 @@ io_state_t io_read(const uint8_t index) void io_write(const uint8_t index, const io_state_t state) { io_t * io = &io_pins_lut[index]; - if ( IO_STATE_HIGH == state ) + switch (state) { + case IO_STATE_HIGH: *port_lut[io->port]->port_reg |= (1 << io->pin); - } - else - { + break; + + case IO_STATE_LOW : *port_lut[io->port]->port_reg &= ~(1 << io->pin); + break; + + // Undefined state is used by other drivers to indicate "do not interact with this pin" + case IO_STATE_UNDEFINED : + default: + break; } } diff --git a/Modules/Pwm/Tests/pwm_tests.cpp b/Modules/Pwm/Tests/pwm_tests.cpp index 09cd135..0d9bb4b 100644 --- a/Modules/Pwm/Tests/pwm_tests.cpp +++ b/Modules/Pwm/Tests/pwm_tests.cpp @@ -13,6 +13,10 @@ #include "timer_8_bit_async_stub.h" +/** + * @brief Global PWM test suite class + * It will be used to test mixed configurations + */ class PwmModuleTestSuite : public ::testing::Test { public: @@ -28,6 +32,22 @@ class PwmModuleTestSuite : public ::testing::Test } }; +/** + * @brief Test suite dedicated to test 8 bit timers wrapping by PWM module specifically + */ +class PwmModule8BitTimerTestSuite : public ::testing::Test +{ +public: + void SetUp(void) override + { + } + + void TearDown(void) override + { + timer_8_bit_stub_reset(); + } +}; + TEST_F(PwmModuleTestSuite, test_single_hard_config) { // Rewritting parts of pwm_config @@ -77,7 +97,7 @@ TEST_F(PwmModuleTestSuite, test_single_soft_init) } -TEST_F(PwmModuleTestSuite, single_8_bit_pwm_hard_configuration) +TEST_F(PwmModuleTestSuite, single_8_bit_pwm_hard_configuration_waveforms) { // Rewritting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_8_BIT; @@ -147,6 +167,229 @@ TEST_F(PwmModuleTestSuite, single_8_bit_pwm_hard_configuration) ASSERT_FALSE(timer_8_bit_stub_get_config()->started); } +TEST_F(PwmModule8BitTimerTestSuite, unit_a_behavioral_testing) +{ + // Rewritting parts of pwm_config + pwm_config.hard[0].arch = TIMER_ARCH_8_BIT; + pwm_config.hard[0].timer_index = 0U; + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; + pwm_error_t error = PWM_ERROR_OK; + + // Init the timer_8_bit beforehand + timer_8_bit_stub_set_initialised(true); + error = pwm_init(); + ASSERT_EQ(PWM_ERROR_OK, error); + + + // Checking Pwm Fast Full Range behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_8_bit_set_waveform_generation(0U, TIMER8BIT_WG_PWM_FAST_FULL_RANGE); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_NORMAL); // unchanged + timer_8_bit_stub_reset(); + timer_8_bit_stub_set_initialised(true); + } + + // Checking Pwm Phase Correct Full Range behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_8_bit_set_waveform_generation(0U, TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_NORMAL); // unchanged + + timer_8_bit_stub_reset(); + timer_8_bit_stub_set_initialised(true); + } + + // Checking Pwm Fast Mode OCRA Max behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_8_bit_set_waveform_generation(0U, TIMER8BIT_WG_PWM_FAST_OCRA_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_TOGGLE_OCnX); // Switched to toggling pin, frequency halved (or compensated) + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocra, 7U); // 1MHz frequency with 50% duty cycle (pin toggled, so ocra halved) + + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + + timer_8_bit_stub_reset(); + timer_8_bit_stub_set_initialised(true); + } + + // Checking Pwm Phase Correct OCRA Max behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_8_bit_set_waveform_generation(0U, TIMER8BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_TOGGLE_OCnX); // Switched to toggling pin, frequency halved (or compensated) + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocra, 7U); // 1MHz frequency with 50% duty cycle (pin toggled, so ocra halved) + + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + + timer_8_bit_stub_reset(); + timer_8_bit_stub_set_initialised(true); + } +} + +TEST_F(PwmModule8BitTimerTestSuite, unit_b_behavioral_testing) +{ + // Rewritting parts of pwm_config + pwm_config.hard[0].arch = TIMER_ARCH_8_BIT; + pwm_config.hard[0].timer_index = 0U; + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_B; + pwm_error_t error = PWM_ERROR_OK; + + // Init the timer_8_bit beforehand + timer_8_bit_stub_set_initialised(true); + error = pwm_init(); + ASSERT_EQ(PWM_ERROR_OK, error); + + + // Checking Pwm Fast Full Range behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_8_bit_set_waveform_generation(0U, TIMER8BIT_WG_PWM_FAST_FULL_RANGE); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocrb, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(properties.duty_cycle, 25U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + timer_8_bit_stub_reset(); + timer_8_bit_stub_set_initialised(true); + } + + // Checking Pwm Phase Correct Full Range behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_8_bit_set_waveform_generation(0U, TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocrb, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + + timer_8_bit_stub_reset(); + timer_8_bit_stub_set_initialised(true); + } + + // Checking Pwm Fast Mode OCRA Max behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_8_bit_set_waveform_generation(0U, TIMER8BIT_WG_PWM_FAST_OCRA_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocra, 15U); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocrb, (properties.duty_cycle * timer_8_bit_stub_get_config()->ocra) / 100U); + + ASSERT_EQ(properties.duty_cycle, 25U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + + timer_8_bit_stub_reset(); + timer_8_bit_stub_set_initialised(true); + } + + // Checking Pwm Phase Correct OCRA Max behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_8_bit_set_waveform_generation(0U, TIMER8BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocra, 15U); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocrb, (properties.duty_cycle * timer_8_bit_stub_get_config()->ocra) / 100U); + + ASSERT_EQ(properties.duty_cycle, 25U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + + timer_8_bit_stub_reset(); + timer_8_bit_stub_set_initialised(true); + } +} + + TEST_F(PwmModuleTestSuite, single_8_bit_async_pwm_hard_configuration) { // Rewritting parts of pwm_config @@ -302,6 +545,12 @@ TEST_F(PwmModuleTestSuite, single_16_bit_pwm_hard_configuration) } +TEST_F(PwmModuleTestSuite, configure_single_soft_and_run) +{ + +} + + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index 476f15b..1ab6dfd 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -84,8 +84,9 @@ typedef struct */ typedef struct { - uint8_t io_index; /**< IO index from the Io lookup table @see static io configuration */ - uint8_t timebase_index; /**< Timebase index used to look at the watch */ + uint8_t io_index; /**< IO index from the Io lookup table @see static io configuration */ + uint8_t timebase_index; /**< Timebase index used to look at the watch */ + io_state_t safe_state; /**< Safe io state used by the driver when initialising and when stopped to configure the targeted pin to a known safe state */ } pwm_soft_static_config_t; /** @@ -239,16 +240,20 @@ pwm_error_t pwm_stop_all(void); * This driver checks the actual values of TCCRxx, looking for WG modes and COMxA/B modes. * Those values will then be taken into account in order to configure the timer accordingly, but this function will not configure WG and COM modes for * you, this is the responsibility of the Timer initialisation steps. - * @param pwm_instance_index : pwm instance index as per given in config.c file - * @param frequency : targeted PWM frequency - * @param clock_freq : current CPU frequency (note that if CPU frequency changes, output PWM will be off as well) + * + * @note This function might not, under some circumstances, achieve the desired output frequency or desired duty cycle, because of underlying hardware timers limitations. + * The properties parameters is used as an output and will reflect the 'real' achieved PWM characteristics, as per configured in Timer's hardware registers. + * @param[in] index : pwm instance index as per given in config.c file + * @param[in] type : kind of PWM driver used (either software based or hardware based) + * @param[in] clock_freq : current CPU frequency (note that if CPU frequency changes, output PWM will be off as well) + * @param[in,out] properties : [in] : gives the desired output PWM characteristics, [out] : carries the actual frequency and duty cycle as per configured by this function * @return pwm_error_t: * PWM_ERR_OK : operation succeeded * PWM_ERR_TIMEBASE_ISSUE : operation did not succeed because of timebase module errors - * PWM_ERROR_TIMER_ISSUE : operation did not succeed because of timer drivers errors + * PWM_ERROR_TIMER_ISSUE : operation did not succeed because of timer drivers errors * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly */ -pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_props_t const * const properties, const uint32_t * clock_freq); +pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_props_t * const properties, const uint32_t * clock_freq); /** * @brief Configures a particular timer to output complementary PWM with dead time generation. diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index cdae612..55ac9d4 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -49,7 +49,7 @@ static pwm_error_t pwm_init_single_hard(pwm_hard_static_config_t const * const c * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly * PWM_ERROR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ -static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq); +static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t * const properties, const uint32_t * clock_freq); /** * @brief Configures a single timer 8 bit asynchronous instance based on common parameters @@ -61,7 +61,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly * PWM_ERROR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ -static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq); +static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t * const properties, const uint32_t * clock_freq); /** * @brief Configures a single timer 16 bit instance based on common parameters @@ -73,7 +73,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p * PWM_ERROR_CONFIG : PWM configuration error, driver or dependencies were not configured correctly * PWM_ERROR_TIMER_ISSUE : encountered issues when configuring underlying timer, probably a global configuration error */ -static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq); +static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t * const properties, const uint32_t * clock_freq); /** * @brief Verifies that pwm index fits within the range @@ -272,7 +272,7 @@ pwm_error_t pwm_stop(const uint8_t index, const pwm_type_t type) return ret; } -pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_props_t const * const properties, const uint32_t * clock_freq) +pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_props_t * const properties, const uint32_t * clock_freq) { pwm_error_t ret = PWM_ERROR_OK; if (PWM_TYPE_HARDWARE == type) @@ -311,7 +311,7 @@ pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_pr } -static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) +static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t * const properties, const uint32_t * clock_freq) { timer_error_t timerr = TIMER_ERROR_OK; pwm_error_t ret = PWM_ERROR_OK; @@ -373,6 +373,10 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t { return PWM_ERROR_TIMER_ISSUE; } + + // Properties object needs to be updated with the actual frequency used by the timer + properties->frequency = (*clock_freq / (prescaler_value * (COUNTER_MAX_VALUE_8_BIT + 1))); + break; } // TOP value is controlled by OCRA value @@ -399,6 +403,12 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t { return PWM_ERROR_TIMER_ISSUE; } + + // Properties object needs to be updated with the actual frequency used by the timer + // Note that OCRA needs to be multiplied by 2 because of the toggling nature of the output pin ; + // So it behaves as if ocra was twice as large with a normal COMP mode switching + properties->frequency = (*clock_freq / (prescaler_value * (ocr_value + 1) * 2)); + properties->duty_cycle = 50U; break; // Misconfigured Timer, could not proceed further @@ -432,22 +442,14 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t case TIMER8BIT_WG_PWM_FAST_FULL_RANGE: case TIMER8BIT_WG_PWM_PHASE_CORRECT_FULL_RANGE: { - // OCRA value represents the duty_cycle value now + // OCRB value represents the duty_cycle value now ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U; - timerr = timer_8_bit_set_ocra_register_value(timer_config->timer_index, ocr_value); + timerr = timer_8_bit_set_ocrb_register_value(timer_config->timer_index, ocr_value); if(TIMER_ERROR_OK != timerr) { return PWM_ERROR_TIMER_ISSUE; } - break; - - // Set timer ocrb value, to control duty_cycle - timerr = timer_8_bit_set_ocrb_register_value(index, ocr_value); - if (TIMER_ERROR_OK != timerr) - { - return PWM_ERROR_TIMER_ISSUE; - } - + properties->frequency = (*clock_freq / (prescaler_value * (COUNTER_MAX_VALUE_8_BIT + 1))); break; } @@ -466,6 +468,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t { return PWM_ERROR_TIMER_ISSUE; } + properties->frequency = (*clock_freq / (prescaler_value * (ocr_value + 1))); // Compute exact duty cycle value for OCRB (reuse the ocr_value variable) ocr_value = (properties->duty_cycle * ocr_value) / 100U; @@ -488,7 +491,7 @@ static pwm_error_t configure_timer_8_bit_single(const uint8_t index, pwm_props_t } // Timer 8 bit async share the same infrastructure as the 8 bit one -static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) +static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_props_t * const properties, const uint32_t * clock_freq) { timer_error_t timerr = TIMER_ERROR_OK; pwm_error_t ret = PWM_ERROR_OK; @@ -609,16 +612,8 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p case TIMER8BIT_ASYNC_WG_PWM_FAST_FULL_RANGE: case TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_FULL_RANGE: { - // OCRA value represents the duty_cycle value now + // OCRB value represents the duty_cycle value now ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U; - timerr = timer_8_bit_async_set_ocra_register_value(timer_config->timer_index, ocr_value); - if(TIMER_ERROR_OK != timerr) - { - return PWM_ERROR_TIMER_ISSUE; - } - break; - - // Set timer ocrb value, to control duty_cycle timerr = timer_8_bit_async_set_ocrb_register_value(index, ocr_value); if (TIMER_ERROR_OK != timerr) { @@ -726,7 +721,7 @@ static timer_generic_resolution_t derive_16_bit_timer_resolution_from_waveform_s * PWM_ERROR_TIMER_ISSUE : encountered an issue with the underlying timer's capabilities and / or configuration * PWM_ERROR_CONFIG : something is off in the base configuration of either PWM driver or underlying timer 16 bit driver (waveform generation can be off for instance) */ -static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t const * const properties, const uint32_t * clock_freq) +static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_t * const properties, const uint32_t * clock_freq) { timer_error_t timerr = TIMER_ERROR_OK; pwm_error_t ret = PWM_ERROR_OK; @@ -798,6 +793,14 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ case TIMER16BIT_WG_PWM_PHASE_CORRECT_8_bit_FULL_RANGE: // OCR value represents duty_cycle ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U; + if( PWM_HARD_TIMER_UNIT_A == timer_config->unit) + { + timerr |= timer_16_bit_set_ocra_register_value(timer_config->timer_index, &ocr_value); + } + else + { + timerr |= timer_16_bit_set_ocrb_register_value(timer_config->timer_index, &ocr_value); + } break; // TOP value is set to 511 @@ -805,6 +808,14 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ case TIMER16BIT_WG_PWM_PHASE_CORRECT_9_bit_FULL_RANGE: // OCR value represents duty_cycle ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_9_BIT) / 100U; + if( PWM_HARD_TIMER_UNIT_A == timer_config->unit) + { + timerr |= timer_16_bit_set_ocra_register_value(timer_config->timer_index, &ocr_value); + } + else + { + timerr |= timer_16_bit_set_ocrb_register_value(timer_config->timer_index, &ocr_value); + } break; // Top value is set to 1023 @@ -812,6 +823,14 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ case TIMER16BIT_WG_PWM_PHASE_CORRECT_10_bit_FULL_RANGE: // OCR value represents duty_cycle ocr_value = (properties->duty_cycle * COUNTER_MAX_VALUE_10_BIT) / 100U; + if( PWM_HARD_TIMER_UNIT_A == timer_config->unit) + { + timerr |= timer_16_bit_set_ocra_register_value(timer_config->timer_index, &ocr_value); + } + else + { + timerr |= timer_16_bit_set_ocrb_register_value(timer_config->timer_index, &ocr_value); + } break; // TOP value is governed by ICR register From 37b32a05906a25e6b8c8a80dbc80d3ff6f86931a Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 27 Apr 2022 11:08:20 +0200 Subject: [PATCH 38/51] Fixed doxygen [in,out] params formatting in comments Signed-off-by: bebenlebricolo --- .../slave_firmware/App/inc/i2c_slave_handler.h | 2 +- .../Tests/Stub/i2c_fake_slave_application_data.h | 4 ++-- Drivers/I2c/inc/i2c.h | 4 ++-- Drivers/Lcd_screen/inc/HD44780_lcd.h | 4 ++-- Modules/Pwm/inc/pwm.h | 13 +++++++++++++ Utils/inc/memutils.h | 2 +- 6 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h b/Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h index 54d8f6e..36095f5 100644 --- a/Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h +++ b/Drivers/I2c/Examples/slave_firmware/App/inc/i2c_slave_handler.h @@ -8,7 +8,7 @@ * When a read operation (master reads from this slave), current_byte is considered as an output. * When a write operation (master writes to this slave), current_byte is considered as an input. * The request parameter informs about the nature of the current i2c transaction (read or write requests) - * @param[in/out] current_byte : interface byte used by the I2C driver + * @param[in,out] current_byte : interface byte used by the I2C driver * @param[in] request : nature of the I2C transaction currently taking place * @return I2C_SLAVE_HANDLER_ERROR_OK or any other error from the i2c_slave_handler_error_t enum in case of failure. */ diff --git a/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h b/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h index dcac787..8c5d8a1 100644 --- a/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h +++ b/Drivers/I2c/Tests/Stub/i2c_fake_slave_application_data.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -78,7 +78,7 @@ void i2c_fake_slave_application_init(void); /** * @brief handles the first byte of a read/write operation when configured as a slave - * @param[in/out] byte : gives the current byte on which we are working + * @param[in,out] byte : gives the current byte on which we are working * @param[in] request : gives the current I2C operation from master's point of view * => when master reads from slave, request shall be set to I2C_REQUEST_READ */ diff --git a/Drivers/I2c/inc/i2c.h b/Drivers/I2c/inc/i2c.h index 370b75d..92f9d78 100644 --- a/Drivers/I2c/inc/i2c.h +++ b/Drivers/I2c/inc/i2c.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -206,7 +206,7 @@ typedef enum * When a read operation (master reads from this slave), current_byte is considered as an output. * When a write operation (master writes to this slave), current_byte is considered as an input. * The request parameter informs about the nature of the current i2c transaction (read or write requests) - * @param[in/out] current_byte : interface byte used by the I2C driver + * @param[in,out] current_byte : interface byte used by the I2C driver * @param[in] request : nature of the I2C transaction currently taking place * * Example given : diff --git a/Drivers/Lcd_screen/inc/HD44780_lcd.h b/Drivers/Lcd_screen/inc/HD44780_lcd.h index ca7aa7e..208eeca 100644 --- a/Drivers/Lcd_screen/inc/HD44780_lcd.h +++ b/Drivers/Lcd_screen/inc/HD44780_lcd.h @@ -4,7 +4,7 @@ @ FreeMyCode version : 1.0 RC alpha Author : bebenlebricolo - License : + License : name : GPLv3 url : https://www.gnu.org/licenses/quick-guide-gplv3.html Date : 12/02/2021 @@ -223,7 +223,7 @@ hd44780_lcd_error_t hd44780_lcd_init(hd44780_lcd_config_t const * const config); /** * @brief Gives a default configuration to start with - * @param[in/out] config : device configuration + * @param[in,out] config : device configuration * @return hd44780_lcd_error_t * HD44780_LCD_ERROR_OK : Operation succeeded * HD44780_LCD_ERROR_NULL_POINTER : Given pointer is uninitialised diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index 1ab6dfd..afa85c3 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -255,6 +255,19 @@ pwm_error_t pwm_stop_all(void); */ pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_props_t * const properties, const uint32_t * clock_freq); +/** + * @brief probes actual configuration of a single PWM instance. + * This function can be used to determine actual pwm frequency and duty cycle, accounting underlying hardware/software limitations. + * Its functionality is already covered by the @see pwm_config_single function, which returns the actual current properties of a targeted PWM instance, + * but this one is read-only and does not write into Timer's registers. + * + * @param[in] index + * @param[in] type + * @param[out] properties + * @return pwm_error_t + */ +pwm_error_t pwm_get_actual_props(const uint8_t index, const pwm_type_t type, pwm_props_t * const properties, const uint32_t * clock_freq); + /** * @brief Configures a particular timer to output complementary PWM with dead time generation. * It uses the Phase correct and phase and frequency correct modes in order to achieve proper dead time generation diff --git a/Utils/inc/memutils.h b/Utils/inc/memutils.h index be4aaf4..feb950e 100644 --- a/Utils/inc/memutils.h +++ b/Utils/inc/memutils.h @@ -8,7 +8,7 @@ /** * @brief provides a volatile-ready memset kind-of interface * Sets all blocks of targeted memory to the given value, when memory is marked as volatile - * @param[in/out] ptr : memory block to be modified (volatile) + * @param[in,out] ptr : memory block to be modified (volatile) * @param[in] value : sets * @param[in] size : sizeof the block in bytes */ From f4826a14e6c9d887f6780ff30cec318588f145c7 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 27 Apr 2022 15:45:46 +0200 Subject: [PATCH 39/51] Ported pwm actual properties probing to timer 8 bit async Signed-off-by: bebenlebricolo --- Modules/Pwm/Tests/pwm_tests.cpp | 467 ++++++++++++++++++++++++-------- Modules/Pwm/src/pwm.c | 13 + 2 files changed, 370 insertions(+), 110 deletions(-) diff --git a/Modules/Pwm/Tests/pwm_tests.cpp b/Modules/Pwm/Tests/pwm_tests.cpp index 0d9bb4b..911165a 100644 --- a/Modules/Pwm/Tests/pwm_tests.cpp +++ b/Modules/Pwm/Tests/pwm_tests.cpp @@ -48,6 +48,38 @@ class PwmModule8BitTimerTestSuite : public ::testing::Test } }; +/** + * @brief Test suite dedicated to test 8 bit timers wrapping by PWM module specifically + */ +class PwmModule8BitAsyncTimerTestSuite : public ::testing::Test +{ +public: + void SetUp(void) override + { + } + + void TearDown(void) override + { + timer_8_bit_async_stub_reset(); + } +}; + +/** + * @brief Test suite dedicated to test 8 bit timers wrapping by PWM module specifically + */ +class PwmModule16BitTimerTestSuite : public ::testing::Test +{ +public: + void SetUp(void) override + { + } + + void TearDown(void) override + { + timer_16_bit_stub_reset(); + } +}; + TEST_F(PwmModuleTestSuite, test_single_hard_config) { // Rewritting parts of pwm_config @@ -167,6 +199,161 @@ TEST_F(PwmModuleTestSuite, single_8_bit_pwm_hard_configuration_waveforms) ASSERT_FALSE(timer_8_bit_stub_get_config()->started); } +TEST_F(PwmModuleTestSuite, single_8_bit_async_pwm_hard_configuration) +{ + // Rewritting parts of pwm_config + pwm_config.hard[0].arch = TIMER_ARCH_8_BIT_ASYNC; + pwm_config.hard[0].timer_index = 0U; + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; + + // Setting up a software PWM + pwm_config.soft[0].io_index = 0U; + pwm_config.soft[0].timebase_index = 0U; + + pwm_error_t error = PWM_ERROR_OK; + + // Init the timer_8_bit beforehand + timer_8_bit_async_stub_set_initialised(true); + + // Init the timer_8_bit beforehand + timer_8_bit_async_stub_set_initialised(true); + error = pwm_init(); + ASSERT_EQ(PWM_ERROR_OK, error); + + pwm_props_t properties = + { + .frequency = 1 MHz, + .duty_cycle = 50U, + .pol = PWM_POLARITY_INVERTED + }; + const uint32_t cpu_freq = 1 MHz; + + // Normal Waveform generation should return an error, this pwm module does not want + // to interfere with other components using Timers, such as a timebase for instance. + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_NORMAL); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + // Same goes for CTC mode + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_CTC); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + + // Check that all 4 waveform modes are correct + const timer_8_bit_async_waveform_generation_t valid_modes[] = + { + TIMER8BIT_ASYNC_WG_PWM_FAST_FULL_RANGE, + TIMER8BIT_ASYNC_WG_PWM_FAST_OCRA_MAX, + TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_FULL_RANGE, + TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_OCRA_MAX, + }; + + // Select a valid waveform generation mode + for (const auto mode : valid_modes) + { + (void) timer_8_bit_async_set_waveform_generation(0U, mode); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + EXPECT_EQ(PWM_ERROR_OK, error); + } + + // Start the timer + ASSERT_FALSE(timer_8_bit_async_stub_get_config()->started); + error = pwm_start(0U, PWM_TYPE_HARDWARE); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_TRUE(timer_8_bit_async_stub_get_config()->started); + + // Check that timer is indeed stopped + error = pwm_stop(0U, PWM_TYPE_HARDWARE); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_FALSE(timer_8_bit_async_stub_get_config()->started); +} + +TEST_F(PwmModuleTestSuite, single_16_bit_pwm_hard_configuration) +{ + // Rewritting parts of pwm_config + pwm_config.hard[0].arch = TIMER_ARCH_16_BIT; + pwm_config.hard[0].timer_index = 0U; + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; + + // Setting up a software PWM + pwm_config.soft[0].io_index = 0U; + pwm_config.soft[0].timebase_index = 0U; + + pwm_error_t error = PWM_ERROR_OK; + + // Init the timer_16_bit beforehand + timer_16_bit_stub_set_initialised(true); + + // Init the timer_16_bit beforehand + timer_16_bit_stub_set_initialised(true); + error = pwm_init(); + ASSERT_EQ(PWM_ERROR_OK, error); + + pwm_props_t properties = + { + .frequency = 1 MHz, + .duty_cycle = 50U, + .pol = PWM_POLARITY_INVERTED + }; + const uint32_t cpu_freq = 16 MHz; + + // Normal Waveform generation should return an error, this pwm module does not want + // to interfere with other components using Timers, such as a timebase for instance. + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_NORMAL); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + // Same goes for CTC mode + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_CTC_ICR_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_CTC_OCRA_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_CONFIG, error); + + + // Check that all 4 waveform modes are correct + const timer_16_bit_waveform_generation_t valid_modes[] = + { + TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_FAST_8_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_FAST_ICR_MAX, + TIMER16BIT_WG_PWM_FAST_OCRA_MAX, // Error + + TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_ICR_MAX, + TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_OCRA_MAX, //Error + + TIMER16BIT_WG_PWM_PHASE_CORRECT_10_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_9_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_8_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_ICR_MAX, + TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX, // Error + }; + + // Select a valid waveform generation mode + for (const auto mode : valid_modes) + { + (void) timer_16_bit_set_waveform_generation(0U, mode); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + EXPECT_EQ(PWM_ERROR_OK, error); + } + + // Start the timer + ASSERT_FALSE(timer_16_bit_stub_get_config()->started); + error = pwm_start(0U, PWM_TYPE_HARDWARE); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_TRUE(timer_16_bit_stub_get_config()->started); + + // Check that timer is indeed stopped + error = pwm_stop(0U, PWM_TYPE_HARDWARE); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_FALSE(timer_16_bit_stub_get_config()->started); +} + + TEST_F(PwmModule8BitTimerTestSuite, unit_a_behavioral_testing) { // Rewritting parts of pwm_config @@ -389,168 +576,228 @@ TEST_F(PwmModule8BitTimerTestSuite, unit_b_behavioral_testing) } } - -TEST_F(PwmModuleTestSuite, single_8_bit_async_pwm_hard_configuration) +TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_a_behavioral_testing) { // Rewritting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_8_BIT_ASYNC; pwm_config.hard[0].timer_index = 0U; pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; - - // Setting up a software PWM - pwm_config.soft[0].io_index = 0U; - pwm_config.soft[0].timebase_index = 0U; - pwm_error_t error = PWM_ERROR_OK; - // Init the timer_8_bit beforehand - timer_8_bit_async_stub_set_initialised(true); - // Init the timer_8_bit beforehand timer_8_bit_async_stub_set_initialised(true); error = pwm_init(); ASSERT_EQ(PWM_ERROR_OK, error); - pwm_props_t properties = - { - .frequency = 1 MHz, - .duty_cycle = 50U, - .pol = PWM_POLARITY_INVERTED - }; - const uint32_t cpu_freq = 1 MHz; - // Normal Waveform generation should return an error, this pwm module does not want - // to interfere with other components using Timers, such as a timebase for instance. - (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_NORMAL); - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_CONFIG, error); + // Checking Pwm Fast Full Range behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; - // Same goes for CTC mode - (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_CTC); - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_CONFIG, error); + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_PWM_FAST_FULL_RANGE); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + timer_8_bit_async_stub_reset(); + timer_8_bit_async_stub_set_initialised(true); + } - // Check that all 4 waveform modes are correct - const timer_8_bit_async_waveform_generation_t valid_modes[] = + // Checking Pwm Phase Correct Full Range behavior { - TIMER8BIT_ASYNC_WG_PWM_FAST_FULL_RANGE, - TIMER8BIT_ASYNC_WG_PWM_FAST_OCRA_MAX, - TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_FULL_RANGE, - TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_OCRA_MAX, - }; + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; - // Select a valid waveform generation mode - for (const auto mode : valid_modes) + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_FULL_RANGE); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + + timer_8_bit_async_stub_reset(); + timer_8_bit_async_stub_set_initialised(true); + } + + // Checking Pwm Fast Mode OCRA Max behavior { - (void) timer_8_bit_async_set_waveform_generation(0U, mode); + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_PWM_FAST_OCRA_MAX); error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - EXPECT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_TOGGLE_OCnX); // Switched to toggling pin, frequency halved (or compensated) + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocra, 7U); // 1MHz frequency with 50% duty cycle (pin toggled, so ocra halved) + + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + + timer_8_bit_async_stub_reset(); + timer_8_bit_async_stub_set_initialised(true); } - // Start the timer - ASSERT_FALSE(timer_8_bit_async_stub_get_config()->started); - error = pwm_start(0U, PWM_TYPE_HARDWARE); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_TRUE(timer_8_bit_async_stub_get_config()->started); + // Checking Pwm Phase Correct OCRA Max behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; - // Check that timer is indeed stopped - error = pwm_stop(0U, PWM_TYPE_HARDWARE); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_FALSE(timer_8_bit_async_stub_get_config()->started); + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_OCRA_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_TOGGLE_OCnX); // Switched to toggling pin, frequency halved (or compensated) + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocra, 7U); // 1MHz frequency with 50% duty cycle (pin toggled, so ocra halved) + + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + + timer_8_bit_async_stub_reset(); + timer_8_bit_async_stub_set_initialised(true); + } } -TEST_F(PwmModuleTestSuite, single_16_bit_pwm_hard_configuration) +TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_b_behavioral_testing) { // Rewritting parts of pwm_config - pwm_config.hard[0].arch = TIMER_ARCH_16_BIT; + pwm_config.hard[0].arch = TIMER_ARCH_8_BIT_ASYNC; pwm_config.hard[0].timer_index = 0U; - pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; - - // Setting up a software PWM - pwm_config.soft[0].io_index = 0U; - pwm_config.soft[0].timebase_index = 0U; - + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_B; pwm_error_t error = PWM_ERROR_OK; - // Init the timer_16_bit beforehand - timer_16_bit_stub_set_initialised(true); - - // Init the timer_16_bit beforehand - timer_16_bit_stub_set_initialised(true); + // Init the timer_8_bit beforehand + timer_8_bit_async_stub_set_initialised(true); error = pwm_init(); ASSERT_EQ(PWM_ERROR_OK, error); - pwm_props_t properties = + + // Checking Pwm Fast Full Range behavior { - .frequency = 1 MHz, - .duty_cycle = 50U, - .pol = PWM_POLARITY_INVERTED - }; - const uint32_t cpu_freq = 16 MHz; + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; - // Normal Waveform generation should return an error, this pwm module does not want - // to interfere with other components using Timers, such as a timebase for instance. - (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_NORMAL); - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_CONFIG, error); + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_PWM_FAST_FULL_RANGE); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocrb, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(properties.duty_cycle, 25U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly - // Same goes for CTC mode - (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_CTC_ICR_MAX); - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_CONFIG, error); + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + timer_8_bit_async_stub_reset(); + timer_8_bit_async_stub_set_initialised(true); + } - (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_CTC_OCRA_MAX); - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_CONFIG, error); + // Checking Pwm Phase Correct Full Range behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_FULL_RANGE); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocrb, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly - // Check that all 4 waveform modes are correct - const timer_16_bit_waveform_generation_t valid_modes[] = + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + + timer_8_bit_async_stub_reset(); + timer_8_bit_async_stub_set_initialised(true); + } + + // Checking Pwm Fast Mode OCRA Max behavior { - TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE, - TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE, - TIMER16BIT_WG_PWM_FAST_8_bit_FULL_RANGE, - TIMER16BIT_WG_PWM_FAST_ICR_MAX, - TIMER16BIT_WG_PWM_FAST_OCRA_MAX, // Error + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; - TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_ICR_MAX, - TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_OCRA_MAX, //Error + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_PWM_FAST_OCRA_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocra, 15U); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocrb, (properties.duty_cycle * timer_8_bit_async_stub_get_config()->ocra) / 100U); - TIMER16BIT_WG_PWM_PHASE_CORRECT_10_bit_FULL_RANGE, - TIMER16BIT_WG_PWM_PHASE_CORRECT_9_bit_FULL_RANGE, - TIMER16BIT_WG_PWM_PHASE_CORRECT_8_bit_FULL_RANGE, - TIMER16BIT_WG_PWM_PHASE_CORRECT_ICR_MAX, - TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX, // Error - }; + ASSERT_EQ(properties.duty_cycle, 25U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly - // Select a valid waveform generation mode - for (const auto mode : valid_modes) - { - (void) timer_16_bit_set_waveform_generation(0U, mode); + properties.pol = PWM_POLARITY_INVERTED; error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - EXPECT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + + timer_8_bit_async_stub_reset(); + timer_8_bit_async_stub_set_initialised(true); } - // Start the timer - ASSERT_FALSE(timer_16_bit_stub_get_config()->started); - error = pwm_start(0U, PWM_TYPE_HARDWARE); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_TRUE(timer_16_bit_stub_get_config()->started); + // Checking Pwm Phase Correct OCRA Max behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; - // Check that timer is indeed stopped - error = pwm_stop(0U, PWM_TYPE_HARDWARE); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_FALSE(timer_16_bit_stub_get_config()->started); -} + (void) timer_8_bit_async_set_waveform_generation(0U, TIMER8BIT_ASYNC_WG_PWM_PHASE_CORRECT_OCRA_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocra, 15U); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocrb, (properties.duty_cycle * timer_8_bit_async_stub_get_config()->ocra) / 100U); + ASSERT_EQ(properties.duty_cycle, 25U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly -TEST_F(PwmModuleTestSuite, configure_single_soft_and_run) -{ + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + timer_8_bit_async_stub_reset(); + timer_8_bit_async_stub_set_initialised(true); + } } - int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 55ac9d4..0381da7 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -553,6 +553,10 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p { return PWM_ERROR_TIMER_ISSUE; } + + // Properties object needs to be updated with the actual frequency used by the timer + properties->frequency = (*clock_freq / (prescaler_value * (COUNTER_MAX_VALUE_8_BIT + 1))); + break; } // TOP value is controlled by OCRA value @@ -579,6 +583,13 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p { return PWM_ERROR_TIMER_ISSUE; } + + // Properties object needs to be updated with the actual frequency used by the timer + // Note that OCRA needs to be multiplied by 2 because of the toggling nature of the output pin ; + // So it behaves as if ocra was twice as large with a normal COMP mode switching + properties->frequency = (*clock_freq / (prescaler_value * (ocr_value + 1) * 2)); + properties->duty_cycle = 50U; + break; // Misconfigured Timer, could not proceed further @@ -619,6 +630,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p { return PWM_ERROR_TIMER_ISSUE; } + properties->frequency = (*clock_freq / (prescaler_value * (COUNTER_MAX_VALUE_8_BIT + 1))); break; } @@ -638,6 +650,7 @@ static pwm_error_t configure_timer_8_bit_async_single(const uint8_t index, pwm_p { return PWM_ERROR_TIMER_ISSUE; } + properties->frequency = (*clock_freq / (prescaler_value * (ocr_value + 1))); // Compute exact duty cycle value for OCRB (reuse the ocr_value variable) ocr_value = (properties->duty_cycle * ocr_value) / 100U; From 0508fb5a48912bd27fc15d33703e720cddd5ce9a Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 27 Apr 2022 16:29:55 +0200 Subject: [PATCH 40/51] Updated timer's prescaler computation apis a little bit Signed-off-by: bebenlebricolo --- Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h | 22 ++- Drivers/Timers/Timer_8_bit/src/timer_8_bit.c | 21 ++- .../Timer_8_bit_async/inc/timer_8_bit_async.h | 22 ++- .../Timer_8_bit_async/src/timer_8_bit_async.c | 28 +-- .../Pwm/Tests/Stubs/timer_8_bit_async_stub.c | 21 ++- Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c | 21 ++- Modules/Pwm/Tests/pwm_tests.cpp | 164 ++++++++++++++++++ Modules/Pwm/src/pwm.c | 26 ++- .../Tests/Stubs/timer_8_bit_async_stub.c | 11 +- .../Timebase/Tests/Stubs/timer_8_bit_stub.c | 11 +- 10 files changed, 285 insertions(+), 62 deletions(-) diff --git a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h index 13066df..acc5b39 100644 --- a/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h +++ b/Drivers/Timers/Timer_8_bit/inc/timer_8_bit.h @@ -404,12 +404,15 @@ timer_error_t timer_8_bit_stop(uint8_t id); * @param[out] prescaler : output prescaler parameter * @param[out] ocr : output ocr value * @param[out] accumulator : output accumulator value ; used by the timebase module for instance to count events and extend timer's counter capabilities + * @return + * TIMER_ERROR_OK : operation succeeded + * TIMER_ERROR_CONFIG : Something was wrong in the input configuration (probably unachievable frequency parameters) */ -void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_prescaler_selection_t * const prescaler, - uint8_t * const ocr, - uint16_t * const accumulator); +timer_error_t timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_prescaler_selection_t * const prescaler, + uint8_t * const ocr, + uint16_t * const accumulator); /** * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, @@ -418,10 +421,13 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, * @param[in] clock_freq : current CPU main clock frequency * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) * @param[out] prescaler : output prescaler parameter + * @return + * TIMER_ERROR_OK : operation succeeded + * TIMER_ERROR_CONFIG : Something was wrong in the input configuration (probably unachievable frequency parameters) */ -void timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_prescaler_selection_t * const prescaler); +timer_error_t timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_prescaler_selection_t * const prescaler); #define TIMER_8_BIT_MAX_PRESCALER_COUNT 5U diff --git a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c index 5c561c6..3cfe51c 100644 --- a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c +++ b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c @@ -86,7 +86,7 @@ uint16_t timer_8_bit_prescaler_to_value(const timer_8_bit_prescaler_selection_t return 0; } -void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, +timer_error_t timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, const uint32_t * const target_freq, timer_8_bit_prescaler_selection_t * const prescaler, uint8_t * const ocr, @@ -103,15 +103,20 @@ void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, .prescaler_lookup_array.size = TIMER_8_BIT_MAX_PRESCALER_COUNT, }, }; - timer_generic_compute_parameters(¶meters); + if(TIMER_ERROR_OK != timer_generic_compute_parameters(¶meters)) + { + return TIMER_ERROR_CONFIG; + } + *prescaler = timer_8_bit_prescaler_from_value(¶meters.output.prescaler); *ocr = (uint8_t) parameters.output.ocr; *accumulator = parameters.output.accumulator; + return TIMER_ERROR_OK; } -void timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_prescaler_selection_t * const prescaler) +timer_error_t timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_prescaler_selection_t * const prescaler) { timer_generic_parameters_t parameters = { @@ -124,8 +129,12 @@ void timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, .prescaler_lookup_array.size = TIMER_8_BIT_MAX_PRESCALER_COUNT, }, }; - timer_generic_find_closest_prescaler(¶meters); + if(TIMER_ERROR_OK != timer_generic_find_closest_prescaler(¶meters)) + { + return TIMER_ERROR_CONFIG; + } *prescaler = parameters.output.prescaler; + return TIMER_ERROR_OK; } static inline timer_error_t check_id(uint8_t id) diff --git a/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h b/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h index dd841b5..a89572f 100644 --- a/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h +++ b/Drivers/Timers/Timer_8_bit_async/inc/timer_8_bit_async.h @@ -417,12 +417,15 @@ timer_error_t timer_8_bit_async_stop(uint8_t id); * @param[out] prescaler : output prescaler parameter * @param[out] ocr : output ocr value * @param[out] accumulator : output accumulator value ; used by the timebase module for instance to count events and extend timer's counter capabilities + * @return + * TIMER_ERROR_OK : operation succeeded + * TIMER_ERROR_CONFIG : Something was wrong in the input configuration (probably unachievable frequency parameters) */ -void timer_8_bit_async_compute_matching_parameters(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_async_prescaler_selection_t * const prescaler, - uint8_t * const ocra, - uint16_t * const accumulator); +timer_error_t timer_8_bit_async_compute_matching_parameters(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_async_prescaler_selection_t * const prescaler, + uint8_t * const ocra, + uint16_t * const accumulator); /** * @brief Computes timing parameters such as prescaler, ocr value and accumulator in order to satisfy the requested target frequency, @@ -431,10 +434,13 @@ void timer_8_bit_async_compute_matching_parameters(const uint32_t * const clock_ * @param[in] clock_freq : current CPU main clock frequency * @param[in] target_freq : desired output frequency of the timer (assuming ocr is the top value) * @param[out] prescaler : output prescaler parameter + * @return + * TIMER_ERROR_OK : operation succeeded + * TIMER_ERROR_CONFIG : Something was wrong in the input configuration (probably unachievable frequency parameters) */ -void timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_async_prescaler_selection_t * const prescaler); +timer_error_t timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_async_prescaler_selection_t * const prescaler); #define TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT (7U) diff --git a/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c b/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c index d8a7fe9..9be6aed 100644 --- a/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c +++ b/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c @@ -82,11 +82,11 @@ uint16_t timer_8_bit_async_prescaler_to_value(const timer_8_bit_async_prescaler_ return 0; } -void timer_8_bit_async_compute_matching_parameters(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_async_prescaler_selection_t * const prescaler, - uint8_t * const ocra, - uint16_t * const accumulator) +timer_error_t timer_8_bit_async_compute_matching_parameters(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_async_prescaler_selection_t * const prescaler, + uint8_t * const ocra, + uint16_t * const accumulator) { timer_generic_parameters_t parameters = { @@ -99,15 +99,19 @@ void timer_8_bit_async_compute_matching_parameters(const uint32_t * const clock_ .prescaler_lookup_array.size = TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT, }, }; - timer_generic_compute_parameters(¶meters); + if(TIMER_ERROR_OK != timer_generic_compute_parameters(¶meters)) + { + return TIMER_ERROR_CONFIG; + } *prescaler = timer_8_bit_async_prescaler_from_value(¶meters.output.prescaler); *ocra = (uint8_t) parameters.output.ocr; *accumulator = parameters.output.accumulator; + return TIMER_ERROR_OK; } -void timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_async_prescaler_selection_t * const prescaler) +timer_error_t timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_async_prescaler_selection_t * const prescaler) { timer_generic_parameters_t parameters = { @@ -120,8 +124,12 @@ void timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_fr .prescaler_lookup_array.size = TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT, }, }; - timer_generic_find_closest_prescaler(¶meters); + if(TIMER_ERROR_OK != timer_generic_find_closest_prescaler(¶meters)) + { + return TIMER_ERROR_CONFIG; + } *prescaler = parameters.output.prescaler; + return TIMER_ERROR_OK; } static inline timer_error_t check_id(uint8_t id) diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c index 0031d74..5acc1a0 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_async_stub.c @@ -61,17 +61,18 @@ void timer_8_bit_async_stub_reset(void) memset(&configuration, 0, sizeof(timer_8_bit_async_stub_configuration_t)); } -void timer_8_bit_async_compute_matching_parameters( const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_async_prescaler_selection_t * const prescaler, - uint8_t * const ocra, - uint16_t * const accumulator) +timer_error_t timer_8_bit_async_compute_matching_parameters( const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_async_prescaler_selection_t * const prescaler, + uint8_t * const ocra, + uint16_t * const accumulator) { (void) clock_freq; (void) target_freq; *prescaler = configuration.prescaler; *ocra = configuration.ocra; *accumulator = configuration.accumulator; + return TIMER_ERROR_OK; } const timer_generic_prescaler_pair_t timer_8_bit_async_prescaler_table[TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT] = @@ -85,10 +86,11 @@ const timer_generic_prescaler_pair_t timer_8_bit_async_prescaler_table[TIMER_8_B {.value = 1024, .type = (uint8_t) TIMER8BIT_ASYNC_CLK_PRESCALER_1024 }, }; -void timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_async_prescaler_selection_t * const prescaler) +timer_error_t timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_async_prescaler_selection_t * const prescaler) { + timer_error_t ret = TIMER_ERROR_OK; timer_generic_parameters_t parameters = { .input = @@ -100,8 +102,9 @@ void timer_8_bit_async_compute_closest_prescaler(const uint32_t * const clock_fr .prescaler_lookup_array.size = TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT, }, }; - timer_generic_find_closest_prescaler(¶meters); + ret = timer_generic_find_closest_prescaler(¶meters); *prescaler = parameters.output.prescaler; + return ret; } diff --git a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c index c086005..a48d9a4 100644 --- a/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_8_bit_stub.c @@ -68,17 +68,18 @@ void timer_8_bit_stub_get_driver_configuration(timer_8_bit_config_t * const conf *config = configuration.driver_config; } -void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_prescaler_selection_t * const prescaler, - uint8_t * const ocra, - uint16_t * const accumulator) +timer_error_t timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_prescaler_selection_t * const prescaler, + uint8_t * const ocra, + uint16_t * const accumulator) { (void) clock_freq; (void) target_freq; *prescaler = configuration.prescaler; *ocra = configuration.ocra; *accumulator = configuration.accumulator; + return TIMER_ERROR_OK; } const timer_generic_prescaler_pair_t timer_8_bit_prescaler_table[TIMER_8_BIT_MAX_PRESCALER_COUNT] = @@ -90,10 +91,11 @@ const timer_generic_prescaler_pair_t timer_8_bit_prescaler_table[TIMER_8_BIT_MAX {.value = 1024U, .type = (uint8_t) TIMER8BIT_CLK_PRESCALER_1024 }, }; -void timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_prescaler_selection_t * const prescaler) +timer_error_t timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_prescaler_selection_t * const prescaler) { + timer_error_t ret = TIMER_ERROR_OK; timer_generic_parameters_t parameters = { .input = @@ -105,8 +107,9 @@ void timer_8_bit_compute_closest_prescaler(const uint32_t * const clock_freq, .prescaler_lookup_array.size = TIMER_8_BIT_MAX_PRESCALER_COUNT, }, }; - timer_generic_find_closest_prescaler(¶meters); + ret = timer_generic_find_closest_prescaler(¶meters); *prescaler = parameters.output.prescaler; + return ret; } diff --git a/Modules/Pwm/Tests/pwm_tests.cpp b/Modules/Pwm/Tests/pwm_tests.cpp index 911165a..6a70154 100644 --- a/Modules/Pwm/Tests/pwm_tests.cpp +++ b/Modules/Pwm/Tests/pwm_tests.cpp @@ -353,6 +353,9 @@ TEST_F(PwmModuleTestSuite, single_16_bit_pwm_hard_configuration) ASSERT_FALSE(timer_16_bit_stub_get_config()->started); } +// ################################################################# +// ######## Hardware timers behavioral testing starts here ######### +// ################################################################# TEST_F(PwmModule8BitTimerTestSuite, unit_a_behavioral_testing) { @@ -798,6 +801,167 @@ TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_b_behavioral_testing) } } + +TEST_F(PwmModule16BitTimerTestSuite, unit_a_behavioral_testing) +{ + // Rewritting parts of pwm_config + pwm_config.hard[0].arch = TIMER_ARCH_16_BIT; + pwm_config.hard[0].timer_index = 0U; + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; + pwm_error_t error = PWM_ERROR_OK; + + // Init the timer_16_bit beforehand + timer_16_bit_stub_set_initialised(true); + error = pwm_init(); + ASSERT_EQ(PWM_ERROR_OK, error); + + + // Checking Pwm Fast Full Range behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_FAST_8_bit_FULL_RANGE); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 0U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + + // Checking Pwm Fast Full Range behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, (properties.duty_cycle * 511) / 100U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 0U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (511 + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + + // Checking Pwm Fast Full Range behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, (properties.duty_cycle * 1023U) / 100U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 0U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (1023U + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + + // Checking Pwm Phase Correct Full Range behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_FAST_ICR_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + + // Checking Pwm Fast Mode OCRA Max behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_FAST_OCRA_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_TOGGLE_OCnX); // Switched to toggling pin, frequency halved (or compensated) + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, 7U); // 1MHz frequency with 50% duty cycle (pin toggled, so ocra halved) + + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + + // Checking Pwm Phase Correct OCRA Max behavior + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + const uint32_t cpu_freq = 16 MHz; + + (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_TOGGLE_OCnX); // Switched to toggling pin, frequency halved (or compensated) + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, 7U); // 1MHz frequency with 50% duty cycle (pin toggled, so ocra halved) + + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } +} + + + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 0381da7..a287386 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -744,6 +744,7 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ timer_16_bit_prescaler_selection_t prescaler = TIMER16BIT_CLK_NO_CLOCK; timer_16_bit_waveform_generation_t waveform = TIMER16BIT_WG_NORMAL; pwm_hard_static_config_t * timer_config = &pwm_config.hard[index]; + uint16_t prescaler_value = 1U; // We need to probe the waveform generation modes from Timer driver because it drives the way we configure a PWM afterwards // (Because timer8 bit has some limitations when it comes to having PWMs with full frequency and duty cycle control, a lot depends on the Waveform Generation) @@ -757,12 +758,18 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ timer_generic_resolution_t resolution = derive_16_bit_timer_resolution_from_waveform_selection(waveform); // Compute closest prescaler first - timer_16_bit_compute_closest_prescaler(clock_freq, &properties->frequency, resolution, &prescaler); + timerr = timer_16_bit_compute_closest_prescaler(clock_freq, &properties->frequency, resolution, &prescaler); + if (TIMER_ERROR_OK != timerr) + { + return PWM_ERROR_TIMER_ISSUE; + } + timerr = timer_16_bit_set_prescaler(index, prescaler); if (TIMER_ERROR_OK != timerr) { return PWM_ERROR_TIMER_ISSUE; } + prescaler_value = timer_16_bit_prescaler_to_value(prescaler); // Select the polarity globally, checking special cases later on @@ -814,6 +821,9 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ { timerr |= timer_16_bit_set_ocrb_register_value(timer_config->timer_index, &ocr_value); } + + // Actual output frequency is affected by this configuration, because of timer's construction + properties->frequency = *clock_freq / (prescaler_value * (COUNTER_MAX_VALUE_8_BIT + 1)); break; // TOP value is set to 511 @@ -829,6 +839,10 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ { timerr |= timer_16_bit_set_ocrb_register_value(timer_config->timer_index, &ocr_value); } + + // Actual output frequency is affected by this configuration, because of timer's construction + properties->frequency = *clock_freq / (prescaler_value * (COUNTER_MAX_VALUE_9_BIT + 1)); + break; // Top value is set to 1023 @@ -844,6 +858,9 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ { timerr |= timer_16_bit_set_ocrb_register_value(timer_config->timer_index, &ocr_value); } + + // Actual output frequency is affected by this configuration, because of timer's construction + properties->frequency = *clock_freq / (prescaler_value * (COUNTER_MAX_VALUE_10_BIT + 1)); break; // TOP value is governed by ICR register @@ -867,6 +884,7 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ { timerr |= timer_16_bit_set_ocrb_register_value(timer_config->timer_index, &ocr_value); } + // Output frequency characteristics should match the input requested properties at this point } break; @@ -892,7 +910,8 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ // Frequency is governed by OCRA, duty cycle is 50% and frequency is halved because output pin is toggled // So divide OCRA by 2 (multiplying resulting frequency) in order to still get a 50% duty cycle PWM with the right frequency timerr |= timer_16_bit_set_compare_match_A(timer_config->timer_index, TIMER16BIT_CMOD_TOGGLE_OCnX); - + properties->frequency = *clock_freq / (prescaler_value * (ocr_value + 1)*2); + properties->duty_cycle = 50U; // output duty cycle is fixed } else { @@ -904,6 +923,9 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ timerr = timer_16_bit_set_ocra_register_value(timer_config->timer_index, &ocr_value); timerr |= timer_16_bit_set_ocrb_register_value(timer_config->timer_index, &ocr_value); timerr |= timer_16_bit_set_compare_match_B(timer_config->timer_index, TIMER16BIT_CMOD_TOGGLE_OCnX); + + // In that case, both frequency and duty cycle are achieved through the use of this configuration. + // So output frequency characteristics should match the requested input pwm properties parameters } break; diff --git a/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c b/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c index fe919f8..08d7a66 100644 --- a/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c +++ b/Modules/Timebase/Tests/Stubs/timer_8_bit_async_stub.c @@ -63,17 +63,18 @@ void timer_8_bit_async_stub_reset(void) memset(&configuration, 0, sizeof(configuration_t)); } -void timer_8_bit_async_compute_matching_parameters( const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_async_prescaler_selection_t * const prescaler, - uint8_t * const ocra, - uint16_t * const accumulator) +timer_error_t timer_8_bit_async_compute_matching_parameters( const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_async_prescaler_selection_t * const prescaler, + uint8_t * const ocra, + uint16_t * const accumulator) { (void) clock_freq; (void) target_freq; *prescaler = configuration.prescaler; *ocra = configuration.ocra; *accumulator = configuration.accumulator; + return TIMER_ERROR_OK; } const timer_generic_prescaler_pair_t timer_8_bit_async_prescaler_table[TIMER_8_BIT_ASYNC_MAX_PRESCALER_COUNT] = diff --git a/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c b/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c index d5e4141..b0e170a 100644 --- a/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c +++ b/Modules/Timebase/Tests/Stubs/timer_8_bit_stub.c @@ -70,17 +70,18 @@ void timer_8_bit_stub_get_driver_configuration(timer_8_bit_config_t * const conf *config = configuration.driver_config; } -void timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, - const uint32_t * const target_freq, - timer_8_bit_prescaler_selection_t * const prescaler, - uint8_t * const ocra, - uint16_t * const accumulator) +timer_error_t timer_8_bit_compute_matching_parameters(const uint32_t * const clock_freq, + const uint32_t * const target_freq, + timer_8_bit_prescaler_selection_t * const prescaler, + uint8_t * const ocra, + uint16_t * const accumulator) { (void) clock_freq; (void) target_freq; *prescaler = configuration.prescaler; *ocra = configuration.ocra; *accumulator = configuration.accumulator; + return TIMER_ERROR_OK; } const timer_generic_prescaler_pair_t timer_8_bit_prescaler_table[TIMER_8_BIT_MAX_PRESCALER_COUNT] = From 6572c525e0ffe65dbbdff6190152ca152497568b Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 27 Apr 2022 17:01:43 +0200 Subject: [PATCH 41/51] Fixed bug in compute closest prescaler function in timer drivers Signed-off-by: bebenlebricolo --- .../Timer_16_bit/Tests/timer_16_bit_tests.cpp | 41 +++++++++++++++++++ .../Timers/Timer_16_bit/src/timer_16_bit.c | 3 +- .../Timer_8_bit/Tests/timer_8_bit_tests.cpp | 40 ++++++++++++++++++ Drivers/Timers/Timer_8_bit/src/timer_8_bit.c | 3 +- .../Tests/timer_8_bit_async_tests.cpp | 41 +++++++++++++++++++ .../Timer_8_bit_async/src/timer_8_bit_async.c | 3 +- Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c | 3 +- Modules/Pwm/src/pwm.c | 8 +++- 8 files changed, 137 insertions(+), 5 deletions(-) diff --git a/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp b/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp index c1467db..486adac 100644 --- a/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp +++ b/Drivers/Timers/Timer_16_bit/Tests/timer_16_bit_tests.cpp @@ -619,6 +619,47 @@ TEST(timer_16_bit_driver_tests, test_parameters_computation_prescaler) ASSERT_EQ(accumulator, 0U); } +TEST(timer_16_bit_driver_tests, test_find_closest_prescaler_function) +{ + timer_error_t err = TIMER_ERROR_OK; + uint32_t clock_freq = 16'000'000; + uint32_t target_freq = 1'000'000; + + timer_16_bit_prescaler_selection_t prescaler = TIMER16BIT_CLK_PRESCALER_1; + err = timer_16_bit_compute_closest_prescaler(&clock_freq, &target_freq, TIMER_GENERIC_RESOLUTION_16_BIT, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_1); + + target_freq = 1'000; + err = timer_16_bit_compute_closest_prescaler(&clock_freq, &target_freq, TIMER_GENERIC_RESOLUTION_16_BIT, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_1); + + + target_freq = 3'000; + err = timer_16_bit_compute_closest_prescaler(&clock_freq, &target_freq, TIMER_GENERIC_RESOLUTION_16_BIT, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_1); + + target_freq = 5'000; + err = timer_16_bit_compute_closest_prescaler(&clock_freq, &target_freq, TIMER_GENERIC_RESOLUTION_16_BIT, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_1); + + clock_freq = 8'000'000; + target_freq = 440; + err = timer_16_bit_compute_closest_prescaler(&clock_freq, &target_freq, TIMER_GENERIC_RESOLUTION_16_BIT, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_1); + + clock_freq = 16'000'000; + target_freq = 1; + err = timer_16_bit_compute_closest_prescaler(&clock_freq, &target_freq, TIMER_GENERIC_RESOLUTION_16_BIT, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER16BIT_CLK_PRESCALER_256); +} + + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); diff --git a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c index 4b94084..c205334 100644 --- a/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c +++ b/Drivers/Timers/Timer_16_bit/src/timer_16_bit.c @@ -132,7 +132,8 @@ timer_error_t timer_16_bit_compute_closest_prescaler(const uint32_t * const cloc return TIMER_ERROR_CONFIG; } - *prescaler = parameters.output.prescaler; + *prescaler = timer_16_bit_prescaler_from_value(¶meters.output.prescaler); + return TIMER_ERROR_OK; } diff --git a/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp b/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp index bc678a1..f1b06e0 100644 --- a/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp +++ b/Drivers/Timers/Timer_8_bit/Tests/timer_8_bit_tests.cpp @@ -523,6 +523,46 @@ TEST(timer_8_bit_driver_tests, test_parameters_computation_prescaler) ASSERT_EQ(accumulator, 124U); } +TEST(timer_8_bit_driver_tests, test_find_closest_prescaler_function) +{ + timer_error_t err = TIMER_ERROR_OK; + uint32_t clock_freq = 16'000'000; + uint32_t target_freq = 1'000'000; + + timer_8_bit_prescaler_selection_t prescaler = TIMER8BIT_CLK_PRESCALER_1; + err = timer_8_bit_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_1); + + target_freq = 1'000; + err = timer_8_bit_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_64); + + + target_freq = 3'000; + err = timer_8_bit_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_64); + + target_freq = 5'000; + err = timer_8_bit_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_64); + + clock_freq = 8'000'000; + target_freq = 440; + err = timer_8_bit_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_256); + + clock_freq = 16'000'000; + target_freq = 1; + err = timer_8_bit_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_CLK_PRESCALER_1024); +} + int main(int argc, char **argv) { diff --git a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c index 3cfe51c..15514a4 100644 --- a/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c +++ b/Drivers/Timers/Timer_8_bit/src/timer_8_bit.c @@ -133,7 +133,8 @@ timer_error_t timer_8_bit_compute_closest_prescaler(const uint32_t * const clock { return TIMER_ERROR_CONFIG; } - *prescaler = parameters.output.prescaler; + *prescaler = timer_8_bit_prescaler_from_value(¶meters.output.prescaler); + return TIMER_ERROR_OK; } diff --git a/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp b/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp index 3dc4ae3..dee4971 100644 --- a/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp +++ b/Drivers/Timers/Timer_8_bit_async/Tests/timer_8_bit_async_tests.cpp @@ -595,6 +595,47 @@ TEST(timer_8_bit_async_driver_tests, test_parameters_computation_prescaler) ASSERT_EQ(accumulator, 124U); } +TEST(timer_8_bit_async_async_driver_tests, test_find_closest_prescaler_function) +{ + timer_error_t err = TIMER_ERROR_OK; + uint32_t clock_freq = 16'000'000; + uint32_t target_freq = 1'000'000; + + timer_8_bit_async_prescaler_selection_t prescaler = TIMER8BIT_ASYNC_CLK_PRESCALER_1; + err = timer_8_bit_async_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); + + target_freq = 1'000; + err = timer_8_bit_async_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_64); + + + target_freq = 3'000; + err = timer_8_bit_async_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_32); + + target_freq = 5'000; + err = timer_8_bit_async_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_32); + + clock_freq = 8'000'000; + target_freq = 440; + err = timer_8_bit_async_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_128); + + clock_freq = 16'000'000; + target_freq = 1; + err = timer_8_bit_async_compute_closest_prescaler(&clock_freq, &target_freq, &prescaler); + ASSERT_EQ(err, TIMER_ERROR_OK); + ASSERT_EQ(prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1024); +} + + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); diff --git a/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c b/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c index 9be6aed..d7f9402 100644 --- a/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c +++ b/Drivers/Timers/Timer_8_bit_async/src/timer_8_bit_async.c @@ -128,7 +128,8 @@ timer_error_t timer_8_bit_async_compute_closest_prescaler(const uint32_t * const { return TIMER_ERROR_CONFIG; } - *prescaler = parameters.output.prescaler; + *prescaler = timer_8_bit_async_prescaler_from_value(¶meters.output.prescaler); + return TIMER_ERROR_OK; } diff --git a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c index 3817be1..0d8b278 100644 --- a/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c +++ b/Modules/Pwm/Tests/Stubs/timer_16_bit_stub.c @@ -124,7 +124,8 @@ timer_error_t timer_16_bit_compute_closest_prescaler(const uint32_t * const cloc return TIMER_ERROR_CONFIG; } - *prescaler = parameters.output.prescaler; + *prescaler = timer_16_bit_prescaler_from_value(¶meters.output.prescaler); + return next_error; } diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index a287386..bc60bf2 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -757,11 +757,17 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ // Retrieve actual current timer resolution based on current waveform generation mode as per set in timer 16 bit registers timer_generic_resolution_t resolution = derive_16_bit_timer_resolution_from_waveform_selection(waveform); + if(waveform == TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE) + { + (void) waveform; + asm("NOP"); + } + // Compute closest prescaler first timerr = timer_16_bit_compute_closest_prescaler(clock_freq, &properties->frequency, resolution, &prescaler); if (TIMER_ERROR_OK != timerr) { - return PWM_ERROR_TIMER_ISSUE; + return PWM_ERROR_CONFIG; } timerr = timer_16_bit_set_prescaler(index, prescaler); From 3dafaa1e8514633be387b4edcc99010ccba50e53 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 27 Apr 2022 19:06:46 +0200 Subject: [PATCH 42/51] Implemented tests for PWM 16 bit Signed-off-by: bebenlebricolo --- Modules/Pwm/Tests/pwm_tests.cpp | 295 ++++++++++++++++++-------------- Modules/Pwm/inc/pwm.h | 5 + Modules/Pwm/src/pwm.c | 11 -- 3 files changed, 171 insertions(+), 140 deletions(-) diff --git a/Modules/Pwm/Tests/pwm_tests.cpp b/Modules/Pwm/Tests/pwm_tests.cpp index 6a70154..6944dce 100644 --- a/Modules/Pwm/Tests/pwm_tests.cpp +++ b/Modules/Pwm/Tests/pwm_tests.cpp @@ -382,9 +382,9 @@ TEST_F(PwmModule8BitTimerTestSuite, unit_a_behavioral_testing) ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_NORMAL); // unchanged ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); - ASSERT_EQ(timer_8_bit_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocra, (properties.duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U); ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_8_BIT + 1)))); // Actual output frequency is updated accordingly properties.pol = PWM_POLARITY_INVERTED; error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); @@ -406,9 +406,9 @@ TEST_F(PwmModule8BitTimerTestSuite, unit_a_behavioral_testing) ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_NORMAL); // unchanged ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); - ASSERT_EQ(timer_8_bit_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocra, (properties.duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U); ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_8_BIT + 1)))); // Actual output frequency is updated accordingly properties.pol = PWM_POLARITY_INVERTED; error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); @@ -486,9 +486,9 @@ TEST_F(PwmModule8BitTimerTestSuite, unit_b_behavioral_testing) ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_NORMAL); // unchanged ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); - ASSERT_EQ(timer_8_bit_stub_get_config()->ocrb, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocrb, (properties.duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U); ASSERT_EQ(properties.duty_cycle, 25U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_8_BIT + 1)))); // Actual output frequency is updated accordingly properties.pol = PWM_POLARITY_INVERTED; error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); @@ -510,9 +510,9 @@ TEST_F(PwmModule8BitTimerTestSuite, unit_b_behavioral_testing) ASSERT_EQ(timer_8_bit_stub_get_config()->compA, TIMER8BIT_CMOD_NORMAL); // unchanged ASSERT_EQ(timer_8_bit_stub_get_config()->compB, TIMER8BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value ASSERT_EQ(timer_8_bit_stub_get_config()->prescaler, TIMER8BIT_CLK_PRESCALER_1); - ASSERT_EQ(timer_8_bit_stub_get_config()->ocrb, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(timer_8_bit_stub_get_config()->ocrb, (properties.duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U); ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_8_BIT + 1)))); // Actual output frequency is updated accordingly properties.pol = PWM_POLARITY_INVERTED; error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); @@ -604,9 +604,9 @@ TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_a_behavioral_testing) ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); - ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocra, (properties.duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U); ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_8_BIT + 1)))); // Actual output frequency is updated accordingly properties.pol = PWM_POLARITY_INVERTED; error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); @@ -628,9 +628,9 @@ TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_a_behavioral_testing) ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); - ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocra, (properties.duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U); ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_8_BIT + 1)))); // Actual output frequency is updated accordingly properties.pol = PWM_POLARITY_INVERTED; error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); @@ -708,9 +708,9 @@ TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_b_behavioral_testing) ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); - ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocrb, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocrb, (properties.duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U); ASSERT_EQ(properties.duty_cycle, 25U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_8_BIT + 1)))); // Actual output frequency is updated accordingly properties.pol = PWM_POLARITY_INVERTED; error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); @@ -732,9 +732,9 @@ TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_b_behavioral_testing) ASSERT_EQ(timer_8_bit_async_stub_get_config()->compA, TIMER8BIT_ASYNC_CMOD_NORMAL); // unchanged ASSERT_EQ(timer_8_bit_async_stub_get_config()->compB, TIMER8BIT_ASYNC_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value ASSERT_EQ(timer_8_bit_async_stub_get_config()->prescaler, TIMER8BIT_ASYNC_CLK_PRESCALER_1); - ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocrb, (properties.duty_cycle * 255U) / 100U); + ASSERT_EQ(timer_8_bit_async_stub_get_config()->ocrb, (properties.duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U); ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_8_bit_async_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_8_BIT + 1)))); // Actual output frequency is updated accordingly properties.pol = PWM_POLARITY_INVERTED; error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); @@ -816,147 +816,184 @@ TEST_F(PwmModule16BitTimerTestSuite, unit_a_behavioral_testing) ASSERT_EQ(PWM_ERROR_OK, error); - // Checking Pwm Fast Full Range behavior + // Checking Pwm 8 bit Full Range behavior { - pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; const uint32_t cpu_freq = 16 MHz; - (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_FAST_8_bit_FULL_RANGE); - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value - ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged - ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); - ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); - ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 0U); - ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); - ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly - - properties.pol = PWM_POLARITY_INVERTED; - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value - ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged - timer_16_bit_stub_reset(); - timer_16_bit_stub_set_initialised(true); - } - - // Checking Pwm Fast Full Range behavior + timer_16_bit_waveform_generation_t configs[2U] = + { + TIMER16BIT_WG_PWM_FAST_8_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_8_bit_FULL_RANGE + }; + + for(const auto config : configs) + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + (void) timer_16_bit_set_waveform_generation(0U, config); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, (properties.duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 0U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_8_BIT + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + } + + // Checking Pwm 9 bit Full Range behavior { - pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; const uint32_t cpu_freq = 16 MHz; - (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE); - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value - ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged - ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); - ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, (properties.duty_cycle * 511) / 100U); - ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 0U); - ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); - ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (511 + 1)))); // Actual output frequency is updated accordingly - - properties.pol = PWM_POLARITY_INVERTED; - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value - ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged - timer_16_bit_stub_reset(); - timer_16_bit_stub_set_initialised(true); - } - - // Checking Pwm Fast Full Range behavior + timer_16_bit_waveform_generation_t configs[2U] = + { + TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_9_bit_FULL_RANGE + }; + + for(const auto config : configs) + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + (void) timer_16_bit_set_waveform_generation(0U, config); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, (properties.duty_cycle * COUNTER_MAX_VALUE_9_BIT) / 100U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 0U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_9_BIT + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + } + + // Checking Pwm 10 bit Full Range behavior { - pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; const uint32_t cpu_freq = 16 MHz; - (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE); - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value - ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged - ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); - ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, (properties.duty_cycle * 1023U) / 100U); - ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 0U); - ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); - ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (1023U + 1)))); // Actual output frequency is updated accordingly - properties.pol = PWM_POLARITY_INVERTED; - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value - ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged - timer_16_bit_stub_reset(); - timer_16_bit_stub_set_initialised(true); + timer_16_bit_waveform_generation_t configs[2U] = + { + TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_10_bit_FULL_RANGE + }; + + for(const auto config : configs) + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + (void) timer_16_bit_set_waveform_generation(0U, config); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, (properties.duty_cycle * COUNTER_MAX_VALUE_10_BIT) / 100U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 0U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_10_BIT + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } } // Checking Pwm Phase Correct Full Range behavior { - pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; const uint32_t cpu_freq = 16 MHz; - (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_FAST_ICR_MAX); - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value - ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged - ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); - ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, (properties.duty_cycle * 255U) / 100U); - ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (255U + 1)))); // Actual output frequency is updated accordingly - properties.pol = PWM_POLARITY_INVERTED; - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value - ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + timer_16_bit_waveform_generation_t configs[3U] = + { + TIMER16BIT_WG_PWM_FAST_ICR_MAX, + TIMER16BIT_WG_PWM_PHASE_CORRECT_ICR_MAX, + TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_ICR_MAX + }; - timer_16_bit_stub_reset(); - timer_16_bit_stub_set_initialised(true); - } + for(const auto config : configs) + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; - // Checking Pwm Fast Mode OCRA Max behavior - { - pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; - const uint32_t cpu_freq = 16 MHz; + (void) timer_16_bit_set_waveform_generation(0U, config); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, 7U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 15U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 0U); - (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_FAST_OCRA_MAX); - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_TOGGLE_OCnX); // Switched to toggling pin, frequency halved (or compensated) - ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged - ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); - ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, 7U); // 1MHz frequency with 50% duty cycle (pin toggled, so ocra halved) + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly - ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged - timer_16_bit_stub_reset(); - timer_16_bit_stub_set_initialised(true); + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } } - // Checking Pwm Phase Correct OCRA Max behavior + // Checking Pwm Fast Mode OCRA Max behavior { - pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; const uint32_t cpu_freq = 16 MHz; - (void) timer_16_bit_set_waveform_generation(0U, TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX); - error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); - ASSERT_EQ(PWM_ERROR_OK, error); - ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_TOGGLE_OCnX); // Switched to toggling pin, frequency halved (or compensated) - ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged - ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); - ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, 7U); // 1MHz frequency with 50% duty cycle (pin toggled, so ocra halved) - ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved - ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly - - timer_16_bit_stub_reset(); - timer_16_bit_stub_set_initialised(true); + timer_16_bit_waveform_generation_t configs[3U] = + { + TIMER16BIT_WG_PWM_FAST_OCRA_MAX, + TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX, + TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_OCRA_MAX + }; + + for(const auto config : configs) + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + + (void) timer_16_bit_set_waveform_generation(0U, config); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_TOGGLE_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, 7U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 0U); + + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } } } diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index afa85c3..50ddfaa 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -25,6 +25,11 @@ extern "C" #define MHz * 1000000UL #define kHz * 1000U +#define COUNTER_MAX_VALUE_8_BIT 255U +#define COUNTER_MAX_VALUE_9_BIT 511U +#define COUNTER_MAX_VALUE_10_BIT 1023U +#define COUNTER_MAX_VALUE_16_BIT 65535U + /** * @brief PWM module error types used to inform caller how operations performed. */ diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index bc60bf2..be14fdf 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -17,11 +17,6 @@ #endif -#define COUNTER_MAX_VALUE_8_BIT 255U -#define COUNTER_MAX_VALUE_9_BIT 511U -#define COUNTER_MAX_VALUE_10_BIT 1023U -#define COUNTER_MAX_VALUE_16_BIT 65535U - /** * @brief Static storage for pwm configuration * This is done this way to enhance the dynamic nature of PWMs, so that we can @@ -757,12 +752,6 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ // Retrieve actual current timer resolution based on current waveform generation mode as per set in timer 16 bit registers timer_generic_resolution_t resolution = derive_16_bit_timer_resolution_from_waveform_selection(waveform); - if(waveform == TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE) - { - (void) waveform; - asm("NOP"); - } - // Compute closest prescaler first timerr = timer_16_bit_compute_closest_prescaler(clock_freq, &properties->frequency, resolution, &prescaler); if (TIMER_ERROR_OK != timerr) From 30ccd0aded5ff62a46ec79fce3e0d37a7a26ff42 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 27 Apr 2022 19:15:20 +0200 Subject: [PATCH 43/51] Implemented 16 bit timer unit B pwm test Signed-off-by: bebenlebricolo --- Modules/Pwm/Tests/pwm_tests.cpp | 201 +++++++++++++++++++++++++++++++- Modules/Pwm/src/pwm.c | 5 +- 2 files changed, 203 insertions(+), 3 deletions(-) diff --git a/Modules/Pwm/Tests/pwm_tests.cpp b/Modules/Pwm/Tests/pwm_tests.cpp index 6944dce..1a34936 100644 --- a/Modules/Pwm/Tests/pwm_tests.cpp +++ b/Modules/Pwm/Tests/pwm_tests.cpp @@ -801,7 +801,6 @@ TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_b_behavioral_testing) } } - TEST_F(PwmModule16BitTimerTestSuite, unit_a_behavioral_testing) { // Rewritting parts of pwm_config @@ -997,6 +996,206 @@ TEST_F(PwmModule16BitTimerTestSuite, unit_a_behavioral_testing) } } +TEST_F(PwmModule16BitTimerTestSuite, unit_b_behavioral_testing) +{ + // Rewritting parts of pwm_config + pwm_config.hard[0].arch = TIMER_ARCH_16_BIT; + pwm_config.hard[0].timer_index = 0U; + pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_B; + pwm_error_t error = PWM_ERROR_OK; + + // Init the timer_16_bit beforehand + timer_16_bit_stub_set_initialised(true); + error = pwm_init(); + ASSERT_EQ(PWM_ERROR_OK, error); + + + // Checking Pwm 8 bit Full Range behavior + { + const uint32_t cpu_freq = 16 MHz; + + timer_16_bit_waveform_generation_t configs[2U] = + { + TIMER16BIT_WG_PWM_FAST_8_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_8_bit_FULL_RANGE + }; + + for(const auto config : configs) + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + (void) timer_16_bit_set_waveform_generation(0U, config); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, (properties.duty_cycle * COUNTER_MAX_VALUE_8_BIT) / 100U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, 0U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_8_BIT + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + } + + // Checking Pwm 9 bit Full Range behavior + { + const uint32_t cpu_freq = 16 MHz; + + timer_16_bit_waveform_generation_t configs[2U] = + { + TIMER16BIT_WG_PWM_FAST_9_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_9_bit_FULL_RANGE + }; + + for(const auto config : configs) + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + (void) timer_16_bit_set_waveform_generation(0U, config); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, 0U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, (properties.duty_cycle * COUNTER_MAX_VALUE_9_BIT) / 100U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_9_BIT + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + } + + // Checking Pwm 10 bit Full Range behavior + { + const uint32_t cpu_freq = 16 MHz; + + + timer_16_bit_waveform_generation_t configs[2U] = + { + TIMER16BIT_WG_PWM_FAST_10_bit_FULL_RANGE, + TIMER16BIT_WG_PWM_PHASE_CORRECT_10_bit_FULL_RANGE + }; + + for(const auto config : configs) + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + (void) timer_16_bit_set_waveform_generation(0U, config); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, 0U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, (properties.duty_cycle * COUNTER_MAX_VALUE_10_BIT) / 100U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, (cpu_freq / (timer_16_bit_stub_get_config()->prescaler * (COUNTER_MAX_VALUE_10_BIT + 1)))); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + } + + // Checking Pwm ICR mode + { + const uint32_t cpu_freq = 16 MHz; + + + timer_16_bit_waveform_generation_t configs[3U] = + { + TIMER16BIT_WG_PWM_FAST_ICR_MAX, + TIMER16BIT_WG_PWM_PHASE_CORRECT_ICR_MAX, + TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_ICR_MAX + }; + + for(const auto config : configs) + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 50U, .pol = PWM_POLARITY_NORMAL }; + + (void) timer_16_bit_set_waveform_generation(0U, config); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_CLEAR_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 15U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 7U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, 0U); + + ASSERT_EQ(properties.duty_cycle, 50U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_NORMAL); // unchanged + + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + } + + // Checking Pwm Fast Mode OCRA Max behavior + { + const uint32_t cpu_freq = 16 MHz; + + + timer_16_bit_waveform_generation_t configs[3U] = + { + TIMER16BIT_WG_PWM_FAST_OCRA_MAX, + TIMER16BIT_WG_PWM_PHASE_CORRECT_OCRA_MAX, + TIMER16BIT_WG_PWM_PHASE_AND_FREQ_CORRECT_OCRA_MAX + }; + + for(const auto config : configs) + { + pwm_props_t properties = { .frequency = 1 MHz, .duty_cycle = 25U, .pol = PWM_POLARITY_NORMAL }; + + (void) timer_16_bit_set_waveform_generation(0U, config); + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_NORMAL); // Normal polarity means we want to clear pin when reaching OCR value + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_CLEAR_OCnX); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->prescaler, TIMER16BIT_CLK_PRESCALER_1); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocra, 15U); + ASSERT_EQ(timer_16_bit_stub_get_config()->icr, 0U); + ASSERT_EQ(timer_16_bit_stub_get_config()->ocrb, 3U); + + ASSERT_EQ(properties.duty_cycle, 25U); // Duty cycle is preserved + ASSERT_EQ(properties.frequency, 1 MHz); // Actual output frequency is updated accordingly + + properties.pol = PWM_POLARITY_INVERTED; + error = pwm_config_single(0U, PWM_TYPE_HARDWARE, &properties, &cpu_freq); + ASSERT_EQ(PWM_ERROR_OK, error); + ASSERT_EQ(timer_16_bit_stub_get_config()->compA, TIMER16BIT_CMOD_NORMAL); // unchanged + ASSERT_EQ(timer_16_bit_stub_get_config()->compB, TIMER16BIT_CMOD_SET_OCnX); // Normal polarity means we want to clear pin when reaching OCR value + + timer_16_bit_stub_reset(); + timer_16_bit_stub_set_initialised(true); + } + } +} int main(int argc, char **argv) diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index be14fdf..b9741e7 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -914,10 +914,11 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ // OCRB fine tunes the duty_cycle // Ocr value will become the OCRB value, using OCRA as the limit counter value (TOP) - ocr_value = (properties->duty_cycle * ocr_value) / 100U; + ocr_value = (*clock_freq /(prescaler_value * properties->frequency) - 1); timerr = timer_16_bit_set_ocra_register_value(timer_config->timer_index, &ocr_value); + + ocr_value = (properties->duty_cycle * ocr_value) / 100U; timerr |= timer_16_bit_set_ocrb_register_value(timer_config->timer_index, &ocr_value); - timerr |= timer_16_bit_set_compare_match_B(timer_config->timer_index, TIMER16BIT_CMOD_TOGGLE_OCnX); // In that case, both frequency and duty cycle are achieved through the use of this configuration. // So output frequency characteristics should match the requested input pwm properties parameters From b617d427f83d0da990780e4192b7e16eebeb40e2 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 27 Apr 2022 19:18:16 +0200 Subject: [PATCH 44/51] Added unimplemented body for 16 bit complementary pwm config Signed-off-by: bebenlebricolo --- Modules/Pwm/inc/pwm.h | 3 ++- Modules/Pwm/src/pwm.c | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index 50ddfaa..b512c6b 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -39,7 +39,8 @@ typedef enum PWM_ERROR_CONFIG, /**< Something is wrong with the configuration */ PWM_ERROR_TIMEBASE_ISSUE, /**< Software timebase has encountered some errors */ PWM_ERROR_TIMER_ISSUE, /**< Timer drivers encountered some errors */ - PWM_ERROR_INDEX_OUT_OF_RANGE /**< Given pwm instance index is out of range */ + PWM_ERROR_INDEX_OUT_OF_RANGE, /**< Given pwm instance index is out of range */ + PWM_ERROR_NOT_IMPLEMENTED /**< Specific function is not implemented (yet) */ } pwm_error_t; /** diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index b9741e7..031e00c 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -943,6 +943,13 @@ static pwm_error_t configure_timer_16_bit_single(const uint8_t index, pwm_props_ return ret; } +pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const config, const uint32_t * clock_freq ) +{ + (void) clock_freq; + (void) config; + return PWM_ERROR_NOT_IMPLEMENTED; +} + static inline bool index_valid(const uint8_t index, const pwm_type_t type) { From 7830174873ada6fe09123306a15a8545f9dabbc7 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Wed, 27 Apr 2022 19:36:25 +0200 Subject: [PATCH 45/51] Cleaned a bit CMakeLists.txt files Signed-off-by: bebenlebricolo --- Modules/Pwm/Tests/CMakeLists.txt | 13 ++++++------- Tests/CMakeLists.txt | 1 + 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Modules/Pwm/Tests/CMakeLists.txt b/Modules/Pwm/Tests/CMakeLists.txt index 4bed5d8..9686c58 100644 --- a/Modules/Pwm/Tests/CMakeLists.txt +++ b/Modules/Pwm/Tests/CMakeLists.txt @@ -8,12 +8,11 @@ if(WIN32) set(THREAD_LIB "") else() set(THREAD_LIB pthread) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weffc++") endif() ### timebase_module library ### add_library(pwm_module STATIC -../src/pwm.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/pwm.c ) target_include_directories(pwm_module PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/inc @@ -30,11 +29,11 @@ target_include_directories(pwm_module PUBLIC ########## Timebase module tests ########## add_executable(pwm_module_tests - pwm_tests.cpp - Stubs/timer_8_bit_async_stub.c - Stubs/timer_8_bit_stub.c - Stubs/timer_16_bit_stub.c - Stubs/config.c + ${CMAKE_CURRENT_SOURCE_DIR}/pwm_tests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Stubs/timer_8_bit_async_stub.c + ${CMAKE_CURRENT_SOURCE_DIR}/Stubs/timer_8_bit_stub.c + ${CMAKE_CURRENT_SOURCE_DIR}/Stubs/timer_16_bit_stub.c + ${CMAKE_CURRENT_SOURCE_DIR}/Stubs/config.c ) target_include_directories(pwm_module_tests PUBLIC diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 6f41873..e6bb9d6 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -14,6 +14,7 @@ add_definitions( option(COVERAGE OFF) + if(COVERAGE) set(COVERAGE_FLAGS "--coverage --ftest-coverage -fprofile-arcs") else() From 1f9f5509b51e524a3bddf28a5b6068537643b762 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Fri, 29 Apr 2022 10:17:22 +0200 Subject: [PATCH 46/51] Consolidated io driver api Signed-off-by: bebenlebricolo --- Drivers/Io/Tests/io_tests.cpp | 63 ++++++++++++++++++++++++---- Drivers/Io/inc/io.h | 29 +++++++++++-- Drivers/Io/src/io.c | 78 ++++++++++++++++++++++++++++++++--- Modules/Pwm/src/pwm.c | 32 +++++++++++++- 4 files changed, 183 insertions(+), 19 deletions(-) diff --git a/Drivers/Io/Tests/io_tests.cpp b/Drivers/Io/Tests/io_tests.cpp index 63131f5..19c6449 100644 --- a/Drivers/Io/Tests/io_tests.cpp +++ b/Drivers/Io/Tests/io_tests.cpp @@ -32,9 +32,24 @@ along with this program. If not, see . #include "io.h" #include "config.h" -TEST(io_driver, test_init) +class IoDriverTests : public ::testing::Test { - io_init(); +public : + void SetUp() override + { + } + + void TearDown() override + { + memset(get_stubbed_registers(), 0, sizeof(stubbed_registers_t)); + (void) io_deinit(); + } +}; + +TEST_F(IoDriverTests, test_init) +{ + io_error_t err = io_init(); + ASSERT_EQ(IO_ERROR_OK, err); auto stubs = get_stubbed_registers(); ASSERT_EQ(stubs->st_mcucr, 0); @@ -53,29 +68,59 @@ TEST(io_driver, test_init) ASSERT_EQ(stubs->st_portd.st_port_reg, (uint8_t)(1 << 5U)); ASSERT_EQ(stubs->st_portd.st_pin_reg, 0); ASSERT_EQ(stubs->st_portd.st_ddr_reg, 1 << 5U | 1 << 1U); + + ASSERT_TRUE(io_is_initialised()); } -TEST(io_driver, test_read) +TEST_F(IoDriverTests, test_deinit) { - io_init(); + io_error_t err = io_init(); + ASSERT_EQ(IO_ERROR_OK, err); + ASSERT_TRUE(io_is_initialised()); + + err = io_deinit(); + ASSERT_FALSE(io_is_initialised()); +} + +TEST_F(IoDriverTests, test_read) +{ + io_state_t state = IO_STATE_UNDEFINED; + io_error_t err = IO_ERROR_OK; + err = io_read(PIN_POWER_SWITCH, &state); + ASSERT_EQ(IO_ERROR_NOT_INITIALISED, err); + + err = io_init(); + ASSERT_EQ(IO_ERROR_OK, err); auto stubs = get_stubbed_registers(); stubs->st_portc.st_pin_reg |= 0xF0; - auto state = io_read(PIN_POWER_SWITCH); + // Check out of range detection + err = io_read(IO_MAX_PINS, &state); + ASSERT_EQ(IO_ERROR_INDEX_OUT_OF_RANGE, err); + + err = io_read(PIN_POWER_SWITCH, &state); ASSERT_EQ(state, IO_STATE_LOW); + ASSERT_EQ(IO_ERROR_OK, err); stubs->st_portc.st_pin_reg |= (1 << 3U); - state = io_read(PIN_POWER_SWITCH); + err = io_read(PIN_POWER_SWITCH, &state); ASSERT_EQ(state, IO_STATE_HIGH); + ASSERT_EQ(IO_ERROR_OK, err); stubs->st_portc.st_pin_reg &= ~(1 << 3U); - state = io_read(PIN_POWER_SWITCH); + err = io_read(PIN_POWER_SWITCH, &state); ASSERT_EQ(state, IO_STATE_LOW); + ASSERT_EQ(IO_ERROR_OK, err); } -TEST(io_driver, test_write) +TEST_F(IoDriverTests, test_write) { - io_init(); + io_error_t err = IO_ERROR_OK; + err = io_write(PIN_POWER_SWITCH, IO_STATE_HIGH); + ASSERT_EQ(IO_ERROR_NOT_INITIALISED, err); + + err = io_init(); + ASSERT_EQ(IO_ERROR_OK, err); auto stubs = get_stubbed_registers(); ASSERT_EQ(stubs->st_portb.st_port_reg, 0x2); diff --git a/Drivers/Io/inc/io.h b/Drivers/Io/inc/io.h index 2438c80..fd37d8e 100644 --- a/Drivers/Io/inc/io.h +++ b/Drivers/Io/inc/io.h @@ -15,6 +15,15 @@ extern "C" #pragma message("IO_MAX_PINS macro was not defined in this compilation unit, IO_MAX_PINS will take its default size.") #endif +typedef enum +{ + IO_ERROR_OK, /**< Operation succeeded */ + IO_ERROR_CONFIG, /**< Configuration issues */ + IO_ERROR_ALREADY_INITIALISED, /**< Io driver was already initialised */ + IO_ERROR_NOT_INITIALISED, /**< Used to reject actions on pins if driver is not initialised */ + IO_ERROR_INDEX_OUT_OF_RANGE /**< User tried to use an IO index greater than registered */ +} io_error_t; + /** * @brief describes a simplified interface for any * given pin to be configured (using enums instead of plain registers) @@ -114,7 +123,7 @@ extern io_reg_config_t io_reg_config; * true : pin is set (high logic level) * false : pin is not set (low logic level) */ -io_state_t io_read(const uint8_t index); +io_error_t io_read(const uint8_t index, io_state_t * const state); /** * @brief writes data to a single pin, using its index (from the lookup table) @@ -122,13 +131,27 @@ io_state_t io_read(const uint8_t index); * in case where the pin is set as an input and that you write to it, you may change the pin configuration ! * @param[in] index : index of the pin in the lookup table * @param[in] state : new state of the pin + * @return + * IO_ERROR_OK : operation succeeded + * IO_ERROR_CONFIG : input state is still set to undefined, that's a config issue + * IO_ERROR_INDEX_OUT_OF_RANGE : given index is greater than registered IO_MAX_PINS macro */ -void io_write(const uint8_t index, const io_state_t state); +io_error_t io_write(const uint8_t index, const io_state_t state); /** * @brief configures all registered pins and give them default state, if any */ -void io_init(void); +io_error_t io_init(void); + +/** + * @brief Reverts all previously configured pins as being high impedance inputs + */ +io_error_t io_deinit(void); + +/** + * @brief Checks if IO driver was initialised + */ +bool io_is_initialised(void); #ifdef __cplusplus } diff --git a/Drivers/Io/src/io.c b/Drivers/Io/src/io.c index da2b163..a19a110 100644 --- a/Drivers/Io/src/io.c +++ b/Drivers/Io/src/io.c @@ -2,6 +2,8 @@ #define PUD_MSK (0x10) +static bool initialised = false; + static io_port_config_t * port_lut[IO_PORT_COUNT] = { &io_reg_config.porta_cfg, @@ -10,6 +12,8 @@ static io_port_config_t * port_lut[IO_PORT_COUNT] = &io_reg_config.portd_cfg }; +static inline io_error_t check_index(const uint8_t index); + static inline void configure_single_pin(io_port_config_t * config, io_t * io) { if(io->direction == IO_OUT_PUSH_PULL) @@ -38,8 +42,14 @@ static inline void configure_single_pin(io_port_config_t * config, io_t * io) } } -void io_init(void) +io_error_t io_init(void) { + // Skip reinitialisation if driver is already initialised + if(initialised) + { + return IO_ERROR_ALREADY_INITIALISED; + } + bool needs_pull_up = false; for (uint8_t i = 0 ; i < IO_MAX_PINS ; i++) { @@ -53,17 +63,65 @@ void io_init(void) { *io_reg_config.mcucr_reg |= PUD_MSK; } + + initialised = true; + return IO_ERROR_OK; +} + +io_error_t io_deinit(void) +{ + for (uint8_t i = 0 ; i < IO_MAX_PINS ; i++) + { + // Copy the io as we don't want to modify original io configuration in-place + // with this function + io_t io = io_pins_lut[i]; + io.direction = IO_IN_TRISTATE; + configure_single_pin(port_lut[io.port], &io); + } + // Disables Pull ups globally + *io_reg_config.mcucr_reg &= ~PUD_MSK; + initialised = false; + return IO_ERROR_OK; } -io_state_t io_read(const uint8_t index) +bool io_is_initialised(void) { + return initialised; +} + +io_error_t io_read(const uint8_t index, io_state_t * const state) +{ + io_error_t ret = check_index(index); + if(IO_ERROR_OK != ret) + { + return ret; + } + + // Reject action if not initialised (because we might be messing up with the pins which might be in the wrong state) + if(false == initialised) + { + return IO_ERROR_NOT_INITIALISED; + } + io_t * io = &io_pins_lut[index]; - io_state_t state = (io_state_t) ((*port_lut[io->port]->pin_reg & (1 << io->pin)) >> io->pin); - return state; + *state = (io_state_t) ((*port_lut[io->port]->pin_reg & (1 << io->pin)) >> io->pin); + return ret; } -void io_write(const uint8_t index, const io_state_t state) +io_error_t io_write(const uint8_t index, const io_state_t state) { + io_error_t ret = check_index(index); + if(IO_ERROR_OK != ret) + { + return ret; + } + + // Reject action if not initialised (because we might be messing up with the pins which might be in the wrong state) + if(false == initialised) + { + return IO_ERROR_NOT_INITIALISED; + } + io_t * io = &io_pins_lut[index]; switch (state) { @@ -78,7 +136,17 @@ void io_write(const uint8_t index, const io_state_t state) // Undefined state is used by other drivers to indicate "do not interact with this pin" case IO_STATE_UNDEFINED : default: + ret = IO_ERROR_CONFIG; break; } + return ret; } +static inline io_error_t check_index(const uint8_t index) +{ + if(index >= IO_MAX_PINS) + { + return IO_ERROR_INDEX_OUT_OF_RANGE; + } + return IO_ERROR_OK; +} diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 031e00c..21a3431 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -29,6 +29,7 @@ static struct uint16_t last_tick; /**< Holds the last tick retrieved from timebase module */ uint16_t start_tick; /**< Holds the start tick retrieved from timebase module */ + bool started; /**< Records if a specific software pwm is started or not */ } soft_config[PWM_MAX_SOFT_INSTANCES] = {0}; @@ -83,6 +84,10 @@ pwm_error_t pwm_init(void) { pwm_error_t err = PWM_ERROR_OK; + // Check IO Driver is initialised + // And check Timebase module is initialised as well + + // Iterate over pwm_config and search hard configurations for (uint8_t i = 0 ; i < PWM_MAX_HARD_INSTANCES ; i++) { @@ -298,8 +303,17 @@ pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_pr } else { - soft_config[index].frequency = properties->frequency; - soft_config[index].duty_cycle = properties->duty_cycle; + pwm_soft_static_config_t * timer_config = &pwm_config.soft[index]; + io_error_t err = io_write(timer_config->io_index, timer_config->safe_state); + if (IO_ERROR_OK != err) + { + ret = PWM_ERROR_CONFIG; + } + else + { + soft_config[index].frequency = properties->frequency; + soft_config[index].duty_cycle = properties->duty_cycle; + } } return ret; @@ -951,6 +965,20 @@ pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const } +pwm_error_t pwm_process(void) +{ + pwm_error_t ret = PWM_ERROR_OK; + + // Nothing to do for the hardware part, this is already automatically handled + // by the timers themselves. + + + + return ret; +} + + + static inline bool index_valid(const uint8_t index, const pwm_type_t type) { if (PWM_TYPE_HARDWARE == type) From 18ff4830b5afbc13eef192b50568598ac1ce7cc7 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Fri, 29 Apr 2022 12:05:02 +0200 Subject: [PATCH 47/51] Modified timebase module to compute period based on input frequency Signed-off-by: bebenlebricolo --- Modules/Pwm/Tests/CMakeLists.txt | 2 + Modules/Pwm/Tests/Stubs/io_stub.c | 10 +++ Modules/Pwm/Tests/Stubs/io_stub.h | 14 ++++ Modules/Pwm/Tests/Stubs/timebase_stub.c | 39 +++++++++++ Modules/Pwm/Tests/Stubs/timebase_stub.h | 17 +++++ Modules/Pwm/inc/pwm.h | 5 +- Modules/Pwm/src/pwm.c | 79 ++++++++++++++++++++--- Modules/Timebase/Tests/timebase_tests.cpp | 49 ++++++++++++++ Modules/Timebase/inc/timebase.h | 26 ++++++++ Modules/Timebase/src/timebase.c | 50 ++++++++++++++ 10 files changed, 280 insertions(+), 11 deletions(-) create mode 100644 Modules/Pwm/Tests/Stubs/io_stub.c create mode 100644 Modules/Pwm/Tests/Stubs/io_stub.h create mode 100644 Modules/Pwm/Tests/Stubs/timebase_stub.c create mode 100644 Modules/Pwm/Tests/Stubs/timebase_stub.h diff --git a/Modules/Pwm/Tests/CMakeLists.txt b/Modules/Pwm/Tests/CMakeLists.txt index 9686c58..9251dad 100644 --- a/Modules/Pwm/Tests/CMakeLists.txt +++ b/Modules/Pwm/Tests/CMakeLists.txt @@ -34,6 +34,8 @@ add_executable(pwm_module_tests ${CMAKE_CURRENT_SOURCE_DIR}/Stubs/timer_8_bit_stub.c ${CMAKE_CURRENT_SOURCE_DIR}/Stubs/timer_16_bit_stub.c ${CMAKE_CURRENT_SOURCE_DIR}/Stubs/config.c + ${CMAKE_CURRENT_SOURCE_DIR}/Stubs/io_stub.c + ${CMAKE_CURRENT_SOURCE_DIR}/Stubs/timebase_stub.c ) target_include_directories(pwm_module_tests PUBLIC diff --git a/Modules/Pwm/Tests/Stubs/io_stub.c b/Modules/Pwm/Tests/Stubs/io_stub.c new file mode 100644 index 0000000..1846bab --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/io_stub.c @@ -0,0 +1,10 @@ +#include "io.h" +#include "io_stub.h" + +io_error_t io_write(const uint8_t index, const io_state_t state) +{ + (void) index; + (void) state; + + return IO_ERROR_OK; +} diff --git a/Modules/Pwm/Tests/Stubs/io_stub.h b/Modules/Pwm/Tests/Stubs/io_stub.h new file mode 100644 index 0000000..837ac5c --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/io_stub.h @@ -0,0 +1,14 @@ +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + +extern bool io_stub_initialised; + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/timebase_stub.c b/Modules/Pwm/Tests/Stubs/timebase_stub.c new file mode 100644 index 0000000..0fcdf24 --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/timebase_stub.c @@ -0,0 +1,39 @@ +#include "timebase.h" +#include "timebase_stub.h" + +bool timebase_stub_initialised = false; +static uint16_t next_duration = 0; + +timebase_error_t timebase_get_tick(const uint8_t id, uint16_t * const tick) +{ + (void) id; + (void) tick; + return TIMEBASE_ERROR_OK; +} + +timebase_error_t timebase_is_initialised(const uint8_t id, bool * const initialised) +{ + (void) id; + *initialised = timebase_stub_initialised; + return TIMEBASE_ERROR_OK; +} + +timebase_error_t timebase_get_duration(uint16_t const * const reference, uint16_t const * const new_tick, uint16_t * const duration) +{ + (void) reference; + (void) new_tick; + (void) duration; + + return TIMEBASE_ERROR_OK; +} + +void timebase_stub_set_duration(const uint16_t duration) +{ + next_duration = duration; +} + +void timebase_stub_reset(void) +{ + next_duration = 0; + timebase_stub_initialised = false; +} \ No newline at end of file diff --git a/Modules/Pwm/Tests/Stubs/timebase_stub.h b/Modules/Pwm/Tests/Stubs/timebase_stub.h new file mode 100644 index 0000000..44f70e6 --- /dev/null +++ b/Modules/Pwm/Tests/Stubs/timebase_stub.h @@ -0,0 +1,17 @@ +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + +void timebase_stub_set_next_duration(const uint16_t duration); +void timebase_stub_reset(void); + +extern bool timebase_stub_initialised; + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index b512c6b..b908212 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -37,9 +37,10 @@ typedef enum { PWM_ERROR_OK = 0, /**< Operation succeeded, no issues */ PWM_ERROR_CONFIG, /**< Something is wrong with the configuration */ - PWM_ERROR_TIMEBASE_ISSUE, /**< Software timebase has encountered some errors */ + PWM_ERROR_IO_ISSUE, /**< Error caught when communicating with IO driver */ PWM_ERROR_TIMER_ISSUE, /**< Timer drivers encountered some errors */ - PWM_ERROR_INDEX_OUT_OF_RANGE, /**< Given pwm instance index is out of range */ + PWM_ERROR_TIMEBASE_ISSUE, /**< Software timebase has encountered some errors */ + PWM_ERROR_INDEX_OUT_OF_RANGE, /**< Given pwm instance index is out of range */ PWM_ERROR_NOT_IMPLEMENTED /**< Specific function is not implemented (yet) */ } pwm_error_t; diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 21a3431..7013db6 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -24,12 +24,13 @@ */ static struct { - uint32_t frequency; /**< Initial frequency of this Pwm module instance */ - uint8_t duty_cycle; /**< Initial duty cycle of this Pwm module instance */ - - uint16_t last_tick; /**< Holds the last tick retrieved from timebase module */ - uint16_t start_tick; /**< Holds the start tick retrieved from timebase module */ - bool started; /**< Records if a specific software pwm is started or not */ + uint16_t period; /**< Gives the time period in ticks for a single software PWM */ + uint16_t switch_tick; /**< Used to implement duty cycle and events. */ + // The switch tick indicates when a pin has to change its state */ + uint16_t last_tick; /**< Holds the last tick retrieved from timebase module */ + uint16_t start_tick; /**< Holds the start tick of the current frame/period retrieved from timebase module */ + io_state_t state; /**< Records the current IO state, so that we can keep track of the duty cycle as well */ + bool started; /**< Records if a specific software pwm is started or not */ } soft_config[PWM_MAX_SOFT_INSTANCES] = {0}; @@ -193,6 +194,32 @@ pwm_error_t pwm_start(const uint8_t index, const pwm_type_t type) if( PWM_TYPE_SOFTWARE == type) { // Start software PWM + pwm_soft_static_config_t * config = &pwm_config.soft[index]; + timebase_error_t timberr = TIMEBASE_ERROR_OK; + io_error_t ioerr = IO_ERROR_OK; + + ioerr = io_write(config->io_index, config->safe_state); + if(IO_ERROR_OK != ioerr) + { + ret = PWM_ERROR_IO_ISSUE; + } + + // Handling timebase module interaction + if(PWM_ERROR_OK == ret) + { + uint16_t tick = 0; + timberr = timebase_get_tick(config->timebase_index, &tick); + if(TIMEBASE_ERROR_OK != timberr) + { + ret = PWM_ERROR_TIMEBASE_ISSUE; + } + else + { + soft_config[index].start_tick = tick; + soft_config[index].last_tick = tick; + soft_config[index].started = true; + } + } } else { @@ -309,10 +336,20 @@ pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_pr { ret = PWM_ERROR_CONFIG; } - else + + // Same, reject timebase misinitialisation as well + bool timebase_initialised = false; + timebase_error_t timberr = timebase_is_initialised(timer_config->timebase_index, &timebase_initialised); + if(TIMEBASE_ERROR_OK != timberr || false == timebase_initialised) { - soft_config[index].frequency = properties->frequency; - soft_config[index].duty_cycle = properties->duty_cycle; + ret = PWM_ERROR_CONFIG; + } + + // Transaction with IO driver and Timebase Module are validated, we can now start to work with the registered pin. + if (PWM_ERROR_OK == ret) + { + soft_config[index].period = properties->frequency; + soft_config[index].switch_tick = properties->duty_cycle; } } @@ -968,12 +1005,36 @@ pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const pwm_error_t pwm_process(void) { pwm_error_t ret = PWM_ERROR_OK; + io_error_t ioerr = IO_ERROR_OK; + timebase_error_t timberr = TIMEBASE_ERROR_OK; + uint16_t duration = 0; + uint8_t timebase_index = 0; // Nothing to do for the hardware part, this is already automatically handled // by the timers themselves. + for(uint8_t index = 0 ; index < PWM_MAX_SOFT_INSTANCES; index++) + { + if(true == soft_config[index].started) + { + timebase_index = pwm_config.soft[index].timebase_index; + timberr = timebase_get_tick(timebase_index, &soft_config[index].last_tick); + if (TIMEBASE_ERROR_OK != timberr) + { + ret = PWM_ERROR_TIMEBASE_ISSUE; + break; + } + timberr = timebase_get_duration(&soft_config[index].start_tick, &soft_config[index].last_tick, &duration); + if (TIMEBASE_ERROR_OK != timberr) + { + ret = PWM_ERROR_TIMEBASE_ISSUE; + break; + } + } + } + return ret; } diff --git a/Modules/Timebase/Tests/timebase_tests.cpp b/Modules/Timebase/Tests/timebase_tests.cpp index 924febf..5fce8a5 100644 --- a/Modules/Timebase/Tests/timebase_tests.cpp +++ b/Modules/Timebase/Tests/timebase_tests.cpp @@ -296,6 +296,55 @@ TEST_F(TimebaseModule8BitInitialised, test_ticks_and_durations) ASSERT_EQ(duration,((uint32_t) (timebase_internal_config[0U].tick) + USHRT_MAX) - (uint32_t) reference); } +TEST_F(TimebaseModule8BitInitialised, test_period_from_frequency_calculations) +{ + uint32_t frequency = 1000; + uint16_t period = 0; + timebase_error_t err = TIMEBASE_ERROR_OK; + err = timebase_compute_period_from_frequency(0U, &frequency, TIMEBASE_FREQUENCY_HZ, &period); + ASSERT_EQ(err, TIMEBASE_ERROR_FREQUENCY_TOO_HIGH); + ASSERT_EQ(period, 0); + + timebase_static_config[0].clock_freq = 16'000'000; + timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_MICROSECONDS; + timebase_static_config[0].timer.type = TIMER_ARCH_8_BIT; + timebase_static_config[0].timer.index = 0U; + + err = timebase_init(0U); + ASSERT_EQ(err, TIMEBASE_ERROR_OK); + err = timebase_compute_period_from_frequency(0U, &frequency, TIMEBASE_FREQUENCY_HZ, &period); + ASSERT_EQ(err, TIMEBASE_ERROR_OK); + ASSERT_EQ(period, 1000U); + + // What about singing a song ? + frequency = 440; + err = timebase_compute_period_from_frequency(0U, &frequency, TIMEBASE_FREQUENCY_HZ, &period); + ASSERT_EQ(err, TIMEBASE_ERROR_OK); + ASSERT_EQ(period, 2272); + + frequency = 880; + err = timebase_compute_period_from_frequency(0U, &frequency, TIMEBASE_FREQUENCY_HZ, &period); + ASSERT_EQ(err, TIMEBASE_ERROR_OK); + ASSERT_EQ(period, 1136); + + // Trying with custom frequencies as well + timebase_static_config[0].timescale = TIMEBASE_TIMESCALE_CUSTOM; + timebase_static_config[0].custom_target_freq = 44'000UL; + err = timebase_init(0U); + ASSERT_EQ(err, TIMEBASE_ERROR_OK); + + frequency = 880; + err = timebase_compute_period_from_frequency(0U, &frequency, TIMEBASE_FREQUENCY_HZ, &period); + ASSERT_EQ(err, TIMEBASE_ERROR_OK); + ASSERT_EQ(period, 50); + + // Highest pitched 'E' hearable by humans + frequency = 21'098; + err = timebase_compute_period_from_frequency(0U, &frequency, TIMEBASE_FREQUENCY_HZ, &period); + ASSERT_EQ(err, TIMEBASE_ERROR_OK); + ASSERT_EQ(period, 2); +} + int main(int argc, char **argv) { diff --git a/Modules/Timebase/inc/timebase.h b/Modules/Timebase/inc/timebase.h index f03c86e..fdf9ac4 100644 --- a/Modules/Timebase/inc/timebase.h +++ b/Modules/Timebase/inc/timebase.h @@ -55,6 +55,7 @@ typedef enum TIMEBASE_ERROR_UNSUPPORTED_TIMER_TYPE, /**< Given timer type is not compatible with timer_arch_t enum */ TIMEBASE_ERROR_UNSUPPORTED_TIMESCALE, /**< Given timescale is not relevant to timebase module */ + TIMEBASE_ERROR_FREQUENCY_TOO_HIGH, /**< Targeted timebase instance could not implement given frequency */ TIMEBASE_ERROR_TIMER_UNINITIALISED, /**< Underlying timer is not initialised */ TIMEBASE_ERROR_TIMER_ERROR, /**< Encountered an error while using underlying timer driver */ } timebase_error_t; @@ -71,6 +72,18 @@ typedef enum TIMEBASE_TIMESCALE_CUSTOM, /**< Custom timescale, allows to use a custom configuration to handle timebase generation */ } timebase_timescale_t; +/** + * @brief Packs frequencies base units. + * @details This enum is quite strange but allows us to calculate timebase ticks periods for frequencies that are lower than 1 Hz. + * Amongst other things, it prevents from using floating point arithmetics (which is heavy) and allows us to + * Generate very slow events, that could make sense from a pure timing point of view. + */ +typedef enum +{ + TIMEBASE_FREQUENCY_HZ, /**< Default Hz unit for frequencies */ + TIMEBASE_FREQUENCY_MILLI_HZ, /**< Quite weird to see this, but that's the only way we can calculate periods for frequencies that are lower than 1 HZ */ +} timebase_frequency_t; + /** * @brief Initialisation structure */ @@ -179,6 +192,19 @@ timebase_error_t timebase_get_duration_now(const uint8_t id, uint16_t const * co */ void timebase_interrupt_callback(const uint8_t id); +/** + * @brief Computes a time period (in ticks) for a specific instance of Timebase, using the desired frequency parameter as + * the main input. + * + * @param[in] id : id of the targeted timebase instance (holds the information about its own timepace) + * @param[in] frequency : input absolute frequency to be converted into an amount of ticks from that timebase + * @param[out] period : output period calculated in ticks of this specific timebase instance + * * @return + * TIMEBASE_ERROR_OK : operation succeeded + * TIMEBASE_ERROR_INVALID_INDEX : given module id is out of bounds + */ +timebase_error_t timebase_compute_period_from_frequency(const uint8_t id, uint32_t const * const frequency, const timebase_frequency_t funit, uint16_t * const period); + /** * @brief Encodes the static configuration used by this module * Each slot of this array codes for a single timebase instance, based on a single individual hardware timer diff --git a/Modules/Timebase/src/timebase.c b/Modules/Timebase/src/timebase.c index 2e01aaf..1ffb0ad 100644 --- a/Modules/Timebase/src/timebase.c +++ b/Modules/Timebase/src/timebase.c @@ -368,6 +368,56 @@ void timebase_interrupt_callback(const uint8_t timebase_id) } } +timebase_error_t timebase_compute_period_from_frequency(const uint8_t id, uint32_t const * const frequency, const timebase_frequency_t funit, uint16_t * const period) +{ + uint32_t calculated_period = 0; + uint16_t multiplicator = 1; + if(TIMEBASE_FREQUENCY_MILLI_HZ == funit) + { + // Note, having this kind of multiplication happening at runtime is not performant at all, + // However, even for small avr chips it does not seem too bad (gcc quickly calls for __udivmodsi4, __mulis3, etc..) + // And it happens only at configuration time, it won't impede runtime performances + multiplicator = 1000U; + } + + switch(timebase_static_config[id].timescale) + { + // Timebase in seconds needs special handling because frequency parameter is in Hertz, + // So if we want to achieve lower frequencies than 1Hz, we need to use a different strategy + case TIMEBASE_TIMESCALE_SECONDS: + calculated_period = multiplicator * 1U / *frequency ; + break; + + case TIMEBASE_TIMESCALE_MILLISECONDS: + calculated_period = multiplicator * 1000U / *frequency; + break; + + case TIMEBASE_TIMESCALE_MICROSECONDS: + calculated_period = multiplicator * 1000000U / *frequency ; + break; + + case TIMEBASE_TIMESCALE_CUSTOM: + calculated_period = multiplicator * timebase_static_config[id].custom_target_freq / *frequency; + break; + + // Should never get there + case TIMEBASE_TIMESCALE_UNDEFINED: + default: + return TIMEBASE_ERROR_UNSUPPORTED_TIMESCALE; + } + + // If we reach 0, it means we cannot achieve the required frequency + if(calculated_period <= 1) + { + return TIMEBASE_ERROR_FREQUENCY_TOO_HIGH; + } + + *period = (uint16_t) calculated_period; + + return TIMEBASE_ERROR_OK; +} + + timebase_error_t timebase_deinit(const uint8_t id) { if (false == is_index_valid(id)) From e86269f3da6adebf176e4204cf08adb7791648b4 Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Fri, 29 Apr 2022 16:50:21 +0200 Subject: [PATCH 48/51] Added PWM event generation at the same time we are handling pin switching Signed-off-by: bebenlebricolo --- .gitignore | 3 +- Modules/Pwm/inc/pwm.h | 52 +++++++++++ Modules/Pwm/src/pwm.c | 210 +++++++++++++++++++++++++++++++++++++++--- 3 files changed, 253 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index acc847e..65aa3b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ [Bb]uild/ *.vscode/ *.vs/ -*.autosave* \ No newline at end of file +*.autosave* +*.code-workspace \ No newline at end of file diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index b908212..e91ec7b 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -105,6 +105,24 @@ typedef struct pwm_soft_static_config_t soft[PWM_MAX_SOFT_INSTANCES]; /**< Encodes the software static configuration */ } pwm_static_config_t; + +// ################################################################################################ +// ########################### Software based PWM event generation################################# +// ################################################################################################ + +typedef void (*pwm_soft_event_callback_t)(void); + +/** + * @brief Describes the various events supported by the software based PWM generation mode + */ +typedef enum +{ + PWM_SOFT_EVENT_RISING_EDGE, /**< Event is generated when PWM signal goes from low state to high state (rising edge) */ + PWM_SOFT_EVENT_FALLING_EDGE,/**< Event is generated when PWM signal goes from high state to low state (falling edge) */ + PWM_SOFT_EVENT_RESET, /**< Event is generated when a single PWM period is achieved (when the PWM resets) */ + PWM_SOFT_EVENT_TOGGLED, /**< Event is generated when PWM signal changes states (either Falling/Rising edge), covers the 3 above cases. */ +} pwm_soft_event_t; + /** * @brief Encodes the various kind of TOP value used by a hardware timer counter to set the resolution (impacts frequency as well) * They are essentially used by this PWM driver to configure Timer registers when configuring resolution and frequency. @@ -288,6 +306,40 @@ pwm_error_t pwm_get_actual_props(const uint8_t index, const pwm_type_t type, pwm */ pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const config, const uint32_t * clock_freq ); +/** + * @brief Configures a single event for the targeted software PWM + * + * @param[in] index : index of targeted software PWM as per configured in static configuration (@see pwm_config.soft) + * @param[in] callback : callback function which will be called when the event is reached + * @param[in] when : on what kind of event the callback should be registered + * @return pwm_error_t + * PWM_ERR_OK : operation succeeded + * PWM_ERROR_CONFIG : input do not make sense (probably and issue with the "when" parameter) + * PWM_ERROR_INDEX_OUT_OF_RANGE : targeted index is out of range + */ +pwm_error_t pwm_soft_register_event(const uint8_t index, const pwm_soft_event_callback_t callback, const pwm_soft_event_t when); + +/** + * @brief Pops a single event from a software pwm instance + * + * @param index : index of targeted software PWM as per configured in static configuration (@see pwm_config.soft) + * @param when : what kind of event should be cleared + * @return pwm_error_t + * PWM_ERR_OK : operation succeeded + * PWM_ERROR_INDEX_OUT_OF_RANGE : targeted index is out of range + * PWM_ERROR_CONFIG : input do not make sense (probably and issue with the "when" parameter) + */ +pwm_error_t pwm_soft_remove_event(const uint8_t index, const pwm_soft_event_t when); + +/** + * @brief Removes all events at once for a single software PWM instance + * + * @param index + * @return pwm_error_t + * PWM_ERR_OK : operation succeeded + * PWM_ERROR_INDEX_OUT_OF_RANGE : targeted index is out of range + */ +pwm_error_t pwm_soft_clear_all_events(const uint8_t index); // Static configuration for both software based and hardware based pwms extern pwm_static_config_t pwm_config; /** Static compile-time configuration used by this driver (needs to be implemented in config.c)*/ diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 7013db6..4e00161 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -24,13 +24,20 @@ */ static struct { - uint16_t period; /**< Gives the time period in ticks for a single software PWM */ - uint16_t switch_tick; /**< Used to implement duty cycle and events. */ - // The switch tick indicates when a pin has to change its state */ - uint16_t last_tick; /**< Holds the last tick retrieved from timebase module */ - uint16_t start_tick; /**< Holds the start tick of the current frame/period retrieved from timebase module */ - io_state_t state; /**< Records the current IO state, so that we can keep track of the duty cycle as well */ - bool started; /**< Records if a specific software pwm is started or not */ + uint16_t period; /**< Gives the time period in ticks for a single software PWM */ + uint16_t switch_tick; /**< Used to implement duty cycle and events. */ + // The switch tick indicates when a pin has to change its state */ + uint16_t last_tick; /**< Holds the last tick retrieved from timebase module */ + uint16_t start_tick; /**< Holds the start tick of the current frame/period retrieved from timebase module */ + io_state_t state; /**< Records the current IO state, so that we can keep track of the duty cycle as well */ + bool started; /**< Records if a specific software pwm is started or not */ + struct + { + pwm_soft_event_callback_t rising_edge; /**< Rising edge event */ + pwm_soft_event_callback_t falling_edge; /**< Falling edge event */ + pwm_soft_event_callback_t toggling; /**< Toggled pin event */ + pwm_soft_event_callback_t reset; /**< Counter reset event*/ + } events; } soft_config[PWM_MAX_SOFT_INSTANCES] = {0}; @@ -328,6 +335,7 @@ pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_pr } } + // Software based PWM else { pwm_soft_static_config_t * timer_config = &pwm_config.soft[index]; @@ -344,12 +352,22 @@ pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_pr { ret = PWM_ERROR_CONFIG; } + uint16_t period = 0; + + if(PWM_ERROR_OK == ret) + { + timberr = timebase_compute_period_from_frequency(timer_config->timebase_index, properties->frequency, TIMEBASE_FREQUENCY_HZ, &period); + if(TIMEBASE_ERROR_OK != timberr || false == timebase_initialised) + { + ret = PWM_ERROR_CONFIG; + } + } // Transaction with IO driver and Timebase Module are validated, we can now start to work with the registered pin. if (PWM_ERROR_OK == ret) { - soft_config[index].period = properties->frequency; - soft_config[index].switch_tick = properties->duty_cycle; + soft_config[index].period = period; + soft_config[index].switch_tick = (properties->duty_cycle * period) / 100U; } } @@ -1001,6 +1019,78 @@ pwm_error_t pwm_hard_config_complementary(pwm_hard_compl_config_t const * const return PWM_ERROR_NOT_IMPLEMENTED; } +static inline pwm_error_t process_soft_end_of_period(const uint8_t index) +{ + soft_config[index].start_tick = soft_config[index].last_tick; + + io_error_t ioerr = io_write(pwm_config.soft[index].io_index, pwm_config.soft[index].safe_state); + if(IO_ERROR_OK != ioerr) + { + return PWM_ERROR_IO_ISSUE; + } + + // Generate the reset event + if(NULL != soft_config[index].events.reset) + { + soft_config[index].events.reset(); + } + + // Call the toggling event as well (we're changing state !) + if(NULL != soft_config[index].events.toggling) + { + soft_config[index].events.toggling(); + } + + return PWM_ERROR_OK;; +} + +static inline pwm_error_t process_soft_toggling(const uint8_t index) +{ + pwm_error_t ret = PWM_ERROR_OK; + // If starting safe state matches last updated state, it means we are still on the 'left' part of the PWM cycle + // So we need to operate the transition + if(pwm_config.soft[index].safe_state == soft_config[index].state) + { + // Update last_tick + soft_config[index].start_tick = soft_config[index].last_tick; + io_error_t ioerr = IO_ERROR_OK; + if(IO_STATE_LOW == soft_config[index].state) + { + ioerr = io_write(pwm_config.soft[index].io_index, IO_STATE_HIGH); + + // Generate event + if(IO_ERROR_OK == ioerr && NULL != soft_config[index].events.rising_edge) + { + soft_config[index].events.rising_edge(); + } + } + else + { + ioerr = io_write(pwm_config.soft[index].io_index, IO_STATE_LOW); + + // Generate event + if(IO_ERROR_OK == ioerr && NULL != soft_config[index].events.falling_edge) + { + soft_config[index].events.falling_edge(); + } + } + + // Global IOError check + if(IO_ERROR_OK != ioerr) + { + ret = PWM_ERROR_IO_ISSUE; + } + else + { + // Call the toggling event as well (we're changing state !) + if(NULL != soft_config[index].events.toggling) + { + soft_config[index].events.toggling(); + } + } + } + return ret; +} pwm_error_t pwm_process(void) { @@ -1021,20 +1111,34 @@ pwm_error_t pwm_process(void) if (TIMEBASE_ERROR_OK != timberr) { ret = PWM_ERROR_TIMEBASE_ISSUE; - break; + continue; } timberr = timebase_get_duration(&soft_config[index].start_tick, &soft_config[index].last_tick, &duration); if (TIMEBASE_ERROR_OK != timberr) { ret = PWM_ERROR_TIMEBASE_ISSUE; - break; + continue; } + // We reached the end of the current period, it's time to start a new one ! + if(duration >= soft_config[index].period) + { + ret = process_soft_end_of_period(index); + continue; + } + // We are now in the 'right' part of the PWM, there's is probably some work to do ! + if(duration >= soft_config[index].switch_tick) + { + ret = process_soft_toggling(index); + continue; + } } } + // Because of the above code structure, a single error case in ret will be caught and brought back + // to calling layer for error handling return ret; } @@ -1048,3 +1152,87 @@ static inline bool index_valid(const uint8_t index, const pwm_type_t type) } return index < PWM_MAX_SOFT_INSTANCES; } + + +pwm_error_t pwm_soft_register_event(const uint8_t index, const pwm_soft_event_callback_t callback, const pwm_soft_event_t when) +{ + if(false == index_valid(index, PWM_TYPE_SOFTWARE)) + { + return PWM_ERROR_INDEX_OUT_OF_RANGE; + } + + pwm_error_t ret = PWM_ERROR_OK; + switch(when) + { + case PWM_SOFT_EVENT_FALLING_EDGE: + soft_config[index].events.falling_edge = callback; + break; + + case PWM_SOFT_EVENT_TOGGLED: + soft_config[index].events.toggling = callback; + break; + + case PWM_SOFT_EVENT_RESET: + soft_config[index].events.reset = callback; + break; + + case PWM_SOFT_EVENT_RISING_EDGE: + soft_config[index].events.rising_edge = callback; + break; + + default: + ret = PWM_ERROR_CONFIG; + break; + } + + return ret; +} + +pwm_error_t pwm_soft_remove_event(const uint8_t index, const pwm_soft_event_t when) +{ + if(false == index_valid(index, PWM_TYPE_SOFTWARE)) + { + return PWM_ERROR_INDEX_OUT_OF_RANGE; + } + + pwm_error_t ret = PWM_ERROR_OK; + switch(when) + { + case PWM_SOFT_EVENT_FALLING_EDGE: + soft_config[index].events.falling_edge = NULL; + break; + + case PWM_SOFT_EVENT_TOGGLED: + soft_config[index].events.toggling = NULL; + break; + + case PWM_SOFT_EVENT_RESET: + soft_config[index].events.reset = NULL; + break; + + case PWM_SOFT_EVENT_RISING_EDGE: + soft_config[index].events.rising_edge = NULL; + break; + + default: + ret = PWM_ERROR_CONFIG; + break; + } + + return ret; +} + +pwm_error_t pwm_soft_clear_all_events(const uint8_t index) +{ + if(false == index_valid(index, PWM_TYPE_SOFTWARE)) + { + return PWM_ERROR_INDEX_OUT_OF_RANGE; + } + + soft_config[index].events.falling_edge = NULL; + soft_config[index].events.rising_edge = NULL; + soft_config[index].events.toggling = NULL; + soft_config[index].events.reset = NULL; + + return PWM_ERROR_OK; +} From 2c5b4ce51e4bb3a3b2ffc977f93f62dedfe2e97b Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Fri, 26 Jan 2024 16:30:03 +0100 Subject: [PATCH 49/51] Updated CMake minimum required version to remove deprecation warning Signed-off-by: bebenlebricolo --- Drivers/Adc/CMakeLists.txt | 2 +- Drivers/Adc/Tests/CMakeLists.txt | 2 +- Drivers/CMakeLists.txt | 2 +- Drivers/I2c/CMakeLists.txt | 2 +- Drivers/I2c/Tests/CMakeLists.txt | 2 +- Drivers/Io/CMakeLists.txt | 2 +- Drivers/Io/Tests/CMakeLists.txt | 2 +- Drivers/Lcd_screen/CMakeLists.txt | 2 +- Drivers/Lcd_screen/Tests/CMakeLists.txt | 2 +- Drivers/Timers/CMakeLists.txt | 2 +- Drivers/Timers/Timer_16_bit/CMakeLists.txt | 2 +- Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt | 2 +- Drivers/Timers/Timer_8_bit/CMakeLists.txt | 2 +- Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt | 2 +- Drivers/Timers/Timer_8_bit_async/CMakeLists.txt | 2 +- Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt | 2 +- Drivers/Timers/Timer_generic/CMakeLists.txt | 2 +- Drivers/Timers/Timer_generic/Tests/CMakeLists.txt | 2 +- ExampleApp/src/driver_setup.c | 6 +++--- Modules/CMakeLists.txt | 2 +- Modules/Pwm/CMakeLists.txt | 2 +- Modules/Pwm/Tests/CMakeLists.txt | 2 +- Modules/Pwm/examples/CMakeLists.txt | 2 +- Modules/Pwm/src/pwm.c | 3 +-- Modules/Timebase/CMakeLists.txt | 2 +- Modules/Timebase/Tests/CMakeLists.txt | 2 +- Toolchain/avr8-gcc-toolchain.cmake | 2 +- 27 files changed, 29 insertions(+), 30 deletions(-) diff --git a/Drivers/Adc/CMakeLists.txt b/Drivers/Adc/CMakeLists.txt index 3d81bbd..532ea6d 100644 --- a/Drivers/Adc/CMakeLists.txt +++ b/Drivers/Adc/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) add_library(adc_driver STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/adc_stack.c diff --git a/Drivers/Adc/Tests/CMakeLists.txt b/Drivers/Adc/Tests/CMakeLists.txt index 109f76a..eacf3ea 100644 --- a/Drivers/Adc/Tests/CMakeLists.txt +++ b/Drivers/Adc/Tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) project(adc_tests) enable_testing() diff --git a/Drivers/CMakeLists.txt b/Drivers/CMakeLists.txt index 8da096f..243dd08 100644 --- a/Drivers/CMakeLists.txt +++ b/Drivers/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Adc) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Timers/Timer_8_bit) diff --git a/Drivers/I2c/CMakeLists.txt b/Drivers/I2c/CMakeLists.txt index 1519e48..f54fb8f 100644 --- a/Drivers/I2c/CMakeLists.txt +++ b/Drivers/I2c/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) # Stop here as we need an extra config.h file in order to build this driver # This file provides symbols for the driver to work properly diff --git a/Drivers/I2c/Tests/CMakeLists.txt b/Drivers/I2c/Tests/CMakeLists.txt index de53f94..67e197a 100644 --- a/Drivers/I2c/Tests/CMakeLists.txt +++ b/Drivers/I2c/Tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) project(i2c_tests) enable_testing() diff --git a/Drivers/Io/CMakeLists.txt b/Drivers/Io/CMakeLists.txt index 7374cd4..233587c 100644 --- a/Drivers/Io/CMakeLists.txt +++ b/Drivers/Io/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) add_library(io_driver STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/io.c diff --git a/Drivers/Io/Tests/CMakeLists.txt b/Drivers/Io/Tests/CMakeLists.txt index 56ad700..a22a9e4 100644 --- a/Drivers/Io/Tests/CMakeLists.txt +++ b/Drivers/Io/Tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) project(io_driver_tests) diff --git a/Drivers/Lcd_screen/CMakeLists.txt b/Drivers/Lcd_screen/CMakeLists.txt index f4caeea..fef8d66 100644 --- a/Drivers/Lcd_screen/CMakeLists.txt +++ b/Drivers/Lcd_screen/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) add_library(HD44780_lcd_driver STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/HD44780_lcd.c diff --git a/Drivers/Lcd_screen/Tests/CMakeLists.txt b/Drivers/Lcd_screen/Tests/CMakeLists.txt index 018a460..ae9c271 100644 --- a/Drivers/Lcd_screen/Tests/CMakeLists.txt +++ b/Drivers/Lcd_screen/Tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) project(HD44780_lcd) enable_testing() diff --git a/Drivers/Timers/CMakeLists.txt b/Drivers/Timers/CMakeLists.txt index af2a2d2..e73dac8 100644 --- a/Drivers/Timers/CMakeLists.txt +++ b/Drivers/Timers/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Timer_8_bit) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Timer_8_bit_async) diff --git a/Drivers/Timers/Timer_16_bit/CMakeLists.txt b/Drivers/Timers/Timer_16_bit/CMakeLists.txt index 2242eb1..bd81c12 100644 --- a/Drivers/Timers/Timer_16_bit/CMakeLists.txt +++ b/Drivers/Timers/Timer_16_bit/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) add_library(timer_16_bit_driver STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/timer_16_bit.c diff --git a/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt b/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt index 6dbb071..b0777b9 100644 --- a/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt +++ b/Drivers/Timers/Timer_16_bit/Tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) project(timer_16_bit_driver_test) enable_testing() diff --git a/Drivers/Timers/Timer_8_bit/CMakeLists.txt b/Drivers/Timers/Timer_8_bit/CMakeLists.txt index d6c6d91..e3c5075 100644 --- a/Drivers/Timers/Timer_8_bit/CMakeLists.txt +++ b/Drivers/Timers/Timer_8_bit/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) add_library(timer_8_bit_driver STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/timer_8_bit.c diff --git a/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt b/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt index c1012b2..d0a1f8d 100644 --- a/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt +++ b/Drivers/Timers/Timer_8_bit/Tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) project(timer_8_bit_driver_test) enable_testing() diff --git a/Drivers/Timers/Timer_8_bit_async/CMakeLists.txt b/Drivers/Timers/Timer_8_bit_async/CMakeLists.txt index 328a728..e10f826 100644 --- a/Drivers/Timers/Timer_8_bit_async/CMakeLists.txt +++ b/Drivers/Timers/Timer_8_bit_async/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) add_library(timer_8_bit_async_driver STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/timer_8_bit_async.c diff --git a/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt b/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt index 1b44fee..1ff5081 100644 --- a/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt +++ b/Drivers/Timers/Timer_8_bit_async/Tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) project(timer_8_bit_async_driver_test) enable_testing() diff --git a/Drivers/Timers/Timer_generic/CMakeLists.txt b/Drivers/Timers/Timer_generic/CMakeLists.txt index 1944968..f7bd755 100644 --- a/Drivers/Timers/Timer_generic/CMakeLists.txt +++ b/Drivers/Timers/Timer_generic/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) add_library(timer_generic_driver STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/timer_generic.c diff --git a/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt b/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt index 056b137..283f138 100644 --- a/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt +++ b/Drivers/Timers/Timer_generic/Tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) project(timer_generic_tests) enable_testing() diff --git a/ExampleApp/src/driver_setup.c b/ExampleApp/src/driver_setup.c index 56cf0de..1307c92 100644 --- a/ExampleApp/src/driver_setup.c +++ b/ExampleApp/src/driver_setup.c @@ -78,7 +78,7 @@ driver_setup_error_t driver_init_timer_0(void) /* Set original port state of OC0A/OC0B pins before any OCRx overrides them */ /* This is done in opposing polarities to respect mosfet push-pull driver pair starting point*/ OC0A_PORT_REG |= (1 << OC0A_PIN_NUMBER); - OC0B_PORT_REG &= ~(1 << OC0B_PIN_NUMBER); + //OC0B_PORT_REG &= ~(1 << OC0B_PIN_NUMBER); /* Configuring timer */ /* F_CPU = 16'000'000 Hz ; F_TIMER0 2'000'000 Hz*/ @@ -124,7 +124,7 @@ driver_setup_error_t driver_init_timer_1(void) /* Set original port state of OC0A/OC0B pins before any OCRx overrides them */ /* This is done in opposing polarities to respect mosfet push-pull driver pair starting point*/ OC1A_PORT_REG |= (1 << OC1A_PIN_NUMBER); // Pulled to Vcc (low side of mosfet driver pulls mosfet's gate to ground) - OC1B_PORT_REG &= ~(1 << OC1B_PIN_NUMBER); // Pulled to ground (high side of mosfet driver is depleted) + //OC1B_PORT_REG &= ~(1 << OC1B_PIN_NUMBER); // Pulled to ground (high side of mosfet driver is depleted) /* Configuring timer */ /* F_CPU = 16'000'000 Hz ; F_TIMER0 2'000'000 Hz*/ @@ -168,7 +168,7 @@ driver_setup_error_t driver_init_timer_2(void) /* Set original port state of OC0A/OC0B pins before any OCRx overrides them */ /* This is done in opposing polarities to respect mosfet push-pull driver pair starting point*/ OC2A_PORT_REG |= (1 << OC2A_PIN_NUMBER); - OC2B_PORT_REG &= ~(1 << OC2B_PIN_NUMBER); + //OC2B_PORT_REG &= ~(1 << OC2B_PIN_NUMBER); /* Configuring timer */ /* F_CPU = 16'000'000 Hz ; F_TIMER0 2'000'000 Hz*/ diff --git a/Modules/CMakeLists.txt b/Modules/CMakeLists.txt index 6ffd655..730afd6 100644 --- a/Modules/CMakeLists.txt +++ b/Modules/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Timebase) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Pwm) diff --git a/Modules/Pwm/CMakeLists.txt b/Modules/Pwm/CMakeLists.txt index 13a240d..f48760d 100644 --- a/Modules/Pwm/CMakeLists.txt +++ b/Modules/Pwm/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) ################################################################################################# ##################################### PWM driver library ######################################## diff --git a/Modules/Pwm/Tests/CMakeLists.txt b/Modules/Pwm/Tests/CMakeLists.txt index 9251dad..0975c21 100644 --- a/Modules/Pwm/Tests/CMakeLists.txt +++ b/Modules/Pwm/Tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) project(pwm_module_tests C CXX) diff --git a/Modules/Pwm/examples/CMakeLists.txt b/Modules/Pwm/examples/CMakeLists.txt index ad7b9cd..af95b13 100644 --- a/Modules/Pwm/examples/CMakeLists.txt +++ b/Modules/Pwm/examples/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) ################################################################################################# ##################################### PWM driver library ######################################## diff --git a/Modules/Pwm/src/pwm.c b/Modules/Pwm/src/pwm.c index 4e00161..fb80c36 100644 --- a/Modules/Pwm/src/pwm.c +++ b/Modules/Pwm/src/pwm.c @@ -356,7 +356,7 @@ pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_pr if(PWM_ERROR_OK == ret) { - timberr = timebase_compute_period_from_frequency(timer_config->timebase_index, properties->frequency, TIMEBASE_FREQUENCY_HZ, &period); + timberr = timebase_compute_period_from_frequency(timer_config->timebase_index, &properties->frequency, TIMEBASE_FREQUENCY_HZ, &period); if(TIMEBASE_ERROR_OK != timberr || false == timebase_initialised) { ret = PWM_ERROR_CONFIG; @@ -1095,7 +1095,6 @@ static inline pwm_error_t process_soft_toggling(const uint8_t index) pwm_error_t pwm_process(void) { pwm_error_t ret = PWM_ERROR_OK; - io_error_t ioerr = IO_ERROR_OK; timebase_error_t timberr = TIMEBASE_ERROR_OK; uint16_t duration = 0; uint8_t timebase_index = 0; diff --git a/Modules/Timebase/CMakeLists.txt b/Modules/Timebase/CMakeLists.txt index 0516c95..baad836 100644 --- a/Modules/Timebase/CMakeLists.txt +++ b/Modules/Timebase/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) add_library(timebase_module STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/timebase.c diff --git a/Modules/Timebase/Tests/CMakeLists.txt b/Modules/Timebase/Tests/CMakeLists.txt index ce42aa1..61f002c 100644 --- a/Modules/Timebase/Tests/CMakeLists.txt +++ b/Modules/Timebase/Tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.20) project(timebase_module_tests) enable_testing() diff --git a/Toolchain/avr8-gcc-toolchain.cmake b/Toolchain/avr8-gcc-toolchain.cmake index 4ea9928..c75a243 100644 --- a/Toolchain/avr8-gcc-toolchain.cmake +++ b/Toolchain/avr8-gcc-toolchain.cmake @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.20) # see CMAKE_SYSTEM_NAME for cross compiling and Cmake system version if(WIN32 AND NOT CMAKE_GENERATOR STREQUAL "Unix Makefiles") From 3ccbfa23416c13732b8d3451a0da63dbe72fe33c Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Sun, 10 Mar 2024 12:48:37 +0100 Subject: [PATCH 50/51] Backup : publishing left-overs Signed-off-by: bebenlebricolo --- Modules/Pwm/Tests/pwm_tests.cpp | 22 +++++++++++----------- Modules/Pwm/inc/pwm.h | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Modules/Pwm/Tests/pwm_tests.cpp b/Modules/Pwm/Tests/pwm_tests.cpp index 1a34936..394c150 100644 --- a/Modules/Pwm/Tests/pwm_tests.cpp +++ b/Modules/Pwm/Tests/pwm_tests.cpp @@ -82,7 +82,7 @@ class PwmModule16BitTimerTestSuite : public ::testing::Test TEST_F(PwmModuleTestSuite, test_single_hard_config) { - // Rewritting parts of pwm_config + // Rewriting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_8_BIT; pwm_config.hard[0].timer_index = 0U; pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; @@ -102,7 +102,7 @@ TEST_F(PwmModuleTestSuite, test_single_hard_config) TEST_F(PwmModuleTestSuite, test_single_soft_init) { - // Rewritting parts of pwm_config + // Rewriting parts of pwm_config pwm_config.soft[0].io_index = 0U; pwm_config.soft[0].timebase_index = 0U; @@ -131,7 +131,7 @@ TEST_F(PwmModuleTestSuite, test_single_soft_init) TEST_F(PwmModuleTestSuite, single_8_bit_pwm_hard_configuration_waveforms) { - // Rewritting parts of pwm_config + // Rewriting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_8_BIT; pwm_config.hard[0].timer_index = 0U; pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; @@ -201,7 +201,7 @@ TEST_F(PwmModuleTestSuite, single_8_bit_pwm_hard_configuration_waveforms) TEST_F(PwmModuleTestSuite, single_8_bit_async_pwm_hard_configuration) { - // Rewritting parts of pwm_config + // Rewriting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_8_BIT_ASYNC; pwm_config.hard[0].timer_index = 0U; pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; @@ -271,7 +271,7 @@ TEST_F(PwmModuleTestSuite, single_8_bit_async_pwm_hard_configuration) TEST_F(PwmModuleTestSuite, single_16_bit_pwm_hard_configuration) { - // Rewritting parts of pwm_config + // Rewriting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_16_BIT; pwm_config.hard[0].timer_index = 0U; pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; @@ -359,7 +359,7 @@ TEST_F(PwmModuleTestSuite, single_16_bit_pwm_hard_configuration) TEST_F(PwmModule8BitTimerTestSuite, unit_a_behavioral_testing) { - // Rewritting parts of pwm_config + // Rewriting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_8_BIT; pwm_config.hard[0].timer_index = 0U; pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; @@ -463,7 +463,7 @@ TEST_F(PwmModule8BitTimerTestSuite, unit_a_behavioral_testing) TEST_F(PwmModule8BitTimerTestSuite, unit_b_behavioral_testing) { - // Rewritting parts of pwm_config + // Rewriting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_8_BIT; pwm_config.hard[0].timer_index = 0U; pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_B; @@ -581,7 +581,7 @@ TEST_F(PwmModule8BitTimerTestSuite, unit_b_behavioral_testing) TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_a_behavioral_testing) { - // Rewritting parts of pwm_config + // Rewriting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_8_BIT_ASYNC; pwm_config.hard[0].timer_index = 0U; pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; @@ -685,7 +685,7 @@ TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_a_behavioral_testing) TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_b_behavioral_testing) { - // Rewritting parts of pwm_config + // Rewriting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_8_BIT_ASYNC; pwm_config.hard[0].timer_index = 0U; pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_B; @@ -803,7 +803,7 @@ TEST_F(PwmModule8BitAsyncTimerTestSuite, unit_b_behavioral_testing) TEST_F(PwmModule16BitTimerTestSuite, unit_a_behavioral_testing) { - // Rewritting parts of pwm_config + // Rewriting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_16_BIT; pwm_config.hard[0].timer_index = 0U; pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_A; @@ -998,7 +998,7 @@ TEST_F(PwmModule16BitTimerTestSuite, unit_a_behavioral_testing) TEST_F(PwmModule16BitTimerTestSuite, unit_b_behavioral_testing) { - // Rewritting parts of pwm_config + // Rewriting parts of pwm_config pwm_config.hard[0].arch = TIMER_ARCH_16_BIT; pwm_config.hard[0].timer_index = 0U; pwm_config.hard[0].unit = PWM_HARD_TIMER_UNIT_B; diff --git a/Modules/Pwm/inc/pwm.h b/Modules/Pwm/inc/pwm.h index e91ec7b..2553613 100644 --- a/Modules/Pwm/inc/pwm.h +++ b/Modules/Pwm/inc/pwm.h @@ -291,7 +291,7 @@ pwm_error_t pwm_config_single(const uint8_t index, const pwm_type_t type, pwm_pr * @param[out] properties * @return pwm_error_t */ -pwm_error_t pwm_get_actual_props(const uint8_t index, const pwm_type_t type, pwm_props_t * const properties, const uint32_t * clock_freq); +pwm_error_t pwm_probe_config(const uint8_t index, const pwm_type_t type, pwm_props_t * const properties, const uint32_t * clock_freq); /** * @brief Configures a particular timer to output complementary PWM with dead time generation. From 073ec9541fa42d8d642f52fffbc2337592b1b70f Mon Sep 17 00:00:00 2001 From: bebenlebricolo Date: Sun, 10 Mar 2024 13:05:46 +0100 Subject: [PATCH 51/51] Updated toolchain to match C23 pre-spec (removed -pedantic to support #warnings) Signed-off-by: bebenlebricolo --- Toolchain/avr8-gcc-toolchain.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Toolchain/avr8-gcc-toolchain.cmake b/Toolchain/avr8-gcc-toolchain.cmake index c75a243..aaf2643 100644 --- a/Toolchain/avr8-gcc-toolchain.cmake +++ b/Toolchain/avr8-gcc-toolchain.cmake @@ -142,10 +142,10 @@ endif( NOT ( (CMAKE_BUILD_TYPE MATCHES Release) OR -Wextra \ -Wno-main \ -Wundef \ - -pedantic \ -Wstrict-prototypes \ -Werror \ -Wfatal-errors ") + #-pedantic \ -> Disabled for now as it prevents using the #warning preproc macros. It can be added back when the C23 standard is out and supported by toolchains ! set(COMPILER_LINKER_FORWARD_OPTIONS "-Wl,--gc-sections -Wl,--relax") set(FULL_OPTIONS "${COMPILE_OPTIONS} ${COMPILER_WARNINGS} ${COMPILER_LINKER_FORWARD_OPTIONS}")

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