1、NIOS TIMER中止相关笔记 NIOS TIMER中止试验 一、 开发环境及试验目 (1)、 开发环境: 硬件: DE2—70开发板 软件: Quartus II 9.0sp2 Web Edition NIOS II EDC 9.0 NIOS IDE (2)、 试验目: 深入了解TIMER中止, 学会写TIMER中止函数, 学会调用TIMER中止 二、 相关知识、 资料 (1)状态寄存器: status: TO: 计数器递减至0时置1, 并保持, 直到软件修改为0 RUN: 定时器运行时为1, 停止时为0, 不能
2、被软件改写 (2)控制寄存器(control): ITO: 若为1则TIMER递减至0时发出中止, 不然中止被屏蔽 CONT: 为1时定时器连续工作, 为0时定时器只工作一次 Start、 stop: 分别用来开启定时器和停止定时器, 只需置1, 不能同时置1 (3)周期计数器: Periodl & Periodh (4)定时器快照寄存器: (Snapl & Snaph) NIOS中访问定时器 头文件: Altera_Avalon_timer_regs.h 该文件: 1、 读写状态寄
3、存器: IORD_ALTERA_AVALON_TIMER_STATUS(base) IOWR_ALTERA_AVALON_TIMER_STATUS(base,data) 2、 读写控制寄存器: IORD_ALTERA_AVALON_TIMER_CONTROL(base) IOWR_ALTERA_AVALON_TIMER_CONTROL(base,data) 3、 读写周期寄存器 IORD_ALTERA_AVALON_TIMER_PERIODL(base) IOWR_ALTERA_AVALON_TIMER_ PERIODL (base,data) IORD_ALTERA_A
4、VALON_TIMER_ PERIODH (base) IOWR_ALTERA_AVALON_TIMER_ PERIODH (base,data) 4、 读写计数器快照寄存器 IORD_ALTERA_AVALON_TIMER_SANPL(base) IOWR_ALTERA_AVALON_TIMER_ SANPL (base,data) IORD_ALTERA_AVALON_TIMER_ SANPH (base) IOWR_ALTERA_AVALON_TIMER_ SANPH(base,data) 三、 试验内容(内容为大量截图新浪博客不方便上传, 懒上传了, 仅上传NIOS源程序
5、
#include
6、alt_u8 i=0; int main(void) { printf("\n main function! \n"); Timer_ISR_Init(); //set interrupter function while(1) { usleep(10000); } return 0; } //Timer1 alt_u8 LED1=0; static void Timer1_Irq_Handler(void *context,al
7、t_u32 id) { printf("\n Timers1 INTERRUPT! \n"); LED1++; IOWR_ALTERA_AVALON_PIO_DATA(LED1_BASE,LED1); IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER1_BASE,0); IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER2_BASE,0x07); } //Timer2 alt_u8 LED2=0; alt_u8 K; alt_u32 Timer_Prd[] = {2500000
8、0,12500000,6250000,3125000}; static void Timer2_Irq_Handler(void *context,alt_u32 id) { printf("\n Timers2 INTERRUPT! \n"); LED2=(LED2+1)%4; IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER2_BASE,Timer_Prd[LED2]); IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER2_BASE,0); IOWR_ALTERA_AVALON_P
9、IO_DATA(LED2_BASE,LED2); K=IORD_ALTERA_AVALON_PIO_DATA(K1_BASE) & 0x01; if(K) IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER3_BASE,0x07); else IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER3_BASE,0x0a); IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER2_BASE,0); } //Timer3 alt_u8 LED3=0
10、 static void Timer3_Irq_Handler(void *context,alt_u32 id) { printf("\n Timers3 INTERRUPT! \n"); LED3++; IOWR_ALTERA_AVALON_PIO_DATA(LED3_BASE,LED3); IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER3_BASE,0); } static void Timer_ISR_Init(void) { printf("\n INTERRUPTer function
11、 \n"); //timer1 IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER1_BASE,0); alt_irq_register(TIMER1_IRQ,NULL,Timer1_Irq_Handler); IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER1_BASE,0x01); //timer2 IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER2_BASE,0); alt_irq_register(TIMER2_IRQ,NULL,Time
12、r2_Irq_Handler); IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER2_BASE,0x01); //timer3 IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER3_BASE,0); alt_irq_register(TIMER3_IRQ,NULL,Timer3_Irq_Handler); IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER3_BASE,0x01); } (英文太差, 写注释写很差, 估量就自己能看懂, 见笑) 四、 试验心得:
13、 部分资料写在试验前TIMER资料中 总结在NIOS中C程序编写所应有格式 如上例所表示: 在一个时钟初始化中需写以下三句话: 1、 TIMER状态寄存器设置: 开启TIMER IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER1_BASE,0); 2、 中止注册, 函数内为: 中止号, 空指针, 中止函数 alt_irq_register(TIMER1_IRQ,NULL,Timer1_Irq_Handler); 3、 timer控制寄存器设置: 开启TIMER中止信号发送 IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER1_BASE,0x01); ISR书写: 若在初始化内并没有将TIMER申明为循环工作, 则需要在其中加入重启中止: IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER1_BASE,0);






