KEIL仿真的AGSI接口

合集下载

使用Keil软件模拟调试单片机串行口

使用Keil软件模拟调试单片机串行口

使用Keil软件模拟调试单片机串行口单片机串行口是单片机中很常见的接口之一,常用于与外界通讯,如与PC机通讯,接收或发送数据等。

Keil软件可以帮助我们模拟及调试单片机串行口,下面是详细介绍。

一、Keil软件简介Keil是一款强大的单片机编程软件,具有模拟器和仿真器。

其可支持多种嵌入式系统和多种编译器。

同时Keil具有标准C 编译器,专门用于单片机编程,而且具有与某些模拟器和编译器的集成,可提供完整的嵌入式开发环境。

二、使用Keil软件模拟1. 连接软件与硬件在开始模拟之前,需要将单片机与电脑通过串口连接好。

打开“Options for Target”对话框,选择“Debug”选项卡,选择正确的COM 端口,设置存根速度,完成调试设置。

2. 添加串行口文件在Keil软件中打开设计文件,键入“#include <reg52.h>”来添加注册头文件,其中包含了需要使用串口的相关寄存器位。

利用如下代码,可以对串行口的各项参数进行设置,例如波特率、校验位等等。

void init(){SCON = 0X50; //使串口工作在方式1,即8位数据,可变波特率TMOD |= 0X20; //TMOD的高4位设为0010,使Timer1工作在方式2TH1 = 0XF3; //波特率设为2400bpsTL1 = 0XF3;TR1 = 1; //启动Timer1ES = 1; //开启串口中断EA = 1; //打开总中断}3. 编写数据收发代码在调用串口的过程中,我们往往需要使用到接收和发送两个函数。

在接收方面,我们需要设置好接收中断模式以及缓冲区的异步处理。

编写简单的数据接收收发代码如下:void send_data(unsigned char dat){SBUF = sdat; //将数据传输到SBUF当中while(!TI); //等待发送完成TI = 0; //完成发送}unsigned char receive_data(){while(!RI); //等待接收完成RI = 0; // 完成接收return SBUF; // 返回接收缓冲区}4. 最后进行模拟完成串行口配置和数据处理之后,就可以开始模拟调试了。

关于Keil串口使用的一些要点

关于Keil串口使用的一些要点

字号:大中小关于Keil串口使用的一些要点1.Keil的Peripherals下的Serial显示的对话框中,只是用来查看一些串口状态的,是不能用来修改的。

比如想模拟串口接收,在这里修改SBUF的值会不起作用。

读到的全是0.2.Keil的Serial #1,#2,#3是直接对单片机的。

按下对应的键,键码会发送到SBUF中去。

但这个值是无法观察到的。

只能通过mov a,sbuff的方式读出。

不过,虽然在Serial窗口可以设置Ascii模式或Hex模式,按下的键统一还是用Ascii的形式传到SBUF中去了。

具体见::/forum/read/1627783. 最完美的解决办法是将keil的串口绑定到PC的串口上去。

(先用Mode命令,再用Assign命令)1 ASSIGN命令将单片机的串口绑定到计算机的串口。

基本使用方式为:ASSIGN COMx < inreg > outreg其中: COMx代表计算机的串口,可以是COM1、COM2、COM3或COM4;而inreg和outreg代表单片机的串口。

对于只有一个串口的普通单片机,即SIN和SOUT;对于有两个或者多个串口的单片机,即SnIN和SnOUT(n=0,1,…即单片机的串口号)。

图1 串口连线示意图例如:ASSIGN COM1 < SIN > SOUT将计算机的串口1绑定到单片机的串口(针对只有一个串口的单片机)。

ASSIGN COM2 < SIN > SOUT将计算机的串口2绑定到单片机的串口0(针对有多个串口的单片机,注意串口号的位置)。

需要注意的是,参数的括号是不能省略的,而outreg则是没有括号的。

2 MODE命令设置被绑定计算机串口的参数。

基本使用方式为:MODE COMx baudrate, parity, databits, stopbits其中: COMx(x = 1,2,…)代表计算机的串口号;baudrate代表串口的波特率;parity代表校验方式;databits代表数据位长度;stopbits代表停止位长度。

Keil的AGSI仿真实验板制作

Keil的AGSI仿真实验板制作

Keil的AGSI仿真实验板制作Keil 的强大功能,对于初学者来说,还有些不直观,调试过程中看到的是一些数值,并没有看到这些数值所引起的外围电路的变化,例如数码管点亮、发光管发光等。

为了让初学者更好地入门,笔者利用Keil 提供的AGSI 接口开发了两块仿真实验板。

这两块仿真板将枯燥无味的数字用形象的图形表达出来,可以使初学者在没有硬件时就能感受到真实的学习环境,降低单片机的入门门槛。

图1 是键盘、LED 显示实验仿真板的图,从图中可以看出,该板比较简单,有在P1 口接有8 个发光二管,在P3 口接有4 个按钮,图的右边给出了原理图。

图2 是另一个较为复杂的实验仿真板。

在该板上有8 个数码管,16 个按键(接成4*4 的矩阵式),另外还有P1 口接的8个发光管,两个外部中断按钮,一个带有计数器的脉冲发生器等资源,显然,这块板可以完成更多的实验。

一、实验仿真板的安装这两块仿真实验板实际上是两个dll 文件,名称分别是ledkey.dll 和simboard.dll,安装时只要根据需要将这两个或某一个文件拷贝到keil 软件的c51bin 文件夹中即可。

二、实验仿真板的使用要使用仿真板,必须对工程进行设置,设置的方法是点击Project->Option for Target‘Target1’打开对话框,然后选中Debug 标签页,在Dialog :Parameter:后的编缉框中输入-d 文件名。

例如要用ledkey.dll(即第一块仿真板)进行调试,就输入-dledkey,如图3所示,输入完毕后点击确定退出。

编译、连接完成后按CTRL+F5 进入调试,此时,点击菜单Peripherals,即会多出一项“键盘LED 仿真板(K)”,选中该项,即会出现如图1 的界面。

键盘、LED 显示实验仿真板图2 单片机实验仿真板同样,在设置时如果输入-dsimboard 则能够调出如图2 的界面。

第一块仿真板的硬件电路很简单,电路图已在板上,第二块板实现的功能稍复杂,其键盘和数码显示管部份的电路原理图如图4 所示。

基于KEIL-AGSI接口的单片机虚拟实验室构建

基于KEIL-AGSI接口的单片机虚拟实验室构建

基于KEIL-AGSI接口的单片机虚拟实验室构建摘要:文章提出了一种基于uVision KEIL的AGSI接口,利用VC++编写动态链接库,模拟单片机外围设备,以实现单片机虚拟实验室的建设方案,从而实验、实训课题在虚拟平台中实现,有效解决了资金和设备维护问题,并增强了学生自主学习单片机的便利性和时效性。

关键词:AGSI;仿真实验室;单片机;动态链接库1. 引言目前,单片机因其功能强且可自定义,价格低,可靠性高,抗干扰能力强,使用方便灵活,通用性强,在工控、智能仪表、通信系统、信号处理、智能家电等领域都得到了广泛的应用,学习者逐年增加。

作者利用计算机软件的仿真技术,在KEIL的AGSI接口基础上,开发DLL库,构建单片机虚拟实验室,针对高职院校单片机教学,成功的解决了资金的限制,单片机设备更新快,学生自主学习时硬件缺乏等许多实际的问题和困难。

2. 解决方案为了解决传统单片机实验室存在的问题,并为学生自主学习提供更大的便利。

基于AGSI接口利用VC++自行开发动态链接库,采用纯软件的方法仿真按钮、LED、数码管、LCD、信号发生器以及其他自定义外设,无缝链接至uVision,实现方便的外设软件仿真和直观的界面问题。

2.1 仿真库的开发。

下面将以学生学习时常用的跑马灯实训题目为例,开发直观的虚拟外设,介绍如何利用AGSI接口开发动态链接库。

(1)启动MS Visual C++,利用MFC AppWizard(dll)新建Experiment 工程。

注意使用MFC的静态链接,否则无法正常工作。

(2)在Experiment工程中添加头文件AGSI.h,增加AGSI的接口函数原型,在Experiment.h中添加SFR(特殊功能寄存器)、VTR(虚拟寄存器)的定义和接口函数原型。

(3)在Experiment.cpp文件中添加外设初始化代码,包括AGSI的建立(GetFunctionPointers),外设菜单入口及其对应对话框的声明(DefineAllMenuEntries),和SFR(DefineAllSFR),VTR(DefineAllVTREG),监视器(DefineAllWatches)和中断(DefineAllInterrupts)的声明。

Jlink设置SWD仿真

Jlink设置SWD仿真

MDK 3.50下用J-Link 的SWD(两线)仿真的教程其实在调试仿真的时候用J-LINK的Cortex-M3方式已经足够,并且在MDK 下他的功能已经做得非常的好,用标准20脚的JTAG下载,速度是非常的快,一般初学者都是这样做的。

但是SWD方式似乎速度更快、更加方便、简捷、,对于项目中对板子空间要求严格、I/O口资源紧张的用户来说更加的有利,正常的JTAG需要20管脚,而J-Link 的SWD只需要2根线(PA13/JTMS/SWDIO、PA14/JTCK/SWCLK)就够了(加上电源线也就4根),这样就节省了3个I/O口(PA15/JTDI、PB3/JTDO、PB4/JNTRST)为其它所用,并且可节省一部分板子的空间(只需4个口就可以了)。

下面我说一下SWD两线仿真的一些步骤、注意事项及需要注意的问题。

首先说一下接口的连接:将JLINK的1、7、9、20分别与自己的开发板上JTAG的VCC、JTMS、JTCK、GND用杜邦线相连即可!1)SWD 仿真模式概念简述先所说 SWD 和传统的调试方式有什么不一样:首先给大家介绍下经验之谈:(一): SWD 模式比 JTAG 在高速模式下面更加可靠. 在大数据量的情况下面 JTAG 下载程序会失败, 但是 SWD 发生的几率会小很多. 基本使用 JTAG 仿真模式的情况下是可以直接使用 SWD 模式的, 只要你的仿真器支持. 所以推荐大家使用这个模式.(二): 在大家 GPIO 刚好缺一个的时候, 可以使用 SWD 仿真, 这种模式支持更少的引脚.(三): 在大家板子的体积有限的时候推荐使用 SWD 模式, 他需要的引脚少, 当然需要的 PCB 空间就小啦.比如: 你可以选择一个很小的 2.54 间距的 5 芯端子做仿真接口.(2) 仿真器对 SWD 模式支持情况再说说市面上的常用仿真器对 SWD 仿真的支持情况.(1) JLINKV6 支持 SWD 仿真模式. 速度较慢.(2) JLINKV7 比较好的支持 SWD 仿真模式, 速度有了明显的提高. 速度是 JLINKV6 的 6 倍.(3) JLINKV8 非常好的支持 SWD 仿真模式, 速度可以到 10M.(4) ULINK1 不支持 SWD 模式(5) 盗版 ULINK2 非常好的支持 SWD 模式. 速度可以达到 10M.(6) 正版 ULINK2 非常好的支持 SWD 模式. 速度可以达到 10M.再所说硬件上的不同:(1) JLINKV6 需要的硬件接口为: GND, RST, SWDIO, SWDCLK(2) JLINKV7 需要的硬件接口为: GND, RST, SWDIO, SWDCLK(3) JLINKV8 需要的硬件接口为: VCC, GND, RST, SWDIO, SWDCLK(4) ULINK1 不支持 SWD 模式(5) 盗版 ULINK2 需要的硬件接口为: GND, RST, SWDIO, SWDCLK(6) 正版 ULINK2 需要的硬件接口为: GND, RST, SWDIO, SWDCLK由此可以看到只有 JLINKV8 需要 5 个引脚. 那么给大家介绍下为什么有了 VCC 这个引脚时候有好处, 我的个人理解: 我认为有这个引脚是最合适的, 仿真器对目标板子的仿真需要用到 RST 引脚, 其实使用仿真器内部的 VCC 做这个功能其实并不是非常美妙. 因此 JLINKV8 选择了只和目标板共 GND, 但是不共 VCC. 因此我觉得这种模式最合理, 当然通常情况下仿真器和目标板共 GND 和 VCC 是没有错的。

KEIL μV2下AGSI接口结构及其仿真DLL的实现

KEIL μV2下AGSI接口结构及其仿真DLL的实现
W ANG a - n Xio do g
(p r n yisMu a agN r l nvr t, d j n 50 2 C ia e a met f h s , n in omaU iesy Mu a i g 7 1 , hn ) t oP c D J i n a 1
Abs r c : i a e r s n s a l r a i e me h d t i u a e M CU y t ms b s d o o t r l to m s Th tu t r f t a t Th s p p rp e e t n a t n tv t o o s m l t e s s e a e n s f wa e p a f r . e s r c u e o
标系统提供 给单 片机 各种信号 的输入 , 测试 单片机 的实 际运行情 况 , 来辅助系 统开 ¨ 。此外 , 采用软件 模拟仿
真器进行开发也是一种简 单、实用的开发方法 。它是在
Байду номын сангаас
t rnefc ) 口说 明 [ o tr e 接 l a 2 ]
Kel V2 i 是德 国 KE L公 司开发的单片机 C语言 I
+基金 项 目: 黑龙 江省教 育厅科 学技术研 究 项 目 ( 5 2 1 2 9 1 1 9)
收 稿 E期 : 0 — —1 l 2 8 0 0 5 6
VC +或 C + ule 可 以很容易地编写 D L ( + + Bi r d L 动态链
自 化 术 应 20 年 7 第1期 动 技 与 用》08 第2卷 1
AGSIsi t ra e a d DLLswi ’ n e f c n t VC++ a e i t d c d f rt e s mu a i n o p c fc p rp e a q i me t . h r n r u e o i l t fs e ii e i h r l u p o h o e ns Ke r s a s; l; c + y wo d : g i d l V +

Keil软件仿真的串口调试技巧

Keil软件仿真的串口调试技巧

Keil软件仿真的串口调试技巧Keil软件仿真的串口调试技巧引言在单片机系统中,串口(UART,通用异步收发接口)是一个非常重要的组成部分。

通常使用单片机串口通过 RS232/RS485电平转换芯片与上位机连接,以进行上位机与下位机的数据交换、参数设置、组成网络以及各种外部设备的连接等。

RS232/RS485串行接口总线具有成本低、简单可靠、容易使用等特点,加上其历史悠久,所以目前应用仍然非常广泛;特别对于数据量不是很大的场合,串口通信仍然是很好的选择,有着广阔的使用前景。

在单片机编程中,串口占了很重要的地位。

传统方式串口程序的调试,往往是利用专用的单片机硬件仿真器。

在编写好程序后,利用仿真器来设置断点,观察变量和程序的流程,逐步对程序进行调试,修正错误。

使用硬件仿真器的确是很有效的方法,但是也有一些缺点:很多仿真器不能做到完全硬件仿真,因而会造成仿真时正常,而实际运行时出现错误的情况;也有仿真不能通过,但是实际运行正常的情况。

对于一些较新的芯片或者是表面贴装的芯片,要么没有合适的仿真器或仿真头;要么就是硬件仿真器非常昂贵,且不容易买到。

有时由于设备内部结构空间的限制,仿真头不方便接入。

有的仿真器属于简单的在线仿真型,仿真时有很多限制。

例如速度不高,实时性或稳定性不好,对断点有限制等,造成仿真起来不太方便。

1 调试前的准备工作下面介绍一种利用Keil的软件仿真功能来实现51单片机串口调试用户程序的方法。

使用这种方法,无需任何硬件仿真器,甚至都不需要用户电路板。

所需的只是:①硬件。

1台普通计算机(需要带有2个标准串口)和1根串口线(两头都是母头,连线关系如图1所示)。

②串口软件可以是自己编写的专用调试或上下位机通信软件,也可以是通用的串口软件(如串口助手、串口调试等),主要用来收发数据。

如果没有合适的串口调试软件,则可使用笔者编写的一个免费的串口小工具TurboCom。

除了与其他软件一样的数据收发功能外,它还有定时轮流发送自定义数据帧和自动应答(接收到指定数据帧后,自动返回相应的数据帧)这两个很有用的功能,特别适合于老化测试。

keil教程5

keil教程5

其于Keil 的实验仿真板的使用前面介绍了Keil 软件的使用,从中我们可以看到Keil 的强大功能,不过,对于初学者来说,还有些不直观,调试过程中看到的是一些数值,并没有看到这些数值所引起的外围电路的变化,例如数码管点亮、发光管发光等。

为了让初学者更好地入门,笔者利用Keil 提供的AGSI 接口开发了两块仿真实验板。

这两块仿真板将枯燥无味的数字用形象的图形表达出来,可以使初学者在没有硬件时就能感受到真实的学习环境,降低单片机的入门门槛。

图1是键盘、LED 显示实验仿真板的图,从图中可以看出,该板比较简单,有在P1口接有8个发光二极管,在P3口接有4个按钮,图的右边给出了原理图。

图2是另一个较为复杂的实验仿真板。

在该板上有8个数码管,16个按键(接成4*4的矩阵式),另外还有P1口接的8个发光管,两个外部中断按钮,一个带有计数器的脉冲发生器等资源,显然,这块板可以完成更多的实验。

一、实验仿真板的安装这两块仿真实验板实际上是两个dll 文件,名称分别是ledkey.dll 和simboard.dll ,安装时只要根据需要将这两个或某一个文件拷贝到keil 软件的c51\bin 文件夹中即可。

二、实验仿真板的使用要使用仿真板,必须对工程进行设置,设置的方法是点击Project->Option for Target ‘Target1’打开对话框,然后选中Debug 标签页,在Dialog :Parameter:后的编缉框中输入-d 文件名。

例如要用ledkey.dll (即第一块仿真板)进行调试,就输入-dledkey ,如图3所示,输入完毕后点击确定退出。

编译、连接完成后按CTRL+F5进入调试,此时,点击菜单Peripherals ,即会多出一项“键盘LED 仿真板(K )”,选中该项,即会出现如图1的界面,键盘、LED 显示实验仿真板图2 单片机实验仿真板同样,在设置时如果输入-dsimboard 则能够调出如图2的界面。

Keil 与Proteus仿真问题总结

Keil 与Proteus仿真问题总结

Keil 与Proteus仿真问题总结1、Keil与Proteus联调8051单片机的时候,效果相当于添加.hex文件到单片机后运行;Keil下关于off-chip code memory 、off-chip Xdata memory的设置对调试没有任何影响。

如下图:使用了T80C31,内部没有ROM,外部ROM也不设置,同样可以仿真,RAM也一样。

如果选择的是AT89S51,内部ROM只有4K,而编译的程序有6K多,设置如下图示:就可以仿真运行,不管是Keil自带的Simulator,还是与Proteus联调。

2、如果Proteus对51单片机的设置如下图示:Simulate Program Fetches属性选择了Yes,则Keil与Proteus无法联合调试;若选择了No,则不用设置Program Files,Keil与Proteus一样可以联合调试,效果就相当于为Program Files添加了.hex文件一样。

上图示CPU为80C31,内部没有ROM,“{ROM=0} ”,但照样可以添加.hex文件,而且添加的.hex文件大小为6K多。

只要Simulate Program Fetches属性选择了No,则不管电路有没有外部扩展ROM,一样可以仿真运行。

而如果Simulate Program Fetches属性选择了Yes,那么即使外部ROM连接正确,但是不管怎么设置属性EXTROM、EXTRAM、Code memory map、Data memorymap的值,都不能仿真。

如果在Proteus中,外部RAM设置到了8000-FFFF这个地址段,那么需要在程序中指定地址,否则读取不到外部RAM,仿真失败。

因此一般把外部RAM的地址分配到0000开始的地址空间。

3、关于仿真外部程序存储器的问题,主要要了解清楚8051Model的内部构架规则。

摘抄英文帮助如下:By default, all external data memory accesses are fully modelled. That is to say that each external data memory cycle involves simulating the numerous transitions of ALE and the P0 and P2 port pins. A typically cycle will involve around 50 pin state transitions is thus vastly expensive in terms of simulation time.In contrast, all program memory cycles are simulated internal to the 8051 model - that is to say that the program bytes are looked up in a memory buffer internal to the chip and no pin-state transitions are simulated. This is the case irrespective of the amount of internal ROM available on a particular 8051 part, and is done in order to achieve reasonable simulation speeds. This optimisation can be disabled by specifying:DBG_FETCH=FALSEFor applications which make extensive use of external data RAM, two further optimisations can be specified.DA TARAM PropertyThis specifies regions of the external memory map which can be treated as RAM and simulated internally to the 8051 model. A typical example would be:DA TARAM=0000-7FFF,C000-FFFFThis would specify two regions of external data memory.CODERAM PropertyWhere regions of the external memory map are wired in a Von-Neumann configuration (external data memory and code memory are the same), this can be specified as follows:CODERAM=0000-7FFFAny external memory writes to the region 0000-7FFF will then 'write through' to the internal program memory buffer of the model and be 'seen' by subsequent instruction fetches and MOVC instructions.4、关于8051Model的所有属性,摘抄如下:The 8051 model supports the following properties:Property Default DescriptionPROGRAM-Specifies one or more program files to be loaded into the model's internal code memory. The files can be either Intel hex files or OMF51 absolute object module formatfiles. Use commas to separate multiple file names. See Specifying The Program File for more information.CLOCK 1.2MHz Specifies the clock frequency of the processor. For reasons of efficiency, the clock circuitry is not simulated, and the clock rate of the processor is determined solely by this value.DBG_FETCH FALSE If TRUE, causes the model to simulate external program fetches.This mode of operation is extremely slow, but will allow you to test external program memory decode circuitry.DA TARAM-Specifies regions of the memory map that correspond to external data RAM. This allows for much faster simulation of external memory accesses. See Modelling the Memory Map for more information.CODERAM-Specifies regions of the external memory map that are shared between code and data (i.e. von-neumann decoding). See Modelling the Memory Map for more information.5、6、。

KEIL仿真环境建立以及与Proteus联调

KEIL仿真环境建立以及与Proteus联调

KEIL仿真环境建立以及与Proteus联调一 KEIL工程建立1、在D盘新建一个文件夹TEST,用来保存工程文件。

注意:文件夹不要建在系统盘。

2、启动【Keil uVision2】从开始菜单或桌面找到【Keil uVision2】图标,双击图标启动【Keil uVision2】。

1、建立工程文件1)点击菜单【Project】→【New Project】图1-12)选择刚才建立的TEST文件夹,并输入工程文件名(用有意义的英文缩写),这里为TEST_1,点击【保存】按钮(图1-2)。

