J'utilise contrôleur STM32F2 et je suis interface avec un ST7036 écran LCD via une interface parallèle 8 bits. P>
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. P>
Comment générer un délai de 20 nanosecondes dans C? p>
3 Réponses :
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 ++; code> va probablement faire (si A est situé dans la pile). P>
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 () code> La fonction ci-dessus l'accomplit parfaitement pour moi et peut être vérifié ou utilisé pour différentes longueurs de retard.
Utilisez Pour vérifier la précision du retard (voir stopwatch_delay (4 code>) 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.
Main code>), vous pouvez appeler
stopwatch_start code>, exécuter
stopwatch_delay (ticks) code>, puis appeler
Stopwatch_stop code> et vérifier avec
calcnanosecondsfromstopWatch (m_nstart, m_nstop) code>. Ajuster
cochets code> au besoin. P>
Ê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 () code> mille fois dans une boucle à l'intérieur
principale () code> (par exemple
run_my_function () code> 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 () code> 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 B> pipelined B>. 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 CODE> est une minuterie en cours d'exécution, cela ne fonctionnera pas quand il est proche de
0xFFFFFFFF code>, car
find_ticks code> débordera et Ensuite,
stopwatch_getticks ()> = end_tacks code> quittera immédiatement. 2)
1000 * ndifftticks code> débordera si vous laissez le chronomètre exécuté pendant plus de
26ms code> (si j'ai calculé correctement). 3) Il est difficile de savoir pourquoi votre
stopwatch_start code> /
stopwatch_stop code> macros n'utilise pas
dwt_cyccnt code> car il est déjà défini. 4) Pour une solution générale,
stopwatch_reset code> est une mauvaise idée puisqu'il vous empêche d'utiliser le chronomètre à partir de plusieurs interruptions.
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. P>
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. P>
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. P>
Avez-vous essayé la fonction
nanosleep () code>? Remarque: vous devez inclure code> 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.