Hallo Zusammen,
ich habe in den letzten Tagen schon einige Posts zu dem Thema "Low power
mode" des MSP430FR5720 verfasst.
Endlich kann ich mal ein Stück Code präsentieren, dass zumindest
ansatzweise funktioniert:
1 | #include <msp430.h>
|
2 |
|
3 | void Board_Init();
|
4 | void EnterLPM35();
|
5 |
|
6 | volatile int i=0;
|
7 |
|
8 | int main(void)
|
9 | {
|
10 | WDTCTL = WDTPW | WDTHOLD; // Stop WDT
|
11 |
|
12 | while(1)
|
13 | {
|
14 | Board_Init();
|
15 |
|
16 | for(i=0; i<100; i++){
|
17 | P3OUT |= BIT1;
|
18 | P3OUT &= ~BIT1;}
|
19 |
|
20 | EnterLPM35();
|
21 | }
|
22 | }
|
23 |
|
24 | void Board_Init(void)
|
25 | {
|
26 | // Port Configuration for Measurement
|
27 | P3OUT &= ~BIT1;
|
28 | P3DIR |= BIT1;
|
29 |
|
30 | //Configure Interupt on Switch S1
|
31 | P3DIR &= ~(BIT0); // Configure P3.0 as input direction pin
|
32 | P3OUT &= ~BIT0; // Configure P3.0 as pulled-up
|
33 | P3REN |= BIT0; // P3.0 pull-up register enable
|
34 | P3IES &= ~BIT0; // P3.0 Hi/Low edge
|
35 | P3IFG &= ~BIT0; // Clear all P3.0 interrupt flags
|
36 | P3IE |= BIT0; // P3.0 interrupt enabled
|
37 | P3SEL0 = 0;
|
38 | P3SEL1 = 0;
|
39 | PM5CTL0 &= ~LOCKLPM5; // Lock CS registers
|
40 | }
|
41 |
|
42 |
|
43 | void EnterLPM35(void)
|
44 | {
|
45 | PMMCTL0_H = PMMPW_H; // Open PMM Registers for write
|
46 | PMMCTL0_L |= PMMREGOFF; // and set PMMREGOFF
|
47 | __bis_SR_register(LPM4_bits | GIE);
|
48 | }
|
49 |
|
50 |
|
51 | // Port 3 interrupt service routine
|
52 | #pragma vector=PORT3_VECTOR
|
53 | __interrupt void Port_3(void)
|
54 | {
|
55 | P3IFG &= ~BIT0;
|
56 | P3DIR |= BIT1;
|
57 | P3OUT |= BIT1;
|
58 | P3OUT &= ~BIT1;
|
59 | //__bic_SR_register_on_exit(LPM4_bits);
|
60 | __bic_SR_register_on_exit(LPM4_bits+GIE);
|
61 | }
|
Merkwürdig:
Das Ausgangsbit BIT1 an PORT3 wird mehr oder weniger je nach Lust und
Laune gesetzt d.h. mal scheint der MSP430 wirklich in den Sleep Mode zu
gehen, mal eben nicht.
Vielleicht ergeht es ja gerade Jemandem ähnlich, der weiß was hier noch
falsch ist.
Beste Grüße,
MSPler