3)出现选择器件类型对话框(图1-3), 在对话框左列表中选择单片机型号,这里为【Atmel】→【AT89C51】,点【确定】按钮(图1-3)。

图1-34)出现是否添加标准8051启动代码的对话框,点击【否】(图1-4),进入Keil uVision2工程界面。

图1-42、建立汇编源文件1)点击菜单【File】→【New】(图1-5),出现一个空白文本,在该文本编辑框中进行汇编程序的编写。

图1-52)点击菜单【File】→【Save】保存该程序文件,在文件名栏中输入程序文件名(用有意义的英文缩写),且不能和工程文件同名,后缀为“.C”,如下图保存为汇编程序。

图1-63)点击左侧【Project Workspace】列表窗中的【Target 1】文件夹,出现【Source Group 1】文件夹。

鼠标右击【Source Group 1】文件夹,在弹出的菜单中点击【Add Files to Group ‘Source Group 1’】出现添加文件对话框(图1-7)。

图1-74)在文件类型中选择【Asm Source file (*.s*;*.src;*.a*)】,选择刚才保存的源文件,点击【Add】完成添加(图1-8),然后点击【Close】关闭界面。

图1-85)继续在文本编辑框中输入以下源程序,并注意随时保存。

3、点击菜单【Project】→【Translate... 】,编译当前源程序(图1-9)。

