16 #ifdef __MSP430_HAS_PMM__
21 void PMM_enableSvsL (
void)
23 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
24 HWREG16(PMM_BASE + OFS_SVSMLCTL) |= SVSLE;
25 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
28 void PMM_disableSvsL (
void)
30 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
31 HWREG16(PMM_BASE + OFS_SVSMLCTL) &= ~SVSLE;
32 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
35 void PMM_enableSvmL (
void)
37 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
38 HWREG16(PMM_BASE + OFS_SVSMLCTL) |= SVMLE;
39 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
42 void PMM_disableSvmL (
void)
44 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
45 HWREG16(PMM_BASE + OFS_SVSMLCTL) &= ~SVMLE;
46 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
49 void PMM_enableSvsH (
void)
51 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
52 HWREG16(PMM_BASE + OFS_SVSMHCTL) |= SVSHE;
53 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
56 void PMM_disableSvsH (
void)
58 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
59 HWREG16(PMM_BASE + OFS_SVSMHCTL) &= ~SVSHE;
60 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
63 void PMM_enableSvmH (
void)
65 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
66 HWREG16(PMM_BASE + OFS_SVSMHCTL) |= SVMHE;
67 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
70 void PMM_disableSvmH (
void)
72 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
73 HWREG16(PMM_BASE + OFS_SVSMHCTL) &= ~SVMHE;
74 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
77 void PMM_enableSvsLSvmL (
void)
79 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
80 HWREG16(PMM_BASE + OFS_SVSMLCTL) |= (SVSLE + SVMLE);
81 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
84 void PMM_disableSvsLSvmL (
void)
86 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
87 HWREG16(PMM_BASE + OFS_SVSMLCTL) &= ~(SVSLE + SVMLE);
88 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
91 void PMM_enableSvsHSvmH (
void)
93 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
94 HWREG16(PMM_BASE + OFS_SVSMHCTL) |= (SVSHE + SVMHE);
95 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
98 void PMM_disableSvsHSvmH (
void)
100 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
101 HWREG16(PMM_BASE + OFS_SVSMHCTL) &= ~(SVSHE + SVMHE);
102 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
105 void PMM_enableSvsLReset (
void)
107 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
108 HWREG16(PMM_BASE + OFS_PMMRIE) |= SVSLPE;
109 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
112 void PMM_disableSvsLReset (
void)
114 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
115 HWREG16(PMM_BASE + OFS_PMMRIE) &= ~SVSLPE;
116 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
119 void PMM_enableSvmLInterrupt (
void)
121 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
122 HWREG16(PMM_BASE + OFS_PMMRIE) |= SVMLIE;
123 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
126 void PMM_disableSvmLInterrupt (
void)
128 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
129 HWREG16(PMM_BASE + OFS_PMMRIE) &= ~SVMLIE;
130 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
133 void PMM_enableSvsHReset (
void)
135 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
136 HWREG16(PMM_BASE + OFS_PMMRIE) |= SVSHPE;
137 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
140 void PMM_disableSvsHReset (
void)
142 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
143 HWREG16(PMM_BASE + OFS_PMMRIE) &= ~SVSHPE;
144 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
147 void PMM_enableSvmHInterrupt (
void)
149 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
150 HWREG16(PMM_BASE + OFS_PMMRIE) |= SVMHIE;
151 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
154 void PMM_disableSvmHInterrupt (
void)
156 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
157 HWREG16(PMM_BASE + OFS_PMMRIE) &= ~SVMHIE;
158 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
161 void PMM_clearPMMIFGS (
void)
163 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
164 HWREG16(PMM_BASE + OFS_PMMIFG) = 0;
165 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
168 void PMM_enableSvsLInLPMFastWake (
void)
171 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
172 HWREG16(PMM_BASE + OFS_SVSMLCTL) |= (SVSLFP + SVSLMD);
173 HWREG16(PMM_BASE + OFS_SVSMLCTL) &= ~SVSMLACE;
174 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
177 void PMM_enableSvsLInLPMSlowWake (
void)
179 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
180 HWREG16(PMM_BASE + OFS_SVSMLCTL) |= SVSLMD;
181 HWREG16(PMM_BASE + OFS_SVSMLCTL) &= ~(SVSLFP + SVSMLACE);
182 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
185 void PMM_disableSvsLInLPMFastWake (
void)
187 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
188 HWREG16(PMM_BASE + OFS_SVSMLCTL) |= SVSLFP;
189 HWREG16(PMM_BASE + OFS_SVSMLCTL) &= ~(SVSLMD + SVSMLACE);
190 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
193 void PMM_disableSvsLInLPMSlowWake (
void)
195 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
196 HWREG16(PMM_BASE + OFS_SVSMLCTL) &= ~(SVSLFP + SVSMLACE + SVSLMD);
197 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
200 void PMM_enableSvsHInLPMNormPerf (
void)
202 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
203 HWREG16(PMM_BASE + OFS_SVSMHCTL) |= SVSHMD;
204 HWREG16(PMM_BASE + OFS_SVSMHCTL) &= ~(SVSMHACE + SVSHFP);
205 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
208 void PMM_enableSvsHInLPMFullPerf (
void)
210 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
211 HWREG16(PMM_BASE + OFS_SVSMHCTL) |= (SVSHMD + SVSHFP);
212 HWREG16(PMM_BASE + OFS_SVSMHCTL) &= ~SVSMHACE;
213 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
216 void PMM_disableSvsHInLPMNormPerf (
void)
218 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
219 HWREG16(PMM_BASE + OFS_SVSMHCTL) &= ~(SVSMHACE + SVSHFP + SVSHMD);
220 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
223 void PMM_disableSvsHInLPMFullPerf (
void)
225 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
226 HWREG16(PMM_BASE + OFS_SVSMHCTL) |= SVSHFP;
227 HWREG16(PMM_BASE + OFS_SVSMHCTL) &= ~(SVSMHACE + SVSHMD);
228 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
231 void PMM_optimizeSvsLInLPMFastWake (
void)
234 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
235 HWREG16(PMM_BASE + OFS_SVSMLCTL) |= (SVSLFP + SVSLMD + SVSMLACE);
236 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
239 void PMM_optimizeSvsHInLPMFullPerf (
void)
241 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
242 HWREG16(PMM_BASE + OFS_SVSMHCTL) |= (SVSHMD + SVSHFP + SVSMHACE);
243 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
246 uint16_t PMM_setVCoreUp ( uint8_t level){
247 uint32_t PMMRIE_backup, SVSMHCTL_backup, SVSMLCTL_backup;
255 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
259 PMMRIE_backup =
HWREG16(PMM_BASE + OFS_PMMRIE);
260 HWREG16(PMM_BASE + OFS_PMMRIE) &= ~(SVMHVLRPE | SVSHPE | SVMLVLRPE |
261 SVSLPE | SVMHVLRIE | SVMHIE |
262 SVSMHDLYIE | SVMLVLRIE | SVMLIE |
265 SVSMHCTL_backup =
HWREG16(PMM_BASE + OFS_SVSMHCTL);
266 SVSMLCTL_backup =
HWREG16(PMM_BASE + OFS_SVSMLCTL);
269 HWREG16(PMM_BASE + OFS_PMMIFG) = 0;
272 HWREG16(PMM_BASE + OFS_SVSMHCTL) = SVMHE | SVSHE | (SVSMHRRL0 * level);
275 while ((
HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMHDLYIFG) == 0) ;
278 HWREG16(PMM_BASE + OFS_PMMIFG) &= ~SVSMHDLYIFG;
281 if ((
HWREG16(PMM_BASE + OFS_PMMIFG) & SVMHIFG) == SVMHIFG){
284 HWREG16(PMM_BASE + OFS_PMMIFG) &= ~SVSMHDLYIFG;
285 HWREG16(PMM_BASE + OFS_SVSMHCTL) = SVSMHCTL_backup;
288 while ((
HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMHDLYIFG) == 0) ;
292 OFS_PMMIFG) &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG |
293 SVMLVLRIFG | SVMLIFG |
298 HWREG16(PMM_BASE + OFS_PMMRIE) = PMMRIE_backup;
300 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
307 HWREG16(PMM_BASE + OFS_SVSMHCTL) |= (SVSHRVL0 * level);
310 while ((
HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMHDLYIFG) == 0) ;
313 HWREG16(PMM_BASE + OFS_PMMIFG) &= ~SVSMHDLYIFG;
316 HWREG8(PMM_BASE + OFS_PMMCTL0_L) = PMMCOREV0 * level;
319 HWREG16(PMM_BASE + OFS_SVSMLCTL) = SVMLE | (SVSMLRRL0 * level) |
320 SVSLE | (SVSLRVL0 * level);
323 while ((
HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMLDLYIFG) == 0) ;
326 HWREG16(PMM_BASE + OFS_PMMIFG) &= ~SVSMLDLYIFG;
331 HWREG16(PMM_BASE + OFS_SVSMLCTL) &= (SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 +
332 SVSMLRRL1 + SVSMLRRL2
337 ~(SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 + SVSMLRRL1 + SVSMLRRL2);
340 HWREG16(PMM_BASE + OFS_SVSMLCTL) |= SVSMLCTL_backup;
344 HWREG16(PMM_BASE + OFS_SVSMHCTL) &= (SVSHRVL0 + SVSHRVL1 +
345 SVSMHRRL0 + SVSMHRRL1 +
351 ~(SVSHRVL0 + SVSHRVL1 + SVSMHRRL0 + SVSMHRRL1 + SVSMHRRL2);
354 HWREG16(PMM_BASE + OFS_SVSMHCTL) |= SVSMHCTL_backup;
357 while (((
HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMLDLYIFG) == 0) ||
358 ((
HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMHDLYIFG) == 0)) ;
361 HWREG16(PMM_BASE + OFS_PMMIFG) &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG |
362 SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG
366 HWREG16(PMM_BASE + OFS_PMMRIE) = PMMRIE_backup;
369 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
374 uint16_t PMM_setVCoreDown ( uint8_t level){
375 uint32_t PMMRIE_backup, SVSMHCTL_backup, SVSMLCTL_backup;
383 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
387 PMMRIE_backup =
HWREG16(PMM_BASE + OFS_PMMRIE);
388 HWREG16(PMM_BASE + OFS_PMMRIE) &= ~(SVMHVLRPE | SVSHPE | SVMLVLRPE |
389 SVSLPE | SVMHVLRIE | SVMHIE |
390 SVSMHDLYIE | SVMLVLRIE | SVMLIE |
393 SVSMHCTL_backup =
HWREG16(PMM_BASE + OFS_SVSMHCTL);
394 SVSMLCTL_backup =
HWREG16(PMM_BASE + OFS_SVSMLCTL);
397 HWREG16(PMM_BASE + OFS_PMMIFG) &= ~(SVMHIFG | SVSMHDLYIFG |
398 SVMLIFG | SVSMLDLYIFG
402 HWREG16(PMM_BASE + OFS_SVSMHCTL) = SVMHE | (SVSMHRRL0 * level) |
403 SVSHE | (SVSHRVL0 * level);
404 HWREG16(PMM_BASE + OFS_SVSMLCTL) = SVMLE | (SVSMLRRL0 * level) |
405 SVSLE | (SVSLRVL0 * level);
408 while ((
HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMHDLYIFG) == 0 ||
409 (
HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMLDLYIFG) == 0) ;
412 HWREG16(PMM_BASE + OFS_PMMIFG) &= ~(SVSMHDLYIFG + SVSMLDLYIFG);
416 HWREG8(PMM_BASE + OFS_PMMCTL0_L) = PMMCOREV0 * level;
420 HWREG16(PMM_BASE + OFS_SVSMLCTL) &= (SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 +
421 SVSMLRRL1 + SVSMLRRL2
426 ~(SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 + SVSMLRRL1 + SVSMLRRL2);
429 HWREG16(PMM_BASE + OFS_SVSMLCTL) |= SVSMLCTL_backup;
433 HWREG16(PMM_BASE + OFS_SVSMHCTL) &= (SVSHRVL0 + SVSHRVL1 + SVSMHRRL0 +
434 SVSMHRRL1 + SVSMHRRL2
439 ~(SVSHRVL0 + SVSHRVL1 + SVSMHRRL0 + SVSMHRRL1 + SVSMHRRL2);
442 HWREG16(PMM_BASE + OFS_SVSMHCTL) |= SVSMHCTL_backup;
445 while (((
HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMLDLYIFG) == 0) ||
446 ((
HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMHDLYIFG) == 0)) ;
449 HWREG16(PMM_BASE + OFS_PMMIFG) &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG |
450 SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG
454 HWREG16(PMM_BASE + OFS_PMMRIE) = PMMRIE_backup;
456 HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
461 bool PMM_setVCore ( uint8_t level){
464 uint16_t interruptState;
470 actlevel = (
HWREG16(PMM_BASE + OFS_PMMCTL0) & PMMCOREV_3);
474 interruptState = __get_interrupt_state();
475 __disable_interrupt();
481 if (level > actlevel){
482 status = PMM_setVCoreUp(++actlevel);
484 status = PMM_setVCoreDown(--actlevel);
489 if(interruptState & GIE)
491 __enable_interrupt();
497 uint16_t PMM_getInterruptStatus (uint16_t mask)
499 return ( (
HWREG16(PMM_BASE + OFS_PMMIFG)) & mask );