00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include <avr32/io.h>
00049 #include "compiler.h"
00050
00058 static void wdt_set_ctrl(unsigned long ctrl)
00059 {
00060 AVR32_WDT.ctrl = ctrl | (AVR32_WDT_KEY_VALUE << AVR32_WDT_CTRL_KEY_OFFSET);
00061 AVR32_WDT.ctrl = ctrl | ((unsigned long) (~AVR32_WDT_KEY_VALUE << AVR32_WDT_CTRL_KEY_OFFSET) & AVR32_WDT_CTRL_KEY_MASK);
00062 }
00063
00064
00065 long long wdt_get_us_timeout_period(void)
00066 {
00067
00068 return (AVR32_WDT.ctrl & AVR32_WDT_CTRL_EN_MASK) ?
00069 ((1ULL << (((AVR32_WDT.ctrl & AVR32_WDT_CTRL_PSEL_MASK) >> AVR32_WDT_CTRL_PSEL_OFFSET) + 1)) *
00070 1000000 + AVR32_PM_RCOSC_FREQUENCY / 2) / AVR32_PM_RCOSC_FREQUENCY :
00071 -1ULL;
00072 }
00073
00074
00075 void wdt_disable(void)
00076 {
00077 wdt_set_ctrl(AVR32_WDT.ctrl & ~AVR32_WDT_CTRL_EN_MASK);
00078 }
00079
00080
00081 unsigned long long wdt_enable(unsigned long long us_timeout_period)
00082 {
00083 #define MIN_US_TIMEOUT_PERIOD (((1ULL << 1 ) * 1000000 + AVR32_PM_RCOSC_FREQUENCY / 2) / AVR32_PM_RCOSC_FREQUENCY)
00084 #define MAX_US_TIMEOUT_PERIOD (((1ULL << (1 << AVR32_WDT_CTRL_PSEL_SIZE)) * 1000000 + AVR32_PM_RCOSC_FREQUENCY / 2) / AVR32_PM_RCOSC_FREQUENCY)
00085
00086
00087
00088 wdt_set_ctrl(AVR32_WDT_CTRL_EN_MASK |
00089 ((32 - clz(((((Min(Max(us_timeout_period, MIN_US_TIMEOUT_PERIOD), MAX_US_TIMEOUT_PERIOD) *
00090 AVR32_PM_RCOSC_FREQUENCY + 500000) / 1000000) << 1) - 1) >> 1) - 1) <<
00091 AVR32_WDT_CTRL_PSEL_OFFSET));
00092
00093
00094 return wdt_get_us_timeout_period();
00095 }
00096
00097
00098 void wdt_reenable(void)
00099 {
00100 wdt_set_ctrl(AVR32_WDT.ctrl | AVR32_WDT_CTRL_EN_MASK);
00101 }
00102
00103
00104 void wdt_clear(void)
00105 {
00106 AVR32_WDT.clr = 0;
00107 }
00108
00109
00110 void wdt_reset_mcu(void)
00111 {
00112 Disable_global_interrupt();
00113
00114 wdt_enable(0);
00115 while (1);
00116 }