请教一个问题:在NIOSII IDE环境下的中断编程如何实现?
- UID
- 153502
- 性别
- 男
|
请教一个问题:在NIOSII IDE环境下的中断编程如何实现?
小弟已经通过 QII把硬件设计完毕,其中在CPU上设计了一个中断输入引脚,可是俺不知道在NIOSIIIDE环境下的中断编程如何来写,殷切希望各位大哥大姐能够给小弟示例一段!!!您只需告诉我如何初始化、如何跳出主程序进入到中断服务程序、在中断服务程序或者主程序中应该做哪些设置即可,具体要干什么活儿不需示例,期待您的回复,谢谢! |
|
|
|
|
|
- UID
- 136199
- 性别
- 男
|
rxguo 我这里有一个定时器中断的例子,你看一下吧。 定时器中断程序也跑起来了(转载)
定时器中断程序也跑起来了,大家分享!
过程如下:
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) {;} } 按键中断要在sopc中的in口中选中产生中断。按键如果是低电平有效,选地调变产生中断。 |
这个版主不太冷
===========================
我的中电网博客:http://blog.chinaecnet.com/u/20/index.htm |
|
|
|
|
|
- UID
- 153502
- 性别
- 男
|
|
|
|
|
|