本文主要是介绍NOS II - Timer定时器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
NOS II-Time定时器
简单回忆NIOS II中定时器的使用。
一、定时器的框图
二、定时器寄存器的描述
定时器的寄存器都是16bit的,
偏移量 | 寄存器名称 | R/W | 15bit | … | 4bit | 3bit | 2bit | 1bit | 0bit |
---|---|---|---|---|---|---|---|---|---|
0 | Status - 状态寄存器 | R/W - 可读可写 | * | * | * | * | * | run | TO |
1 | Control - 控制寄存器 | R/W | * | * | * | stop | start | cont | ITO |
2 | PeriodL - 周期低16位 | R/W | 超时周期-1(位15…0) | ||||||
3 | PeriodH - 周期高16位 | R/W | 超时周期-1(位31…16) | ||||||
4 | SnapL - 快照低16bit | R/W | 计时快照(位15…0) | ||||||
5 | SnapH - 快照高16bit | R/W | 计时快照(位31…16) |
1、状态寄存器
0bit : TO,这一位表示计时器寄到定时的时间时,这一位就会被置1。
1bit : run,如果为1这表示正在计数,只要在计数,这位就是1,否则为0
2、控制寄存器
0bit :ITO表示是否允许中断,一般都是要允许中断的;
1bit:cont表示是连续的那个单词,表示是否工作在连续工作模式,还是单次工作模式.。即如果置为1,计数完一轮之后再计数第二轮,一直循环计数
2bit:start位,如果这位被置为1,则表示启动定时器;
3bit:stop位,如果是1这表示定时器IP停止工作;
3、周期寄存器
用于配置要计数多久
4、快照寄存器
用于查看当前计数到哪里了
三、中断操作
只要内部计数器减到且控制寄存器对的ITO位设置位1,定时器内核就会产生IRO。用户要用以下的任意一种方式应答IRQ:
- 清除状态寄存器的TO位,等待下一个超时事件的发生;
- 通过将控制寄存器的ITO位清0来禁止中断
四、定时器内核的配置选项
五、定时器的软件编程
定时器内核提供硬件对的寄存器访问和HAL层的API函数:
定义内核的寄存器映射并提供硬件设备访问宏定义:
altera_avalon_timer_regs.h
实现了HAL系统库的定时器设备驱动程序:
altera_avalon_time.h
altera_avalon_timer_sc.c
altera_avalon_timer_ts.c
altera_avalon_timer_vars.v
定时器TIMER0的简单应用,配置步骤:
// 定时器的初始化alt_ic_isr_register(TIMER0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER0_IRQ, TIMER0_Interrupts, NULL, 0);// Timer0中断函数注册,TIMER0_Interrupts是中断服务函数,即计数到时需要执行的任务,用户自己编写IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER0_BASE, 0);//配置控制寄存器 停止Timer0。TIMER0_BASE是定时器的地址IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER0_BASE, 0);//配置状态寄存器 清中断标志IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER0_BASE, (2500000 >> 16));//配置周期寄存器的高16bit,nios的时钟50MHz,周期是20ns,要计时50ms=50000000ns,50_000_000ns/20ns=2500000次,50MHz的时钟需要计数到250000次才能计数到50msIOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER0_BASE, (2500000 & 0xFFFF));//配置周期寄存器的低16bit 定时时间为50ms// 启动定时器IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER0_BASE, 0x07);// 启动Timer0定时器
对注册中断函数alt_ic_isr_register()的参数进行简单的介绍:
- TIMER0_IRQ_INTERRUPT_CONTROLLER_ID:是中断控制器标号,从system.h中复制。arm系统中一般有个中断控制器来管理中断,比如串口中断,定时中断等;
- TIMER0_IRQ:硬件中断号,从system.h中复制
- TIMER0_Interrupts:中断服务函数
- NULL:这位参数是指向与设备驱动实例相关的数据结构体
- 0:flag标志位,保留使用,一般我们置为0就可以;
--晓凡 2024年6月10日于武汉书
这篇关于NOS II - Timer定时器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!