不少人都问到NiosII定时器定时问题,下面说明如何使用定时器设定一秒一次中断。
在SOPC BUILDER中添加timer,设置如下图所示:
在Initial Period 选择1S。
说明:Initial Period 可表示为定时器的默认定时值,当在写程序的过程中不对周期寄存器写定时初值时,定时器的定时值就默认为Initial Period设定的值。 于是在在定时1秒的时候可以有两种方法,一种是Initial Period 设定为1秒。 另一种是在register中选上Writable Period ,然后在程序中写入定时初值使定时器定时一秒。
此主题相关图片如下:
程序如下:每一秒LED闪一次,数码管1秒加1并显示。
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_timer_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
void timer_ISR (int context) //定时中断服务程序
{
alt_u8 led;
alt_u32 sec;
led=~led;
sec++;
IOWR_8DIRECT(SEG7LED_0_BASE,0,sec%10);
IOWR_8DIRECT(SEG7LED_0_BASE,1,(sec/10)%10);
IOWR_8DIRECT(SEG7LED_0_BASE,2,(sec/100)%10);
IOWR_8DIRECT(SEG7LED_0_BASE,3,(sec/1000)%10);
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);//清TO标志
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, 0);
*(unsigned int *)LED_PIO_BASE =led;
//下面两条语句可以不加,不加时,定时值为SOPC Builder中设置的定时值1S,加上也是定时1S。
//IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE, 50000000&0xffff);50M的频率写入低16位
//IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE, 50000000>>16);50M的频率写入高16位
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, ALTERA_AVALON_TIMER_CONTROL_ITO_MSK|ALTERA_AVALON_TIMER_CONTROL_START_MSK
);
}
int main(void)
{
alt_irq_register(TIMER_0_IRQ, 0, timer_ISR);//安装中断服务子程序
//IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE, 50000000&0xffff);初值设置50M低16位
//IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE, 50000000>>16);50M高16位
IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,
ALTERA_AVALON_TIMER_CONTROL_ITO_MSK|ALTERA_AVALON_TIMER_CONTROL_START_MSK );
//启 动定时器,开中断。
while (1)
{
}
return 1;
}
沒有留言:
張貼留言