Le 12 juin 2025 à 18:13:52 :
Langage ? C++ ?
IDE ? C'est stm32idle ? Connais pas...
C'est quoi le système, quelle carte ?
C'est du C
Oui Ide STM32L496ZGT6 sur un kameleon board
Le 12 juin 2025 à 18:16:11 :
Surtout ne donne pas de détails ni le code,on risquerai de t'aider![]()
// ------------------------
// Register Base Addresses
// ------------------------
// ------------------------
// RCC Registers
// ------------------------
// ------------------------
// GPIOC Registers
// ------------------------
// ------------------------
// LPUART1 Registers
// ------------------------
// ------------------------
// LPUART Initialization
// ------------------------
int LPUART_init(void) {
// 1. Enable GPIOC and LPUART1 clocks
RCC_AHB2ENR |= (1 << 2); // GPIOC enable
RCC_APB1ENR2 |= (1 << 0); // LPUART1 enable
// 2. Configure PC0 and PC1 to Alternate Function mode (AF8)
GPIOC_MODER &= ~((3 << (0 * 2)) | (3 << (1 * 2)));
GPIOC_MODER |= ((2 << (0 * 2)) | (2 << (1 * 2)));
GPIOC_AFRL &= ~((0xF << (0 * 4)) | (0xF << (1 * 4)));
GPIOC_AFRL |= ((8 << (0 * 4)) | (8 << (1 * 4)));
// 3. Disable DMA
LPUART_CR3 &= ~((1 << 7) | (1 << 6)); // Disable DMAT & DMAR
// 4. Configure word length = 8 bits, no parity, 1 stop bit
LPUART_CR1 &= ~((1 << 12) | (1 << 28)); // M0 = 0, M1 = 0 8-bit
LPUART_CR1 &= ~(1 << 10); // Parity control disabled
LPUART_CR2 &= ~(3 << 12); // 1 stop bit
// 5. Set baud rate: 4 MHz / 115200 35
LPUART_BRR = 35;
// 6. Enable transmitter and receiver
LPUART_CR1 |= (1 << 3); // TE
LPUART_CR1 |= (1 << 2); // RE
// 7. Enable LPUART
LPUART_CR1 |= (1 << 0); // UE
return 0;
}
// ------------------------
// Send one character
// ------------------------
int LPUART_SendChar(unsigned char data) {
while (!(LPUART_ISR & (1 << 7))); // Wait for TXE
LPUART_TDR = data;
return 0;
}
// ------------------------
// Receive one character (non-blocking)
// ------------------------
int LPUART_ReceiveChar(unsigned char *data) {
if (LPUART_ISR & (1 << 5)) { // RXNE
*data = (unsigned char)(LPUART_RDR & 0xFF);
return 1;
}
return 0;
}
// ------------------------
// Send a null-terminated string
// ------------------------
int LPUART_SendString(unsigned char *str) {
while (*str) {
LPUART_SendChar(*str++);
}
return 0;
}
// ------------------------
// Main Application
// ------------------------
int main(void) {
unsigned char ch;
LPUART_init();
// 1. Send alphabet (lowercase then uppercase)
for (ch = 'a'; ch <= 'z'; ch++) {
LPUART_SendChar(ch);
}
for (ch = 'A'; ch <= 'Z'; ch++) {
LPUART_SendChar(ch);
}
// 2. Send welcome message
LPUART_SendString((unsigned char*)"\r\nWelcome message - YourName\r\n");
// 3. Infinite echo loop with typeface change
while (1) {
if (LPUART_ReceiveChar(&ch)) {
// Change case if alphabet
if (ch >= 'a' && ch <= 'z') ch -= 32;
else if (ch >= 'A' && ch <= 'Z') ch += 32;
LPUART_SendChar(ch);
}
}
return 0;
}
Tu utilises :
define RCC_BASE 0x40021000
Mais define seul n'existe pas en C. Il faut utiliser la directive de préprocesseur correcte :
Et cela vaut pour toutes les autres lignes du genre.
Mauvais offset pour GPIOC_AFRL
Tu as :
Mais pour le registre AFRL, l'offset est 0x20 uniquement si c'est AFR[1] (AFRH).
Pour GPIOC :
AFRL (Alternate Function Low register) est à offset 0x20
AFRH est à offset 0x24
Mais GPIO pins 0 et 1 sont bien dans AFRL, donc OK ici. Donc pas une erreur si tu veux gérer PC0 et PC1.
Mauvaise configuration de PC0 et PC1 pour LPUART1 (STM32L4 par ex.)
LPUART1 TX/RX ne sont pas toujours sur PC0/PC1 selon le microcontrôleur.
Sur STM32L4xx (par exemple), LPUART1 est généralement mappé sur :
PA2 (TX)
PA3 (RX)
ou parfois
PB10 / PB11
Donc si tu configures PC0 et PC1, vérifie dans la datasheet que LPUART1 AF8 est bien disponible sur PC0/PC1.
Sinon, tu enverras à des broches muettes.
Commentaire incorrect ou ambigü
// 5. Set baud rate: 4 MHz / 115200 35
LPUART_BRR = 35;
Cela suggère un f_clk = 4 MHz. Mais il n’est pas clair d’où vient ce 4 MHz : c’est l’horloge d’où ?
Et 35 est une valeur étrange pour 115200 bps, car :
BRR = f_clk / baudrate
= 4_000_000 / 115200 34.722
Donc 35 est acceptable, mais ton commentaire mérite de préciser que c’est un arrondi, sinon on croira à une erreur.
// 5. Set baud rate: f_clk = 4 MHz BRR = 4,000,000 / 115200 35
J’ai oublié
Retour dans main() inutile
Ton main() a :
return 0;
Mais ce n'est jamais atteint à cause de la boucle infinie :
while (1) { ... }
Ce n'est pas une erreur, juste inutile.
JvArchive compagnon