2008年4月12日 星期六

NIOSII定时器中断的测试程序

1. 首先,硬件方面做以下变动: 在SOPC中添加一个interval timer,命名为timer_0,设置初始化定时周期为500ms,Full featured, 寄存器设置中3个全选,2个输出信号设置都不选,然后finish, 重新Generate,然后到 Quartus 4.2里面去Complation一下,用ASP口烧写到板子的EPCS1里。

2.然后启动NIOS II IDE,写了如下代码(其实都是在我第一个从Hello_led程序中边学边修改过来的)测试程序代码。

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_timer_regs.h"
#include "alt_types.h"

volatile alt_u8 count;


static void handle_Timer0_interrupts(void* context, alt_u32 id)
{
alt_u8 a;
volatile alt_u8 *countptr = (volatile alt_u8 *)context;
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);//清TO标志
a = *countptr; //取出count中的值
a=a<<1; a ="="" a="1;" countptr="a;">

int main (void)
{

count=1;
alt_irq_register( TIMER_0_IRQ, (void *)&count, handle_Timer0_interrupts); //注册中断函数

//因为我在添加定时器timer_0的时候,设置了初始值为 定时周期500ms的值,我的晶振是50Mhz,
//因为只是简单测试一下定时中断代码的书写方法,所以这里没有重新设置预制值,直接采用初始化时自动
//设置的初始值,当然,也是我懒得去计算初始值,如果要重新设置为不同的定时周期,用下面的2个函数
//IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE, TimerValueLow);
//IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE, TimerValueHigh);
//其中TimerValueLow和TimerValueHigh是你要设置的低16位和高16位的定时器初值。
//定时器工作时是将这2个寄存器的值调入32位计数器,然后根据CPU的时钟,逐步递减计数器
//的值,直到减到0为止,然后触发中断,并且再次从预制寄存器中将预制值调入32位计数器中,
//再次重复【递减->到0->中断&重新装载初值 】的这个过程
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, 7); //启动timer允许中断,连续计数


while (1) {;}
}

将程序按照前面一篇文章的步骤烧写到Flash芯片里,按了一下重新配置,然后就看见Led以500ms的频率跑动起来了。

範本2:

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "altera_avalon_timer_regs.h"
alt_u8 led = 0;
static void timer_interrupts(void* context, alt_u32 id)
{
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 0);

if(led==7) led=0;
else led=led+1;
}

int main ()
{
alt_irq_register(TIMER_IRQ, (void*) &led, timer_interrupts);

IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_BASE, 0x20);
IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_BASE, 0xBE);
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE, 7);
while (1)
{
switch(led)
{
case 0: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x01)break;
case 1: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x02)break;
case 2:
case 3:
..
..
..
default: IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x01) break;
}
}
return 0;
}

沒有留言: