我想将正弦波数据传递到一个引脚(任何可能的引脚),以便我的程序能够在模拟器中运行时读取它。我怎样才能以(time:value)的形式传递数据,或者只是传递函数float generatorForPinX(int time);
作为GNU ARM Eclipse的信号发生器(我使用QEMU,但是如果需要其他模拟器,我愿意迁移)电路板模拟器?GNU ARM Eclipse:如何模拟引脚输入?
-1
A
回答
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通道的Vdd的值16
- 模式3将从ADC通道8
这些模式可以通过使用按钮来选择的读取的,但由于我们仿效与QEMU硬件,按钮没有t可用。我通过更改int mode = 1;
值并重新编译程序来切换模式。
ADC仿真
该QEMU使用来模拟各ADC通道的方法是在stm32_adc_start_conv
函数可见在hw/arm/stm32_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的正弦波。下面是从所有3种模式返回的ADC值的曲线图:
如果你想有一个ADC通道使用不同的仿真模式,可以修改stm32_adc_start_conv
和重建QEMU按照上述步骤。
相关问题
- 1. GNU模拟退火
- 2. GNU ARM - 未找到nano.specs
- 3. Arduino模拟引脚中断
- 4. 如何在输入流中模拟zip?
- 5. 如何模拟输入禁用?
- 6. ARM周期精确模拟器
- 7. 如何正确引用GNU readline库来扫描终端输入?
- 8. GNU Readline:如何清除输入行?
- 9. STM32 Eclipse + ARM GNU工具链错误链接器。
- 10. Jython引入java模块Eclipse
- 11. 模拟手写笔输入
- 12. jQuery模拟按键输入
- 13. Python模拟输入键
- 14. 模拟用户输入
- 15. 模拟文件输入onChange
- 16. 模拟摄像机输入
- 17. 模拟输入密钥java
- 18. 如何将GNU链接器脚本ld转换为Scatter文件(ARM)
- 19. 阅读输入引脚(Teensy)
- 20. 如何使用Eclipse模拟器截图?
- 21. GNU让 - 如何输出
- 22. Redshift SqlActivity:如何在脚本中引用输入和输出
- 23. 如何正确模拟模态对话框并等待输入?
- 24. 如何模拟DOM犀牛/ Java 6的脚本引擎
- 25. 如何在使用pinMode时区分模拟和数字引脚?
- 26. Python:模拟输入模块方法
- 27. GNU无线电输入和输出缓冲区如何工作?
- 28. 如何使用gnu-parallel处理带有两个输入的脚本?
- 29. android 5.0 arm模拟器不起作用
- 30. 如何模拟OSX 10.6(“雪豹”)下的ARM体系结构?
你在模拟什么目标?这个用于STM32的QEMU分支包括具有正弦模式的ADC仿真:https://beckus.github.io/qemu_stm32/ – Tim
@Tim:是的,STM32!非常感谢你!请做一个扩展的答案,并附上一个简短的解释,说明如何让可编译和可运行的QEMU STM32项目添加这样的模拟(只需将源文件添加到项目src目录中)? – DuckQueen