Veri Sayfasının 31. bölümünü okuyorsanız, buradan ulaşabilirsiniz , işler sizin için biraz daha açık olabilir.
İşte bildiklerimin bir özeti:
PIO, Paralel Giriş / Çıkış anlamına gelir ve aynı anda birden çok kayıt portunu okuma ve yazma işlevi sunar. Veri sayfasında bir kayıttan bahsedildiği yerde, örneğin PIO_OWER, Arduino kütüphanesinde bunlara erişmek için makrolar vardır REG_PIO? _OWER nerede? mevcut farklı portlar için A, B, C veya D'dir.
Hala REG_PIOC_OWER = 0xdeadbeef gibi kısaltma tabanlı kayıt aramalarından daha okunabilir hale getirdiği için pinlerde giriş / çıkış ayarlamak için yavaş Arduino pinMode () işlevini kullanma eğilimindeyim, ancak daha sonra pinleri ayarlamak için doğrudan kayıtları kullanın performans / senkronizasyonu. Henüz girdi ile hiçbir şey yapmadım, bu yüzden örneklerimin tümü çıktı tabanlıdır.
Temel kullanım için çıkış hatlarını yüksek ayarlamak için REG_PIO? _SODR, düşük ayarlamak için REG_PIO? _CODR kullanırsınız. Örneğin REG_PIOC_SODR = 0x00000002, PORTC'de bit 1'i (sıfırdan sayılı) ayarlayacaktır (bu, Due dijital pim 33'tür). PORTC üzerindeki diğer tüm pimler değişmeden kalır. REG_POIC_CODR = 0x00000002, PORTC düşük bit 1'i ayarlayacaktır. Yine diğer tüm pimler değişmeden kalır.
Bu hala optimal olmadığından veya paralel verilerle senkronize edildiğinizden, bir portun 32 bitinin tümünü tek bir çağrı ile yazmanıza izin veren bir kayıt vardır. Bunlar REG_PIO? _ODSR'dir, bu nedenle REG_PIOC_ODSR = 0x00000002 artık PORTC yüksekte bit 1'i ayarlayacak ve PORTC'deki diğer tüm bitler tek bir CPU komutunda anında düşük olacaktı.
Aynı anda bir portun 32 bitini de ayarlamanız gereken bir durumda olmanız pek olası olmadığından, pinlerin mevcut değerini saklamanız, bunları gizlemek için bir AND işlemi yapmanız gerekir. değiştirmek istiyorsanız, yüksek ayarlamak istediğiniz olanları ayarlamak için bir OR işlemi gerçekleştirin, ardından yazmanızı ve tekrarlayın ve bu uygun değildir. Bunun üstesinden gelmek için, CPU'nun kendisi sizin için maskeleme yapacak. OWSR'de ayarlanan bitlerle eşleşmeyen ODSR'lere yazdığınız bitleri maskeleyecek OWSR (çıktı yazma durum kaydı) adı verilen bir kayıt vardır.
Yani, şimdi REG_PIOC_OWER = 0x00000002 (bu OWSR'nin bit 1'ini ayarlar) ve REG_PIOC_OWDR = 0xfffffffd (bu OWSR'nin bit 1 dışındaki tüm bitleri temizler) çağırır ve daha sonra REG_PIOC_ODSR = 0x00000002'yi tekrar çağırırsak, bu sefer sadece biraz değişecektir 1 PORTC ve diğer tüm bitler değişmeden kalır. Gerçeğine dikkat OWER sağlayan herhangi bit 1 olarak ayarlanır yazdığınız değer ve OWDR devre dışı bırakır herhangi bit 1 olarak ayarlanır yazdığınız değer. Bunu okuduğumda bunu anladı rağmen, hala OWDR engelli bit benim ilk test kod düşünme yazarken bir kod hata yapmak başardı değildi değer 1 olarak ayarlanmış yazdım.
Umarım bu en azından Due CPU'nun PIO'sunu anlamanız için biraz başlangıç yapmıştır. Bir okuma ve bir oyun var ve başka sorularınız varsa, onlara cevap vermeye çalışacağım.
Düzenleme: Bir şey daha ...
PORT'ların hangi bitlerinin Due'ın hangi dijital hatlarına karşılık geldiğini nasıl bilebilirsiniz? Şuna bir göz at: Due Pinout