2016-04-12 30 views
0

Mikroişlemci at32uc3b0256 var ve ledleri açmak istiyorum (örneklerden basit bir program). Bunu yapmak için Atmel Studio'yu kullanıyorum. Ben örnek kod bulundu:Acemi - avr32 açık led, derleyici değişkenleri göremiyor

#ifndef F_CPU 
#define F_CPU 16000000UL // 16 MHz clock speed 
#endif 

#include <avr/io.h> 
#include <util/delay.h> 

int main(void) 
{ 
    DDRC = 0xFF; //Makes PORTC as Output 
    while(1) //infinite loop 
    { 
    PORTC = 0xFF; //Turns ON All LEDs 
    _delay_ms(1000); //1 second delay 
    PORTC= 0x00; //Turns OFF All LEDs 
    _delay_ms(1000); //1 second delay 
    } 
} 

Ama Atmel Studio bunu yazdığında ben bazı hatalar var, Atmel Studio değişken olarak DDRC ve limanların görmüyorum. Bunu nasıl düzeltebilirim?

enter image description here

+2

Peki, io.h'de ne denir? Belki gerçek cihaz için ayarlamanız gereken #define var mı? –

+1

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

+0

'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

cevap

1

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:

  1. 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

  2. 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).

  3. yapılandırmak/şimdi eşyalarını

  4. Bootlaoder

    sen bakmak gerekir başka bir şey önyükleyici olduğunu do HW modüllerini

  5. 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.