Keil实验仿真板

Keil实验仿真板

基于Keil 的实验仿真板的使用对于初学者来说,学习单片机是与实验离不开的,若光靠看书是很难理解其原理和学会单片机。

由于初学,不可能购置很多昂贵的设备, 但如在没有程序写入器、没有实验板或没有仿真器的情况下又有学习单片机的愿望怎么办呢?对于51系列单片机来说,Keil C开发系统具有编辑、编译、仿真的功能。

Keil软件的使用,从中我们可以看到Keil的强大功能,不过,还有些不直观,为了让初学者更好地入门,笔者也学着利用Keil提供的AGSI 接口开发了几块仿真实验板,还将继续推出仿真实验板。

图1 是键盘、LED光二极管,在P3 口接有4 个按钮。

图3的实验仿真板上有3个数码管,4 打钩是有毛刺,反之无毛刺。

数器、查表方面的实验。

其原理图见图4。

图5的实验仿真板上有6个数码管,2 个按键。

P1、P0、P2每个口有八位,高四位与低四位口分别接了一个4511芯片,高位在左,低位在右。

该板可以做一些中断、多字节加、BCD码转换等方面的实验。

其原理图见6。

动态显示、开关,串行通信等实验板正在开发中。

图 1图 2图 3a EA/VPP2.0CVCC图 4图 5一、实验仿真板的安装仿真实验板实际上是dll 文件,名称CmAgsi.dll, 安装时只要根据需要将这个文件拷贝到keil 软件的c51\bin 文件夹中即可。

二、实验仿真板的使用要使用仿真板,必须对工程进行设置,设置的方法是点击Project->Option for Target ‘Target1’ 打开对话框,然后选中Debug 标签页,在Dialog :Parameter: 后的编缉框中输入-dCmAgsi。

如图7所示,输入完毕后点击确定退出。

编译、连接完成后按CTRL+F5 进入调试,此时,点击菜单Peripherals, 图8菜单, 选中“单片机实验列表(L)”, 即会出现如图9 的界面,选择相应的实验可进入软件仿真。

三、实例调试以下用汇编语言编制一个程序,说明实验仿真板二的使用。

keil5软件仿真波形以及出现unknownsignal的解决方法

