* CNF & M0DE * # MODEy : # Définit la direction de # fonctionnement de la ligne # y du port en question. # 00 -> Entrée # 01 -> Sortie (10Mhz) # 10 -> Sortie (2Mhz) # 11 -> Sortie (50Mhz) # CNFy : # Définit le type de # fonctionnement de la ligne y # du port en question selon la # direction choisie. # CNFy en Entrée : # 00 -> Analogique (mesure...) # 01 -> Entrée flottant (Res tir) # 10 -> Entrée avec tirage # 11 -> Réservé # CNFy en Sortiee : # 00 -> std. push-pull # 01 -> std. collecteur ouvert # 10 -> alternative push-pull # 11 -> alt. collecteur ouvert # Ex : CNF = 10 et MODE = 11 # -> Ob1011 -> 0xB #///////////////////////////// * Définitions * # signal numériq vs analogiq : #Un signal numérique ne peut #prendre que deux valeurs #significatives (V ≤ VL) ou #1 (V ≥ VH) alors qu'un signal #analogique peut prendre dans #l'absolu une infinité de #valeurs. Pour exploiter les #signaux analogiques on utilis #un convertisseur analogique/ #numérique qui fournit une #approximation de leur valeur. #////// # Pq "void fonction(void)" : #Les exceptions sont la #réponse du processeur à des #événements asynchrones par #rapport au flot du programme. #Il n’est pas possible #d’anticiper l’arrivée de ces #événements et donc de #préparer un passage de param- #ètre, de même qu’il n’ est # pas possible de récupérer #une valeur de retour éventue- #lle d’où le prototype utilisé #////// # Contrôleur pour autoriser # exceptions : # Exceptions sont autorisées # de manière générale au niv # du contrôleur NVIC en # complément de la validation # générale des interruptions # masquables dans le registre # PSR. #////// # condition pour que exception # prenne le pas sur une autre : #Il faut qu’elle soit plus #prioritaire (valeur de priorité #plus faible) et bien sûr qu’elle #soit autorisée. #////// # Coder chaînes caractères : # Code ASCII, # taille caractère -> 8 bits #////// # Interet interruption par rapp # à scrutation des registres : # scrutation registre prend # beaucoup de ressources CPU #////// # Registre CPU vs periph interne: # registre périphériques ont une # adress / CPU pas accès par adr #////// # Autre : # Le registre SP est utilisé # par le CPU comme pointeur # de pile. # Drapeau N permet de savoir # si le résultat d’une opérat- # ion a fourni un résultat # négatif ou non. # L'exception "Erreur matérie- # lle" ne possède pas la # priorité la plus importante. # Le débogueur utilisé en TP # utilise le lien JTAG pour # communiquer avec le processeur # Il est possible de modifier # la priorité de l’interruption # TIM3_IRQn. # Le registre PC sert à pointer # les instructions du programme. # L’instruction PUSH empile un # mot de 32 bits. # L’instruction BL n'agit pas # que sur le registre PC. #///////////////////////////// * Codage * Déclaration de GPIOB : # #define GPIOB ((GPIO_TypeDef*) # GPIOB_BASE ) Paramètrage des ports : # GPIOx_CRL pour lignes 0 à 7 # GPIOx_CRH pour lignes 8 à 15 # ex : PE8 en sortie 2Mhz std PP # -> Ob0010 -> 0x2 # temp = GPIOE->CRH; # temp &= 0xFFFFFFF0; # temp |= 0x00000002; # GPIOE->CRH = temp; Utilisation des timers : # Configuration : # calc: T = 1/Fclk(PSC+1)(ARR+1) # PSC = 36000-1 = 35999 # ARR = 1000-1 = 999 #////// # opérations à effectuer pour # que le TIMER3 puisse générer # une interruption périodique à # la remise à 0 de CNT : # Il faut autoriser l'interrupt- # ion TIM3 au niveau du contrôl- # eur NVIC. Paramétrer le timer # et valider l'interruption de # remise à 0 avec le registre # DIER (bit UIE). Initialisation de Timer # pour STM32 : # TIM3 => RCC->APB1ENR |= 2; # TIM2 => RCC->APB1ENR |= 1; # TIM4 => RCC->APB1ENR |= 4; void tim3Init (void) { RCC->APB1ENR |= 2; TIM3->PSC = 36000-1; TIM3->ARR = 1000-1; TIM3->CR1 = 0; TIM3->CR2 = 0; TIM3->DIER =1; TIM3->SR = 0; TIM3->CR1 = 1; NVIC_ClearPendingIRQ(TIM3_IRQn); NVIC_EnableIRQ(TIM3_IRQn); } #//////// Drapeau UIF : # Si drapeau UIF=1 alors -> # if (TIM3->SR & 1) # drapeau UIF=0 (clear) -> # TIM3->SR &= ~1; #//////// Programme principal : # rappels : # int main(void){ # */ init des variables /* # SystemInit(); # */ init des fonctions /* # tim3Init(); # TIM3->CNT=0; # TIM3->CCR1 = 1000; # # for (;;){ /* Loop forever */ # */ Le code demandé /* # } */ Fermeture loop F/* #} */ Fermeture main /*