1、第7章 Nios II 常用外设编程本章介绍了本章介绍了Nios II处理器常用外围设备处理器常用外围设备(Peripherals)内核的特点、配置以及软件编程,供大家在使用这些外设内核的特点、配置以及软件编程,供大家在使用这些外设定制定制Nios II系统时查阅。这些外设都是以系统时查阅。这些外设都是以IP核的形式提供核的形式提供给用户的给用户的,用户可以根据实际需要把这些用户可以根据实际需要把这些IP核集成到核集成到Nios II系统中去。系统中去。主要介绍:主要介绍:硬件结构;硬件结构;内核的特性核接口;内核的特性核接口;SOPC Builder中各内核的配置选项;中各内核的配置选项;软
2、件编程。软件编程。主要内容主要内容7.1 并行输入/输出内核并行输入并行输入/输出内核输出内核(PIO内核内核)提供提供Avalon从控制器从控制器端口和通用端口和通用I/O口口间的存储器映射接口。间的存储器映射接口。PIO内核提供简内核提供简单的单的I/O访问用户逻辑或外部设备,例如:访问用户逻辑或外部设备,例如:控制控制LED 读取开关量读取开关量 控制显示设备控制显示设备 配置并且与片外设备通信配置并且与片外设备通信说明:说明:1.1.SOPC BuilderSOPC Builder中提供了中提供了PIOPIO内核,可以很容易将内核,可以很容易将PIOPIO内核集成到内核集成到SOPC
3、BuilderSOPC Builder生成的生成的系统中。系统中。2.2.通用通用I/OI/O端口既连接到片内逻辑又连接到外部设备的端口既连接到片内逻辑又连接到外部设备的FPGA I/OFPGA I/O管脚。管脚。7.1 并行输入/输出内核PIO内核简介内核简介最多最多32个个I/O端端口口CPU内核PIO内核内核寄存器Nios II 系统系统PIO内核Pio31Pio30Pio29Pio3Pio2Pio1Pio0Pio7Pio6Pio5Pio4Pio3Pio2Pio1Pio0PIO内核端口数端口数可设置可设置每个Avalon接口的PIO内核可提供32个I/O端口且端口数可设置,用户可以添加一
4、个或多个PIO内核。CPU通过I/O寄存器控制I/O端口的行为。I/O口可以配置为输入、输出和三态,还可以用来检测电平事件和边沿事件。CPU通过寄通过寄存器控制存器控制I/O端口行端口行为为PIO内核结构框图内核结构框图7.1 并行输入/输出内核PIO内核寄存器描述内核寄存器描述偏移量寄存器名称R/W(n-1)2100数据寄数据寄存器存器读访问R读入输入引脚上的逻辑电平值写访问W向PIO输出口写入新值1方向寄存器方向寄存器R/W控制每个I/O口的输入输出方向。0:输入;1:输出。2中断屏蔽寄存器中断屏蔽寄存器 R/W使能或禁止每个输入端口的IRQ。1:中断使能;0:禁止中断。3边沿捕获寄存器边
5、沿捕获寄存器 R/W 当边沿事件发生时对应位置1。注:注:该寄存器是否存在取决于硬件的配置。如果该寄存器不存在,那么读寄存器将返回未定义的值,该寄存器是否存在取决于硬件的配置。如果该寄存器不存在,那么读寄存器将返回未定义的值,写寄存器无效。写寄存器无效。写任意值到边沿捕获寄存器将清除所有位为写任意值到边沿捕获寄存器将清除所有位为0 0。“该寄存器是否存在取决于硬件的配置。如果该寄存器不存在,那么读寄存器将返回未定义的值,写寄存器无效。”CPU读读/写写PIO接口的映射寄存器控制接口的映射寄存器控制PIO的各个端口的各个端口四个寄存器四个寄存器:data、direction、interruptm
6、ask和和edgecapture7.1 并行输入/输出内核双击 PIO内核配置选项7.1 并行输入/输出内核 PIO内核配置选项Basic Settings 选项卡I/O口宽度口宽度:可设置为132的任何整数值。Direction中文描述Bidirectional(tri-state)ports双向(三态)端口Input ports only仅为输入端口Output ports only仅为输出端口Both input and output ports输入和输出端口7.1 并行输入/输出内核 PIO内核配置选项Basic Settings 选项卡Direction中文描述Bidirection
7、al(tri-state)ports双向(三态)端口Input ports only仅为输入端口Output ports only仅为输出端口Both input and output ports输入和输出端口7.1 并行输入/输出内核 PIO内核配置选项Input Options 选项卡边沿捕获寄存器中断寄存器Rising Edge:上升沿:上升沿Falling Edge:下降沿:下降沿Either Edge:上升或下降沿上升或下降沿Level:输入为高电平且中断使能,:输入为高电平且中断使能,则则PIO内核产生一个内核产生一个IRQ。Edge:边沿捕获寄存器相应位为:边沿捕获寄存器相应位为
8、1且且中断使能,则中断使能,则PIO内核产生一内核产生一个个IRQ。说明:当指定类型的边沿在输入端口出现时,边沿捕获寄存器对应位置1。说明:中断只有高电平中断,如果希望低电平时中断,则需在该I/O输入引脚前加一个“非”门。7.1 并行输入/输出内核 PIO内核配置选项Simulation 选项卡当需要对外进行仿真时,当需要对外进行仿真时,要设置要设置simulation选项选项卡。卡。7.1 并行输入/输出内核软件编程软件编程PIO内核提供了对硬件进行寄存器级访问的文件。Altera_avalon_pio_regs.h该文件定义了内核的寄存器映射并提供硬件设备访问宏定义。可通过阅读上述文件以熟
9、悉PIO设备的软件访问方法,但不应该修改文件。3.3.软件编程软件编程PIO内核不是内核不是HAL支持的通用设备模型,不能通过支持的通用设备模型,不能通过HAL API或或ANSI C 标准库来访问标准库来访问 Altera提供了提供了PIO的寄存器头文件的寄存器头文件altera_avalon_pio_regs.h。文件定义其寄存器映射,文件定义其寄存器映射,提供了对底层硬件的符号化访问方法提供了对底层硬件的符号化访问方法。PIO 内核的设备信息在内核的设备信息在system.h 中中实验实验3 3 实验目的:熟悉实验目的:熟悉NiosII PIO设备的访问方法设备的访问方法#include
10、 system.h#include altera_avalon_pio_regs.h#include alt_types.h“int main(void)_attribute_(weak,alias(alt_main);int alt_main(void)alt_u8 led=0 x2;alt_u8 dir=0;volatile int i;while(1)if(led&0 x81)/led为边缘情况为边缘情况1或或8的时候,改方向的时候,改方向 dir=(dir 0 x1);if(dir)led=led 1;else led=led 1;IOWR_ALTERA_AVALON_PIO_DATA
11、(LED_PIO_BASE,led);/led值值写入写入PIO i=0;while(i200000)i+;/延时延时 return 0;此处:定义此处:定义main的的别名为别名为alt_main#include system.h“#define LED_PIO_NAME/dev/led_pio#define LED_PIO_BASE 0 x06424110 .#include altera_avalon_pio_regs.h“#define IORD_ALTERA_AVALON_PIO_DATA(base)IORD(base,0)#define IOWR_ALTERA_AVALON_PIO
12、_DATA(base,data)IOWR(base,0,data)#include alt_types.h“typedef signed char alt_8;.例:红色发放二极管LEDR在LEDR上输出显示data数据的C/C+语句格式为:IOWR _ALTERA_AVALON_PIO_DATA(LED_RED_BASE,data)或者:或者:7.1 并行输入/输出内核IOWR_ALTERA_AVALON_PIO_DATA(0 x00B81090,data)IOWR(LED_RED_BASE,0,data)IOWR(0 x00B81090,0,data)例:例:编写编写 C/C+程序,让程序
13、,让DE2开发板上的开发板上的18只红色发光二极只红色发光二极管管LEDR17LEDR0依次向左移位发光。依次向左移位发光。#include“count_binary.h”int alt_main(void)int i,data;data=0 x01;for(i=0;i18;i+)IOWR(LEDR_BASE,0,data);data=1;usleep(100000);2)电平开关)电平开关SW 有有18只电平开关只电平开关SW17SW0,在硬件设备命名为,在硬件设备命名为SWITCH_PIO,电,电平开关的定义在平开关的定义在system.h头文件中。头文件中。电平开关的编程电平开关的编程
14、用变量用变量key读取电平开关读取电平开关SW上的数据的上的数据的C/C+语句格式为语句格式为:key=IORD_ALTERA_AVALON_PIO_DATA(SWITCH_PIO_BASE)或:或:key=IORD(SWITCH_PIO_BASE,0);例:例:编写编写 C/C+程序,用变量程序,用变量key读取读取DE2开发板上的开发板上的18只电只电平开关上的数据,并用七段数码管显示读出的数据。平开关上的数据,并用七段数码管显示读出的数据。#include“count_binary.h”int alt_main(void)int key;key=IORD(SWITCH_PIO_BASE,
15、0);IOWR(SEG7_DISPLAY_BASE,0,key);3)按钮按钮BUTTON 有有4只按钮只按钮KEY3KEY0,在硬件设备命名为,在硬件设备命名为BUTTON_PIO,按钮,按钮BUTTON的定义在的定义在system.h头文件中。头文件中。按钮按钮BUTTON的编程的编程 用变量用变量key读取按钮读取按钮BUTTON上的数据的上的数据的C/C+语句格式为:语句格式为:key=IORD_ALTERA_AVALON_PIO_DATA(BUTTON_PIO_BASE)或:或:key=IORD(BUTTON_PIO_BASE,0);异常处理异常处理v异常异常是指程序离开正常流程的一
16、种控制上的切换。是指程序离开正常流程的一种控制上的切换。v异常可能由需要立即响应的处理器内部或者外部设备异常可能由需要立即响应的处理器内部或者外部设备的某一事件引起。的某一事件引起。v异常处理异常处理指响应异常所进行的处理,并且返回到异常指响应异常所进行的处理,并且返回到异常产生之前程序执行的状态。产生之前程序执行的状态。异常不是异常不是bug!bug!v 学习学习重点重点:处理硬件中断请求处理硬件中断请求 使用使用HAL注册用户定义的中断服务程序(注册用户定义的中断服务程序(Interrupt Service RoutineISR)来处理硬件中断请求。)来处理硬件中断请求。v Nios II
17、处理器异常分类如下:处理器异常分类如下:n 硬件中断硬件中断n 软件陷阱软件陷阱n 未实现的指令未实现的指令n 其他异常其他异常v 所有的异常所有的异常(硬件和软件)由位于异常地址硬件和软件)由位于异常地址(exception address)的异常程序来处理。的异常程序来处理。v 异常地址在系统创建时指定,软件编程人员不用直接访问异常处异常地址在系统创建时指定,软件编程人员不用直接访问异常处 理地址,编写程序也不需要知道该地址。理地址,编写程序也不需要知道该地址。1.硬件中断硬件中断v NIOS处理器支持处理器支持32个外部中断源,中断号越小,优先级越高个外部中断源,中断号越小,优先级越高v
18、 处理硬件中断的流程处理硬件中断的流程n 来自外设的请求硬件中断的信号(来自外设的请求硬件中断的信号(interrupt request)n 保存保存Nios II处理器寄存器(处理器寄存器(context switch)n 禁止硬件中断禁止硬件中断n 将控制权交到将控制权交到Nios II处理器异常地址处理器异常地址(exception handler)n 跳转到异常处理地址后执行跳转到异常处理地址后执行异常处理程序异常处理程序,处理器开始执行,处理器开始执行一段一段HAL系统代码,判断中断源和中断优先级,然后再转跳到系统代码,判断中断源和中断优先级,然后再转跳到相应的用户的相应的用户的中断
19、服务程序(中断服务程序(ISR)中。即发生异常后,异常处中。即发生异常后,异常处理除理除ISR外的所有工作都由外的所有工作都由HAL系统库代码自动完成。系统库代码自动完成。【context】:语境:语境使用HAL开发应用程序 nHAL与异常处理异常处理过程和中断服务程序异常处理过程和中断服务程序(1)中断服务程序的编写和注册方法)中断服务程序的编写和注册方法 n HAL的的ISR APIv Nios II IDE创建系统库工程时,包含了所有需要的创建系统库工程时,包含了所有需要的ISR。用户不必去写用户不必去写HAL ISR,除非用户要和定制的外设通信。,除非用户要和定制的外设通信。v HAL
20、 API定义了很多函数管理硬件中断,如:定义了很多函数管理硬件中断,如:alt_irq_register()alt_irq_disable()alt_irq_enable()v 用用HAL API编写用户的编写用户的ISR,步骤:,步骤:1.编写特定设备中断的编写特定设备中断的ISR。2.调用调用alt_irq_register()函数来注册函数来注册ISR。n 编写用户的编写用户的ISR v 用户编写的用户编写的ISR必须符合必须符合alt_irq_register()函数的原型函数的原型v 注意:编写的注意:编写的ISR中不能使用中不能使用ANSI C标准库中标准库中I/O有关操作,有关操
21、作,不要调用不要调用printf(),可能使系统死锁,可能使系统死锁第一个参数:中断上下文指针第一个参数:中断上下文指针(向向ISR传递语境信息的指针传递语境信息的指针)第二个参数:中断号第二个参数:中断号,在在system.h中声明,例如:中声明,例如:PIO_IRQvoid isr_name(void*context,alt_u32 id)n 注册用户的注册用户的ISR,向,向HAL层传递中断服务程序信息层传递中断服务程序信息v注意:使用该函数需包含注意:使用该函数需包含”sys/alt_irq.h”头文件头文件第一个参数为中断号第一个参数为中断号;(alt_u32在在alt_types.
22、h定义为定义为unsigned long)第二个参数为中断上下文指针;第二个参数为中断上下文指针;第三个参数是中断服务函数的指针。(可直接用函数名字)第三个参数是中断服务函数的指针。(可直接用函数名字)v中断发生时,系统中断发生时,系统回调用户注册的中断服务程序回调用户注册的中断服务程序,传入的,传入的第一个参数即为用户调用第一个参数即为用户调用alt_irq_register时传入的中断上下时传入的中断上下文指针参数;传入的第二个参数为本中断的中断号。文指针参数;传入的第二个参数为本中断的中断号。alt_irq_register(alt_u32 id,void*context,void(*i
23、sr)(void*,alt_u32)n Button PIO以以中断中断的形式与应用程序的形式与应用程序 通信,设备的初始化程序比较特殊,也是整个软件设计的难点通信,设备的初始化程序比较特殊,也是整个软件设计的难点(2)举例)举例中断编程中断编程(实验实验5 PIO外部中断实验外部中断实验)static void handle_button_interrupts(void*context,alt_u32 id)/*清中断捕获寄存器清中断捕获寄存器*/IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);/*通知外部有中断事件发生通知外部有中断事件
24、发生*/done+;n 编写用户的编写用户的ISR 采用中断方式时还需要对按钮进行开放中断、复位边沿捕获寄存器和登记中采用中断方式时还需要对按钮进行开放中断、复位边沿捕获寄存器和登记中断源的初始化处理。按钮初始化过程语句如下:断源的初始化处理。按钮初始化过程语句如下:static void init_button_pio()void*edge_capture_ptr=(void*)&edge_capture;/*开放全部开放全部4个按钮的中断个按钮的中断*/IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0 xf);/*复位边沿捕获寄存器复位边沿
25、捕获寄存器*/IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0 x0);/*登记中断源登记中断源*/alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_button_interrupts);n 注册用户的注册用户的ISR(初始化)初始化)n提高处理性能的措施(1)从软件上改善处理性能从软件上改善处理性能1.1.把无关紧要的以及影响中断执行性能的事情放在中断服务程序之外处理把无关紧要的以及影响中断执行性能的事情放在中断服务程序之外处理,尽量使中断服务程序精简;,尽量使中断服务程序精简;2
26、.2.把传送大量数据之类的事情交给把传送大量数据之类的事情交给DMADMA来完成;来完成;3.3.如果使用如果使用DMADMA传输大量数据,可以加大缓冲区以减少中断次数,从而提高传输大量数据,可以加大缓冲区以减少中断次数,从而提高中断性能。中断性能。4.4.DMADMA传输大量数据应用中,采用双缓冲区;传输大量数据应用中,采用双缓冲区;5.5.在允许的情况下,一直保持中断使能。在允许的情况下,一直保持中断使能。6.6.使用快速的存储空间来存储关键代码;使用快速的存储空间来存储关键代码;7.7.使用中断嵌套使用中断嵌套8.8.将应用程序工程和系统库工程都设置为高的编译优化等级。将应用程序工程和系
27、统库工程都设置为高的编译优化等级。n提高处理性能的措施(1)从硬件上改善处理性能从硬件上改善处理性能1.添加或加大快速存储器来存储关键代码或作为数据缓存。添加或加大快速存储器来存储关键代码或作为数据缓存。2.添加添加DMA控制器,这要与软件改善中的第控制器,这要与软件改善中的第3.4步同时执行。步同时执行。3.使用性能更好的使用性能更好的Nios II处理器,如处理器,如Nios II/f。4.根据系统实际的中断优先级来合理分配根据系统实际的中断优先级来合理分配SOPC Builder系统中的系统中的中断号,注意中断号,注意IRQ0为最高优先级。为最高优先级。设计关键技术补充设计关键技术补充头
28、文件头文件v程序中采用程序中采用volatilevolatile修饰变量,这是操作系统内核编程经常修饰变量,这是操作系统内核编程经常用到的一个修饰关键字。用到的一个修饰关键字。v如果将变量加上如果将变量加上volatilevolatile修饰,则编译器保证对此变量的读修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。写操作都不会被优化(肯定执行)。v一般说来,一般说来,volatilevolatile用在如下的几个地方:用在如下的几个地方:中断服务程序中修改的供其它程序检测的变量需要加中断服务程序中修改的供其它程序检测的变量需要加volatile volatile;多任务环境下各任
29、务间共享的标志应该加多任务环境下各任务间共享的标志应该加volatilevolatile;存储器映射的硬件寄存器通常也要加存储器映射的硬件寄存器通常也要加volatilevolatile说明,因为说明,因为每次对它的读写都可能有不同意义。每次对它的读写都可能有不同意义。设计关键技术补充设计关键技术补充volatilevolatile7.2 定时器内核定时器内核综述定时器内核综述定时器是挂载在定时器是挂载在Avalon总线上的总线上的32位定时器,特性如下:位定时器,特性如下:两种计数模式:单次减两种计数模式:单次减1和和连续减连续减1计数模式计数模式 定时器到达定时器到达0时产生中断请求时产生
30、中断请求(IRQ);可选择设定为看门狗定时器,计算到达可选择设定为看门狗定时器,计算到达0时复位系统;时复位系统;可选择输出周期性脉冲,在定时器计算到达可选择输出周期性脉冲,在定时器计算到达0时输出脉冲;时输出脉冲;可由软件启动、停止或复位定时器;可由软件启动、停止或复位定时器;可由软件使能或屏蔽定时器中断。可由软件使能或屏蔽定时器中断。7.2 定时器内核定时器内核综述定时器内核综述定时器结构框图定时器结构框图StatusControlPeriodhPeriodlSnaphSnapl控制控制逻辑逻辑计数器寄存器文件Timeout pulseIRQReset数据总线数据总线地址总线地址总线(看门
31、狗)看门狗)Avanlon总线从机总线从机接口到内接口到内核逻辑核逻辑7.2 定时器内核定时器内核综述定时器内核综述定时器可进行的基本操作如下所述:定时器可进行的基本操作如下所述:Avalon主控制器通过对控制寄存器执行不同的写操作来控制:主控制器通过对控制寄存器执行不同的写操作来控制:启动和停止定时器启动和停止定时器 使能使能/禁能禁能IRQ 指定单次减指定单次减1计数或连续减计数或连续减1计数模式计数模式 处理器读状态寄存器获取当前定时器的运行信息。处理器读状态寄存器获取当前定时器的运行信息。处理器可通过写数据到处理器可通过写数据到periodl和和periodh寄存器来设定定时器寄存器来
32、设定定时器周期。周期。7.2 定时器内核定时器可进行的基本操作如下所述:定时器可进行的基本操作如下所述:内部计数器计数减到内部计数器计数减到0,立即从周期寄存器开始重新装载。,立即从周期寄存器开始重新装载。处理器可以通过写处理器可以通过写snapl或或snaph获取计数器的当前值。获取计数器的当前值。当计数器计数到达当计数器计数到达0时:时:如果如果IRQ被使能,则产生一个被使能,则产生一个IRQ(可选的)脉冲发生器输出有效持续一个时钟周期(可选的)脉冲发生器输出有效持续一个时钟周期(可选的)看门狗输出复位系统(可选的)看门狗输出复位系统7.2 定时器内核定时器寄存器描述定时器寄存器描述定时器
33、寄存器定时器寄存器偏移量名称R/W位描述15432100statusRW*RUNTO1controlRW*STOPSTARTCONTITO2periodlRW超时周期1(位15.0)3periodhRW超时周期1(位31.16)4snaplRW计数器快照(位15.0)5snaphRW计数器快照(位31.16)RUNTOSTOPSTART CONT ITOperiodlPeriodhsnaplsnaph注:注:*表示该位保留,读取值未定义。表示该位保留,读取值未定义。7.2 定时器内核状态寄存器描述状态寄存器描述定时器寄存器定时器寄存器位名称R/W/清除位描述0TOR/C当内部计数器减到0时,T
34、O(Timeout)位置1;一旦发生timeout事件,TO位保持置位状态直到被主控制器清除。向TO位写零即可清除置位状态1RUNR当内部计数器运行时,RUN位为1;否则该位为0。对RUN位的写操作无效7.2 定时器内核控制寄存器描述控制寄存器描述定时器寄存器定时器寄存器位名称R/W/清除位描述0ITOR/W如ITO位为1,则使能定时器中断;如ITO位为0,则屏蔽定时器中断1CONTR/WCONT(连续方式)位决定内部计数器减到0时的操作,1则计数器连续运行,直到用STOP将其停止;0则计数器在减到0后停止2STARTW写1启动内部计数器运行(减1计数),写0无效3STOPW写0停止内部计数器
35、运行,写0无效7.2 定时器内核n 定时器内核配置选项CFI控制器框图Initial perod:用于预设硬件生成后的定时器周期,即perodl和periodh寄存器的值。7.2 定时器内核n 定时器内核配置选项CFI控制器框图Preset Configurations:可选择的预定义的硬件配置。7.2 定时器内核n 定时器内核配置选项CFI控制器框图Writeable perod:n 使能:主控制器可通过写period而改变向下计数周期。n 禁能:向下计数周期由Timeout Period确定,且period寄存器不在硬件中存在。Readable snapshot:n 使能:主控制器可读当前
36、向下计数器的值。n 禁能:计数器的状态仅通过状态寄存器或IRQ信号来检测。Snap寄存器不在硬件中存在。Start/Stop control bits:n 使能:主控制可通过写START和STOP位来启动和停止定时器。n 禁能:定时器连续运行。7.2 定时器内核n 定时器内核配置选项CFI控制器框图Timeout pulse:n 使能:定时器到0时,timeout_pulse输出一个时钟周期的高电平。n 禁能:timeout_out信号不存在。System reset on timeout:n 使能:定时器到0时,resetrequest信号输出一个时钟周期的高电平使系统复位。n 禁能:res
37、etrequest信号不存在。7.2 定时器内核软件编程软件编程Altera为NiosII处理器用户提供硬件抽象层(HAL)系统库驱动程序,允许用户使用HAL应用程序接口(API)函数来访问定时器内核。1.1.HALHAL系统库支持系统库支持2.2.系统时钟驱动程序系统时钟驱动程序3.3.时间标记驱动程序时间标记驱动程序4.4.软件文件软件文件7.2 定时器内核timer内核提供了对硬件进行寄存器级访问的文件。Altera_avalon_timer_regs.h该文件定义了内核的寄存器映射并提供硬件设备访问宏定义。可通过阅读上述文件以熟悉timer设备的软件访问方法,但不应该修改文件。#ifn
38、def _ALTERA_AVALON_TIMER_REGS_H_#define _ALTERA_AVALON_TIMER_REGS_H_#include/*STATUS register*/#define ALTERA_AVALON_TIMER_STATUS_REG 0#define IOADDR_ALTERA_AVALON_TIMER_STATUS(base)_IO_CALC_ADDRESS_NATIVE(base,ALTERA_AVALON_TIMER_STATUS_REG)#define IORD_ALTERA_AVALON_TIMER_STATUS(base)IORD(base,ALT
39、ERA_AVALON_TIMER_STATUS_REG)#define IOWR_ALTERA_AVALON_TIMER_STATUS(base,data)IOWR(base,ALTERA_AVALON_TIMER_STATUS_REG,data)/*CONTROL register*/#define ALTERA_AVALON_TIMER_CONTROL_REG 1#define IOADDR_ALTERA_AVALON_TIMER_CONTROL(base)_IO_CALC_ADDRESS_NATIVE(base,ALTERA_AVALON_TIMER_CONTROL_REG)#defin
40、e IORD_ALTERA_AVALON_TIMER_CONTROL(base)IORD(base,ALTERA_AVALON_TIMER_CONTROL_REG)#define IOWR_ALTERA_AVALON_TIMER_CONTROL(base,data)IOWR(base,ALTERA_AVALON_TIMER_CONTROL_REG,data)HAL APIn 定时器设备是可以计数时钟的硬件设备,产生周期性的中断定时器设备是可以计数时钟的硬件设备,产生周期性的中断 请求。用户使用定时器设备提供一些和时间相关的功能,如请求。用户使用定时器设备提供一些和时间相关的功能,如 HALHA
41、L系统时钟、报警器、时间测量系统时钟、报警器、时间测量n 使用定时器设备,使用定时器设备,NiosNios II II处理器系统在硬件上必须包含一处理器系统在硬件上必须包含一 个定时器外设。个定时器外设。n HAL APIHAL API提供两种定时器设备的驱动程序:提供两种定时器设备的驱动程序:系统时钟驱动系统时钟驱动支持报警支持报警(alarms)(alarms),用户在调度程序使用。,用户在调度程序使用。时间标记驱动程序时间标记驱动程序支持高精度的时间测量。支持高精度的时间测量。注意:注意:1.1.一个单独的定时器外设可以作为一个系统时钟或是时间一个单独的定时器外设可以作为一个系统时钟或是
42、时间 标记,但是标记,但是不能兼顾不能兼顾。2.HAL2.HAL特定的访问定时器设备的特定的访问定时器设备的APIAPI函数在函数在sys/sys/alt_alarm.halt_alarm.h 和和sys/sys/alt_timestamp.halt_timestamp.h中定义。中定义。nHAL系统时钟驱动程序提供周期的系统时钟驱动程序提供周期的“节拍节拍”,系,系统时钟按照每一个节拍进行递增。系统库时钟测量统时钟按照每一个节拍进行递增。系统库时钟测量时间是以时间是以“ticks”(滴答)(滴答)为单位为单位n 通过在通过在Nios II IDE的的系统库属性系统库属性中设置来选择指定中设置
43、来选择指定的定时器外设作为系统时钟设备。的定时器外设作为系统时钟设备。注意:不要将注意:不要将HAL系统时钟和驱动系统时钟和驱动Nios II 处理器的处理器的 时钟信号混淆。时钟信号混淆。n用户可以调用函数来获得系统时钟的当前值用户可以调用函数来获得系统时钟的当前值(函数返函数返回自从系统复位之后经历的时间回自从系统复位之后经历的时间),或系统时钟速率,或系统时钟速率 常用函数常用函数1.报警报警(Alarm)_定时器用作系统时钟定时器用作系统时钟n 用户可以注册在指定时刻执行的函数使用用户可以注册在指定时刻执行的函数使用HAL alarm工具工具软件程序注册一个报警通过调用函数软件程序注册
44、一个报警通过调用函数alt_alarm_start()理解为:定时中断理解为:定时中断!解释:解释:n个个ticks之后调用函数之后调用函数callback。alt_alarm_start()初始初始化输入变量化输入变量alarm所指向的结构,用户不必去初始化它。所指向的结构,用户不必去初始化它。callback函数复位函数复位alarm。注册的。注册的callback函数的返回值是直到下函数的返回值是直到下一个一个callback函数调用的函数调用的tick的数目。返回值为的数目。返回值为0,表示,表示alarm应应该停止。用户也可以通过该停止。用户也可以通过alt_alarm_stop()
45、取消一个取消一个alarm。n 下面的例子实现了周期为下面的例子实现了周期为1秒的秒的callback注册一个注册一个alarm。实实 验验 5:定时器中断定时器中断控制闪烁频率控制闪烁频率2.时间测量时间测量_定时器用作系统时钟定时器用作系统时钟思考:思考:nios II中如何知道函数或者程序的执行时间?中如何知道函数或者程序的执行时间?指定定时器指定定时器3.时间测量时间测量(高精度高精度)_定时器用作时钟标记定时器用作时钟标记若测量时间间隔,精度要求比若测量时间间隔,精度要求比HAL系统时钟提供的要高。系统时钟提供的要高。使用时间标记驱动程序提供高分辨率的定时函数。使用时间标记驱动程序提
46、供高分辨率的定时函数。7.3 JTAG_UART内核JTAG_UART内核综述内核综述JTAG_ UART内核内核7.3 JTAG_UART内核JTAG_UART内核综述内核综述lJTAG UART内核通过内核通过Avalon从控制器接口连接到从控制器接口连接到Avalon总线。总线。lJTAG UART内核包含内核包含2个个32位寄存器(数据和控制),它们可通过位寄存器(数据和控制),它们可通过Avalon从控制器端口进行存取。从控制器端口进行存取。lAvalon主控制器访问寄存器来控制内核并在主控制器访问寄存器来控制内核并在JTAG连接上传输数据。连接上传输数据。l JTAG UART内核
47、提供高电平有效的中断输出,该输出在读内核提供高电平有效的中断输出,该输出在读FIFO几乎为满或写几乎为满或写FIFO几乎为空时申请一个中断。几乎为空时申请一个中断。l有读写有读写FIFO也是也是JTAG UART内核与内核与UART内核的不同点之一。内核的不同点之一。FIFO可以改善可以改善JTAG连接的带宽。连接的带宽。FIFO深度可由用户设置。深度可由用户设置。7.3 JTAG_UART内核JTAG_UART的寄存器描述的寄存器描述偏移量寄存器名称R/W位描述31 161514 11 1098 7 2100数据RWRAVAILRVALID保留DATA1控制RWWSPACE保留AC WIRI
48、保留WRJTAG_ UART内核内核寄存器映射寄存器映射7.3 JTAG_UART内核n JTAG-UART配置选项卡JATG_UART配置选项卡Write FIFO:写写FIFO设置设置Read FIFO:读读FIFO设置设置JTAG_UART软件编程软件编程n Altera为为Nios II处理器提供处理器提供HAL系统库驱动程序,可以使用系统库驱动程序,可以使用ANSI C 标准库函数和标准库函数和HALAPI 访问访问JTAG_UARTnANSI C 库函数库函数 printf()、getchar()、fopen()nHAL API 函数系统支持函数系统支持 open()、close(
49、)、read()、write()JTAG_UART软件编程软件编程nANSI C 库函数库函数#include int main()printf(Hello from Nios II!n);return 0;函数原型:函数原型:intint fopenfopen(char (char*file_namefile_name,way_useway_use););输入参数:输入参数:file_namefile_name文件名,文件名,way_useway_use使用文件方式,比如使用文件方式,比如r r,w w分别对应着读写分别对应着读写函数说明:打开文件,对其进行某种文件操作函数说明:打开文件,对
50、其进行某种文件操作返回值:返回值:打不开则出错,返回一个空指针打不开则出错,返回一个空指针NULLNULL函数原型:函数原型:intint fclosefclose(fpfp)输入参数:输入参数:fpfp的定义为:的定义为:FILE FILE*fpfp函数说明:关闭文件函数说明:关闭文件fpfp返回值:返回值:成功返回成功返回0 0,反之为,反之为1 1(EOFEOF)函数原型:函数原型:intint fread(voidfread(void *ptrptr,intint size,size,intint count,FILE count,FILE*fpfp););输入参数:输入参数:ptrp