GNU ARM Eclipse:如何模拟引脚输入?

时间:2017-06-02 17:15:43

标签: c eclipse embedded stm32 qemu

我想将正弦波数据传递到引脚(任何可能的引脚)上,以便我的程序能够在模拟器中运行时读取它。

如何以(time:value)的形式传递数据或者只是将函数float generatorForPinX(int time);传递给GNU ARM Eclipse中的信号发生器(我使用QEMU但是如果需要任何其他模拟器我我愿意迁移)董事会模拟器吗?

1 个答案:

答案 0 :(得分:2)

这些说明用于模拟Olimex STM32 P103开发套件。

下载并构建

首先下载并构建Qemu STM32,其中包含用于在STM32上模拟ADC外设的补丁:

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

如果配置步骤失败,则安装缺少的要求。有关更多信息,请参阅自述文件。

然后下载Olimex STM32 P103 Development Kit Demos

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

stm32_p103_demos-master/demos/adc_single/main.c中查找使用ADC的示例程序。

运行演示应用程序

构建并运行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服务器,您应该看到输出。有关如何构建和运行演示应用程序的更多信息,请参阅自述文件。

查看source for the adc_single demo application,它有3种不同的模式:

  • 模式1(默认值)将从ADC通道16上的温度传感器读取
  • 模式2将从ADC通道16
  • 读取Vdd值
  • 模式3将从ADC通道8读取。

可以使用按钮选择模式,但由于我们使用QEMU模拟硬件,因此按钮不可用。我通过更改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值的图表从所有3种模式返回:

ADC value graph

如果您想让ADC通道使用不同的仿真模式,您可以按照上述步骤修改stm32_adc_start_conv并重建QEMU。