W przypadku opisu kanału wartość TIM_OCMode zmienia się z wartości TIM_OCMode_Toggle (dla sygnału zegarowego) na wartość TIM_OCMode_PWM1. Wartość TIM_Pulse, opisująca wypełnienie sygnału PWM, odczytywana jest z tablicy.
Projekt umożliwia konfigurowanie parametrów sygnału zegarowego i sygnału PWM, jest to realizowane poprzez następujące operacje:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
//przerwanie wywolane przez joystick w pozycji - up else if(EXTI_GetITStatus(EXTI_Line9) != RESET) { if(b == 1) { //ustawienie aktualnej konfiguracji a += 1; if(a > 11){a = 11;} //aktualizacja wartosci rejestru CCR4 licznika TIM1 TIM1->CCR4 = 1000 - c[a]; } else if(b == 2) { //ustawienie aktualnej konfiguracji a -= 1; if(a < 1){a = 1;} //aktualizacja wartosci rejestru ARR licznika TIM1 TIM1->ARR = a * 34; //wyzerowanie wartosci rejestru CNT licznika TIM1 TIM1->CNT = 0; } //wyczyszczenie flagi przerwania EXTI_ClearITPendingBit(EXTI_Line9); } oraz //przerwanie wywolane przez joystick w pozycji - down if(EXTI_GetITStatus(EXTI_Line10) != RESET) { if(b == 1) { //ustawienie aktualnej konfiguracji a -= 1; if(a < 0){a = 0;} //aktualizacja wartosci rejestru CCR4 licznika TIM1 TIM1->CCR4 = 1000 - c[a]; } else if(b == 2) { //ustawienie aktualnej konfiguracji a += 1; if(a > 16){a = 16;} //aktualizacja wartosci rejestru ARR licznika TIM1 TIM1->ARR = a * 34; //wyzerowanie wartosci rejestru CNT licznika TIM1 TIM1->CNT = 0; } //wyczyszczenie flagi przerwania EXTI_ClearITPendingBit(EXTI_Line10); } |
Aktualizacja parametrów odbywa się bezpośrednio do rejestrów w przypadku sygnału PWM jest to aktualizacja rejestru CCR4 licznika TIM1, natomiast dla sygnału zegarowego aktualizowany jest rejestr ARR licznika oraz zerowanie rejestru CNT, zerowanie jest realizowane w celu uniknięcia sytuaji gdy rejestr CNT będzie posiadał większą wartość od ARR.
W przypadku wciśniecia joysticka (pozycja OK) następuje wyłączenie licznika, jest ono realizowane następująco:
1 2 3 4 5 6 7 8 9 10 11 12 |
//przerwanie wywolane przez joystick w pozycji - ok if(EXTI_GetITStatus(EXTI_Line8) != RESET) { //ustawienie trybu dzialania b = 0; //wyłaczenie timera TIM1 TIM_Cmd(TIM1, DISABLE); //wyłaczenie pinów wyjściowych timera TIM_CtrlPWMOutputs(TIM1, DISABLE); //wyczyszczenie flagi przerwania EXTI_ClearITPendingBit(EXTI_Line8); } |
Funkcje obsługi przerwań odwołują się do zmiennych zadeklarowanych w pliku main.c, aby umożliwić odwoływania się do tych zmiennych w funkcji obsługi przerwania należy przeprowadzić ich inicjalizacje jest to realizowane poprzez:
1 2 3 4 |
//zdefiniowanie zmiennej zadeklarowanej w pliku main.c extern int a; extern int b; extern int c[]; |
Mariusz Dziębowski
m.dziebowski@interia.pl