Eigentlich komm ich aus der AVR-Ecke, spiele aber nun mit einem MSP432
Launchpad herum und bin mir nicht ganz sicher wie ich dieses
programmieren soll. Beispielsweise will ich mit dem Timer_A drei
PWM-Signale erzeugen. Also mit CCR0 die Frequenz und mit CCR1-3 jeweils
den Duty-Cycle festlegen. Soweit sogut, nun habe ich aus einem Tutorial
Initialisierungsfunktionen dieser Art entnommen:
1 | /* DriverLib Includes */
|
2 | #include <ti/devices/msp432p4xx/driverlib/driverlib.h>
|
3 |
|
4 | initTimers(){
|
5 | //Timer_A -> PWM generation
|
6 | const Timer_A_UpModeConfig upConfig = {
|
7 | TIMER_A_CLOCKSOURCE_MCLK, // MCLK Clock Source = 24MHz
|
8 | TIMER_A_CLOCKSOURCE_DIVIDER_1, // MCLK/1 = 24MHz
|
9 | 2400, // 2400 tick period = 10kHz
|
10 | TIMER_A_TAIE_INTERRUPT_DISABLE, // Disable Timer interrupt
|
11 | TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE, // Disable CCR0 interrupt
|
12 | TIMER_A_DO_CLEAR // Clear value
|
13 | };
|
14 | Timer_A_configureUpMode(TIMER_A1_BASE, &upConfig);
|
15 | Timer_A_startCounter(TIMER_A1_BASE, TIMER_A_UP_MODE);
|
16 | return;
|
17 | }
|
18 |
|
19 | main(){
|
20 | while(1){}
|
21 | }
|
22 |
|
23 | // Timer_A PWM ISR
|
24 | void TA1_0_IRQHandler(void){
|
25 | Timer_A_clearCaptureCompareInterrupt(TIMER_A1_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0);
|
26 | }
|
Als ich dann im Internet suchte, wie ich die CCR Interrupts einschalten
kann fand ich vor allem diesen 'Style':
1 | /*** Clocks and GPIO set-up would be here and are in the downloadable
|
2 | example, but have not been shown to reduce the code size ***/
|
3 |
|
4 | /*** Timer0_A Set-Up ***/
|
5 | TA0CCR0 |= 1000-1;
|
6 | TA0CCR1 |= 1;
|
7 | TA0CCTL1 |= OUTMOD_7;
|
8 | TA0CTL |= TASSEL_2 + MC_1;
|
9 |
|
10 | /*** Timer1_A Set-Up ***/
|
11 | TA1CCR0 |= 4000-1;
|
12 | TA1CCTL0 |= CCIE;
|
13 | TA1CTL |= TASSEL_2 + MC_1;
|
14 |
|
15 | _BIS_SR(LPM0_bits + GIE);
|
16 | }
|
17 |
|
18 | #pragma vector=TIMER1_A0_VECTOR
|
19 | __interrupt void Timer1_A0 (void) {
|
20 |
|
21 | TA0CCR1 += IncDec_PWM*2;
|
22 |
|
23 | if( TA0CCR1 > 998 || TA0CCR1 < 2 )
|
24 | IncDec_PWM = -IncDec_PWM;
|
25 | }
|
Dort werden die Register direkt beschrieben, so wie ich es bei den
Atmegas immer mache. Also ohne diese Funktionen. Mir geht's jetzt nicht
direkt um die PWM, sondern um die Art zu Programmieren. Diese Funktionen
erscheinen mir eher umständlich und verlagern das Problem vom Wissen der
Registernamen zum Wissen der richtigen Funktionen. Wobei diese
Funktionen zwar manchmal bequemer sind, aber eine gute Dokumentation
habe ich nicht gefunden. Außerdem wird durch den Overhead
Programmspeicher belegt und der Controller wird langsamer?! Kann mir
jemand aus der Embedded Ecke sagen wie das bei Profis gehandhabt wird?