11
votes

Générer un délai de nanoseconde en C sur STM32

J'utilise contrôleur STM32F2 et je suis interface avec un ST7036 écran LCD via une interface parallèle 8 bits.

La fiche technique indique qu'il devrait y avoir un deuxième délai de 20 nano entre l'adresse de l'adresse et la durée de configuration.

Comment générer un délai de 20 nanosecondes dans C?


2 commentaires

Avez-vous essayé la fonction nanosleep () ? Remarque: vous devez inclure pour l'utiliser.


Vous n'avez pas besoin de faire des retards NS. Ce sont des retards min par datasheet, mais vous pouvez en faire plus. En outre, pourquoi ne voulez-vous pas utiliser SPI ou I2C? C'est beaucoup plus simple et vous pouvez envoyer des données dans un paquet. Vous allez donc libérer le contrôleur pour d'autres tâches.


3 Réponses :


9
votes

La première spécification que j'ai trouvée de STM32F2 suppose une fréquence d'horloge de 120 MHz. C'est environ 8NS par cycle d'horloge. Vous auriez besoin d'environ trois instructions de cycle unique entre les opérations successives d'écriture ou de lecture / écriture. En C, a ++; va probablement faire (si A est situé dans la pile).


3 commentaires

Ouais - Exactement - toutes les réponses, mais celle-ci donne des solutions qui prendraient 100 fois plus de temps que nécessaire ... 20ns est juste quelques cycles, quelques nops en montage seront plus que suffisants ...


Ne serait-il pas bon de vérifier le retard à l'aide du registre de comptage de cycle spécialement conçu à cette fin, quelle que soit la méthode de délai d'utilisation? Sinon, je suppose que cela pourrait être vérifié avec un oscilloscope et des goupilles numériques.


Le stopwatch_delay () La fonction ci-dessus l'accomplit parfaitement pour moi et peut être vérifié ou utilisé pour différentes longueurs de retard.



15
votes

Utilisez stopwatch_delay (4 ) ci-dessous pour accomplir environ 24nes de retard. Il utilise le registre DWT_CYCCNT de STM32, spécialement conçu pour compter les tiques d'horloge actuelles, située à l'adresse 0XE0001004.

Pour vérifier la précision du retard (voir Main ), vous pouvez appeler stopwatch_start , exécuter stopwatch_delay (ticks) , puis appeler Stopwatch_stop et vérifier avec calcnanosecondsfromstopWatch (m_nstart, m_nstop) . Ajuster cochets au besoin. xxx


5 commentaires

Êtes-vous sûr que cela fonctionnerait? Un cycle d'instruction serait d'environ 5ns..obvieusement, le code utilise plus de 5 instructions. Donc, le temps minimum serait de 25ns ... Le délai utilisé dans le matériel pourrait toutefois être beaucoup moins de 25n.


Ouais. Le code doit être modifié au besoin. On pourrait sûrement simplement utiliser le minimum de pièces nécessaires, ou idéalement un utilisateur de ce code exécuterait __ no_Operation () mille fois dans une boucle à l'intérieur principale () (par exemple run_my_function () est) pour obtenir le chronomètre nano-seconde pour 1000 exécutions, puis divisez simplement ce numéro de 1000 pour voir combien de temps un simple pipelined __ no_Operation () sur le système en question ... puis utiliser comme vous le souhaitez.


Juste un commentaire, 1000 NOP / 1000 peut ne pas être égal à 1 NOP. Grande explication quand même!


Vrai, il ne se rapproche que d'un NOP pipelined . Donc, oui, moins les NOPS utilisaient, plus la mesure va dériver de la réalité (à une certaine mesure).


Quelques remarques: 1) Si CPU_CYCLES est une minuterie en cours d'exécution, cela ne fonctionnera pas quand il est proche de 0xFFFFFFFF , car find_ticks débordera et Ensuite, stopwatch_getticks ()> = end_tacks quittera immédiatement. 2) 1000 * ndifftticks débordera si vous laissez le chronomètre exécuté pendant plus de 26ms (si j'ai calculé correctement). 3) Il est difficile de savoir pourquoi votre stopwatch_start / stopwatch_stop macros n'utilise pas dwt_cyccnt car il est déjà défini. 4) Pour une solution générale, stopwatch_reset est une mauvaise idée puisqu'il vous empêche d'utiliser le chronomètre à partir de plusieurs interruptions.



1
votes

Vous devez examiner le périphérique FSMC disponible dans votre puce. Bien que la configuration puisse être compliquée, surtout si vous n'êtes pas déposé dans une pièce de mémoire qu'il a été conçue, vous constaterez peut-être que votre périphérique interfacé parallèle est assez bien adapté à l'un des modes d'interface mémoire.

Ces sortes de contrôleurs de mémoire externes doivent avoir une bande d'options de chronométrage configurables pour prendre en charge la plage de copeaux de mémoire différentes, vous pourrez donc garantir les horaires requis par votre feuille de données.

Le bon avantage de pouvoir faire ceci est votre LCD semblera alors comme n'importe quel ancien périphérique mappé de mémoire, résumant les détails d'interfaçage de niveau inférieur.


0 commentaires