首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU ARM Eclipse:如何模拟引脚输入?

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

Stack Overflow用户
提问于 2017-06-02 17:15:43
回答 1查看 740关注 0票数 0

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

如何将数据以(time:value)的形式传递给GNU (我使用QEMU,但如果需要任何其他模拟器,我愿意迁移)板模拟器,或者仅仅传递一个函数float generatorForPinX(int time);作为信号生成器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-07 23:36:18

这些说明用于模拟Olimex STM32 P103开发工具包。

下载和构建

首先下载并构建Qemu STM32,其中包括用于在STM32上模拟ADC外围设备的修补程序:

代码语言:javascript
复制
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开发工具包演示

代码语言:javascript
复制
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演示程序:

代码语言:javascript
复制
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服务器,您应该可以看到它的输出。有关如何构建和运行演示应用程序的更多信息,请参见自述文件。

看看单演示应用程序,它有3种不同的模式:

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

模式可以通过使用按钮来选择,但是由于我们是在用QEMU模拟硬件,所以这个按钮是不可用的。通过更改int mode = 1;值并重新编译程序,我在两种模式之间切换。

ADC仿真

QEMU用于模拟每个ADC通道的方法可以在stm32_adc_start_conv函数中在adc.c中查看。

代码语言:javascript
复制
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值的图表:

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44334252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档