2016-04-12 15 views
0

私はマイクロプロセッサーを持っていますat32uc3b0256と私はledsをオンにしたいと思います。これを行うためにAtmel Studioを使用します。私は、サンプルコードが見つかりました:初心者 - avr32がオンになり、コンパイラに変数が表示されない

#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 
    } 
} 

をしかし、私はアトメルメーカーにそれを書いたとき、私はいくつかのエラーを得た、アトメルStudioは、変数としてDDRCとポートを参照してくださいいけません。どうすれば修正できますか?

enter image description here

+2

io.hで何が呼び出されていますか?おそらく、実際のデバイスに設定する必要がある#defineがありますか? –

+1

Avr32 ioは、通常のAVRではより複雑です。 Googleのavr32 ioの例あなたはavr32/io.hが必要です。 – Unimportant

+0

ここにいくつかの例があります:https://www.kth.se/social/upload/300/Writing%20your%20own%20program%20%28AVR32%20Studio%29_pm_20100910.pdf – Unimportant

答えて

1

画面フォームアトメルStudioは、あなたはAVR8アーキテクチャのためGPIO例を使用しています。 AVR32アーキテクチャはPBA(と思う)を介して接続された別個HWブロックとしてGPIOモジュールを導入完全に異なっています。あなたはMCUコアは一つだけのモジュールであるサブコンポーネントのネットワーク上としてAVR32アーキテクチャを見ることができますDDRC、...

などの一切のレジスタがありません。 PBAPBBの2つのメインバスがそれぞれ異なるモジュールに接続されています。

あなたがこれを行う必要があるAVR32ファームウェアを動作させるには:

  1. の設定をし、使用する主なMCUコアクロックを開始

    AVR32 MCUコアは、通常、低32kHzクロックで実行されていますリセット後。より良い性能を達成するには、最高66MHzのより高いクロックが必要です。私は通常、いくつかの共通の周波数でPLLを開始し、すべてのクロック(CPU、PBA、PBB、HSB)を後で分けます。 PLLのソースとして、内部クロックなどのクロックが必要ですRCまたは外部クリスタルによって駆動される発振器。また、USBが必要な場合は、特定の周波数が必要なので、妥協する必要があることを念頭に置いてください。SCIFモジュールは、データシートおよび/または例で確認してください。それに

  2. スイッチ(SCIFモジュールはそれのためのいくつかの機能だと思うがある)(100ミリ秒)ビットを待つか、クロックが直接実行されているかどうかを確認いずれかの適切

    を始めたとき。

  3. のconfigure /使用HWモジュールに

  4. を開始し、今Bootlaoder自分のもの

  5. を行う

    あなたはの世話をする必要がありますもう一つは、ブートローダーです。私はJTAGが好きではありません。私は悪い経験をしています(それを揚げるのにあまり時間がかからず、プログラミングは本当に不快です)。 JTAGを使うと、ブートローダを簡単に消すことができます(それぞれのチップは同梱されています)。本当にうんざりです。

    一方、ブートローダーはシンプルでエレガントです。たとえば、私はFLIPを使用し、チップをプログラムするための単純なコマンドラインファイルを持っています。それから、コマンドプロンプトを開いて実行します。そして、それぞれの再構築/プログラミングで、私はちょうどプロンプトで最後のコマンドを繰り返し、enterキーを押して矢印を押した。 JTAGでの多くのクリックと比較すると、はるかに速く簡単です。ここでCMDの例:

    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のスタジオのbinディレクトリにあります。

    ブートローダでは、プログラムが0x0000で始まっていないことをコンパイラに伝える必要があります。これは、ブートローダと重複するためです。これを行うには、トランポリンの例を参照してください。

これは私のAVR32アプリは通常、どのように見えるかです:

私はものに自分を含める代わりに、フレームワークマネージャを使用していない...と私のフレームワークが含まれ、不要なを避けるために書き換えられ
#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); 
    } 
//------------------------------------------------------------------------------------------------ 

コンパイルの速度が遅くなります。また、フレームワークの更新は常に互換性があるわけではないので、更新後にコードがコンパイルされないことがあります。本当に必要な場合を除き、1つのソリッドフレームワークを持ち、更新しない方が良いです。

必要なモジュールだけを選択します(すべて含める必要はありません)。例えば、intc,gpio,scifなどが必要です。私のインクルードはより大きなプロジェクトからのものです。その多くはあなたにとって役に立たず、すべてのヘッダ/モジュールがAVR32チップのすべてで利用できるわけではありません。

は、私はそうバックAPIとアーキテクチャが完全に変更されたGPIO

にトピックオフビット(私が必要だったと思う)を得ました。ピン名に惑わされてはいけません。たとえば、ピンPA35は、ポートAピン35を意味しません!!!ポートはありませんPAというアーキテクチャにはまったく意味のない命名規則があります。ちょっとばかげて、ちょっとしたことがありました。すべてのピンをカバーするのに必要な数のポートがあります。各ポートは32ピンをサポートしており、ピン番号はあなたが知る必要がある本当のものです。

各ピンはavr32/io.hのどこかで定義され、AVR32_PIN_PA04のように定義され、チップGPIOのピン位置の数値が含まれています。 GPIOポートを取得するには/あなただけのこの操作を行うマスク:

port = pin>>5 
mask = 1<<(pin&31) 

今すぐGPIOレジスタにアクセスするために、直接私がgpio.cを見てお勧めします。速度を上げるために、一度に32ピンを設定、分解、テスト、読み込みすることができます(同じポートにある場合)。速度は主にバスクロックに依存します(通常PBAGPIO)ので、クロックが低い場合は高いトグルレートを期待しません。アプリの選択HWピンが賢明に行われている場合、あなたが本当に速い速度を持つことができます

... GPIOを用心アクセスが遅く、賢明に使用されていない場合は、コードのパフォーマンスを殺すことができます。例えば、私はトグル速度を約2-5MHzにしました!

ここ

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

からピンを設定する例あなたは単にあなたが設定したいすべてのピンのマスクでbitを交換することにより、同じポートで複数のピンを設定するためにこれを使用することができます...

の割り込みを使用している場合GPIO割り込みコントローラINTCも、バスで接続され、クロックまたは待機状態を誤って設定した別のモジュールであるため、大きな問題が発生する可能性があることに注意してください。

関連する問題