- UID
- 872235
|
首先在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;
}
|
|