Bonjour,
J'aurais besoin d'un coup de pouce pour utiliser l'UART sur un STM32F446RE (board nucléo). J'ai du oublier quelque chose mais je tourne en rond et je ne vois pas...
Tout d'abord, pour vous faciliter la tâche je vous réunis ci-dessous les liens vers le Reference Manual, et la datasheet du µC :
- Datasheet : http://www.st.com/resource/en/datasheet/stm32f446re.pdf
- Reference manual : http://www.st.com/content/ccc/resour...DM00135183.pdf
Ma procédure est la suivante :
• Activer la clock sur le GPIO sur lequel il y a l’UART qu’on va utiliser
(USART2 : D1 et D0)
TX = D1 = PA2
RX = D0 = PA3
RCC->AHB1ENR = BIT0 à 1
• Activer la clock de l’UART qu’on va utiliser
RCC->APB1ENR = BIT17 à 1
• Configurer les pins concernés au niveau GPIO
La pin TX (transmission) doit être en low speed alternate function (AF7) output push-pull
GPIOA->MODER = BIT4 à 0 + BIT5 à 1 pour alternate function mode
GPIOA->OTYPER = BIT2 à 0 pour output push-pull
GPIOA->OSPEEDR = BIT4 à 0 + BIT5 à 0 pour low speed
GPIOA-> AFRL = BIT11 à 0
BIT10 à 1
BIT9 à 1
BIT8 à 1
La pin RX (réception) doit être en floating input avec pull up ou down si necessaire
GPIOA->MODER = BIT 7 à 0 + BIT6 à 0
GPIOA->AFRL = BIT15 à 0 //Voir si utile de la mettre en alternate function également ?
BIT14 à 1
BIT13 à 1
BIT12 à 1
• Configurer la valeur du baudrate (voir les tableaux en oversampling par 16 je pense avec clock 16mhz mais pas sûr) = 104.1875
USART2->BRR |= 104 << 4 ;
USART2->BRR |= 1875
• Choisir une taille de 8 bits de données
Rien à toucher car c’est de la mise à 0
• Choisir un seul bit de stop
USART2->CR2 = BIT13 0 à et BIT12 à 0
• Mettre en fonction l’USART
USART2->CR1 = BIT13 à 1
• Mettre en fonction le RX pour recevoir les data
USART2->CR1 = BIT2 à 1
• Mettre en fonction le TX pour envoyer des data
USART2->CR1 = BIT3 à 1
Est-ce que vous validez cette procédure ?
Voici le code associé :
Si les pros du STM32 pouvaient me donner le petit truc qu'il me manque, ce serait au topCode://Activation des horloges RCC->AHB1ENR = (RCC->AHB1ENR) | (BIT0); //Activation de la clock du GPIO concerné par l'UART RCC->APB1ENR = (RCC->APB1ENR) | (BIT17); //Activation de l'UART voulu /*VOIR SI Y A PAS UNE HORLOGE A ACTIVER SUR LES ALTERNATE FUNCTIONS*/ //Configuration des GPIO //Config de TX GPIOA->MODER = (GPIOA->MODER) &~ (BIT4); //Configuration PA2 pour pin TX en alternate function GPIOA->MODER = (GPIOA->MODER) | (BIT5); GPIOA->OTYPER = (GPIOA->OTYPER) &~ (BIT2); //Output push-pull GPIOA->OSPEEDR = (GPIOA->OSPEEDR) &~ (BIT4); //Configuration en low-speed GPIOA->OSPEEDR = (GPIOA->OSPEEDR) &~ (BIT5); GPIOA->AFR[0] = (GPIOA->AFR[0]) &~ (BIT11); //Configuration de l'alternate function GPIOA->AFR[0] = (GPIOA->AFR[0]) | (BIT10); GPIOA->AFR[0] = (GPIOA->AFR[0]) | (BIT9); GPIOA->AFR[0] = (GPIOA->AFR[0]) | (BIT8); //Config de RX GPIOA->MODER = (GPIOA->MODER) &~ (BIT7); //Mise en floating input GPIOA->MODER = (GPIOA->MODER) &~ (BIT6); GPIOA->AFR[0] = (GPIOA->AFR[0]) &~ (BIT15); //Configuration de l'alternate function pas sur que ce soit utile GPIOA->AFR[0] = (GPIOA->AFR[0]) | (BIT14); GPIOA->AFR[0] = (GPIOA->AFR[0]) | (BIT13); GPIOA->AFR[0] = (GPIOA->AFR[0]) | (BIT12); //Configuration de l'USART USART2->BRR |= 104<<4; //Baudrate USART2->BRR |= 1875; //Mise en fonction de l'USART USART2->CR1 = (USART2->CR1) | (BIT13); USART2->CR1 = (USART2->CR1) | (BIT2); USART2->CR1 = (USART2->CR1) | (BIT3); //Transmission d'un octet par l'USART USART2->DR = 0b11111111 ; //Octet en binaire en faisant un ou bit à bit do{ }while(((USART2->SR)&BIT7) !=1) ; //On attends la fin de transmission via le bit TXE
Je vois vraiment pas ce que j'ai oublié de faire...
Merci d'avance à ceux qui se pencheront sur mon soucis.
-----