Safety Controller:

* Add watchdog code
* Add file structure for safety controller
* Lay groundstones to move all error flags to the safety controller
* Improve doxygen
This commit is contained in:
2020-07-06 21:12:18 +02:00
parent 8a365ab5e0
commit 67a32cdc20
11 changed files with 265 additions and 1 deletions

View File

@@ -18,6 +18,11 @@
* If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @addtogroup safety-adc
* @{
*/
#include <reflow-controller/safety/safety-adc.h>
#include <reflow-controller/periph-config/safety-adc-hwcfg.h>
#include <helper-macros/helper-macros.h>
@@ -186,3 +191,5 @@ float safety_adc_get_vref()
{
return safety_vref;
}
/** @} */

View File

@@ -0,0 +1,8 @@
/**
@defgroup safety-adc Safety ADC
@ingroup safety
The safety ADC continuously monitors the microcontrollers internal core temperature (and therefore the whole device's temperature) and the external reference voltage compared to its
internal bandgap reference voltage.
*/

View File

@@ -0,0 +1,21 @@
/* Reflow Oven Controller
*
* Copyright (C) 2020 Mario Hüttel <mario.huettel@gmx.net>
*
* This file is part of the Reflow Oven Controller Project.
*
* The reflow oven controller is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* The Reflow Oven Control Firmware 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 the reflow oven controller project.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include <reflow-controller/safety/safety-controller.h>

View File

@@ -0,0 +1,6 @@
/**
@defgroup safety Safety Module
@brief Safety Supervisor Module
This is the safety module which ensures safe operation of the reflow controller
*/

View File

@@ -0,0 +1,99 @@
/* Reflow Oven Controller
*
* Copyright (C) 2020 Mario Hüttel <mario.huettel@gmx.net>
*
* This file is part of the Reflow Oven Controller Project.
*
* The reflow oven controller is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* The Reflow Oven Control Firmware 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 the reflow oven controller project.
* If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @addtogroup watchdog
* @{
*/
#include <reflow-controller/safety/watchdog.h>
#include <stm32/stm32f4xx.h>
/**
* @brief This key is expected by hardware to be written to the IWDG_KR register in order to reset the watchdog
*/
#define STM32_WATCHDOG_RESET_KEY 0xAAAA
/**
* @brief This key is expected by hardware to be written to the IWDG_KR register in order to enable the watchdog
*/
#define STM32_WATCHDOG_ENABLE_KEY 0xCCCC
/**
* @brief This key is expected by hardware to be written to the IWDG_KR register in order to enable access to config
* registers
*/
#define STM32_WATCHDOG_REGISTER_ACCESS_KEY 0x5555
int watchdog_setup(uint8_t prescaler)
{
uint32_t prescaler_reg_val;
/** - Activate the LSI oscillator */
RCC->CSR |= RCC_CSR_LSION;
__DSB();
/** - Wait for the oscillator to be ready */
while (!(RCC->CSR & RCC_CSR_LSIRDY));
if (prescaler == 4)
prescaler_reg_val = 0UL;
else if (prescaler == 8)
prescaler_reg_val = 1UL;
else if (prescaler == 16)
prescaler_reg_val = 2UL;
else if (prescaler == 32)
prescaler_reg_val = 3UL;
else if (prescaler == 64)
prescaler_reg_val = 4UL;
else if (prescaler == 128)
prescaler_reg_val = 5UL;
else
prescaler_reg_val = 6UL;
/** - Unlock registers */
IWDG->KR = STM32_WATCHDOG_REGISTER_ACCESS_KEY;
/** - Write prescaler value */
IWDG->PR = prescaler_reg_val;
/** - Set reload value fixed to 0xFFF */
IWDG->RLR = 0xFFFU;
/** - Write enable key */
IWDG->KR = STM32_WATCHDOG_ENABLE_KEY;
return 0;
}
int watchdog_ack(uint32_t magic)
{
int ret = -1;
/** - Check if magic key is correct */
if (magic == WATCHDOG_MAGIC_KEY) {
/** - Write reset key to watchdog */
IWDG->KR = STM32_WATCHDOG_RESET_KEY;
ret = 0;
}
return ret;
}
/** @} */

View File

@@ -0,0 +1,9 @@
/**
@defgroup watchdog Independent Watchdog
@ingroup safety
The independet watchdog module enusres that the safety controller run continuously and the whole formware does not lock.
The watchdog is entirely controlled by the safety controller and must not be used by the rest of the firmware
*/