keil5软件仿真波形以及出现unknownsignal的解决方法

keil5软件仿真波形以及出现unknownsignal的解决⽅法
1.keil5进⾏软件仿真的设置步骤
⾸先如下图,需要设置勾选为软件仿真(这⾥设置为硬件仿真不⾏),其次后⾯的参数也需要
改。

第⼆个红圈⾥勾选的-pSTM32F103ZE这⾥是根据⾃⼰的芯⽚进⾏
设置。

这⾥我选⽤的是STM32F103ZET6芯⽚。

2.仿真基本设置
⾸先进⼊仿真设置,然后点击波形查看图标。

设置仿真参数点击Setup...
设置添加需要查看的硬件IO⼝。

在setup中输⼊PORTX.i等需要观察的引脚。

如果此时出现unknown signl。

就是debug的设置问题了。

此时需要从新返回第⼀步的仿真设置,查看是否是按照⾃⼰的开发板设置的。

添加好需要查看的IO⼝后,点击RUN进⾏运⾏。

此时如果在框⾥没有看到波形的出现此时查看⾃⼰的设置是否合理。

logic Analyzer的左侧右键将每个波的数据设置为bit和Hexadecimal valus
如果此时波形未出现动态的变化就需要检查是否有如下设置
如果需要调整⽅便查看波形的话,点击 in out all 调整波形
特别需要注意的是:我IO设置为开漏输出,居然仿真都不能输出波形,这个问题坑了我好
久。

keil 仿真 变量的值 -回复

keil 仿真 变量的值 -回复

keil 仿真变量的值-回复在Keil仿真中,变量的值是非常重要的,它们决定了程序的运行结果。

在本文中,我们将一步一步地解答关于Keil仿真变量值的问题,并深入了解这些变量在程序中的作用。

首先,让我们来了解一下Keil仿真的基本概念。

Keil是一种兼容多种处理器架构的集成开发环境(IDE),它提供了一个开发环境用于编写、调试和仿真嵌入式软件。

Keil仿真提供了一个真实的硬件环境,以实时模拟程序的运行过程,并显示程序中各个变量的值。

在Keil仿真中,变量的值主要包括以下几个方面:1. 全局变量:全局变量是在程序的任何地方都可以访问的变量。

在Keil 仿真中,我们可以通过监视窗口或调试输出窗口来查看和监控全局变量的值。

通过观察全局变量的值,我们可以判断程序在不同阶段的运行状态。

2. 局部变量:局部变量是在特定函数内部声明的变量,只能在该函数内部访问。

在Keil仿真中,局部变量的值仅在函数运行时有效,并在函数结束后被销毁。

我们可以通过在调试模式下逐步执行程序来观察局部变量的值的变化。

3. 输入变量:输入变量是程序中由外部输入的值,例如通过串口或ADC(模数转换器)读取的数据。

在Keil仿真中,我们可以通过仿真器设置输入变量的值,并监测它们的变化。

这对于调试程序在不同输入条件下的行为非常有用。

4. 输出变量:输出变量是程序中由计算部分得出的结果值,例如计算均值或控制系统的输出信号。

在Keil仿真中,我们可以通过观察输出变量的值来验证程序计算的准确性。

除了这些基本概念外,Keil仿真还提供了其他功能来帮助我们理解变量值的变化。

例如,我们可以在程序运行的某一时刻设置断点,以便在程序执行到该点时暂停并观察变量的值。

同时,我们还可以使用Keil仿真器的单步执行功能,以便逐一执行程序,并观察每一步的变量值的变化情况。

总之,在Keil仿真中,变量的值对于程序的正确性和性能是至关重要的。

通过仔细观察和监控变量的值,我们可以发现潜在的问题并进行调试。

keil软件仿真实现gpio实验结果

keil软件仿真实现gpio实验结果

keil软件仿真实现gpio实验结果Keil软件仿真实现GPIO实验,可以充分体现出它在嵌入式系统开发中的优越性。

GPIO全称为“General Purpose Input/Output”,是一个通用的可编程IO(Input/Output)端口。

在嵌入式系统中,GPIO负责接收输入信号并对其进行处理,或者输出信号到其他外设。

因此,在嵌入式系统开发中,GPIO的功能非常重要。

在Keil软件中,我们可以通过仿真实现GPIO实验。

实验的目的是探究如何通过Keil软件程序实现GPIO口的开关控制。

首先,我们需要在Keil软件中创建一个新的工程,选取正确的单片机型号和程序开发语言,搭建好开发环境。

在实验中,我们需要重点研究GPIO的输入输出功能。

在Keil软件中,我们可以通过编写代码实现单片机与外设之间的数据交互。

例如,可以通过编写程序控制GPIO口输入开关,来实现对于外设的数据读取;反之,可以通过编写程序控制GPIO口输出开关,来实现对于外设的数据输出。

具体的实验步骤如下:1. 创建一个新的Keil工程,并导入相应的头文件和驱动程序。

2.编写程序,控制GPIO口输入输出状态。

例如,可以编写程序控制LED灯的亮灭,或者控制按键的状态变化。

3.生成可执行文件,并进行调试。

4.通过仿真实验,测试代码的正确性和性能。

在实验中,我们需要注意以下几点:1. GPIO的配置方式:Keil软件中,可以通过相关的配置工具对GPIO进行配置。

例如,可以设置GPIO端口的输入模式和输出模式,以及上拉和下拉电阻等参数。

正确的GPIO配置方式对于实验的成功非常重要。

2. GPIO的编程方式:在Keil软件中,我们可以使用C语言或者汇编语言编写GPIO的程序。

需要注意的是,不同的编程方式会直接影响到程序的性能和可靠性。

3.单片机周边设备的连接和配置:在进行GPIO实验的时候,需要将单片机与其他外设进行连接。

这其中包括芯片引脚对应关系的确定,电路接法的正确性等等。

基于AGSI接口的单片机仿真实验室构建

基于AGSI接口的单片机仿真实验室构建

基于AGSI接口的单片机虚拟实验室构建探索吕俊1,葛惠民,朱玉堂浙江机电职业技术学院,杭州,310053摘要:在高职电气类专业教学中,单片机的实验室建设大多采用硬件仿真器配目标实验板方式,存在一定的弊端:硬件设备采购量大,资金投入大;单片机技术更新快,实验设备落后快;设备维护工作量大。

单片机实验硬件设备通常是成品,学生很难参与到设计环节,学生的动手能力难以得到训练与提高等。

文章提出了一种基于uVision KEIL的AGSI接口,利用VC++编写动态链接库,模拟单片机外围设备,以实现单片机虚拟实验室的建设方案,从而实验、实训课题在虚拟平台中实现,有效解决了资金和设备维护问题,并增强了学生自主学习单片机的便利性和时效性。

关键词:AGSI;虚拟实验室;单片机;动态链接库Exploring of MCU virtual lab constructed based on AGSI interfaceAbstract:In electrical of vocational college, most of the MCU laboratory is constructed by hardware simulation experiment and target boards. There are certain disadvantages in this methods such as hardware equipment procurement large and cost much, MCU technology is updated quickly, experimental equipment backward quickly, equipment maintenance have a big workload. Most of MCU experimental equipment is final goods, so students have no chance to participate to design the equipment, then ability of students is hard to train and improve. This article proposed a new way to construct the MCU lab. A DLL developed by VC++ based on AGSI interface of uVision KEIL. The DLL can simulate the MCU and peripheral equipment, so many experimental projects can be realized in the virtual laboratory. This methods can solve funds lacking and equipment maintenance effectually, and can enhance the convenience and timeliness of student’s self-studying.KeyWord:AGSI; virtual laboratory; MCU; DLL1. 引言目前,单片机因其功能强且可自定义,价格低,可靠性高,抗干扰能力强,使用方便灵活,通用性强,在工控、智能仪表、通信系统、信号处理、智能家电等领域都得到了广泛的应用,学习者逐年增加。

Keil仿真插件使用说明

Keil仿真插件使用说明

给大家传两个Keil的插件,平凡工作室做的,很棒,可以在Keil中模拟出实验板,能作不少实验(和平凡老师的教程配套)。

使用说明:
1.请将下载的2个插件内容拷贝到uVision 的安装目录下的 \Keil\C51\BIN 中。

2.拷贝好以后有两种设置方法:
方法A:
工程文件中需设置一下:project->Option for Target'Target1',选Debug页,左侧最下面,Dialog Dll,一般是DP51.DLL,不用修改,Parameter中是-p51,在其后加入-dledkey,即该行看起来应该是这样的:-p51 -dledkey -dsimboard保存即可进入调试后,点击:Peripherals,其中多出一个“键盘LED实验仿真板”选择该项即可。

