#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE ) void InitFeux (void) {// on peut simplifier le code en se passant de la variable temp unsigned int temp; RCC->APB2ENR |= 0x7C; // valide PA, ..., PE temp = GPIOE->CRH; // paramétrage des lignes PE8 à 13 (sorties à 2 MHz) temp &= 0xFF000000; temp |= 0x00222222; GPIOE->CRH = temp; temp = GPIOD->CRH; // paramétrage de la ligne PD12 à 15(facultatif si on précise que 4 est la valeur par défaut) temp &= 0x0000FFFF; temp |= 0x44440000; GPIOD->CRH = temp; temp = GPIOB->CRH; // paramétrage de la ligne PB14 temp &= 0xF0FFFFFF; temp |= 0x08000000; GPIOB->CRH = temp; GPIOB->ODR |= 1<<14; // pour obtenir un tirage au Vcc sur PB14(pas demandé) } void PiloteGroupeFeux(uint8 groupe, uint8 couleur) { uint16 position; switch (groupe) // selon le groupe { case G13: position = 8; // position du premier bit de couleur GPIOE->ODR &= ~0x0700; //force les 3 bits de couleur à 0 if (couleur<=Rouge) GPIOE->ODR |= (1<<(position+couleur)); break; case G24: position = 11; // position du premier bit de couleur GPIOE->ODR &= ~0x3800; //force les 3 bits de couleur à 0 if (couleur<=Rouge) GPIOE->ODR |= (1<<(position+couleur)); break; default:;// on peut éventuellement gérer les erreurs } GPIOE->ODR |= 0xC000; void tim3Init (void) { RCC->APB1ENR |= 2; TIM3->PSC = 36000-1; TIM3->ARR = 1000-1; TIM3->CR1 = 0; TIM3->CR2 = 0; /* init clock for TIM3 */ /* set prescaler */ /* reset command register 1 */ /* reset command register 2 */ /* set auto-reload */ TIM3->DIER =1; TIM3->SR = 0; TIM3->CR1 = 1; // pour valider l'interruption de remise à 0 de CNT (en vert la partie relative à l'it TIM3) // efface tous les évènements du timer 3 NVIC_ClearPendingIRQ(TIM3_IRQn); NVIC_EnableIRQ(TIM3_IRQn); //efface le drapeau d'it en attente /* Enable Timer */ /* enable TIM3 interrupt */ uint16 cpt=0; uint8 Nuit=0, StateJour=0, StateNuit=0; void TIM3_IRQHandler (void) { // interruption de débordement if (TIM3->SR & 1) } { /* UIF interrupt ? */ if (cpt!=0) cpt--; if (cpt==0) // la temporisation est écoulée (il faut changer d'état selon le jour ou la nuit) { if(Nuit==1) // solution facile utilisation d'une séquence SeqNuit pour la nuit { cpt =SeqNuit[StateNuit].tempo;//durée de commande des feux correspondant à StateNuit StateNuit = (StateNuit+1)%SN_MAX; PiloteGroupeFeux(G13, SeqNuit[StateNuit].feux13); //Piloter les groupes de feux en fonction de l'état PiloteGroupeFeux(G24, SeqNuit[StateNuit].feux24); StateJour=~0; //pourunerepriseenrouge/rougeenmodejour } else { StateJour++; if( StateJour >= SJ_MAX) StateJour =1 ;// rester dans la limite de la table cpt =SeqJour[StateJour].tempo;//durée de commande des feux correspondant à StateJour //Piloter les groupes de feux en fonction de StateJour (PiloteGroupeFeux) PiloteGroupeFeux(G13, SeqJour [StateJour].feux13); //Piloter les groupes de feux en fonction de l'état PiloteGroupeFeux(G24, SeqJour [StateJour].feux24); } } TIM3->SR &= ~1; /* clear UIF flag */ // fin débordement de comptage } }