标题:
[NiosII] 定时器中断
[打印本页]
作者:
海洋狂吻
时间:
2014-4-30 15:54
标题:
[NiosII] 定时器中断
首先在NoisII里面添加一个
Full-featured
的Timer
然后在EDS里面使用下面已经调试成功的代码
#include
//用到printf()函数
#include "altera_avalon_pio_regs.h"
//读写IO寄存器相关函数
#include "sys/alt_irq.h"
//NoisII中断处理相关函数,这里遵循增强型中断风格以向后兼容
#include "altera_avalon_timer_regs.h"
//读写定时器寄存器相关函数
void Timer1_Init(void);
//定时器中断初始化函数申明
void Timer1_ISR(void* isr_context);//定时器中断服务函数申明
//参考"sys/alt_irq.h"定义的函数原型
/* ISR Prototype */
//#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
//typedef void (*alt_isr_func)(void* isr_context);
//#else
//typedef void (*alt_isr_func)(void* isr_context, alt_u32 id);
//#endif
int Flags = 0;
unsigned int timer_isr_context;
int main()
{
Timer1_Init();
printf("Timer1 Init done...\n");
while(1)
{
IOWR_ALTERA_AVALON_PIO_DATA(LEDEDGE_BASE,Flags%2);
}
return 0;
}
void Timer1_Init(void)
{
void* isr_context_ptr = (void*)&timer_isr_context;
IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER1_BASE,0x05F5);
IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER1_BASE,0xE0FF);
// 设置PERIOD寄存器
// PERIODH << 16 | PERIODL = Timer周期 * 系统时钟频率 - 1
// PERIODH << 16 | PERIODL = 1s*100M - 1 = 99999999 = 0x5F5E0FF
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER1_BASE,
ALTERA_AVALON_TIMER_CONTROL_START_MSK|
ALTERA_AVALON_TIMER_CONTROL_CONT_MSK|
ALTERA_AVALON_TIMER_CONTROL_ITO_MSK);
// 设置CONTROL寄存器
// 位数 | 3 | 2 | 1 | 0 |
// CONTROL | STOP | START| CONT | ITO |
// ITO 1,产生IRO; 0,不产生IRQ
// CONT 1,计数器连续运行直到STOP被置一; 0,计数到0停止
// START 1,计数器开始运行; 0,无影响
// STOP 1,计数器停止运行; 0,无影响
// 注册定时器中断
alt_ic_isr_register(
TIMER1_IRQ_INTERRUPT_CONTROLLER_ID,
// 中断控制器标号,从system.h复制
TIMER1_IRQ,
// 硬件中断号,从system.h复制
Timer1_ISR,
// 中断服务子函数
isr_context_ptr,
// 指向与设备驱动实例相关的数据结构体
0x0);
// flags,保留未用
}
void Timer1_ISR(void* timer_isr_context)
{
// 应答中断,将STATUS寄存器清零
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER1_BASE,
~ALTERA_AVALON_TIMER_STATUS_TO_MSK);
//TO=0
Flags += 1;
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0