Board logo

标题: 痛苦,求助:一个关于定时器中断的问题 [打印本页]

作者: rxguo    时间: 2007-3-8 16:54     标题: 痛苦,求助:一个关于定时器中断的问题

痛苦,求助:

小弟写了一段测试定时器中断的代码,语法没有错误,可是烧到片子上之后什么反映都没有,我已经调试半个月了也不知道问题出在什么地方,请各位大虾不吝赐教(急!)附代码如下:

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_timer_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"

volatile int  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; //左移一位
if (a == 0x10)  *countptr=1; //重新赋值给count
IOWR_ALTERA_AVALON_PIO_DATA(GO_BASE, a); //写到LED输出口
}

int alt_main (void)
{

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


IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, 7); //启动timer允许中断,连续计数


while (1) {;}
}

备注:我用SOPC设计的是NIOSII的E型软核、片内RAM(4K)、定时器的周期为1秒


作者: caopengly    时间: 2007-3-8 17:18

请参看,下面的例子。

还有就是你的模版可以换一个,按键中断行不行?

例子如下:

定时器中断程序也跑起来了,大家分享!

过程如下:

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; //作移一位
if (a == 0x10) a=1; //我只有4个led,所以要让led循环闪烁
*countptr=a; //重新赋值给count
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, a); //写到LED输出口
}

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) {;}
}


作者: kzw    时间: 2007-3-9 22:24

楼上写得对,你再试一下,这个比较简单。
作者: dadaowai    时间: 2007-4-17 15:22

呵呵,用main的时候写的对。


作者: dhz030411    时间: 2007-4-19 18:40

不错
作者: 5101102    时间: 2007-4-24 08:46

haha

那是由于用int alt_main (void)时,要自己初始化。而你没有~~~~~我也遇到过

int main (void) __attribute__ ((weak, alias ("alt_main"));
  /*
   * Use alt_main as entry point for this free-standing application
   */
int alt_main (void)

要用alt_irq_init (ALT_IRQ_BASE)函数初始化中断控制器!!!!!
具体方法在例程hello_alt_main中能找到!!!!

http://www.edacn.net/bbs/thread-84717-1-1.html


作者: 子小日月    时间: 2007-4-24 12:39

caopengly   的程序我用过,但是在nios中编译会出错,说count会超出范围,不知道是什么回事,我设的RAM是4K的。


作者: 子小日月    时间: 2007-4-24 12:40

caopengly   的程序我用过,但是在nios中编译会出错,说count会超出范围,不知道是什么回事,我设的RAM是4K的。






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0