资源描述
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)控制寄存器(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、 读写状态寄存器:
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_AVALON_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源程序)
#include <stdio.h>
#include <sys/unistd.h>
#include <io.h>
#include <string.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_timer_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
static void Timer_ISR_Init(void); //set interrupter
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,alt_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[] = {25000000,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_PIO_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;
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! \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,Timer2_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);
}
(英文太差, 写注释写很差, 估量就自己能看懂, 见笑)
四、 试验心得:
部分资料写在试验前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);
展开阅读全文