diff --git a/Controllers/CDebugController.cpp b/Controllers/CDebugController.cpp index e226d620..e5057fcf 100644 --- a/Controllers/CDebugController.cpp +++ b/Controllers/CDebugController.cpp @@ -10,13 +10,18 @@ */ #include "CDebugController.h" +#include "../etl/to_string.h" -CDebugController::CDebugController(etl::string name, +CDebugController::CDebugController(IHardwareMap *p_hardware_map, + etl::string name, uint32_t run_period_ms) : CController(name, run_period_ms), - m_breather_light(BREATHING_GPIO_Port, BREATHING_Pin) + mp_hw(p_hardware_map) { - // TODO Auto-generated constructor stub + if (mp_hw == nullptr) + { + Error_Handler(); + } } CDebugController::~CDebugController() @@ -26,14 +31,114 @@ CDebugController::~CDebugController() void CDebugController::run() { - m_breather_light.toggle(); + static float breathing_light_intensity = 0; + mp_hw->setBreathingLight(breathing_light_intensity); + breathing_light_intensity = breathing_light_intensity ? 0 : 100; } bool CDebugController::newCommand(ICommand *p_command, IComChannel *p_comchannel) { - return CController::newCommand(p_command, - p_comchannel); // todo: temporary plug + bool b_command_recognised = false; + ICommand::command_error_code_t error_code; + /** + * Set mains power output. + * + * mains(channel, power); + */ + if (p_command->getName()->compare("mains") == 0) + { + error_code = setMainsPower(p_command); + b_command_recognised = true; + } + else if (p_command->getName()->compare("?mains") == 0) + { + float mains_power; + error_code = getMainsPower(p_command, &mains_power); + if (error_code == ICommand::COMMAND_OK) + { + CController::s_scratch_pad = "Mains channel "; + etl::to_string((*p_command)[0], + CController::s_scratch_pad, + etl::format_spec(), + true); + CController::s_scratch_pad += ": "; + etl::to_string(mains_power, + CController::s_scratch_pad, + etl::format_spec().precision(2), + true); + p_comchannel->send(CController::s_scratch_pad); + } + b_command_recognised = true; + } + if (b_command_recognised) + { + sendResultMessage(error_code, p_comchannel); + } + return (b_command_recognised); } void CDebugController::reset() {} + +ICommand::command_error_code_t CDebugController::setMainsPower( + ICommand *p_command) +{ + uint8_t mains_channel; + float mains_power; + // extract arguments from command. + if (p_command->getArgumentCount() == 1) + { + mains_channel = 0; + mains_power = (*p_command)[0]; + } + else if (p_command->getArgumentCount() == 2) + { + mains_channel = (uint8_t)(*p_command)[0]; + if (mains_channel != (*p_command)[0]) + { + return (ICommand::ERROR_TYPE_MISMATCH); + } + mains_power = (*p_command)[1]; + } + else + { + return (ICommand::ERROR_ARG_COUNT); + } + // range check arguments. + if ((mains_channel > 2) || (mains_power < 0) || (mains_power > 100)) + { + return (ICommand::ERROR_OUT_OF_BOUNDS); + } + // set channels to requested power + if (mains_channel) + { + mp_hw->setMainsPwm(mains_channel, mains_power); + } + else + { + mp_hw->setMainsPwm(1, mains_power); + mp_hw->setMainsPwm(2, mains_power); + } + return (ICommand::COMMAND_OK); +} + +ICommand::command_error_code_t CDebugController::getMainsPower( + ICommand *p_command, + float *power) +{ + *power = 0; + if (p_command->getArgumentCount() != 1) + { + return (ICommand::ERROR_ARG_COUNT); + } + else if (((*p_command)[0] != 1) && ((*p_command)[0] != 2)) + { + return (ICommand::ERROR_OUT_OF_BOUNDS); + } + else + { + uint8_t channel = (*p_command)[0]; + *power = m_mains_power[channel]; + } + return (ICommand::COMMAND_OK); +} diff --git a/Controllers/CDebugController.h b/Controllers/CDebugController.h index 31983221..e876e8ee 100644 --- a/Controllers/CDebugController.h +++ b/Controllers/CDebugController.h @@ -15,12 +15,15 @@ #include "../etl/string.h" #include "CController.h" #include "CGpioWrapper.h" +#include "IHardwareMap.h" #include "main.h" class CDebugController : public CController { public: - CDebugController(etl::string name, uint32_t run_period_ms); + CDebugController(IHardwareMap *p_hardware_map, + etl::string name, + uint32_t run_period_ms); virtual ~CDebugController(); virtual void run(); @@ -28,7 +31,13 @@ class CDebugController : public CController virtual void reset(); private: - CGpioWrapper m_breather_light; + ICommand::command_error_code_t setMainsPower(ICommand *p_command); + + ICommand::command_error_code_t getMainsPower(ICommand *p_command, + float *power); + + IHardwareMap *mp_hw; + float m_mains_power[2]; }; #endif /* CDEBUGCONTROLLER_H_ */ diff --git a/Controllers/CTemperatureController.cpp b/Controllers/CTemperatureController.cpp index 1fd39c4d..b4388d17 100644 --- a/Controllers/CTemperatureController.cpp +++ b/Controllers/CTemperatureController.cpp @@ -109,23 +109,7 @@ bool CTemperatureController::newCommand(ICommand *p_command, } if (b_command_recognised) { - switch (result) - { - case ICommand::COMMAND_OK: - // p_comchannel->send("OK.\n"); - break; - case ICommand::ERROR_ARG_COUNT: - p_comchannel->send("Wrong number of arguments.\n"); - break; - case ICommand::ERROR_OUT_OF_BOUNDS: - p_comchannel->send("Argument out of bounds.\n"); - break; - case ICommand::ERROR_TYPE_MISMATCH: - p_comchannel->send("Argument type mismatch.\n"); - break; - default: - p_comchannel->send("Non-specific error with the command."); - } + sendResultMessage(result, p_comchannel); } return b_command_recognised; } diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 07365e68..ae250a6d 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -59,10 +59,12 @@ void Error_Handler(void); /* Private defines -----------------------------------------------------------*/ #define BUTTON_Pin GPIO_PIN_13 #define BUTTON_GPIO_Port GPIOC +#define BUTTON_EXTI_IRQn EXTI15_10_IRQn #define PWR_EN_Pin GPIO_PIN_14 #define PWR_EN_GPIO_Port GPIOC #define MAINS_ZERO_Pin GPIO_PIN_15 #define MAINS_ZERO_GPIO_Port GPIOC +#define MAINS_ZERO_EXTI_IRQn EXTI15_10_IRQn #define TEMPERATURE_8_Pin GPIO_PIN_0 #define TEMPERATURE_8_GPIO_Port GPIOC #define EVAPORATOR_T_Pin GPIO_PIN_1 diff --git a/Core/Inc/stm32f4xx_it.h b/Core/Inc/stm32f4xx_it.h index deb0aa40..8eb26977 100644 --- a/Core/Inc/stm32f4xx_it.h +++ b/Core/Inc/stm32f4xx_it.h @@ -57,6 +57,7 @@ void PendSV_Handler(void); void SysTick_Handler(void); void USART1_IRQHandler(void); void USART2_IRQHandler(void); +void EXTI15_10_IRQHandler(void); void DMA2_Stream0_IRQHandler(void); /* USER CODE BEGIN EFP */ diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 0a25f750..b701fe9e 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -63,11 +63,11 @@ void MX_GPIO_Init(void) /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(ENABLE_5_GPIO_Port, ENABLE_5_Pin, GPIO_PIN_RESET); - /*Configure GPIO pins : PCPin PCPin */ - GPIO_InitStruct.Pin = BUTTON_Pin|MAINS_ZERO_Pin; + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = BUTTON_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + HAL_GPIO_Init(BUTTON_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : PCPin PCPin PCPin PCPin */ GPIO_InitStruct.Pin = PWR_EN_Pin|ENABLE_2_Pin|ENABLE_3_Pin|ENABLE_4_Pin; @@ -76,6 +76,12 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = MAINS_ZERO_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(MAINS_ZERO_GPIO_Port, &GPIO_InitStruct); + /*Configure GPIO pins : PBPin PBPin PBPin PBPin */ GPIO_InitStruct.Pin = ENABLE_7_Pin|SPI2_NSS2_Pin|ENABLE_6_Pin|USART1_DE_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; @@ -97,6 +103,10 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(ENABLE_5_GPIO_Port, &GPIO_InitStruct); + /* EXTI interrupt init*/ + HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); + } /* USER CODE BEGIN 2 */ diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c index 4aae7358..1de72071 100644 --- a/Core/Src/stm32f4xx_it.c +++ b/Core/Src/stm32f4xx_it.c @@ -228,6 +228,21 @@ void USART2_IRQHandler(void) /* USER CODE END USART2_IRQn 1 */ } +/** + * @brief This function handles EXTI line[15:10] interrupts. + */ +void EXTI15_10_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI15_10_IRQn 0 */ + + /* USER CODE END EXTI15_10_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(BUTTON_Pin); + HAL_GPIO_EXTI_IRQHandler(MAINS_ZERO_Pin); + /* USER CODE BEGIN EXTI15_10_IRQn 1 */ + + /* USER CODE END EXTI15_10_IRQn 1 */ +} + /** * @brief This function handles DMA2 stream0 global interrupt. */ diff --git a/Core/Src/tim.c b/Core/Src/tim.c index 13e2372c..32bb9f80 100644 --- a/Core/Src/tim.c +++ b/Core/Src/tim.c @@ -257,9 +257,9 @@ void MX_TIM10_Init(void) /* USER CODE END TIM10_Init 1 */ htim10.Instance = TIM10; - htim10.Init.Prescaler = 0; + htim10.Init.Prescaler = 19999; htim10.Init.CounterMode = TIM_COUNTERMODE_UP; - htim10.Init.Period = 65535; + htim10.Init.Period = 99; htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim10) != HAL_OK) @@ -270,8 +270,12 @@ void MX_TIM10_Init(void) { Error_Handler(); } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 0; + if (HAL_TIM_OnePulse_Init(&htim10, TIM_OPMODE_SINGLE) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM2; + sConfigOC.Pulse = 99; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) @@ -298,9 +302,9 @@ void MX_TIM11_Init(void) /* USER CODE END TIM11_Init 1 */ htim11.Instance = TIM11; - htim11.Init.Prescaler = 0; + htim11.Init.Prescaler = 19999; htim11.Init.CounterMode = TIM_COUNTERMODE_UP; - htim11.Init.Period = 65535; + htim11.Init.Period = 99; htim11.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim11.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim11) != HAL_OK) @@ -311,8 +315,12 @@ void MX_TIM11_Init(void) { Error_Handler(); } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 0; + if (HAL_TIM_OnePulse_Init(&htim11, TIM_OPMODE_SINGLE) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM2; + sConfigOC.Pulse = 99; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim11, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) diff --git a/Hardware/CMockHardwareMap.cpp b/Hardware/CMockHardwareMap.cpp index 9d17f32f..247dbcda 100644 --- a/Hardware/CMockHardwareMap.cpp +++ b/Hardware/CMockHardwareMap.cpp @@ -115,6 +115,43 @@ void CMockHardwareMap::enableControlPower(bool b_enable) mb_power_enable = b_enable; } +void CMockHardwareMap::setMainsPwm(uint8_t channel, float power) +{ + if (power < 0) + { + power = 0; + } + if (power > 100) + { + power = 100; + } + if (channel > 2) + { + return; + } + else if (channel == 0) + { + m_mains_pwm[0] = power; + m_mains_pwm[1] = power; + } + else + { + m_mains_pwm[channel - 1] = power; + } +} + +float CMockHardwareMap::getMainsPwm(uint8_t channel) +{ + if (channel > 2) + { + return 0; + } + else + { + return (m_mains_pwm[channel - 1]); + } +} + void CMockHardwareMap::run() { float total_radiator_flow = 0; diff --git a/Hardware/CMockHardwareMap.h b/Hardware/CMockHardwareMap.h index d280619b..9f9fd7d8 100644 --- a/Hardware/CMockHardwareMap.h +++ b/Hardware/CMockHardwareMap.h @@ -34,6 +34,9 @@ class CMockHardwareMap : public IHardwareMap, public CController #endif virtual void setBreathingLight(float duty_cycle); virtual void enableControlPower(bool b_enable); + virtual void setMainsPwm(uint8_t channel, float power); + virtual float getMainsPwm(uint8_t channel); + /* CController methods. */ // etl::string getName() const; // virtual bool tick(uint32_t current_time); @@ -65,6 +68,7 @@ class CMockHardwareMap : public IHardwareMap, public CController float m_incubator_capacity; // heat capacity of incubator float m_incubator_loss; // rate of heat loss to ambient air. float m_control_current; // total current flowing through the heaters. + float m_mains_pwm[2]; }; #endif /* CMOCKHARDWAREMAP_H_ */ diff --git a/Hardware/CRealHardwareMap.cpp b/Hardware/CRealHardwareMap.cpp index 4a16f8bf..9cd9deb8 100644 --- a/Hardware/CRealHardwareMap.cpp +++ b/Hardware/CRealHardwareMap.cpp @@ -33,6 +33,10 @@ #define AD22100_SCALE ((V_REF / 5.0) * (1 / 22.5E-3)) #define AD22100_OFFSET ((V_REF / 5.0) * (-1.375 / 22.5E-3)) +#define MAINS_FREQUENCY 50 // frequency of the mains power supply in [Hz] +#define MAINS_HALF_PERIOD_MS \ + (1000 / MAINS_FREQUENCY) // duration of mains half period in [ms] + const CRealHardwareMap::timer_init_map_t CRealHardwareMap::s_timer_init_map[] = {{&htim1, TIM_CHANNEL_1}, {&htim4, TIM_CHANNEL_1}, @@ -53,6 +57,11 @@ const CRealHardwareMap::gpio_init_map_t CRealHardwareMap::s_gpio_init_map[] = { {PWM_7_GPIO_Port, PWM_7_Pin}, {PWM_8_GPIO_Port, PWM_8_Pin}}; +// correction factors table. Index corresponds to a fraction of half period when +// TRIAC is on. Full half period is 10. +const float CRealHardwareMap::s_mains_correction_table[] = + {0, 2, 9, 22, 40, 60, 78, 91, 98, 100}; + CRealHardwareMap::CRealHardwareMap() : m_adc(&hadc1) { // TODO Auto-generated constructor stub @@ -167,3 +176,102 @@ void CRealHardwareMap::enableControlPower(bool b_enable) { m_power_enable.set(b_enable); } + +void CRealHardwareMap::setMainsPwm(uint8_t channel, float power) +{ + // TODO: + // 1. Sanitise inputs. + // 2. Convert power from percentage to PWM duty cycle. + // 3. Set appropriate Timer CCR. + TIM_HandleTypeDef *p_timer; + switch (channel) + { + case 1: + p_timer = &htim10; + break; + case 2: + p_timer = &htim11; + break; + default: + // Channel is wrong, so bounce out without changing anything. + return; + } + if (power < 0) + { + power = 0; + } + if (power > 100) + { + power = 100; + } + uint16_t ccr = p_timer->Instance->ARR * mainsPowerCorrection(power) / 100; + p_timer->Instance->CCR1 = ccr; +} + +float CRealHardwareMap::getMainsPwm(uint8_t channel) +{ + TIM_HandleTypeDef *p_timer; + switch (channel) + { + case 1: + p_timer = &htim10; + break; + case 2: + p_timer = &htim11; + break; + default: + // Channel is wrong, so bounce out without changing anything. + return 0; + } + float power; + power = p_timer->Instance->CCR1 * 100 / p_timer->Instance->ARR; + return power; +} + +/** + * @brief Correct inherent non-linearity of the mains PWM. + * + * @param power Required power output. Value must be between 0 and 100; + * @return Fraction of half-period that TRIAC should be on. + */ +float CRealHardwareMap::mainsPowerCorrection(float power) const +{ + // Sanitise and handle special cases. + if (power <= 0) return 0; + if (power >= 100) return 1; + uint32_t index = 0; + float mains_factor; // fraction of half-period to switch on + // Find highest power point in the table that's below target power. + while (power > s_mains_correction_table[index]) + { + index++; + } + // Perform linear approximation between this and next power point. + power -= s_mains_correction_table[index]; + mains_factor = power / (s_mains_correction_table[index + 1] - + s_mains_correction_table[index]); + mains_factor += index; + mains_factor /= MAINS_CORRECTION_POINTS; + return mains_factor; +} + +extern "C" +{ + /* GPIO EXTI Callback is called whenever an interrupt event occurs on + * EXTI pins. To speed up execution the processing of this interrupt is + * done directly in the callback instead of calling hardware map + * methods. + */ + void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) + { + if (GPIO_Pin == BUTTON_Pin) + { + // TODO: whatever needs to be called to handle the button press. + } + else if (GPIO_Pin == MAINS_ZERO_Pin) + { + HAL_TIM_OnePulse_Start(&htim10, TIM_CHANNEL_1); + HAL_TIM_OnePulse_Start(&htim11, TIM_CHANNEL_1); + } + } +} diff --git a/Hardware/CRealHardwareMap.h b/Hardware/CRealHardwareMap.h index 75856b15..fa8ae8ae 100644 --- a/Hardware/CRealHardwareMap.h +++ b/Hardware/CRealHardwareMap.h @@ -22,6 +22,8 @@ # include "CSoftPwmOutput.h" #endif +#define MAINS_CORRECTION_POINTS 10 + class CRealHardwareMap : public IHardwareMap { public: @@ -40,8 +42,12 @@ class CRealHardwareMap : public IHardwareMap #endif virtual void setBreathingLight(float duty_cycle); virtual void enableControlPower(bool b_enable); + virtual void setMainsPwm(uint8_t channel, float power); + virtual float getMainsPwm(uint8_t channel); private: + float mainsPowerCorrection(float power) const; + typedef struct TIMER_INIT_MAP_T { TIM_HandleTypeDef *p_timer; @@ -55,6 +61,7 @@ class CRealHardwareMap : public IHardwareMap static const timer_init_map_t s_timer_init_map[HARD_PWM_OUTPUTS]; static const gpio_init_map_t s_gpio_init_map[HARD_PWM_OUTPUTS]; + static const float s_mains_correction_table[MAINS_CORRECTION_POINTS]; CAdcData m_adc; CHardPwmOutput m_hard_pwm_output[HARD_PWM_OUTPUTS]; CGpioWrapper m_polarity_switch[HARD_PWM_OUTPUTS]; diff --git a/Hardware/IHardwareMap.h b/Hardware/IHardwareMap.h index e2675438..3d34736b 100644 --- a/Hardware/IHardwareMap.h +++ b/Hardware/IHardwareMap.h @@ -19,7 +19,7 @@ /** * @note Declare this value to the number of soft PWM outputs that are needed. */ -//#define SOFT_PWM_OUTPUTS 0 +// #define SOFT_PWM_OUTPUTS 0 class IHardwareMap { @@ -117,6 +117,20 @@ class IHardwareMap * @param b_enable Set to true to enable, false to disable. */ virtual void enableControlPower(bool b_enable) = 0; + /** + * @brief Set power of the mains PWM controlled output. + * + * @param channel Number of the channel. + * @param power Value between 0% and 100%. + */ + virtual void setMainsPwm(uint8_t channel, float power) = 0; + /** + * @brief Get power of the mains PWM controlled output. + * + * @param channel Number of the channel. + * @return PWM power in percentage of duty cycle. + */ + virtual float getMainsPwm(uint8_t channel) = 0; }; #endif /* IHARDWAREMAP_H_ */ diff --git a/Lib/Inc/CController.h b/Lib/Inc/CController.h index e847e627..1d93145e 100644 --- a/Lib/Inc/CController.h +++ b/Lib/Inc/CController.h @@ -37,8 +37,14 @@ class CController virtual uint32_t getRunCalls() const; virtual void resetRunCalls(); #endif + virtual void sendResultMessage(ICommand::command_error_code_t error_code, + IComChannel *p_comchannel); protected: + // This variable is for generation and storage of temporary messages, e.g. + // command replies. + static etl::string s_scratch_pad; + etl::string const m_name; uint32_t m_run_period_ms; bool mb_stopped; diff --git a/Lib/Src/CController.cpp b/Lib/Src/CController.cpp index 0070d9a9..6fcfb9fe 100644 --- a/Lib/Src/CController.cpp +++ b/Lib/Src/CController.cpp @@ -12,6 +12,8 @@ #include "CController.h" +etl::string CController::s_scratch_pad = ""; + /** * @brief Create controller base class. * @@ -109,6 +111,33 @@ void CController::start() mb_stopped = false; } +/** + * @brief Send message according to the generated error code. + * + * @param error_code Error code for which the message needs to be generated. + */ +void CController::sendResultMessage(ICommand::command_error_code_t error_code, + IComChannel *p_comchannel) +{ + switch (error_code) + { + case ICommand::COMMAND_OK: + // p_comchannel->send("OK.\n"); + break; + case ICommand::ERROR_ARG_COUNT: + p_comchannel->send("Wrong number of arguments.\n"); + break; + case ICommand::ERROR_OUT_OF_BOUNDS: + p_comchannel->send("Argument out of bounds.\n"); + break; + case ICommand::ERROR_TYPE_MISMATCH: + p_comchannel->send("Argument type mismatch.\n"); + break; + default: + p_comchannel->send("Non-specific error with the command."); + } +} + #ifdef COLLECT_STATS /** * @brief Get number of calls to run() method. diff --git a/Lib/Src/cpp_link.cpp b/Lib/Src/cpp_link.cpp index 249f6692..a2bc5737 100644 --- a/Lib/Src/cpp_link.cpp +++ b/Lib/Src/cpp_link.cpp @@ -56,7 +56,7 @@ CRealHardwareMap g_hardware_map; * unlikely to cause any issues with clock starvation. For choices of prime * numbers to use see prime_numbers.txt file. */ -CDebugController g_debug_controller("debug", 97); +CDebugController g_debug_controller(&g_hardware_map, "debug", 97); CTemperatureController g_temp_controller(&g_hardware_map, "temperature", 89); #ifdef __cplusplus diff --git a/Multichannel temperature sensor.ioc b/Multichannel temperature sensor.ioc index 0ac350fe..929a497d 100644 --- a/Multichannel temperature sensor.ioc +++ b/Multichannel temperature sensor.ioc @@ -127,31 +127,34 @@ Mcu.Pin49=PB9 Mcu.Pin5=PC0 Mcu.Pin50=VP_SYS_VS_Systick Mcu.Pin51=VP_TIM10_VS_ClockSourceINT -Mcu.Pin52=VP_TIM11_VS_ClockSourceINT +Mcu.Pin52=VP_TIM10_VS_OPM +Mcu.Pin53=VP_TIM11_VS_ClockSourceINT +Mcu.Pin54=VP_TIM11_VS_OPM Mcu.Pin6=PC1 Mcu.Pin7=PC2 Mcu.Pin8=PC3 Mcu.Pin9=PA0-WKUP -Mcu.PinsNb=53 +Mcu.PinsNb=55 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F411RETx MxCube.Version=6.5.0 MxDb.Version=DB.6.0.50 -NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.DMA2_Stream0_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true -NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.EXTI15_10_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.ForceEnableDMAVector=true -NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true -NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true -NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true -NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 -NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true -NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.USART2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true -NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false PA0-WKUP.GPIOParameters=GPIO_Label PA0-WKUP.GPIO_Label=TEMPERATURE_1 PA0-WKUP.Locked=true @@ -293,8 +296,9 @@ PC14-OSC32_IN.GPIOParameters=GPIO_Label PC14-OSC32_IN.GPIO_Label=PWR_EN PC14-OSC32_IN.Locked=true PC14-OSC32_IN.Signal=GPIO_Output -PC15-OSC32_OUT.GPIOParameters=GPIO_Label +PC15-OSC32_OUT.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI PC15-OSC32_OUT.GPIO_Label=MAINS_ZERO +PC15-OSC32_OUT.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING PC15-OSC32_OUT.Locked=true PC15-OSC32_OUT.Signal=GPXTI15 PC2.GPIOParameters=GPIO_Label @@ -455,9 +459,10 @@ SH.S_TIM4_CH1.0=TIM4_CH1,PWM Generation1 CH1 SH.S_TIM4_CH1.ConfNb=1 SH.S_TIM4_CH2.0=TIM4_CH2,PWM Generation2 CH2 SH.S_TIM4_CH2.ConfNb=1 +SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2 SPI2.CalculateBaudRate=25.0 MBits/s SPI2.Direction=SPI_DIRECTION_2LINES -SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS,BaudRatePrescaler SPI2.Mode=SPI_MODE_MASTER SPI2.VirtualNSS=VM_NSSHARD SPI2.VirtualType=VM_MASTER @@ -467,9 +472,18 @@ TIM1.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation4 CH4,Presca TIM1.Period=5000-1 TIM1.Prescaler=2-1 TIM10.Channel=TIM_CHANNEL_1 -TIM10.IPParameters=Channel +TIM10.IPParameters=Channel,Prescaler,Period,OCMode_PWM,Pulse +TIM10.OCMode_PWM=TIM_OCMODE_PWM2 +TIM10.Period=99 +TIM10.Prescaler=19999 +TIM10.Pulse=99 TIM11.Channel=TIM_CHANNEL_1 -TIM11.IPParameters=Channel +TIM11.IPParameters=Channel,Prescaler,Period,OCMode_PWM,OCPolarity_1,Pulse +TIM11.OCMode_PWM=TIM_OCMODE_PWM2 +TIM11.OCPolarity_1=TIM_OCPOLARITY_HIGH +TIM11.Period=99 +TIM11.Prescaler=19999 +TIM11.Pulse=99 TIM2.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM2.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 TIM2.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 @@ -492,7 +506,11 @@ VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick VP_TIM10_VS_ClockSourceINT.Mode=Enable_Timer VP_TIM10_VS_ClockSourceINT.Signal=TIM10_VS_ClockSourceINT +VP_TIM10_VS_OPM.Mode=OPM_bit +VP_TIM10_VS_OPM.Signal=TIM10_VS_OPM VP_TIM11_VS_ClockSourceINT.Mode=Enable_Timer VP_TIM11_VS_ClockSourceINT.Signal=TIM11_VS_ClockSourceINT +VP_TIM11_VS_OPM.Mode=OPM_bit +VP_TIM11_VS_OPM.Signal=TIM11_VS_OPM board=custom isbadioc=false