方法B:
修改 Tool.ini, 此文件位于 uVision 的安装目录 /keil 下.请将下面的内容 添加到 [C51] 部分的后面
AGSI1=ledkey.dll ("ledkey")
AGSI2=simboard.dll ("simboard")
重启uVsion进入Debug 模式, 打开菜单Peripheral, 发现增加了2项,分别是键盘LED仿真板,51实验仿真板。

这样使用时就不用每次设置了,任何时候打开都可以用。

3.效果图及原理图:。

如何利用keil AGSI接口协议

如何利用keil AGSI接口协议

如何利用keil AGSI接口协议目录目录 (2)一、文档概述 (3)二、软件仿真的难点 (3)三、解决途径 (3)四、keil与dll的交互原理 (3)4.1 keil软件配置 (4)4.2 VC软件配置 (5)五、实例介绍 (5)一、文档概述通过Keil提供的AGSI 接口,我们可在没有硬件支持的情况下进行软件的模拟仿真,因为是共用的keil平台,所以仿真后的代码可直接在我们的硬件平台上使用。

二、软件仿真的难点软件仿真的难点主要在于keil平台本身并没有提供诸如fopen/fread等函数接口,所以我们要想脱离硬件方便快速的在windows平台对MP3/WMA解码逻辑进行分析验证,就必须找到一个类似的接口,就如同在硬件平台上一样通过ReadFile将u-disk或者sd card中的数据读取到我们的share buffer中,然后进行分析。

三、解决途径Keil提供了AGSI接口,全称为“Advanced Generic Simulator Interface“。

AGSI接口其实就是一个由VC编写的DLL,因此keil 无法进行的操作诸如fopen和fread等都可以通过该dll来进行。

四、keil与dll的交互原理当keil平台在simulator的模式下面开始运行的时候会调用该DLL 的入口函数AGSI entry。

然后通过监控mem,SFR等来实现和DLL的交互。

注:Keil uVision2以上版本才可以使用该接口。

详细介绍请见Apnt_154.pdf。

4.1 keil软件配置打开keil 软件平台,新建或者打开任意一个工程,右击该工程在弹出的菜单中选中option for target,在随后弹出的对话框中选择debug选项,如下图:选中Use Simulator。

在左下角dialog DLL的Parameter下的编辑框中输入-dSPeriDLL,其中SPeriDLL是VC工程编译生成的DLL文件名字,-d是命令。

各种调试接口(JTAG、SWD、RDI)与仿真器(Jlink、Ulink、STlink)

各种调试接口(JTAG、SWD、RDI)与仿真器(Jlink、Ulink、STlink)

各种调试接口(JTAG、SWD、RDI)与仿真器(Jlink、Ulink、STlink)一、JTAG协议JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。

现在多数的高级器件都支持JTAG协议,如ARM、DSP、FPGA器件等。

标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。

相关JTAG引脚的定义为:•TMS:测试模式选择,TMS用来设置JTAG接口处于某种特定的测试模式;•TCK:测试时钟输入;•TDI:测试数据输入,数据通过TDI引脚输入JTAG接口;•TDO:测试数据输出,数据通过TDO引脚从JTAG接口输出;JTAG协议在定义时,由于当时的计算机(PC机)普遍带有并口,因而在连接计算机端是定义使用的并口。

而计算机到了今天,不要说笔记本电脑,现在台式计算机上面有并口的都很少了,取而代之的是越来越多的USB接口。

所以,目前市场上已经很少看到它的身影了。

二、SWD接口串行调试(Serial Wire Debug),应该可以算是一种和JTAG不同的调试模式,使用的调试协议也应该不一样,所以最直接的体现在调试接口上,与JTAG的20个引脚相比,SWD只需要4个(或者5个)引脚,结构简单,但是使用范围没有JTAG广泛,主流调试器上也是后来才加的SWD调试模式。

SWD和传统的调试方式区别:1.SWD模式比JTAG在高速模式下面更加可靠。

在大数据量的情况下面JTAG下载程序会失败,但是SWD发生的几率会小很多。

基本使用JTAG仿真模式的情况下是可以直接使用SWD模式的,只要你的仿真器支持,所以推荐大家使用这个模式。

2.在大家GPIO刚好缺一个的时候,可以使用SWD仿真,这种模式支持更少的引脚。

3.在大家板子的体积有限的时候推荐使用SWD模式,它需要的引脚少,当然需要的PCB空间就小啦!比如你可以选择一个很小的2.54间距的5芯端子做仿真接口。

KEIL中用虚拟串口调试串口程序

KEIL中用虚拟串口调试串口程序

虚拟出两个串口,并且已经连接在一起Stime=0x00 回车这些调试命令如何使用,比较好找,但是,这三条一条都不能少。

开始时,缺少最后一条命令,就无法运行。

Mode用于设置端口Assign用于分配端口输入输出Stime用于设置是否需要考虑内部计数频率。

0时表示直接以mode设置为准,此时不必计算内部的计数而产生的波特率;1时则考虑内部产生的频率而发生的波特率,更合适实际模拟调试,能够检验定时器设置是否准确。

3、现在可以开始运行你的项目了;4、打开串口调试工具,注意设置,端口号要设置为一对串口中的另外一个,本例中为COM3,另外,要确保发送数据的格式,需是16进制。

设置为波特率9600,无校验位、8位数据位,1位停止位(和COM2、程序里的设置一样)。

可以通过KEIL发送数据,在串口调试助手中就可以显示出来。

也可以通过串口调试助手发送数据,在KEIL中接收。

