#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE ) void InitGPIOSpeed (void) { // RCC->APB2ENR |= 0x70; // valide les horloges des port C,D et E /* 0x70 = 0111 0000 */ GPIOE->CRH = 0x22222222; /* Configure les lignes 8 à 15 du GPIO E pour les LEDs */ // on peut s'arrêter ici en précisant que le paramétrage par défaut des ligne est la valeur 4 // donc des entrées flottantes const unsigned short mask[]={0x0000,0x0100,0x0300,0x0700,0x0F00,0x1F00,0x3F00,0x7F00,0xFF00}; void PiloteLeds(unsigned int v, unsigned int vmax) PiloteLeds (entier v, entier vmax) Début Déterminer le rapport Définir l’état des DEL Commander les DEL Fin { // vmax=500 >8 unsigned short odr; unsigned int i=0; odr = GPIOE->ODR; // lecture de la commande actuelle odr &= 0x00FF; // efface PE8 à PE15 mais conserve les autres valeurs if(v != 0) { for (i=1;i<8;i++) { if (v <= i*vmax/8 ) break; // i donne le rapport en 1/8ième } } odr |= mask[i]; // récupère les Leds à allumer GPIOE->ODR = odr; // commande l'état des lignes de port } void initTimerSpeed (void) { RCC->APB1ENR |= 2; /* enable clock for TIM3 */ TIM3->PSC = 360-1; TIM3->ARR = 1000-1; TIM3->CR1 = 0; /* reset command register 1 */ TIM3->CR2 = 0; /* reset command register 2 */ TIM3->DIER = 9 ; // valide CC3IE et UIE TIM3->CR1 |= 1; /* Enable Timer */ TIM3->SR = 0; // efface tous les évènements du timer 3 NVIC_ClearPendingIRQ(TIM3_IRQn); //efface le drapeau d'it en attente NVIC_EnableIRQ(TIM3_IRQn); /* enable TIM3 interrupt */ } void TIM3_IRQHandler (void) { if { } if { } if { } } (TIM3->SR & 1) /* UIF interrupt ? */ period=1; cvp=cvi; cvi=0; TIM3->SR &= ~1; /* clear UIF flag (TIM3->SR & CC3_OF_MASK) /* UIF interrupt ? */ // ne doit pas arriver TIM3->SR &= ~(CC3_OF_MASK); (TIM3->SR & CC3_IF_MASK) /* UIF interrupt ? */ cvi++; TIM3->SR &= ~(CC3_IF_MASK); #define RIGHT 13 // PD13 #define LEFT 15 // PD15 #define MAX_SPEED 500 #define MIN_SPEED 0 int main (void) { char buf1 [15]; char buf2 [15]; unsigned int cdeSpeed=0; unsigned char chgSpeed=1; float compSpeed=0; // vitesse calculée InitTimerSpeed() // InitGPIOSpeed() InitMotor() // fonction créée par d’autres programmeurs Faire Déterminer s’il faut changer de vitesse (joystick + modifier CdeSpeed). Si chgSeep alors chgSpeed=0 SetMotorSpeed(CdeSpeed) fin si Si period=1 alors calculer la vitesse CompSpeed(circonférence= 2πr) fin si DisplayLeds(CompSpeed, MAX-SPEED) SystemInit(); InitGPIOSpeed(); initMotor(); periphRemap(); tim2_Init(); initTimerSpeed(); while (1) { /* loop forever */ if ((GPIOD->IDR & RIGHT)== 0) // accélération { while ((GPIOD->IDR & RIGHT)== 0); // attend le relâchement if (cdeSpeed<MAX_SPEED) cdeSpeed++; // incrémente la vitesse du moteur chgSpeed=1; } if ((GPIOD->IDR & LEFT)== 0) // décérélation { while ((GPIOD->IDR & LEFT)== 0); // attend le relâchement if (cdeSpeed>MIN_SPEED) cdeSpeed- -; chgSpeed=1; } if (chgSpeed==1) { SetMotorSpeed(cdeSpeed); chgSpeed=0; } if (period==1) { //décrémente la vitesse du moteur compSpeed = cvp*2*3.14159*5*100 /200; // vitesse en cm/s period=0; } } }