IAR AVR使用simulator仿真时实现中断模拟
0赞目标: 在实现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

图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

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

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