示例程序:#include "stc15.h" //包含单片机寄存器定义文件unsigned char xdata rxbuffer[21]={0}; //在外部RAM区定义20个单元unsigned char num; //计数变量unsigned char checksum; //校验和变量void main (void) //主程序{num=0;checksum=0;SCON=0x50; //置串行口工作方式1(SM0=0,SM1=1),允许接收(REN=1)AUXR=0x0; //选择定时器1作为波特率发生器// TMOD=0x0; //定时器1为工作方式0// TH1=0xff; //产生9600bps的时间常数// TL1=0xe8;// 注意,该虚拟串口方式无法使用STC定时器工作方式0的波特率发生器模式,只能使用传统的8051模式TMOD=0x20; //定时器1为工作方式1TH1=0xfd; //产生9600bps的时间常数TL1=0xfd;TR1=1; //启动定时器1ES=1; //串行口开中断EA=1; //开中断while(1); //等待中断}void UART_ISR(void) interrupt 4 //中断号4是串行口1中断{unsigned char rxchecksum=0;if(RI){RI=0;rxbuffer[num]=SBUF;if(num<21){if(num<20)checksum^=rxbuffer[num]; //计算校验和num++; //修改计数变量值}if(num==21) //应答信号不是0,重新发送{rxchecksum=rxbuffer[num-1]; //设置发送数据缓冲区指针if (rxchecksum==checksum){SBUF=0x00; //发送第一个数据}else{SBUF=0xff; //发送第一个数据}num=0; //为下次接收做准备checksum=0;}}else{TI = 0; //清发送中断标志}}。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C Compilers • Real-Time OS • Simulators • Education • Evaluation BoardsImplementing µVision DLL’s for Application Note 154 Advanced Generic Simulator Interface Rev. 4Extended by Infineon TechnologiesContents Contents (1)Introduction (3)How to use a Sample Peripheral DLL (4)Implementing own peripheral DLLs: Required Steps (7)How simulation basically works (8)Address representation (9)AGSI Function Description (10)AgsiEntry (11)AgsiDefineSFR (13)AgsiDefineVTR (14)AgsiDeclareInterrupt (15)AgsiSetWatchOnSFR (17)AgsiSetWatchOnVTR (18)AgsiSetWatchOnMemory (19)AgsiCreateTimer (20)AgsiSetTimer (21)AgsiDefineMenuItem (22)AgsiRegisterExecCallBack (24)AgsiWriteSFR (25)AgsiReadSFR (26)AgsiSetSFRReadValue (27)AgsiWriteVTR (28)AgsiReadVTR (29)AgsiWriteMemory (30)AgsiReadMemory (31)AgsiGetStates (32)AgsiGetProgramCounter (33)AgsiIsInInterrupt (34)AgsiIsSleeping (35)AgsiIsSimulatorAccess (36)AgsiIsSyncInstruction (37)AgsiGetSyncCount (38)AgsiSetSyncCount (39)AgsiSetSyncDelay (40)AgsiStopSimulator (41)AgsiWakeUp (42)AgsiTriggerReset (43)AgsiContinue (44)AgsiRequestInterrupt (45)AgsiSetSyncCount (46)AgsiUpdateWindows (47)AgsiHandleFocus (48)AgsiGetExternalClockRate (49)AgsiSetExternalClockRate (50)AgsiGetInternalClockRate (51)AgsiGetClockFactor (52)AgsiMessage (53)AgsiSetTargetKey (54)AgsiGetTargetKey (55)AgsiExecuteCommand (56)AgsiGetLastMemoryAddress (57)AgsiGetSymbolByName (58)AgsiGetSymbolByValue (59)Extensions by Infineon Technologies (61)Index (62)IntroductionThe µVision Debugger supports a simulator interface for implementing user-defined peripherals. This interface is called A dvanced G eneric S imulator I nterface (AGSI). The AGSI introduces a flexible and easy way for adding new user defined peripherals directly to µVision. It provides functions that are necessary to simulate the peripheral’s behavior as well as functions to display peripheral dialogs.To ease the development of a user-defined peripheral, the AGSI and a configuration framework is provided in two example projects. Only µVision version 2.21 or later supports all functions that are described in this document.AGSI Revision 3 is for µVision3 (version 3.00 or higher) and adds the following features: •AgsiEntry has new function codes (nCODE= AGSI_PRE_RESET, AGSI_CMDOUT)•The CALLBACK function for AgsiSetWatchOnSFR, AgsiSetWatchOnVTR, and AgsiSetWatchOnMemory gets now the address and access reason when it is called.AGSI DLL’s that have been developed for µVision2 can still be used with µVision3.SPeriDLLSPeriDLL, is a synonym for ‘Sample Peripheral DLL’. It is a ready to run peripheral DLL which implements a ‘A/D Converter from Analog Devices ADuC812’ as a sample peripheral. It uses most of the AGSI functions to implement this peripheral. The project consists of a MS Visual-C++ (6.0) project file and the following source files:AGSI.h: prototypes for the AGSI functions (do not modify!)SPeriDLL.h: main header file with various prototypes and definitionsSPeriDLL.cpp: main file (created by AppWizard) contains setup code and simulationPeriDialog.h: header file (created by Class Wizard) for a modeless peripheral dialogPeriDialog.cpp: implementation file for a modeless peripheral dialogAlso a simple µVision test project ‘Single A/D conversion with ADuC812’ is included in the fileS812ADC.zip which shows how to include and test the implemented peripheral.STimerDLLSTimerDLL, is a synonym for ‘Sample Timer DLL’. It is a ready to run peripheral DLL which implements a ‘Timer 3’ as a sample peripheral. As regards functionality, ‘Timer 3’ is identical to a standard 8051 Timer 1 but has different SFR addresses so that it can be loaded in addition to a ‘Timer 1’. It uses most of the AGSI functions to implement this peripheral. The project consists of a MS Visual-C++ (6.0) project file and the following source files:AGSI.h: prototypes for the AGSI functions (do not modify!)Common.h: header file with various prototypes and definitionsCommon.cpp: common support functions for AGSI and dialog functionsSTimerDLL.h: header file for STimerDLL classSTimerDLL.cpp: main file provides peripheral setup code and simulationPeriDialog.h: header file (created by Class Wizard) for a modeless peripheral dialogPeriDialog.cpp: implementation file for a modeless peripheral dialogAlso a simple µVision test project is included in the file Timer3.zip which shows how to include and test the implemented peripheral.In order to develop a peripheral, knowledge about C/C++ programming and the MS Visual-C++ 6.00 Programming Environment is required.How to use a Sample Peripheral DLLIn order to use one of the Sample Peripheral DLL’s, you must perform the steps below. The following steps are described for the SPeriDLL but the same applies for the STimerDLL:•Install µVision and the C51 Compiler on your PC.•Create a folder such as D:\Src32\SPeriDLL\•Unzip the file SPeriDLL.zip into the folder. Make sure that the ‘use folder names’ checkbox is checked since SPeriDLL uses some subfolders.•Create a folder such as C:\Keil\C51\Examples\S812ADC\•Unzip the file S812ADC.zip into the folder.•Start Visual-C, select the ‘SPeriDLL.dsw’ project file.•Select ‘Project – Settings’. Click at the ‘Debug’ tab. Browse for the ‘Executable for Debug session’. You need to select the file Uv2.Exe. It is normally in C:\Keil\Uv2 but this depends onwhere you have installed µVision.•Then click at the ‘Custom Build’ tab and write in the ‘Commands’ window the command ‘copy $(InputPath) C:\KEIL\C51\BIN\$(InputName).dll’ and write in the ‘Outputs’ window the outputfile ‘C:\KEIL\C51\BIN\$(InputName).dll’. This step is required to automatically copy the created DLL after building it in the BIN subfolder of µVision which is normally C:\KEIL\C51\BIN butdepends on where you have installed µVision. If everything is right, then the dialog should look like this:•After that, close the dialog.•Select ‘Build – Set active configuration’, choose the SPeriDLL Win32 Debug configuration. •Select ‘Build – Rebuild All’ to create the DLL.•Run µVision by pressing the F5 key. Select ‘Project – Open Project’, the Select Project dialog comes up. Select the ‘S812ADC.uv2’ project. It can be found in the folder that you havecreated and copied the project files into (normally C:\Keil\C51\Examples\S812ADC). •Select ‘Rebuild all target files’ to build the project.•Select ‘Options for Target – Debug’. Enable loading of the SPeriDLL peripheral DLL by simply adding the parameter ‘-dSPeriDLL’ to the parameter list of the ‘Dialog DLL’. The parameter format for peripheral DLL’s is ‘-dDLLName’ (DLL name without extension). Make sure that the ‘Use Simulator’ radio button is checked. If everything is right, then the dialog should look like this:•Close the dialog.•Select ‘Debug – Start/Stop Debug Session’. This will start the µVision Debugger. It initializes and loads also our SPeriDLL.dll. In the ‘Peripherals’ menu a new item should be present withthe label ‘A/D Converter’. Click on this item to open the peripheral dialog which looks like this:•Now you can single step through the code of the ‘Single A/D conversion with ADuC812’ sample and observe the behavior of the ‘A/D Converter’ peripheral and also other peripherals like ‘Port 0’ , ‘Port 2’, ‘Port 3’ and ‘Interrupt’.Note that this sample program demonstrates functionality of only a small part of the A/D Converter.Implementing own peripheral DLLs: Required StepsIn order to develop a peripheral DLL you should perform the following steps:•Start MS Visual-C++ and create a new project ‘MFC AppWizard (dll)’.•Add prototypes and definitions for the AGSI and SFR’s (S pecial F unctions R egisters) and VTR’s (V ir t ual R egisters) definitions to the main header file (*.h).•Write code for the peripheral initialization into the main file (*.cpp). This includes AGSI setup (GetFunctionPointers), declaration of peripheral menu entries and associated dialogs(DefineAllMenuEntries), declaration of SFR’s (DefineAllSFR), VTR’s (DefineAllVTREG),Watches (DefineAllWatches) and Interrupts (DefineAllInterrupts). Write also code for peripheral reset - SFR’s reset values (ResetPripheral). All this functions are called from the functionAgsiEntry() which must be exported by this peripheral DLL.•Write functions for simulation of the peripheral into the main file (these functions are triggered by the defined watches). Include also prototypes of these functions.•Create a peripheral dialog with the Resource Editor (if the dialog is required) and the associated header file (*.h) and implementation file (*.cpp) using the ‘MFC ClassWizard’. Don’tforget to set the ‘Visible’ property of the dialog and include the default buttons ‘OK’ and ‘Cancel’ and make them invisible (required for the behavior of the ESC and Enter keys). Change thedefault constructor for the dialog and add functions PeriDisp() – displays dialog, PeriUpdate() – updates display contents which calls function Update() and PeriKill() – closes the dialog. Addalso a menu definition (AGSIMENU) and a dialog definition (AGSIDLGD).•Write the code for updating the display contents into the Update() function in the dialog implementation file. This function is called automatically when an update is requested and isused to reflect the current state of the peripheral.•Add functions for dialog control item’s messages by using ‘MFC ClassWizard’. Most frequently used messages are: ON_BN_CLICKED for Buttons, ON_EN_KILLFOCUS for Edit Boxes,ON_CBN_SELCHANGE for Combo Boxes …Include also functions for the two invisible buttons ‘OK’ and ‘Cancel’.•Select ‘Project – Settings’. Click at the ‘Debug’ tab. Browse for the ‘Executable for Debug session’ and select the file Uv2.Exe. It is normally in C:\Keil\Uv2 but this depends on where you have installed µVision.•Rebuild your peripheral DLL. Then copy the DLL file to the BIN subfolder of µVision which is normally C:\KEIL\C51\BIN but depends on where you have installed µVision or use the‘Custom Build’ within MS Visual-C++ and write the command that automatically copies the DLL after rebuild (see previous description in the ‘Sample Peripheral DLL’).•Test your peripheral DLL by running µVision (press the F5 key). Select a test project and enable loading of the implemented peripheral DLL by simply adding the parameter‘−dDLLName’ (DLL name without extension) to the parameter list of the peripheral DLL (seeprevious description in the ‘Sample Peripheral DLL’).•If the implemented peripheral is running, switch into Release Mode and rebuild it. Then test the peripheral DLL again (don’t forget to copy the ‘Release DLL’ file to the BIN subfolder ofµVision).How simulation basically worksIf every simulated peripheral would be updated with every simulated CPU instruction, the performance of the simulator would be extremely low. That’s why µVision simulator uses a event driven simulation instead. Events (also called watches) are read or write accesses to special function registers (SFR), virtual register (VTR) or memory areas and when a software timer expires. The following two examples explain this in detail:Analog Digital Converter (see SPeriDLL):Let’s assume that an A/D converter has configuration register (SFR’s ADCCONx), data register (SFR’s ADCDATAx), 8 analog inputs (VTR’s AIN0-7) and one external pin (VTR CONVST) to start a conversion. The A/D converter does nothing until it is started so no functions are called to simulate it and no simulation time is consumed at this time. In order to ‘see’ when the A/D converter is configured and started, so called access watches (AgsiSetWatchOnSFR and AgsiSetWatchOnVTR) need to be set on the configuration register and on the external start pin. This is done in the function ‘DefineAllWatches’. Whenever a new value is written into the ADCCONx register or into the external start pin, the function‘AdcConv’ is called. This function has to check the configuration, reference voltages and the analog inputs in order to calculate the digital value. The digital result cannot be written into the data register at this time. A real A/D converter needs some time to sample and convert an analog voltage. In order to simulate this behavior, a software timer is set (AgsiSetTimer) which calls the function ‘AdcCompleted’ after the specified number of states. This function writes the digital value into the data register, clears the busy flag, and sets the interrupt request bit.16 Bit Timer (see STimerDLL):Even a timer does not need to update (recalculate) its values with every simulated instruction. Typically, the timer values need to be updated when the configuration changes (start/stop, prescaler value) and when the actual timer value is read. Therefore, a write access watch must be set on the configuration register and read access watches must be set on the timer register. The timer calculation function stores the time (states) in a static variable whenever it is called. With the time difference (actual states – last states) the actual timer value can be calculated. With this method, the timer values can be calculated at any time with a minimum of calculation overhead. Only the interrupt on a timer overflow cannot be handled that way. With an additional software timer (AgsiSetTimer) set to this event, the timer is recalculated with every overflow. When a overflow is detected, the interrupt request flag is set and the timer is reloaded with 0 or a specific reload value.Address representationDepending on the microcontroller family, µVision maps the different memory areas (XDATA / DATA / CODE) into one linear address range. These different memory areas are represented with the following values in the most significant byte of a 32 bit address:80166 Microcontroller: This microcontroller has a 16 Mbyte linear address space. The valid address range therefore is from 0 to 0x00FFFFFF. No different memory types are needed.8051 Microcontroller:Define Memory type Address RangeamXDATA XDATA 0x0000 – 0xFFFFamPDATA PDATA 0x0000 – 0x00FF (one page of XDATA)amDATA DATA 0x0000 – 0x00FFamIDATA IDATA 0x0000 – 0x00FF (0x00 – 0x7F = DATA)amCODE CODE 0x0000 – 0xFFFFamBANK0 Bank 0 0x0000 – 0xFFFFamBANK0 + n Bank n 0x0000 – 0xFFFFamBANK31 Bank 31 0x0000 – 0xFFFF80251 Microcontroller: Following types can be used in addition to the memory types of the 8051 Family Define Memory type Address RangeamEDATA EDATA 0x0000 – 0xFFFFamECODE ECODE 0x0000 – 0xFFFFFFamHDATA HDATA 0x0000 – 0xFFFFFFamHCONS HCONST 0x0000 – 0xFFFFFFamCONST CONST 0x0000 – 0xFFFFSLE66 Microcontroller: Following types can be used in addition to the memory types of the 8051 FamilyDefine Memory type Address RangeamPHYS physical 0x0000 – 0xFFFFFFExample:BYTE buffer[10];AgsiReadMemory(0x1000|(amCODE<<24),10,buffer);// read 10 bytes to (CODE) address 0x1000 AgsiReadMemory(0x1000|(amCODE<<16),10,buffer);// the same function but for SLE66 processorAGSI Function DescriptionAgsiEntry is the only function of a peripheral DLL that is called directly from the µVision simulator. All other functions described below are in the µVision simulator and can be called from the peripheral DLL. Functions to define SFR’s, VTR’s, interrupts, timer, menus, dialogs and access watches. These functions can only be called during the initialization.AgsiDefineSFR AgsiDefineVTRAgsiDeclareInterrupt AgsiSetWatchOnSFRAgsiSetWatchOnVTR AgsiSetWatchOnMemoryAgsiCreateTimer AgsiDefineMenuItemAgsiRegisterExecCallBackFunctions to read and write memory, SFR’s and VTR’s:AgsiWriteSFR AgsiReadSFRAgsiWriteVTR AgsiReadVTRAgsiWriteMemory AgsiReadMemoryFunctions to retrieve simulator status information:AgsiGetStates AgsiGetProgramCounterAgsiIsInInterrupt AgsiIsSleepingAgsiIsSimulatorAccess AgsiIsSyncInstructionAgsiGetSyncCount AgsiGetExternalClockRateAgsiGetInternalClockRate AgsiGetClockFactorAgsiGetLastMemoryAddressFunctions to control the simulator:AgsiSetTimer AgsiSetSFRReadValueAgsiStopSimulator AgsiWakeUpAgsiTriggerReset AgsiContinueAgsiRequestInterrupt AgsiSetSyncCountAgsiSetSyncDelay AgsiSetExternalClockRateAgsiUpdateWindows AgsiHandleFocusAgsiMessage AgsiExecuteCommandFunctions to store and retrieve configuration information:AgsiSetTargetKey AgsiGetTargetKeyFunctions to retrieve symbol values or symbol names:AgsiGetSymbolByName AgsiGetSymbolByValueAgsiEntrySummary:extern "C" DWORD AGSIEXPORT AgsiEntry (DWORD nCode, void *vp)Parameter:nCode Function selector. All possible values are listed below.vp Pointer to various objects depending on nCode. In order to use this pointer, itmust be casted to the required data type.Return Value:The function should return TRUE(1) if completed successfully or FALSE(0) if an error occurred.Description:AgsiEntry is the only function of a peripheral DLL that has to be exported. It is called from µVision when a debug session is started to initialize the peripheral simulation as well as during the debugging session to notify events. The meaning of vp depends on the value of nCode. AgsiEntry can be called with the following nCode values:Value of nCode Value of vp FunctionAGSI_CHECK 8051 or 80166 Check CPU TypeAGSI_INIT Pointer to AGSICONFIG Initialize DLLAGSI_TERMINATE Not used TerminateAGSI_RESET Not used ResetAGSI_PREPLL Not used CPU clock is about to be changedAGSI_POSTPLL Not used CPU clock was changedAGSI_PRERESET Not used Called before Reset, but CPU cyclesstill validAGSI_CMDOUT Pointer to Text Command output of 'exec' commands AGSI_ONINTERRUPT Pointer to Interrupt number Interrupt from a deviceAGSI_ONRETI Pointer to Interrupt number Interrupt acknowledgedAGSI_ENTERSLEEP Not used Power down mode enteredAGSI_EXITSLEEP Not used Power down mode exitedAGSI_CHECKThe first call to AgsiEntry is done with nCode=AGSI_CHECK. The pointer vp points to a DWORD which contains either the value 8051 or 80166, or 7 (for ARM) depending on the microcontroller family that is selected in the current project. This call checks if the DLL can be used for the specifiedmicrocontroller family. The function should return TRUE(1) if the DLL supports this microcontroller family or FALSE(0) if not.AGSI_INITThe second call to AgsiEntry is done with nCode=AGSI_INIT. The pointer vp points to the structure AGSICONFIG which contains information about the project and the parameters for this DLL. This information can be used to configure the peripheral DLL. Additional parameters (format: –option) for the DLL can be entered in the µVision dialog ‘Options for Target -> Debug - > Dialog DLL Parameter’. The DLL can analyze the ‘m_pszConfiguration’ string to extract the information. The‘m_pszProjectPath’ can be used to store log files or additional configuration files for the current project.typedef struct {HINSTANCE m_hInstance; // Instance handle to retrieve the function addressesconst char* m_pszProjectPath; // Path to application e.g. C:\KEIL\C51\EXAMPLES\HELLO const char* m_pszDevice; // Simulated Device e.g. 52. This string is extracted// out of the -p option.const char* m_pszConfiguration; // Complete dialog DLL options e.g. -p52 -dmydll ...const char* m_pszAppFile; // Name of loaded OMF file including path e.g.C:\KEIL\C51\EXAMPLES\HELLO\HELLO //HWND m_hwnd; // Mainframe parent window} AGSICONFIG;When AgsiEntry is called with AGSI_INIT, all special function register (SFR), virtual register (VTR), interrupts, watch points and dialogs that need to be simulated must be defined. The function should return FALSE(0) if an error occurs or TRUE(1) if the function has been executed successfully.AGSI_TERMINATEAgsiEntry is called with nCode=AGSI_TERMINATE when the µVision debugger is closed. The pointer vp is not used in this case. When files have been opened during initialization they must be closed and if memory has been allocated, it must be freed.AGSI_RESETAgsiEntry is called with nCode=AGSI_RESET when the simulated CPU is reset. All peripherals (SFR’s) must be set to their reset state. There are several situations where a CPU reset is executed: - When the simulator is started (after AGSI_INIT).- After an application is loaded.- When RESET is entered in the command line or when the reset button is pressed in the toolbar.- When a watchdog timer overflow occurs.The pointer vp is not used in this case.AGSI_PREPLL, AGSI_POSTPLLAgsiEntry is called with nCode=AGSI_PREPLL or AGSI_POSTPLL before and after the CPU clock frequency changes. Some CPU’s have a clock prescaler that can be reprogrammed to save power. In case a peripheral is not connected to the same clock as the CPU, the values for AgsiSetTimer probably need to be recalculated when the CPU clock is modified. This function call notifies a peripheral before and after the CPU clock frequency has changed so that the timer values can be corrected for the new clock. The pointer vp is not used in this case.Summary:BOOL AgsiDefineSFR(const char* pszSfrName, AGSIADDR dwAddress,AGSITYPE eType, BYTE bBitPos);Parameter:pszSfrName Pointer to name of the SFRdwAddress Address of the SFR. Following address ranges are possible:8051/251: 0x80 – 0xFF8051Mx: 0x80 – 0xFF and 0x180 – 0x1FF80166: 0xF000 – 0xF1FE and 0xFE00 – 0xFFFE (even address) eType Type of the SFR.orAGSIBIT8051: AGSIBYTE80166: AGSIWORD or AGSIBITWith AGSIBIT, dwAddress must point to a bit addressable area:8051: 0x80, 0x88, … , 0xF0, 0xF8 every 8th byte80251: 0x80 - 0xFF every byte8051Mx: 0x80 - 0xF8 and 0x180 – 0x1F8 every 8th byte80166: 0xF100 – 0xF1FE and 0xFF00 – 0xFFFE (even address) bBitPos Bit position within SFR (only for eType=AGSIBIT).8051/251/Mx: 0 – 780166: 0 – 15Return Value:TRUE if successful, FALSE in case of wrong address or too many definitions (at least 300 for all loaded DLL’s).Description:This function is used to define a SFR (S pecial F unction R egister) or a SFR bit. These definitions can be listed in the symbol window and can be used in the watch window and command line.Note:This function may only be called during the initialization process.Example:AgsiDefineSFR("IE", 0xA8, AGSIBYTE, 0); // 8051: IEAgsiDefineSFR("EA", 0xA8, AGSIBIT, 7); // 8051: EA bit in IEAgsiDefineSFR("PSW", 0xFF10, AGSIWORD, 0); // 80166: PSWAgsiDefineSFR("IEN", 0xFF10, AGSIBIT, 11); // 80166: IEN bit in PSWSummary:AGSIVTR AgsiDefineVTR(const char* pszVtrName, AGSITYPE eType,DWORD dwValue);Parameter:pszVtrName Name of the VTReType Type of the VTR (AGSIVTRCHAR, AGSIVTRWORD, AGSIVTRLONG orAGSIVTRFLOAT)dwValue Initial Value of the VTR. Initializing float values is a little difficult sincedwValue is defined as DWORD. In this case, the float value can be convertedto a DWORD using a union.Return Value:VTR handle if successful otherwise NULL.Description:This function is used to declare a VTR (V ir t ual R egister). VTR’s are used to display or to set values that are usually set by hardware. With this function, new VTR’s can be defined or the handle of already defined VTR’s can be retrieved.Note:This function may only be called during the initialization process.Example:hXTAL = AgsiDefineVTR("XTAL", AGSIVTRLONG, 0x00B71B00); // 12MHzhVREF = AgsiDefineVTR("VREF", AGSIVTRFLOAT, 0x40200000); // 2.5VhVREF = AgsiDefineVTR("MYPORT", AGSIVTRCHAR, 0x000000FF); // all pins highAgsiDeclareInterruptSummary:BOOL AgsiDeclareInterrupt(AGSIINTERRUPT *pInterrupt);Parameter:PInterrupt Pointer to an AGSIINTERRUPT structure (see below).Return Value:TRUE if successful otherwise FALSE.Description:This function is used to define an interrupt source of an on-chip peripheral. All the information about this interrupt source is passed to the function with a structure. It defines the interrupt vector address as well as all request, enable and priority flags. This information automatically adds another line in the Interrupt Dialog. The structure is different for every microcontroller family and is described in the following AGSIINTERRUPT structure:// 8051/251/8051Mxtypedef struct {AGSIADDR vec; // interrupt vector addresschar *mess; // interrupt name (will be shown in interrupt dialog)// The mode bit is only shown in the interrupt dialog.// It has no influence on interrupt processing.AGSIADDR msfr; // interrupt mode sfr.WORD mmask; // interrupt mode bit mask (only one bit may be set)const char *mname; // name of interrupt mode bitAGSIADDR rsfr; // interrupt request sfrWORD rmask; // interrupt request bit mask (only one bit may be set) const char *rname; // name of interrupt request bitAGSIADDR esfr; // interrupt enable sfrWORD emask; // interrupt enable bit mask (only one bit may be set)const char *ename; // name of interrupt enable bitAGSIADDR p0sfr; // interrupt priority 0 sfrWORD p0mask; // interrupt priority 0 bit mask (only one bit may be set) const char *pname; // name of interrupt priority bitAGSIADDR p1sfr; // interrupt priority 1 sfr. =0 if CPU only supports 2 levels WORD p1mask; // interrupt priority 1 bit mask (only one bit may be set) WORD pwl; // priority within level (1 – lowest priority)WORD auto_reset; // reset interrupt request flag on interrupt entry} AGSIINTERRUPT;// 80166typedef struct {AGSIADDR vec; // interrupt vector address (must be a even address)char *mess; // interrupt name (will be shown in interrupt dialog)AGSIADDR sfr; // interrupt control sfr which contains ILVL, GLVL, IR and IE } AGSIINTERRUPT;// SLE66typedef struct {AGSIADDR vec;char *mess; // Interrupt nameconst char *rname; // name of interrupt request bitconst char *ename; // name of interrupt enable bitconst char *pname; // name of interrupt priority bitDWORD num; // Interrupt NumberDWORD pwl; // priority within level} AGSIINTERRUPT;Note:This function may only be called during the initialization process.Example:// 8051/251/8051Mx#define TCON 0x88#define IE 0xA8#define IP 0xB8#define IPH 0xB7AGSIINTERRUPT ExtInt0 = { // External Interrupt 00x0003, "P3.2/Int0", TCON, 0x01, "IT0", TCON, 0x02, "IE0", IE, 0x01, "EX0", IP, 0x01, "Pri", IPH, 0x01, 8, 1};AGSIINTERRUPT Timer0Int = { // Timer 0 Interrupt0x000B, "Timer 0", 0, 0, "", TCON, 0x20, "TF0", IE, 0x02, "ET0", IP,0x02, "Pri", IPH, 0x02, 6, 1};AgsiDeclareInterrupt(&Timer0Int);AgsiDeclareInterrupt(&ExtInt0);// 80166#define S0TIC 0xFF6CAGSIINTERRUPT SerTransmitInt = { // Serial Transmit Interrupt0x00A8, "S0TINT", S0TIC}AgsiDeclareInterrupt(&SerTransmitInt);Summary:BOOL AgsiSetWatchOnSFR(AGSIADDR SFRAddress, AGSICALLBACKApfnReadWrite,AGSIACCESS eAccess);Parameter:SFRAddress Address of the SFRpfnReadWrite Pointer to a function that is called on SFR access. The function gets asargument the address and the access reason to the memory and does nothave a return value (void function(DWORD adr, AGSICB_REASON r)).eAccess Access type (AGSIREAD, AGSIWRITE, AGSIREADWRITE)Return Value:TRUE if successful otherwise FALSE.Description:This function is used to set a watch on SFR access. Whenever the specified SFR is accessed, the specified function is called.Example:#define TCON 0x88#define TL1 0x8B#define TH1 0x8Dstatic void timer1(DWORD adr, AGSICB_REASON r) {// watch function implementation}AgsiSetWatchOnSFR(TH1, timer1, AGSIREADWRITE); //Call ‘timer1’ when TH1 is written or read AgsiSetWatchOnSFR(TL1, timer1, AGSIREADWRITE); //Call ‘timer1’ when TL1 is written or read AgsiSetWatchOnSFR(TCON, timer1, AGSIWRITE); //Call ‘timer1’ when TCON is written。

相关文档
最新文档