Topic de Senestin :

Quelqu'un s'y connait en système embarqué?

J'ai un exo a rendre demain et j'ai fais un code sur stm32idle mais il ne marche pas je ne sais pas ce qu'est le problème
Et comment veux-tu qu’on aide si tu n’en dis pas plus?
Chagpt comme n'importe quel étudiant aujourd'hui
https://image.noelshack.com/fichiers/2018/26/7/1530476579-reupjesus.png
Langage ? C++ ?
IDE ? C'est stm32idle ? Connais pas...
C'est quoi le système, quelle carte ?

Le 12 juin 2025 à 18:13:14 :
Chagpt comme n'importe quel étudiant aujourd'hui
https://image.noelshack.com/fichiers/2018/26/7/1530476579-reupjesus.png

L'ia sert pas a grand chose dans ce domaine

T'as un diagramme de développement ?
Surtout ne donne pas de détails ni le code,on risquerai de t'aider https://image.noelshack.com/fichiers/2021/04/4/1611841177-ahiahiahi.png
qq1 si connait en dev web ? C'est pour un site internet

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 https://image.noelshack.com/fichiers/2021/04/4/1611841177-ahiahiahi.png

// ------------------------
// Register Base Addresses
// ------------------------

  1. define RCC_BASE 0x40021000
  2. define GPIOC_BASE 0x48000800
  3. define LPUART1_BASE 0x40008000

// ------------------------
// RCC Registers
// ------------------------

  1. define RCC_AHB2ENR (*(volatile unsigned int *)(RCC_BASE + 0x4C))
  2. define RCC_APB1ENR2 (*(volatile unsigned int *)(RCC_BASE + 0x60))

// ------------------------
// GPIOC Registers
// ------------------------

  1. define GPIOC_MODER (*(volatile unsigned int *)(GPIOC_BASE + 0x00))
  2. define GPIOC_AFRL (*(volatile unsigned int *)(GPIOC_BASE + 0x20))

// ------------------------
// LPUART1 Registers
// ------------------------

  1. define LPUART_CR1 (*(volatile unsigned int *)(LPUART1_BASE + 0x00))
  2. define LPUART_CR2 (*(volatile unsigned int *)(LPUART1_BASE + 0x04))
  3. define LPUART_CR3 (*(volatile unsigned int *)(LPUART1_BASE + 0x08))
  4. define LPUART_BRR (*(volatile unsigned int *)(LPUART1_BASE + 0x0C))
  5. define LPUART_ISR (*(volatile unsigned int *)(LPUART1_BASE + 0x1C))
  6. define LPUART_RDR (*(volatile unsigned int *)(LPUART1_BASE + 0x24))
  7. define LPUART_TDR (*(volatile unsigned int *)(LPUART1_BASE + 0x28))

// ------------------------
// 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;
}

Pose ta question j'ai 20 ans d'expérience en embarqué et j'ai travaillé chez Sony
etape 1, branchez cursor à ton vs code sinon tes un golem et je ne discute pas avec toi pour debugger.

Tu utilises :
define RCC_BASE 0x40021000
Mais define seul n'existe pas en C. Il faut utiliser la directive de préprocesseur correcte :

  1. define RCC_BASE 0x40021000

Et cela vaut pour toutes les autres lignes du genre.

Mauvais offset pour GPIOC_AFRL
Tu as :

  1. define GPIOC_AFRL (*(volatile unsigned int *)(GPIOC_BASE + 0x20))

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.

essaye avec gemini 2.5 pro via studio AI :ok:

L'op t'as de la chance de tomber sur un khey qui t'aide plus haut https://image.noelshack.com/fichiers/2018/26/7/1530476579-reupjesus.png

J'étais sur le point de dire que c'est finit aujourd'hui de poser des questions techniques sur des forums FR https://image.noelshack.com/fichiers/2018/26/7/1530476579-reupjesus.png

Données du topic

Auteur
Senestin
Date de création
12 juin 2025 à 18:09:50
Nb. messages archivés
17
Nb. messages JVC
17
Voir le topic sur JVC

Afficher uniquement les messages de l'auteur du topic

En ligne sur JvArchive

JvArchive compagnon

Découvrez JvArchive compagnon , l'userscript combattant la censure abusive sur le 18-25 !