2017-06-02 5 views
-1

正弦波データをピン(可能なもの)に渡したいので、私のプログラムはエミュレータで実行されているときにそのプログラムを読むことができます。GNU ARM Eclipse:ピン入力をシミュレートする方法は?

どのようにデータを(時間:値)の形式で渡すか、関数float generatorForPinX(int time);をシグナルジェネレータとしてGNU ARM Eclipseに渡すにはどうすればよいですか?私はQEMUを使用しますが、他のエミュレータが必要な場合は、マイグレーション)ボードエミュレータ?

+1

あなたはどのようなターゲットをエミュレートしていますか? STM32用のこのQEMUブランチには、サインパターンのADCエミュレーションが含まれています。https://beckus.github.io/qemu_stm32/ – Tim

+0

@Tim:はい、STM32!どうもありがとうございました!エミュレーションを追加するコンパイル可能で実行可能なQEMU STM32プロジェクトをどのように持っているかについての短い解説(プロジェクトファイルのディレクトリに十分なソースファイルを追加するだけです)を書いてください。 – DuckQueen

答えて

2

これらの手順は、Olimex STM32 P103開発キットをエミュレートするためのものです。

ダウンロードして

まずダウンロードを構築し、STM32にADCの周辺機器をエミュレートするためのパッチが含まれ、Qemu STM32を構築:

wget https://github.com/beckus/qemu_stm32/archive/stm32.tar.gz 
tar xf stm32.tar.gz 
cd qemu_stm32-stm32 
./configure --target-list="arm-softmmu" 
make 
cd .. 

のconfigureステップが失敗した場合は、不足している要件をインストールします。詳細については、READMEを参照してください。その後

Olimex STM32 P103 Development Kit Demosダウンロード:ADCを使用するサンプルプログラムのstm32_p103_demos-master/demos/adc_single/main.c

wget https://github.com/beckus/stm32_p103_demos/archive/master.tar.gz 
tar xf master.tar.gz 

ルック。 adc_singleデモをビルドして実行するには

実行デモアプリケーション

cd stm32_p103_demos-master 
QEMU_ARM_DIR=../qemu_stm32-stm32/arm-softmmu/ make adc_single_QEMURUN_TEL 
(from another terminal) telnet localhost 7777 

UART2は、あなたからの出力を見るべき、ポート7777でtelnetサーバに接続されています。デモアプリケーションのビルド方法と実行方法の詳細については、READMEを参照してください。

  • モード1(デフォルト)16
  • モード2 ADCチャンネルからのVdd値を読み取り、ADCチャンネル上の温度センサから読み取られます

    source for the adc_single demo applicationを見ると、それは、3つの異なるモードを有します16

  • モード3は、モードボタンを使用して選択することができるが、我々は、QEMUとハードウェアをエミュレートしているため、ボタンが否定であるADCチャンネル8

から読み出されます利用可能です。私はint mode = 1;の値を変更してプログラムを再コンパイルすることによってモードを切り替えました。

ADCエミュレーション

QEMUは、各ADCチャネルをエミュレートするために使用する方法は、hw/arm/stm32_adc.cstm32_adc_start_conv関数で見ることができる:あなたが見ることができるように

static void stm32_adc_start_conv(Stm32Adc *s) 
{ 
    uint64_t curr_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); 
    int channel_number=stm32_ADC_get_channel_number(s,1); 
    // Write result of conversion 
    if(channel_number==16){ 
     s->Vdda=rand()%(1200+1) + 2400; //Vdda belongs to the interval [2400 3600] mv 
     s->Vref=rand()%(s->Vdda-2400+1) + 2400; //Vref belongs to the interval [2400 Vdda] mv 
     s->ADC_DR= s->Vdda - s->Vref; 
    } 
    else if(channel_number==17){ 
     s->ADC_DR= (s->Vref=rand()%(s->Vdda-2400+1) + 2400); //Vref [2400 Vdda] mv 
    } 
    else{ 
     s->ADC_DR=((int)(1024.*(sin(2*M_PI*qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)/1e9)+1.))&0xfff); 
    } 
    s->ADC_SR&=~ADC_SR_EOC; // jmf : indicates ongoing conversion 
    // calls conv_complete when expires  
    timer_mod(s->conv_timer, curr_time + stm32_ADC_get_nbr_cycle_per_sample(s,channel_number)); 
} 

は、ADCチャンネル16は、ランダムVddの入力をエミュレートしますADCチャネル17はランダムな温度入力をエミュレートし、他のすべてのチャネルは0〜2048の正弦波に従います。あなたはADCチャネルが異なるエミュレーション・パターンを使用したい場合は、あなたがstm32_adc_start_convを変更し、上記の手順を以下のQEMUを再構築することができます

ADC value graph

:ここでは、すべての3つのモードから返されたADC値のグラフです。

関連する問題