Compare commits

...

10 Commits

14 changed files with 203 additions and 552 deletions

4
.gitmodules vendored
View File

@ -5,3 +5,7 @@
path = c-style-checker path = c-style-checker
url = https://git.shimatta.de/mhu/c-style-checker.git url = https://git.shimatta.de/mhu/c-style-checker.git
branch = master branch = master
[submodule "reflow-controller-temp-profile-lang"]
path = reflow-controller-temp-profile-lang
url = https://git.shimatta.de/mhu/reflow-controller-temp-profile-lang.git
branch = master

@ -0,0 +1 @@
Subproject commit c369231e42ecd67bf4d1a72a54b165dcee3b6bdb

View File

@ -7,13 +7,13 @@ CFILES = main.c syscalls.c setup/system_stm32f4xx.c systick.c
ASFILES = boot/startup_stm32f4xx.S ASFILES = boot/startup_stm32f4xx.S
INCLUDEPATH = -Iinclude INCLUDEPATH = -Iinclude
OBJDIR = obj OBJDIR_BASE = obj
target = reflow-controller TARGET_BASE = reflow-controller
LIBRARYPATH = -L. -Lmathlib LIBRARYPATH = -L. -Lmathlib
LIBRARIES = -larm_cortexM4lf_math -lm LIBRARIES = -larm_cortexM4lf_math -lm
DEFINES = -DSTM32F407xx -DSTM32F4XX -DARM_MATH_CM4 -DHSE_VALUE=8000000UL DEFINES = -DSTM32F407xx -DSTM32F4XX -DARM_MATH_CM4 -DHSE_VALUE=8000000UL
mapfile = memory-mapping MAPFILE_BASE = memory-mapping
export GIT_VER = $(shell git describe --always --dirty --tags) export GIT_VER = $(shell git describe --always --dirty --tags)
DEFINES += -DGIT_VER=$(GIT_VER) DEFINES += -DGIT_VER=$(GIT_VER)
@ -48,30 +48,67 @@ CFILES += pid-controller.c oven-driver.c
CFILES += settings/settings.c settings/settings-sd-card.c CFILES += settings/settings.c settings/settings-sd-card.c
CFILES += safety-adc.c CFILES += safety-adc.c
DEFINES += -DDEBUGBUILD DEBUG_DEFINES = -DDEBUGBUILD
RELEASE_DEFINES =
################################################################################### ###################################################################################
CC=arm-none-eabi-gcc ifeq ($(CROSS_COMPILE),)
OBJCOPY=arm-none-eabi-objcopy CROSS_COMPILE=arm-none-eabi-
OBJDUMP=arm-none-eabi-objdump endif
SIZE=arm-none-eabi-size
LFLAGS = -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork CC=$(CROSS_COMPILE)gcc
OBJCOPY=$(CROSS_COMPILE)objcopy
OBJDUMP=$(CROSS_COMPILE)objdump
SIZE=$(CROSS_COMPILE)size
CFLAGS_RELEASE = -O3 -g
CFLAGS_DEBUG = -O0 -g
LFLAGS_RELEASE = -Wl,--gc-sections
LFLAGS_DEBUG =
CFLAGS =
LFLAGS =
ifneq ($(DEBUGBUILD),true)
DEFINES += $(RELEASE_DEFINES)
CFLAGS += $(CFLAGS_RELEASE)
LFLAGS += $(LFLAGS_RELEASE)
target = $(TARGET_BASE)-release
OBJDIR = $(OBJDIR_BASE)/release
MAPFILE = $(MAPFILE_BASE)-release
else
DEFINES += $(DEBUG_DEFINES)
target = $(TARGET_BASE)-debug
CFLAGS += $(CFLAGS_DEBUG)
LFLAGS += $(LFLAGS_DEBUG)
OBJDIR = $(OBJDIR_BASE)/debug
MAPFILE = $(MAPFILE_BASE)-debug
endif
LFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork
LFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 --disable-newlib-supplied-syscalls -nostartfiles LFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 --disable-newlib-supplied-syscalls -nostartfiles
LFLAGS += -Tstm32f407vet6_flash.ld -Wl,-Map=$(mapfile).map LFLAGS += -Tstm32f407vet6_flash.ld -Wl,-Map=$(MAPFILE).map
CFLAGS = -c -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork CFLAGS += -c -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 -nostartfiles -O0 -g CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 -nostartfiles
CFLAGS += -Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter -Wimplicit-fallthrough=3 -Wsign-compare CFLAGS += -Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter -Wimplicit-fallthrough=3 -Wsign-compare
#################################################################################### ####################################################################################
OBJ = $(CFILES:%.c=$(OBJDIR)/%.c.o) OBJ = $(CFILES:%.c=$(OBJDIR)/%.c.o)
ASOBJ += $(ASFILES:%.S=$(OBJDIR)/%.S.o) ASOBJ += $(ASFILES:%.S=$(OBJDIR)/%.S.o)
all: default
default: $(target).elf default: $(target).elf
all: debug release
release:
$(QUIET)$(MAKE) DEBUGBUILD=false
debug:
$(QUIET)$(MAKE) DEBUGBUILD=true
%.bin: %.elf %.bin: %.elf
$(QUIET)$(OBJCOPY) -O binary $^ $@ $(QUIET)$(OBJCOPY) -O binary $^ $@
%.hex: %.elf %.hex: %.elf
@ -97,7 +134,7 @@ $(ASOBJ):
$(QUIET)$(CC) $(CFLAGS) -MMD -MT $@ $(INCLUDEPATH) $(DEFINES) -o $@ $(@:$(OBJDIR)/%.S.o=%.S) $(QUIET)$(CC) $(CFLAGS) -MMD -MT $@ $(INCLUDEPATH) $(DEFINES) -o $@ $(@:$(OBJDIR)/%.S.o=%.S)
.PHONY: qtproject-legacy qtproject clean mrproper objcopy disassemble program .PHONY: qtproject-legacy qtproject qtproject-debug clean mrproper objcopy disassemble program
program: $(target).elf program: $(target).elf
./program-device.sh $< ./program-device.sh $<
@ -108,12 +145,21 @@ disassemble: $(target).elf
objcopy: $(target).bin $(target).hex objcopy: $(target).bin $(target).hex
mrproper: clean mrproper: clean
$(QUIET)rm -f $(target).pro @echo "Purging project files..."
$(QUIET)rm -f $(target).pro $(target).creator $(target).files $(target).cflags $(target).cxxflags $(target).includes $(target).config
clean: clean:
@echo "Cleaning up derived files..." @echo -n "Cleaning up derived files for "
ifneq ($(DEBUGBUILD),true)
@echo "RELEASE build"
else
@echo "DEBUG build"
endif
$(QUIET)rm -f $(target).elf $(target).bin $(target).hex $(OBJ) $(ASOBJ) $(mapfile).map $(CFILES:%.c=$(OBJDIR)/%.c.d) $(ASFILES:%.S=$(OBJDIR)/%.S.d) $(QUIET)rm -f $(target).elf $(target).bin $(target).hex $(OBJ) $(ASOBJ) $(mapfile).map $(CFILES:%.c=$(OBJDIR)/%.c.d) $(ASFILES:%.S=$(OBJDIR)/%.S.d)
$(QUIET)rm -rf $(OBJDIR)/* $(QUIET)rm -rf $(OBJDIR)/*
ifneq ($(DEBUGBUILD),true)
$(QUIET)$(MAKE) DEBUGBUILD=true clean
endif
qtproject-legacy: qtproject-legacy:
echo -e "TEMPLATE = app\nCONFIG -= console app_bundle qt" > $(target).pro echo -e "TEMPLATE = app\nCONFIG -= console app_bundle qt" > $(target).pro
@ -125,9 +171,13 @@ qtproject-legacy:
echo -ne "\nDEFINES += " >> $(target).pro echo -ne "\nDEFINES += " >> $(target).pro
echo "$(DEFINES)" | sed "s/-D//g" >> $(target).pro echo "$(DEFINES)" | sed "s/-D//g" >> $(target).pro
qtproject-debug:
@echo "Generating debug build project"
$(QUIET)$(MAKE) DEBUGBUILD=true qtproject
qtproject: qtproject:
$(QUIET)rm -f $(target).files $(target).cflags $(target).config $(target).creator $(target).includes $(target).creator.user $(QUIET)rm -f $(target).files $(target).cflags $(target).config $(target).creator $(target).includes $(target).creator.user
echo "Generating source file list" @echo "Generating source file list"
$(QUIET)echo "$(CFILES)" | tr ' ' '\n' > $(target).files $(QUIET)echo "$(CFILES)" | tr ' ' '\n' > $(target).files
@echo -n "Appending found header files from folders " @echo -n "Appending found header files from folders "
@echo `echo $(INCLUDEPATH) | sed "s/-I//g"` @echo `echo $(INCLUDEPATH) | sed "s/-I//g"`

View File

@ -238,6 +238,8 @@ static int sdio_check_status_register_cmd13(uint16_t rca, uint32_t *status)
uint32_t response; uint32_t response;
int res; int res;
*status = 0UL;
do { do {
sdio_send_cmd(13, (rca<<16)&0xFFFF0000, SHORT_ANS); sdio_send_cmd(13, (rca<<16)&0xFFFF0000, SHORT_ANS);
if (!(res = sdio_get_response(13, SHORT_ANS, &response))) { if (!(res = sdio_get_response(13, SHORT_ANS, &response))) {
@ -465,10 +467,14 @@ static int sdio_send_select_card_cmd7(uint16_t rca) {
} while(--timeout > 0); } while(--timeout > 0);
/* Check, if card in in TRANS state */ /* Check, if card in in TRANS state */
if (sdio_check_status_register_cmd13(rca, &(status.value))) if (sdio_check_status_register_cmd13(rca, &status.value)) {
res = -1; res = -1;
goto ret_val;
}
if (status.statusstruct.CURRENT_STATE != CURRENT_STATE_TRAN) if (status.statusstruct.CURRENT_STATE != CURRENT_STATE_TRAN)
res = -2; res = -2;
ret_val:
return res; return res;
} }
@ -705,9 +711,10 @@ DRESULT sdio_disk_write(const BYTE *buff, DWORD sector, UINT count)
while (count) { while (count) {
do { do {
sdio_check_status_register_cmd13(card_info.rca, &status.value); ret = sdio_check_status_register_cmd13(card_info.rca, &status.value);
} while (status.statusstruct.CURRENT_STATE == CURRENT_STATE_PRG || } while (status.statusstruct.CURRENT_STATE == CURRENT_STATE_PRG ||
status.statusstruct.CURRENT_STATE == CURRENT_STATE_RCV); status.statusstruct.CURRENT_STATE == CURRENT_STATE_RCV ||
!ret);
if (status.statusstruct.CURRENT_STATE == CURRENT_STATE_STBY) { if (status.statusstruct.CURRENT_STATE == CURRENT_STATE_STBY) {
if (sdio_send_select_card_cmd7(card_info.rca)) if (sdio_send_select_card_cmd7(card_info.rca))

View File

@ -45,7 +45,7 @@ struct oven_pid_errors {
struct oven_pid_status { struct oven_pid_status {
bool active; bool active;
bool aborted; bool error_set;
struct oven_pid_errors error_flags; struct oven_pid_errors error_flags;
float target_temp; float target_temp;
float current_temp; float current_temp;
@ -58,6 +58,8 @@ void oven_driver_set_power(uint8_t power);
void oven_driver_disable(void); void oven_driver_disable(void);
void oven_pid_ack_errors(void);
void oven_pid_init(struct pid_controller *controller_to_copy); void oven_pid_init(struct pid_controller *controller_to_copy);
void oven_pid_handle(float target_temp); void oven_pid_handle(float target_temp);

View File

@ -39,6 +39,12 @@ enum safety_adc_check_result {
SAFETY_ADC_INTERNAL_ERROR = (1U<<4), SAFETY_ADC_INTERNAL_ERROR = (1U<<4),
}; };
extern enum safety_adc_check_result global_safety_adc_status;
enum safety_adc_check_result safety_adc_get_errors();
void safety_adc_clear_errors(void);
void safety_adc_init(); void safety_adc_init();
void safety_adc_deinit(); void safety_adc_deinit();

View File

@ -36,18 +36,18 @@
#include <reflow-controller/shell.h> #include <reflow-controller/shell.h>
#include <reflow-controller/digio.h> #include <reflow-controller/digio.h>
#include "fatfs/shimatta_sdio_driver/shimatta_sdio.h" #include "fatfs/shimatta_sdio_driver/shimatta_sdio.h"
#include <reflow-controller/temp-converter.h>
#include <stm-periph/stm32-gpio-macros.h> #include <stm-periph/stm32-gpio-macros.h>
#include <stm-periph/clock-enable-manager.h> #include <stm-periph/clock-enable-manager.h>
#include <stm-periph/uart.h> #include <stm-periph/uart.h>
#include <reflow-controller/shell-uart-config.h> #include <reflow-controller/shell-uart-config.h>
#include <helper-macros/helper-macros.h>
#include <reflow-controller/oven-driver.h> #include <reflow-controller/oven-driver.h>
#include <reflow-controller/safety-adc.h> #include <reflow-controller/safety-adc.h>
#include <fatfs/ff.h> #include <fatfs/ff.h>
#include <reflow-controller/reflow-menu.h> #include <reflow-controller/reflow-menu.h>
static void setup_nvic_priorities() bool global_error_state;
static void setup_nvic_priorities(void)
{ {
/* No sub priorities */ /* No sub priorities */
NVIC_SetPriorityGrouping(2); NVIC_SetPriorityGrouping(2);
@ -61,7 +61,7 @@ static void setup_nvic_priorities()
FATFS fs; FATFS fs;
FATFS * const fs_ptr = &fs; FATFS * const fs_ptr = &fs;
static inline void uart_gpio_config() static inline void uart_gpio_config(void)
{ {
/* /*
* In case the application is build in debug mode, use the TX/RX Pins on the debug header * In case the application is build in debug mode, use the TX/RX Pins on the debug header
@ -121,30 +121,16 @@ static bool mount_sd_card_if_avail(bool mounted)
if (!sdio_check_inserted() && !mounted) { if (!sdio_check_inserted() && !mounted) {
res = f_mount(fs_ptr, "0:/", 1); res = f_mount(fs_ptr, "0:/", 1);
if (res == FR_OK) { if (res == FR_OK)
return true; return true;
} else { else
return false; return false;
}
} }
return mounted; return mounted;
} }
static inline int32_t handle_pid_controller(struct pid_controller *pid, float target_temperature, static void setup_unused_pins(void)
float current_temperature)
{
int32_t pid_out;
pid_out = (int32_t)pid_sample(pid, target_temperature - current_temperature);
/* Blink green LED */
led_set(1, !led_get(1));
return pid_out;
}
static void setup_unused_pins()
{ {
int i; int i;
@ -154,7 +140,7 @@ static void setup_unused_pins()
GPIOE->PUPDR |= PULLDOWN(i); GPIOE->PUPDR |= PULLDOWN(i);
} }
static inline void setup_system() static inline void setup_system(void)
{ {
setup_nvic_priorities(); setup_nvic_priorities();
systick_setup(); systick_setup();
@ -185,10 +171,11 @@ static void handle_shell_uart_input(shellmatta_handle_t shell_handle)
shell_handle_input(shell_handle, uart_input, uart_input_len); shell_handle_input(shell_handle, uart_input, uart_input_len);
} }
extern char _sccmram;
extern char _eccmram;
static void zero_ccm_ram(void) static void zero_ccm_ram(void)
{ {
/* These extern variables are placed in the linker script */
extern char _sccmram;
extern char _eccmram;
uint32_t len; uint32_t len;
uint32_t i; uint32_t i;
uint32_t *ptr = (uint32_t *)&_sccmram; uint32_t *ptr = (uint32_t *)&_sccmram;
@ -198,10 +185,31 @@ static void zero_ccm_ram(void)
ptr[i] = 0UL; ptr[i] = 0UL;
} }
volatile bool error_state = false; /**
volatile enum safety_adc_check_result safety_adc_status = SAFETY_ADC_CHECK_OK; * @brief This function sets the appropriate error flags in the oven PID controller
* depending on the Safety ADC measurements.
* The PID controller's error flags have to be cleared via the GUI by either starting a new RUN or explicitly
* ack'ing these errors.
*/
static void propagate_safety_adc_error_to_oven_pid(void)
{
enum safety_adc_check_result safety_adc_result;
int main() safety_adc_result = safety_adc_get_errors();
if (safety_adc_result & SAFETY_ADC_CHECK_TEMP_LOW ||
safety_adc_result & SAFETY_ADC_CHECK_TEMP_HIGH)
oven_pid_report_error(OVEN_PID_ERR_OVERTEMP);
if (safety_adc_result & SAFETY_ADC_CHECK_VREF_LOW ||
safety_adc_result & SAFETY_ADC_CHECK_VREF_HIGH)
oven_pid_report_error(OVEN_PID_ERR_VREF_TOL);
if (safety_adc_result & SAFETY_ADC_INTERNAL_ERROR)
oven_pid_report_error(0);
}
int main(void)
{ {
bool sd_card_mounted = false; bool sd_card_mounted = false;
shellmatta_handle_t shell_handle; shellmatta_handle_t shell_handle;
@ -213,6 +221,8 @@ int main()
zero_ccm_ram(); zero_ccm_ram();
setup_system(); setup_system();
global_error_state = false;
shell_handle = shell_init(write_shell_callback); shell_handle = shell_init(write_shell_callback);
shell_print_motd(shell_handle); shell_print_motd(shell_handle);
@ -221,41 +231,26 @@ int main()
pid_status = oven_pid_get_status(); pid_status = oven_pid_get_status();
if(systick_ticks_have_passed(quarter_sec_timestamp, 250)) { if (systick_ticks_have_passed(quarter_sec_timestamp, 250)) {
safety_adc_status = handle_safety_adc();
quarter_sec_timestamp = systick_get_global_tick(); quarter_sec_timestamp = systick_get_global_tick();
if (safety_adc_status & SAFETY_ADC_CHECK_TEMP_LOW || safety_adc_status & SAFETY_ADC_CHECK_TEMP_HIGH) { (void)handle_safety_adc();
oven_pid_report_error(OVEN_PID_ERR_OVERTEMP); propagate_safety_adc_error_to_oven_pid();
}
if (safety_adc_status & SAFETY_ADC_CHECK_VREF_LOW || safety_adc_status & SAFETY_ADC_CHECK_VREF_HIGH) { if (global_error_state)
oven_pid_report_error(OVEN_PID_ERR_VREF_TOL);
}
if (safety_adc_status & SAFETY_ADC_INTERNAL_ERROR) {
oven_pid_report_error(0);
}
if (error_state) {
led_set(0, !led_get(0)); led_set(0, !led_get(0));
} else { else
led_set(0, 0); led_set(0, 0);
}
pt1000_status = adc_pt1000_check_error();
} }
error_state = pid_status->aborted | !!safety_adc_status | !!pt1000_status; pt1000_status = adc_pt1000_check_error();
global_error_state = pid_status->error_set || !!safety_adc_get_errors() || !!pt1000_status;
menu_wait_request = reflow_menu_handle(); menu_wait_request = reflow_menu_handle();
/* Deactivate oven output in case of error! */ /* Deactivate oven output in case of error! */
if (!pid_status->active || pid_status->aborted || error_state) { if (!pid_status->active || global_error_state)
oven_pid_stop();
oven_driver_set_power(0U); oven_driver_set_power(0U);
}
handle_shell_uart_input(shell_handle); handle_shell_uart_input(shell_handle);
@ -264,6 +259,7 @@ int main()
} }
return 0;
} }
void sdio_wait_ms(uint32_t ms) void sdio_wait_ms(uint32_t ms)
@ -271,12 +267,12 @@ void sdio_wait_ms(uint32_t ms)
systick_wait_ms(ms); systick_wait_ms(ms);
} }
void DMA2_Stream7_IRQHandler() void DMA2_Stream7_IRQHandler(void)
{ {
uint32_t hisr = DMA2->HISR; uint32_t hisr = DMA2->HISR;
DMA2->HIFCR = hisr; DMA2->HIFCR = hisr;
if (hisr & DMA_HISR_TCIF7) { if (hisr & DMA_HISR_TCIF7)
uart_tx_dma_complete_int_callback(&shell_uart); uart_tx_dma_complete_int_callback(&shell_uart);
}
} }

View File

@ -29,7 +29,7 @@ static struct pid_controller oven_pid;
static struct oven_pid_status oven_pid_current_status = { static struct oven_pid_status oven_pid_current_status = {
.active = false, .active = false,
.aborted = false, .error_set = false,
.target_temp = 0.0f, .target_temp = 0.0f,
.current_temp = 0.0f, .current_temp = 0.0f,
.timestamp_last_run = 0ULL .timestamp_last_run = 0ULL
@ -71,6 +71,17 @@ void oven_driver_disable()
rcc_manager_disable_clock(&RCC->APB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_TIM_RCC_MASK)); rcc_manager_disable_clock(&RCC->APB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_TIM_RCC_MASK));
} }
void oven_pid_ack_errors(void)
{
oven_pid_current_status.error_set = false;
oven_pid_current_status.error_flags.vref_tol = false;
oven_pid_current_status.error_flags.pt1000_other = false;
oven_pid_current_status.error_flags.generic_error = false;
oven_pid_current_status.error_flags.pt1000_adc_off = false;
oven_pid_current_status.error_flags.controller_overtemp = false;
oven_pid_current_status.error_flags.pt1000_adc_watchdog = false;
}
void oven_pid_init(struct pid_controller *controller_to_copy) void oven_pid_init(struct pid_controller *controller_to_copy)
{ {
pid_copy(&oven_pid, controller_to_copy); pid_copy(&oven_pid, controller_to_copy);
@ -78,12 +89,7 @@ void oven_pid_init(struct pid_controller *controller_to_copy)
oven_pid.output_sat_max = 100.0f; oven_pid.output_sat_max = 100.0f;
oven_pid_current_status.timestamp_last_run = 0ULL; oven_pid_current_status.timestamp_last_run = 0ULL;
oven_pid_current_status.active = true; oven_pid_current_status.active = true;
oven_pid_current_status.error_flags.vref_tol = false; oven_pid_ack_errors();
oven_pid_current_status.error_flags.pt1000_other = false;
oven_pid_current_status.error_flags.generic_error = false;
oven_pid_current_status.error_flags.pt1000_adc_off = false;
oven_pid_current_status.error_flags.controller_overtemp = false;
oven_pid_current_status.error_flags.pt1000_adc_watchdog = false;
} }
void oven_pid_handle(float target_temp) void oven_pid_handle(float target_temp)
@ -93,7 +99,7 @@ void oven_pid_handle(float target_temp)
int resistance_status; int resistance_status;
enum adc_pt1000_error pt1000_error; enum adc_pt1000_error pt1000_error;
if (oven_pid_current_status.active && !oven_pid_current_status.aborted) { if (oven_pid_current_status.active && !oven_pid_current_status.error_set) {
if (systick_ticks_have_passed(oven_pid_current_status.timestamp_last_run, if (systick_ticks_have_passed(oven_pid_current_status.timestamp_last_run,
(uint64_t)(oven_pid.sample_period * 1000))) { (uint64_t)(oven_pid.sample_period * 1000))) {
@ -127,7 +133,7 @@ void oven_pid_report_error(enum oven_pid_error_report report)
struct oven_pid_errors *e = &oven_pid_current_status.error_flags; struct oven_pid_errors *e = &oven_pid_current_status.error_flags;
oven_pid_current_status.active = false; oven_pid_current_status.active = false;
oven_pid_current_status.aborted = true; oven_pid_current_status.error_set = true;
if (report == 0) { if (report == 0) {
e->generic_error = true; e->generic_error = true;

View File

@ -23,10 +23,24 @@
#include <helper-macros/helper-macros.h> #include <helper-macros/helper-macros.h>
#include <stm-periph/clock-enable-manager.h> #include <stm-periph/clock-enable-manager.h>
enum safety_adc_check_result global_safety_adc_status;
enum safety_adc_check_result safety_adc_get_errors()
{
return global_safety_adc_status;
}
void safety_adc_clear_errors(void)
{
global_safety_adc_status = SAFETY_ADC_CHECK_OK;
}
void safety_adc_init() void safety_adc_init()
{ {
rcc_manager_enable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(SAFETY_ADC_ADC_RCC_MASK)); rcc_manager_enable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(SAFETY_ADC_ADC_RCC_MASK));
safety_adc_clear_errors();
/* Enable temperature and VREFINT measurement */ /* Enable temperature and VREFINT measurement */
ADC->CCR |= ADC_CCR_TSVREFE; ADC->CCR |= ADC_CCR_TSVREFE;
@ -117,16 +131,17 @@ void safety_adc_trigger_meas(enum safety_adc_meas_channel measurement)
SAFETY_ADC_ADC_PERIPHERAL->CR2 |= ADC_CR2_SWSTART; SAFETY_ADC_ADC_PERIPHERAL->CR2 |= ADC_CR2_SWSTART;
} }
static volatile uint16_t safety_vref_meas_raw; static uint16_t safety_vref_meas_raw;
static volatile bool safety_vref_valid = false; static bool safety_vref_valid = false;
static volatile uint16_t safety_temp_meas_raw; static uint16_t safety_temp_meas_raw;
static volatile bool safety_temp_valid = false; static bool safety_temp_valid = false;
static float safety_vref; static float safety_vref;
static float safety_temp; static float safety_temp;
enum safety_adc_check_result handle_safety_adc() enum safety_adc_check_result handle_safety_adc()
{ {
static enum safety_adc_meas_channel safety_meas_channel = SAFETY_ADC_MEAS_VREF; static enum safety_adc_meas_channel safety_meas_channel = SAFETY_ADC_MEAS_VREF;
enum safety_adc_check_result check_result;
uint16_t result; uint16_t result;
int poll_status; int poll_status;
@ -153,10 +168,13 @@ enum safety_adc_check_result handle_safety_adc()
} }
if (safety_temp_valid && safety_vref_valid) { if (safety_temp_valid && safety_vref_valid) {
return safety_adc_check_results(safety_vref_meas_raw, safety_temp_meas_raw, &safety_vref, &safety_temp); check_result = safety_adc_check_results(safety_vref_meas_raw, safety_temp_meas_raw, &safety_vref, &safety_temp);
global_safety_adc_status |= check_result;
} else { } else {
return SAFETY_ADC_CHECK_OK; check_result = SAFETY_ADC_CHECK_OK;
} }
return check_result;
} }
float safety_adc_get_temp() float safety_adc_get_temp()

View File

@ -361,6 +361,20 @@ static shellmatta_retCode_t shell_cmd_safety_adc(const shellmatta_handle_t handl
shellmatta_printf(handle, "VREF:\t%8.2f\tmV\r\n", safety_adc_get_vref()); shellmatta_printf(handle, "VREF:\t%8.2f\tmV\r\n", safety_adc_get_vref());
shellmatta_printf(handle, "TEMP:\t%8.2f\tdeg. Celsius\r\n", safety_adc_get_temp()); shellmatta_printf(handle, "TEMP:\t%8.2f\tdeg. Celsius\r\n", safety_adc_get_temp());
shellmatta_printf(handle, "Errors:\t%X", safety_adc_get_errors());
return SHELLMATTA_OK;
}
static shellmatta_retCode_t shell_cmd_safety_adc_clear_error(const shellmatta_handle_t handle, const char *arguments,
uint32_t length)
{
(void)length;
(void)arguments;
(void)handle;
safety_adc_clear_errors();
return SHELLMATTA_OK; return SHELLMATTA_OK;
} }
@ -374,7 +388,7 @@ static shellmatta_retCode_t shell_cmd_safety_adc(const shellmatta_handle_t handl
// struct shellmatta_cmd *next; /**< pointer to next command or NULL */ // struct shellmatta_cmd *next; /**< pointer to next command or NULL */
//} shellmatta_cmd_t; //} shellmatta_cmd_t;
static shellmatta_cmd_t cmd[14] = { static shellmatta_cmd_t cmd[15] = {
{ {
.cmd = "version", .cmd = "version",
.cmdAlias = "ver", .cmdAlias = "ver",
@ -485,6 +499,14 @@ static shellmatta_cmd_t cmd[14] = {
.helpText = "", .helpText = "",
.usageText = "", .usageText = "",
.cmdFct = shell_cmd_safety_adc, .cmdFct = shell_cmd_safety_adc,
.next = &cmd[14],
},
{
.cmd = "safety-adc-clear-error",
.cmdAlias = NULL,
.helpText = "",
.usageText = "",
.cmdFct = shell_cmd_safety_adc_clear_error,
.next = NULL, .next = NULL,
}, },

View File

@ -1,279 +0,0 @@
# Created by https://www.gitignore.io/api/latex
# Edit at https://www.gitignore.io/?templates=latex
### LaTeX ###
## Core latex/pdflatex auxiliary files:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
*.fmt
*.fot
*.cb
*.cb2
.*.lb
## Intermediate documents:
*.dvi
*.xdv
*-converted-to.*
# these rules might exclude image files for figures etc.
# *.ps
# *.eps
# *.pdf
## Generated if empty string is given at "Please type another file name for output:"
specification.pdf
## Bibliography auxiliary files (bibtex/biblatex/biber):
*.bbl
*.bcf
*.blg
*-blx.aux
*-blx.bib
*.run.xml
## Build tool auxiliary files:
*.fdb_latexmk
*.synctex
*.synctex(busy)
*.synctex.gz
*.synctex.gz(busy)
*.pdfsync
## Build tool directories for auxiliary files
# latexrun
latex.out/
## Auxiliary and intermediate files from other packages:
# algorithms
*.alg
*.loa
# achemso
acs-*.bib
# amsthm
*.thm
# beamer
*.nav
*.pre
*.snm
*.vrb
# changes
*.soc
# comment
*.cut
# cprotect
*.cpt
# elsarticle (documentclass of Elsevier journals)
*.spl
# endnotes
*.ent
# fixme
*.lox
# feynmf/feynmp
*.mf
*.mp
*.t[1-9]
*.t[1-9][0-9]
*.tfm
#(r)(e)ledmac/(r)(e)ledpar
*.end
*.?end
*.[1-9]
*.[1-9][0-9]
*.[1-9][0-9][0-9]
*.[1-9]R
*.[1-9][0-9]R
*.[1-9][0-9][0-9]R
*.eledsec[1-9]
*.eledsec[1-9]R
*.eledsec[1-9][0-9]
*.eledsec[1-9][0-9]R
*.eledsec[1-9][0-9][0-9]
*.eledsec[1-9][0-9][0-9]R
# glossaries
*.acn
*.acr
*.glg
*.glo
*.gls
*.glsdefs
# uncomment this for glossaries-extra (will ignore makeindex's style files!)
# *.ist
# gnuplottex
*-gnuplottex-*
# gregoriotex
*.gaux
*.gtex
# htlatex
*.4ct
*.4tc
*.idv
*.lg
*.trc
*.xref
# hyperref
*.brf
# knitr
*-concordance.tex
# TODO Comment the next line if you want to keep your tikz graphics files
*.tikz
*-tikzDictionary
# listings
*.lol
# luatexja-ruby
*.ltjruby
# makeidx
*.idx
*.ilg
*.ind
# minitoc
*.maf
*.mlf
*.mlt
*.mtc[0-9]*
*.slf[0-9]*
*.slt[0-9]*
*.stc[0-9]*
# minted
_minted*
*.pyg
# morewrites
*.mw
# nomencl
*.nlg
*.nlo
*.nls
# pax
*.pax
# pdfpcnotes
*.pdfpc
# sagetex
*.sagetex.sage
*.sagetex.py
*.sagetex.scmd
# scrwfile
*.wrt
# sympy
*.sout
*.sympy
sympy-plots-for-*.tex/
# pdfcomment
*.upa
*.upb
# pythontex
*.pytxcode
pythontex-files-*/
# tcolorbox
*.listing
# thmtools
*.loe
# TikZ & PGF
*.dpth
*.md5
*.auxlock
# todonotes
*.tdo
# vhistory
*.hst
*.ver
# easy-todo
*.lod
# xcolor
*.xcp
# xmpincl
*.xmpi
# xindy
*.xdy
# xypic precompiled matrices
*.xyc
# endfloat
*.ttt
*.fff
# Latexian
TSWLatexianTemp*
## Editors:
# WinEdt
*.bak
*.sav
# Texpad
.texpadtmp
# LyX
*.lyx~
# Kile
*.backup
# KBibTeX
*~[0-9]*
# auto folder when using emacs and auctex
./auto/*
*.el
# expex forward references with \gathertags
*-tags.tex
# standalone packages
*.sta
### LaTeX Patch ###
# glossaries
*.glstex
# Version File
*.ver
*.commit
*.branch
# End of https://www.gitignore.io/api/latex

View File

@ -1,10 +0,0 @@
target=specification
.PHONY: $(target).pdf all clean
all: $(target).pdf
$(target).pdf: $(target).tex
latexmk -pdf -pdflatex="pdflatex -interaction=nostopmode -shell-escape" -use-make $^
clean:
latexmk -CA

View File

@ -1,172 +0,0 @@
\documentclass[12pt,a4paper,oneside,notitlepage, numbers=noenddot,openany]{scrreprt}
\usepackage[a4paper]{geometry}
\geometry{verbose,tmargin=2.5cm,bmargin=4.5cm,lmargin=2.5cm,rmargin=2.5cm}
\setlength{\parindent}{0cm}
\usepackage{array}
\usepackage{textcomp}
\usepackage{float}
\usepackage{graphicx}
\usepackage{caption}
%\usepackage{subcaption}
%\usepackage{textgreek}
\usepackage{setspace}
\usepackage{nomencl}
\usepackage{listing}
\usepackage{tabularx}
\PassOptionsToPackage{hyphens}{url}
\usepackage[%
pdftitle={Temperature Profile File Specification},%
pdfauthor={Mario Huettel},%
pdfsubject={},%
pdfcreator={pdflatex, LaTeX with KOMA-Script},%
pdfpagemode=UseOutlines, % Beim Oeffnen Inhaltsverzeichnis anzeigen
pdfdisplaydoctitle=true, % Dokumenttitel statt Dateiname anzeigen.
pdflang=de, % Sprache des Dokuments.
%plainpages=false,
]{hyperref}
\immediate\write18{git describe --always --long --dirty > \jobname.ver}
\immediate\write18{git rev-parse --verify HEAD > \jobname.commit}
\immediate\write18{git rev-parse --abbrev-ref HEAD > \jobname.branch}
\usepackage[automark,headsepline,plainheadsepline,footsepline,plainfootsepline,autooneside=true]{scrlayer-scrpage}
\clearpairofpagestyles
\hypersetup{%
colorlinks=true, % Aktivieren von farbigen Links im Dokument
linkcolor=blue, % Farbe festlegen
citecolor=green,
%filecolor,
%menucolor=black,
%urlcolor=cyan,
bookmarksnumbered=true%, % Überschriftsnummerierung im PDF Inhalt anzeigen.
%hidelinks=false
}
\usepackage{CJKutf8}
\newenvironment{Japanese}{%
\CJKfamily{min}%
\CJKtilde
\CJKnospace}{}
\usepackage{booktabs}
\usepackage{color}
%\usepackage{cite}
\usepackage{blindtext}
\usepackage[utf8]{inputenc}
\usepackage{multicol}
\usepackage{lastpage}
\usepackage[american]{babel}
\usepackage{amssymb}
\usepackage{datetime}
\usepackage[withpage,printonlyused]{acronym}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{forloop}
\usepackage{csvsimple}
\usepackage{xspace}
%\setcounter{secnumdepth}{3}
%\setcounter{tocdepth}{3}
%\usepackage{apacite}
%\usepackage{natbib}
%\usepackage[babel,german=quotes]{csquotes}
\usepackage{xspace}
\usepackage{nth}
%\usepackage[backend=biber, style=apa, natbib, bibencoding=utf8]{biblatex}
%
%
%
%\addbibresource{lit.bib}
%\DeclareLanguageMapping{ngerman}{ngerman-apa}
%
\usepackage{enumitem}
\newcounter{reqcount}
\newlist{requirements}{description}{1}
\setlist[requirements,1]{%
before={%
\renewcommand*\thereqcount{\arabic{reqcount}}},
font={\bfseries\stepcounter{reqcount}REQ-\thereqcount:}
}
\newcommand{\newreq}{\bfseries\stepcounter{reqcount}REQ-\thereqcount:~}
\usepackage{xargs} % Use more than one optional parameter in a new commands
\usepackage[colorinlistoftodos,prependcaption,textsize=tiny]{todonotes}
\newcommandx{\unsure}[2][1=]{\todo[noline,linecolor=red,backgroundcolor=red!25,bordercolor=red,#1]{#2}}
\newcommandx{\miscite}[1][1=]{\todo[noline,linecolor=black,backgroundcolor=black!25,bordercolor=black]{Missing citation! #1}}
\newcommandx{\change}[2][1=]{\todo[noline,linecolor=blue,backgroundcolor=blue!25,bordercolor=blue,#1]{#2}}
\newcommandx{\info}[2][1=]{\todo[noline,linecolor=OliveGreen,backgroundcolor=OliveGreen!25,bordercolor=OliveGreen,#1]{#2}}
\newcommandx{\improvement}[2][1=]{\todo[noline,linecolor=Plum,backgroundcolor=Plum!25,bordercolor=Plum,#1]{#2}}
\newcommandx{\thiswillnotshow}[2][1=]{\todo[disable,#1]{#2}}
%Figure, table and listing enumeration style
\captionsetup{labelfont=bf}
\usepackage{chngcntr}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\clubpenalty10000
\widowpenalty10000
\displaywidowpenalty10000
%\counterwithout{figure}{part}
\ihead[Spec]{Spec}
\chead[\input{\jobname.ver}]{\input{\jobname.ver}}
\ohead{\headmark}
\ofoot[\pagemark]{\pagemark}
\cfoot[\url{https://git.shimatta.de/mhu/reflow-oven-control-sw}]{\url{https://git.shimatta.de/mhu/reflow-oven-control-sw}}
\setheadsepline{.5pt}
\setfootsepline{.5pt}
\BeforeStartingTOC{\thispagestyle{scrheadings}}
\pagestyle{scrheadings}
\thispagestyle{scrheadings}
\raggedbottom
\begin{document}
\pagenumbering{roman}
\begin{titlepage}
\begin{center}
\begin{figure}[H]
\centering
\resizebox{5cm}{!}{
\includegraphics{img/shimatta-logo}}
\end{figure}
\vspace{10em}
\begin{Huge}
\sffamily\textbf{Temperature Profile File Specification}
\end{Huge}
\vspace{1cm}
\textbf{Version: \input{\jobname.ver}}
\vspace{3em}
\small\texttt{\input{\jobname.commit}/ \input{\jobname.branch}}
\end{center}
\end{titlepage}
\tableofcontents
\newpage
\thispagestyle{scrheadings}
\pagenumbering{arabic}
\chapter{Test}
\end{document}