我想把正弦波数据传递到一个引脚上(任何可能的),这样我的程序就可以在模拟器中运行时读取它。
如何将数据以(time:value)的形式传递给GNU (我使用QEMU,但如果需要任何其他模拟器,我愿意迁移)板模拟器,或者仅仅传递一个函数float generatorForPinX(int time);作为信号生成器?
发布于 2017-06-07 23:36:18
这些说明用于模拟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 ..如果配置步骤失败,则安装缺少的需求。有关更多信息,请参见自述文件。
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 7777UART2附加到端口7777上的telnet服务器,您应该可以看到它的输出。有关如何构建和运行演示应用程序的更多信息,请参见自述文件。
看看单演示应用程序,它有3种不同的模式:
模式可以通过使用按钮来选择,但是由于我们是在用QEMU模拟硬件,所以这个按钮是不可用的。通过更改int mode = 1;值并重新编译程序,我在两种模式之间切换。
ADC仿真
QEMU用于模拟每个ADC通道的方法可以在stm32_adc_start_conv函数中在adc.c中查看。
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。
https://stackoverflow.com/questions/44334252
复制相似问题