mark

IAR AVR使用simulator仿真时实现中断模拟

0
阅读(2835)

目标: 在实现IAR AVR中用simulator模拟中断。

 

一、学习IAR给出的例子

在IARAVR的安装目录avr\tutorials\AdvancedDebugging中有一个模拟串口中断的例子。该例子模拟UART0接收中断,从pc的文本中给UART0 UDR0接收寄存器一个Fib数。

AVR程序将该Fib数从串口输出,输出从Terminal I/O窗口输出。

 

1.       将例子拷贝到用户的目录。

2.       直接运行,软件仿真程序,在中断函数中设置断点,可见能够进入中断,从Terminal I/O窗口输出可见到输出字符‘0’。没有输出Fib数。

3.       新建一个breakpoint


1 设置一个断点

根据图1新建一个Immediate类型的断点。

 

根据图2, Trigger at填入:UDR0

Expression填入 Access()

Access Type选择Read

image003.png

2 Breakpoint输入UDR0

继续仿真,进入中断程序后,从Terminal I/O窗口输出可见到输出字符Fib数。

对图 1的解释:

a)       UDR0是AVR工程中的SetupSimulation.mac文件中Access()函数设定的写入寄存器(UDR0 = _fibValue;)。__readFile(_fileHandle, &_fibValue)以十六进制按行读取文本文件InputData.txt,所以InputData.txt文件中是十六进制数,每行一个。

b)      SimulationSetup()函数给出了要模拟的中断向量"USART0 RXC",间隔3000个时钟周期,100%的概率产生中断。

_interruptID = __orderInterrupt("USART0 RXC", 4000, 3000, 0, 0, 100);

 

 

二、实现一个ADC中断模拟

修改上述例子,用于ADC采样模拟

工程预期目标:模拟ADC中断,读取ADC寄存器,用于后续计算。

步骤:

1.       添加SetupSimulation.mac到工程,修改SetupSimulation.mac文件中SimulationSetup()函数里

_interruptID = __orderInterrupt("ADC", 4000, 3000, 0, 0, 100);

2.       修改SetupSimulation.mac文件中Access()函数里ADC = _fibValue;

3.       根据图3, Trigger at填入:ADC

Expression填入 Access()

Access Type选择Read

image005.png

3 Breakpoint输入ADC

进入Simulator仿真后,可观察到程序进入ADC中断,并读取到了模拟输入值,如图4。

image008.jpg

4 ADC输入值是0x300,数组samples[]=ADC-512结果是256