From aef9ff7f769eb1adfafa36ca6a89663a8200c15d Mon Sep 17 00:00:00 2001 From: Nathael Pajani Date: Mon, 23 Nov 2015 13:21:21 +0100 Subject: [PATCH] Watchdog example (using ADC example as base). --- watchdog/Makefile | 13 ++++ watchdog/README | 36 +++++++++++ watchdog/main.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 210 insertions(+) create mode 100644 watchdog/Makefile create mode 100644 watchdog/README create mode 100644 watchdog/main.c diff --git a/watchdog/Makefile b/watchdog/Makefile new file mode 100644 index 0000000..954c63f --- /dev/null +++ b/watchdog/Makefile @@ -0,0 +1,13 @@ +# Makefile for "base" apps +# This includes apps for the GPIO Demo Module and for the LPC1224-BO board. + +MODULE = $(shell basename $(shell cd .. && pwd && cd -)) +NAME = $(shell basename $(CURDIR)) + +.PHONY: $(NAME).bin +$(NAME).bin: + @make -C ../../.. --no-print-directory NAME=$(NAME) MODULE=$(MODULE) apps/$(MODULE)/$(NAME)/$@ + +clean mrproper: + @make -C ../../.. --no-print-directory $@ + diff --git a/watchdog/README b/watchdog/README new file mode 100644 index 0000000..faf1d07 --- /dev/null +++ b/watchdog/README @@ -0,0 +1,36 @@ +ADC and TMP36 Example + +Copyright 2013 Nathael Pajani + + +/* **************************************************************************** + * 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 2 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 . + * + *************************************************************************** */ + +This example shows the support of the internal ADC, with conversion examples for +a TMP36 analog temperature sensor and a CdS photoresistor. + +The conversion results are sent on the UART0 serial line (115200 8n1) at +regular intervals, and the status led flashes the rest of the time. + +The output looks like this : + ADC(0): 684 (raw: 0x02ac) + TMP36: 29,36 (orig: 248, raw: 00f8) + +The first line displays the decimal and hexadecimal value of the raw +conversion result, on which was the luminosity sensor. +The second line displays the TMP36 temperature, which is not very acurate at +ambient temperature, with the corresponding decimal and hexadecimal raw +conversion values. diff --git a/watchdog/main.c b/watchdog/main.c new file mode 100644 index 0000000..e1e5105 --- /dev/null +++ b/watchdog/main.c @@ -0,0 +1,161 @@ +/**************************************************************************** + * apps/base/watchdog/main.c + * + * Watchdog example + * + * Copyright 2013-2014 Nathael Pajani + * + * + * 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 2 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 +#include "core/lpc_regs_12xx.h" +#include "core/lpc_core_cm0.h" +#include "core/pio.h" +#include "core/system.h" +#include "core/systick.h" +#include "lib/stdio.h" +#include "drivers/serial.h" +#include "drivers/gpio.h" +#include "extdrv/status_led.h" +#include "drivers/adc.h" + + +#define MODULE_VERSION 0x04 +#define MODULE_NAME "GPIO Demo Module" + + +#define SELECTED_FREQ FREQ_SEL_48MHz + +/***************************************************************************** */ +/* Pins configuration */ +/* pins blocks are passed to set_pins() for pins configuration. + * Unused pin blocks can be removed safely with the corresponding set_pins() call + * All pins blocks may be safelly merged in a single block for single set_pins() call.. + */ +const struct pio_config common_pins[] = { + /* UART 0 */ + { LPC_UART0_RX_PIO_0_1, LPC_IO_DIGITAL }, + { LPC_UART0_TX_PIO_0_2, LPC_IO_DIGITAL }, + ARRAY_LAST_PIO, +}; + +const struct pio_config adc_pins[] = { + { LPC_ADC_AD0_PIO_0_30, LPC_IO_ANALOG }, + { LPC_ADC_AD1_PIO_0_31, LPC_IO_ANALOG }, + { LPC_ADC_AD2_PIO_1_0, LPC_IO_ANALOG }, + { LPC_ADC_AD3_PIO_1_1, LPC_IO_ANALOG }, + { LPC_ADC_AD4_PIO_1_2, LPC_IO_ANALOG }, + { LPC_ADC_AD5_PIO_1_3, LPC_IO_ANALOG }, + ARRAY_LAST_PIO, +}; + +const struct pio status_led_green = LPC_GPIO_1_4; +const struct pio status_led_red = LPC_GPIO_1_5; + +const struct wdt_config wdconf = { + .clk_sel = WDT_CLK_IRC, + .intr_mode_only = 0, + .locks = 0, + .nb_clk = 0x4FFFFF, + .wdt_window = 0, + .wdt_warn = 0, +}; + +/***************************************************************************** */ +/* This will display the integer value read on the ADC, between 0 and 1024. + * ADC must be initialised prior to calls to adc_display() (it means that adc_on() + * must be called before using this function. + * adc_num is an ADC channel number (integer between 0 and 7) + * use LPC_ADC_NUM(x) for channel selection. + * returns ADC convertion value or negative value on error. + */ +int adc_display(int adc_num, int uart_num) +{ + uint16_t val = 0; + int ret = 0; + + adc_start_convertion_once(adc_num, 0); + msleep(10); + ret = adc_get_value(&val, adc_num); + if (ret < 0) { + return ret; + } else { + uprintf(uart_num, "ADC(%d): %d (raw: 0x%04x)\r\n", adc_num, val, val); + } + return val; +} + + +/***************************************************************************** */ +void system_init() +{ + /* Stop the watchdog */ + startup_watchdog_disable(); /* Do it right now, before it gets a chance to break in */ + + /* Note: Brown-Out detection must be powered to operate the ADC. adc_on() will power + * it back on if called after system_init() */ + system_brown_out_detection_config(0); + system_set_default_power_state(); + clock_config(SELECTED_FREQ); + set_pins(common_pins); + set_pins(adc_pins); + gpio_on(); + status_led_config(&status_led_green, &status_led_red); + /* System tick timer MUST be configured and running in order to use the sleeping functions */ + systick_timer_on(1); /* 1ms */ + systick_start(); +} + +/* Define our fault handler. This one is not mandatory, the dummy fault handler + * will be used when it's not overridden here. + * Note : The default one does a simple infinite loop. If the watchdog is deactivated + * the system will hang. + */ +void fault_info(const char* name, uint32_t len) +{ + serial_write(0, name, len); + /* Wait for end of Tx */ + serial_flush(0); + /* FIXME : Perform soft reset of the micro-controller ! */ + while (1); +} + + + +/***************************************************************************** */ +int main(void) { + system_init(); + uart_on(0, 115200, NULL); + adc_on(); + + uprintf(0, "System started\n"); + msleep(5); + watchdog_config(&wdconf); + uprintf(0, "Watchdog started\n"); + + while (1) { + watchdog_feed(); + chenillard(50); + /* ADC Test */ + adc_display(LPC_ADC_NUM(0), 0); + } + return 0; +} + + + -- 2.43.0