Ekran formu Atmel Studio Sen AVR8 mimarisi için GPIO örneğini kullanıyor. AVR32 mimarisi PBA (Bence) ile bağlanmış ayrı HW blok olarak GPIO modülü sokulması tamamen farklıdır. Hiçbir kayıtları, ... DDRC
gibi var
Sen MCU çekirdek sadece modüllerin biridir alt bileşenlerinin ağdaki olarak AVR32 mimarisi bakabilirsiniz. Her biri farklı modüllere bağlanmış 2 ana otobüs PBA ve PBB vardır.
Bunu gerek AVR32 firmware çalışması için:
yapılandırabilir ve kullanmak istediğiniz ana MCU çekirdek saati başlatın
AVR32 MCU çekirdek genellikle düşük 32KHz Saate çalışıyor sıfırladıktan sonra. Daha iyi bir performans elde etmek için 66MHz'e kadar daha yüksek saate ihtiyacınız var. Genellikle bazı sıklıkta PLL'u başlatıyorum ve daha sonra tüm saatleri (CPU, PBA, PBB, HSB) bölüyorum. PLL için bir kaynak olarak, örneğin, dahili RC veya harici kristal tarafından sürülen osilatör için bir saat gereklidir. Ayrıca, USB'u da isterseniz, özel bir frekansa gereksinim duyacağınızı aklınızda bulundurmanız gerekir ... Daha fazla bilgi için SCIF modülünü veri sayfasında veya örnek olarak kontrol edin. buna
anahtarı zaman biraz (100 ms) beklemek veya saati doğrudan çalışıp çalışmadığını kontrol Ya düzgün
başladı (SCIF modül bunun için bazı yetenekleri bence vardır).
yapılandırmak/şimdi eşyalarını
Bootlaoder
sen bakmak gerekir başka bir şey önyükleyici olduğunu do HW modüllerini
kullanılan başlar. JTAG'u beğenmedim, bununla kötü bir deneyimim var (kızartmak çok fazla zaman almıyor ve programlamak gerçekten rahatsız edici). JTAG ile önyükleyiciyi kolayca temizleyebilirsiniz (her bir çipin yanına gönderilir) ve işe geri almamın gerçekten çok kötü olduğuna emin olabilirsiniz. Önyükleyici diğer taraftan basit ve zariftir. Örneğin, FLIP'u kullanıyorum ve çipi programlamak için basit comandline dosyası var. Sonra sadece komut istemi açın. Ve her yeniden/programlamada, komutta son komutu tekrarlamak için enter tuşuna basıyorum ve enter tuşuna basıyorum. JTAG ile yapılan birçok tıklama ile karşılaştırıldığında bu çok daha hızlı ve daha basittir. cmd ait Burada örnek:
avr32-objcopy -O ihex AT32UC3L064.elf AT32UC3L064.hex
Batchisp -device AT32UC3L064 -hardware RS232 -port COM1 -baudrate 115200 -operation onfail abort memory flash erase f blankcheck loadbuffer AT32UC3L064.hex program start reset 0
avr32-objcopy.exe
AVR stüdyo bin dizininde olduğunu.
Bootloader ile derleyiciye programınızın 0x0000
'dan başlamaması gerektiğini söylemeniz gerekir, çünkü bu, bootloader ile çakışacaktır. Bunu yapmak için trambolin örneklerine bakın.
Bu benim AVR32 uygulaması genellikle nasıl göründüğünü: Ben Bir şeylere kendimi de yerine çerçeve yöneticisi kullanmayan
#include <avr32/io.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include "intc.c"
#include "gpio.c"
#include "pm_uc3l.c"
#include "scif_uc3l.c"
#include "adcifb.c"
#include "flashcdw.c"
#include "pdca.c"
//#include "pwma.c"
#include "tc.c"
#include "usart.c"
#include "eic.c"
#include "genclk.h"
#include "osc.c"
#include "dfll.c"
#include "sysclk.c"
#include "status_codes.h"
#include "cycle_counter.h"
#include "sleep.h"
#include "delay.c"
#define cpu_clk 30000000
#define _LED AVR32_PIN_PA04
void system_init()
{
delay_init(115000);
Disable_global_interrupt();
INTC_init_interrupts();
scif_start_rc120M();
delay_ms(100);
pm_set_clk_domain_div((pm_clk_domain_t)AVR32_PM_CLK_GRP_CPU,PM_CKSEL_DIVRATIO_4);
pm_set_clk_domain_div((pm_clk_domain_t)AVR32_PM_CLK_GRP_PBA,PM_CKSEL_DIVRATIO_4);
pm_set_clk_domain_div((pm_clk_domain_t)AVR32_PM_CLK_GRP_PBB,PM_CKSEL_DIVRATIO_4);
pm_set_clk_domain_div((pm_clk_domain_t)AVR32_PM_CLK_GRP_HSB,PM_CKSEL_DIVRATIO_4);
pm_set_all_cksel(SCIF_RC120M_FREQ_HZ,cpu_clk,cpu_clk,cpu_clk);
flashcdw_set_flash_waitstate_and_readmode(cpu_clk);
pm_set_mclk_source(PM_CLK_SRC_RC120M);
delay_init(cpu_clk);
}
//------------------------------------------------------------------------------------------------
void wait_ms(U32 dt)
{
U32 t0,t1;
t0=Get_system_register(AVR32_COUNT);
dt=((dt*cpu_clk)+999)/1000;
t0&=RDTSC_mask;
for (;;)
{
t1=Get_system_register(AVR32_COUNT);
t1&=RDTSC_mask;
if (t0>t1) t1+=RDTSC_mask+1;
if ((t1-t0)>=dt) break;
}
}
//------------------------------------------------------------------------------------------------
void wait_us(U32 dt)
{
U32 t0,t1;
t0=Get_system_register(AVR32_COUNT);
dt=((dt*cpu_clk)+999999)/1000000;
t0&=RDTSC_mask;
for (;;)
{
t1=Get_system_register(AVR32_COUNT);
t1&=RDTSC_mask;
if (t0>t1) t1+=RDTSC_mask+1;
if ((t1-t0)>=dt) break;
}
}
//------------------------------------------------------------------------------------------------
int main(void)
{
system_init();
// here init what you need
gpio_configure_pin(_LED,GPIO_DIR_OUTPUT|GPIO_INIT_HIGH);
for (;;)
{
// here do your stuff
gpio_tgl_gpio_pin(_LED);
wait_ms(200);
}
//------------------------------------------------------------------------------------------------
... ve çerçeve gereksiz içerir önlemek için yeniden yazılırsa ve derleme yavaşlama. Ayrıca, çerçeve güncellemelerinin her zaman uyumlu olmadığından emin olun, bu nedenle kodunuzu güncellemeden sonra bazen derleme yapmazsınız ... Bir katı çerçeveye sahip olmanız ve gerçekten ihtiyacınız olmadıkça güncelleştirmemeniz daha iyidir.
Yalnızca gereksinim duyduğunuz modülleri seçin (hepsini dahil etmeniz gerekmez). Örneğin, intc,gpio,scif
vb. Gereksinimleriniz benim için büyük projelerden oluşuyor, bunlardan birçoğu sizin için işe yaramıyor ve tüm üstbilgiler/modüller AVR32 çiplerin tamamı için mevcut değil.
yüzden geri API ve mimarlık tamamen değiştirilir GPIO
için konu dışı biraz (Ben gerekli olduğunu düşünüyorum) var. Pin isimleri ile aldanmayın. Örneğin pin PA35
, A
bağlantı noktası 35
bağlantı noktası anlamına gelmez !!! PA
numaralı bir bağlantı noktası yoktur. no'lu bir kuralı, mimarisine gerçek bir anlam vermeksizin, biraz aptalcadır ve biraz zaman almam gerekir. Tüm pimleri kapatmak için gereken kadar port var. Her port, 32
pinlerini destekler ve pin numarası, bilmeniz gereken gerçek şeydir.
Her bir pim avr32/io.h
içinde AVR32_PIN_PA04
gibi tanımlanmış bir yer olarak tanımlanmıştır ve yonga GPIO'sunda pin konumunun sayısal değerini içerir. GPIO port elde etmek için/sadece bunu maske:
port = pin>>5
mask = 1<<(pin&31)
Şimdi
GPIO kayıtlarını erişmek için doğrudan ben
gpio.c
bakmak tavsiye ederiz. Hızlandırmak için bir kerede 32 pim belirleyebilir, tekrar test edebilir, okuyabilir (aynı bağlantı noktasındaysa). Hız genellikle buss saatine bağlıdır (genellikle
GPIO için
PBA), saatiniz düşükse, yüksek geçiş oranı beklemeyin. sizin App seçilen
HW pin akıllıca bittiyse
Eğer gerçekten hızlı hızları olabilir ...
GPIO erişim yavaş ve eğer kod performansını öldürebilir akıllıca kullanılmaz sakının. Mesela 2-5 MHz civarında hızlarım var! basitçe ayarlamak istediğiniz tüm iğnelerden maskesiyle
bit
alışverişi
gpio.c
void gpio_set_gpio_pin(uint32_t pin)
{
U32 bit= 1 << (pin & 0x1F);
volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
gpio_port->ovrs = bit; // Value to be driven on the I/O line: 1.
gpio_port->oders = bit; // The GPIO output driver is enabled for that pin.
gpio_port->gpers = bit; // The GPIO module controls that pin.
}
Aynı limanda birden işaretçilerine ayarlamak için kullanabilir bir iğne ayarlama Burada
örnek ...
GPIO için Interrupts kullanıyorsanız, interrupt denetleyicisinin INTC interrupt denetleyicisinin de buss tarafından bağlı ayrı bir modül olduğunu ve yanlış ayarlanmış saat veya bekleme durumlarının büyük sorunlara neden olabileceğini unutmayın.
Peki, io.h'de ne denir? Belki gerçek cihaz için ayarlamanız gereken #define var mı? –
Avr32 io normal avr'lar için daha karmaşıktır. Avr32 io örnekleri için Google. Bir şey için avr32/io.h – Unimportant
'a ihtiyacınız var Bazı örnekler: https://www.kth.se/social/upload/300/Writing%20your%20own%20program%20%28AVR32%20Studio%29_pm_20100910.pdf – Unimportant