2017-03-21 6 views
-1

J'écris le pilote LCD TFT pour stm32 et j'ai besoin d'écrire des données de 8 bits sur l'écran LCD. J'ai trouvé cette macro dans la bibliothèque de mcufriend, mais je ne sais pas comment cela fonctionne et comment puis-je l'éditer. Quelqu'un peut-il écrire comment écrire une macro comme celle-ci et comment cela fonctionne?Comment écrire des données 8 bits par macro en C?

Macro de la bibliothèque de mcufriend:

#define write_8(d) { \ 
GPIOA->regs->BSRR = 0x0700 << 16; \ 
GPIOB->regs->BSRR = 0x0438 << 16; \ 
GPIOC->regs->BSRR = 0x0080 << 16; \ 
GPIOA->regs->BSRR = (((d) & (1<<0)) << 9) \ 
      | (((d) & (1<<2)) << 8) \ 
      | (((d) & (1<<7)) << 1); \ 
GPIOB->regs->BSRR = (((d) & (1<<3)) << 0) \ 
      | (((d) & (1<<4)) << 1) \ 
      | (((d) & (1<<5)) >> 1) \ 
      | (((d) & (1<<6)) << 4); \ 
GPIOC->regs->BSRR = (((d) & (1<<1)) << 6); \ 
} 
+0

Il écrit donc un tas de valeurs magiques dans un registre matériel. Quelles sont ces valeurs? La fiche technique vous le dira. –

+0

Nous ne sommes pas le site de support de partout où vous avez obtenu cette macro. Vous n'êtes pas sûr de ce que vous avez l'intention de faire; Si vous voulez écrire un octet sur un GPIO sur le STM32, vous pouvez facilement utiliser un simple byte-write pour ODR. Si c'est pour un protocole de bit-banding, utilisez une fonction. N'utilisez jamais une macro où une fonction va faire! C'est une mauvaise pratique. – Olaf

+0

@Olaf Merci. – Sewek

Répondre

2

Cela ressemble à la syntaxe STM32duino:

    PORT-> regs- > REGISTRE = valeur

avec REGISTRE étant BSRR, le registre de réinitialisation de l'ensemble de bits. La valeur que vous affectez à cette option définit les broches 0 à 15 de PORT élevé si le bit correspondant est défini. Les bits 16 à 31 agissent de la même manière que les bits 0 à 15 du registre BRR; Si le bit est activé, la broche correspondante est basse. Si un bit est nul, l'état de la broche correspondante reste inchangé.

Regardons chaque affectation individuelle dans la macro.


GPIOA->regs->BSRR = 0x0700 << 16; 

Ceci définit les broches GPIOA8, GPIOA9 et GPIOA10 faible. ((1<<8) | (1<<9) | (1<<10) == 0x0700, et 16 bits de haute BSRR fixe les bits correspondants bas.)


GPIOB->regs->BSRR = 0x0438 << 16; 

Ceci définit les repères GPIOB3, GPIOB4, GPIOB5 et GPIOB10 bas.


GPIOC->regs->BSRR = 0x0080 << 16; 

Cette broche fixe à faible GPIOC7.


GPIOA->regs->BSRR = 
     (((d) & (1<<0)) << 9) 
     | (((d) & (1<<2)) << 8) 
     | (((d) & (1<<7)) << 1); 

Si le bit 0 de d est défini, la broche GPIOA9 est situé en hauteur.
Si le bit 2 de d est défini, la broche GPIOA10 est définie sur élevée.
Si le bit 7 de d est défini, la broche GPIOA8 est définie sur élevée.


GPIOB->regs->BSRR = 
     (((d) & (1<<3)) << 0) 
     | (((d) & (1<<4)) << 1) 
     | (((d) & (1<<5)) >> 1) 
     | (((d) & (1<<6)) << 4); 

Si le bit 3 de d est réglé, la broche GPIOB3 est situé en hauteur.
Si le bit 4 de d est défini, la broche GPIOB5 est définie sur élevée.
Si le bit 5 de d est défini, la broche GPIOB4 est définie sur élevée.
Si le bit 6 de d est défini, la broche GPIOB10 est définie sur élevée.


GPIOC->regs->BSRR = 
     (((d) & (1<<1)) << 6); 

Si le bit 1 de d est réglé, la broche GPIOC7 est situé en hauteur.


Les trois premières lignes définies sur les repères GPIOA8, GPIOA9, GPIOA10, GPIOB3, GPIOB4, GPIOB5, GPIOB10 et GPIOC7 bas. Le reste des lignes définit les broches GPIOA9, GPIOC7, GPIOA10, GPIOB3, GPIOB5, GPIOB4, GPIOB10 et GPIOA8 élevé, si le bit correspondant est défini dans d. En d'autres termes, la macro définit les broches A9, C7, A10, B3, B5, B4, B10, A8 haute si le bit 0-7 correspondant dans d est défini, et faible si clair. Je devinerais que la macro est utilisée pour communiquer avec un périphérique (probablement un affichage) utilisant un bus parallèle de 8 bits, avec la broche A9 correspondant au bit le moins significatif de chaque octet parallèle envoyé, et la broche A8 à les bits les plus significatifs; les autres broches énumérées ci-dessus entre les deux.

+0

Merci beaucoup, c'est très utile, maintenant je sais comment cela fonctionne. – Sewek