33 #include "dev/watchdog.h"
37 int msp430_dco_required;
39 #if defined(__MSP430__) && defined(__GNUC__)
40 #define asmv(arg) __asm__ __volatile__(arg)
44 #if defined(__MSP430__) && defined(__GNUC__) && MSP430_MEMCPY_WORKAROUND
46 w_memcpy(
void *out,
const void *in,
size_t n)
50 dest = (uint8_t *) out;
58 #if defined(__MSP430__) && defined(__GNUC__) && MSP430_MEMCPY_WORKAROUND
60 w_memset(
void *out,
int value,
size_t n)
63 dest = (uint8_t *) out;
65 *dest++ = value & 0xff;
75 #define DELTA ((MSP430_CPU_SPEED) / (32768 / 8))
77 unsigned int compare, oldcapture = 0;
86 BCSCTL1 |= DIVA1 + DIVA0;
87 for(i = 0xffff; i > 0; i--) {
91 CCTL2 = CCIS0 + CM0 + CAP;
92 TACTL = TASSEL1 + TACLR + MC1;
97 while((CCTL2 & CCIFG) != CCIFG);
100 compare = compare - oldcapture;
103 if(DELTA == compare) {
105 }
else if(DELTA < compare) {
122 BCSCTL1 &= ~(DIVA1 + DIVA0);
193 #if defined(__MSP430__) && defined(__GNUC__)
195 static char *cur_break = (
char *)&_end;
205 msp430_add_lpm_req(
int req)
207 if(req <= MSP430_REQUIRE_LPM1) {
208 msp430_dco_required++;
213 msp430_remove_lpm_req(
int req)
215 if(req <= MSP430_REQUIRE_LPM1) {
216 msp430_dco_required--;
221 msp430_cpu_init(
void)
228 #if defined(__MSP430__) && defined(__GNUC__)
229 if((uintptr_t)cur_break & 1) {
234 msp430_dco_required = 0;
238 #define STACK_EXTRA 32
246 #if defined(__MSP430__) && defined(__GNUC__)
252 asmv(
"mov r1, %0" :
"=r" (stack_pointer));
253 stack_pointer -= STACK_EXTRA;
254 if(incr > (stack_pointer - cur_break))
257 void *old_break = cur_break;
275 #ifdef __IAR_SYSTEMS_ICC__
276 sr = __get_SR_register();
277 __bic_SR_register(GIE);
279 asmv(
"mov r2, %0" :
"=r" (sr));
280 asmv(
"bic %0, r2" : :
"i" (GIE));
299 #ifdef __IAR_SYSTEMS_ICC__
300 int __low_level_init(
void)
303 WDTCTL = WDTPW + WDTHOLD;
314 #if DCOSYNCH_CONF_ENABLED
317 msp430_sync_dco(
void) {
322 #define DELTA_2 ((MSP430_CPU_SPEED) / 32768)
325 TBCTL = TBSSEL1 | TBCLR;
326 TBCCTL6 = CCIS0 + CM0 + CAP;
332 while(!(TBCCTL6 & CCIFG));
337 while(!(TBCCTL6 & CCIFG));
338 diff = TBCCR6 - last;
354 }
else if(DELTA_2 > diff) {
void watchdog_init(void)
Copyright (c) 2014, Analog Devices, Inc.