利用sys/alt_alarm.h系统时钟服务头文件中的alt_alarm_start ()API 函数以及时钟回调函数进行精确定时。我的设计在现有源程序的基础上,添加三个时钟服务程序,分别利用不同的时间间隔去控制外设LED的闪烁频率。这里的alt_ticks_per_second()其产生的时间间隔为1S,相当于定时常数为50(这个值的等来我是测试出来的,主要根据自建的NIOS II系统的时钟有关系吧!)
/********************************************************************
* 文 件 名:SysTimer_test.c
* 功 能:利用3个系统时钟服务产生0.5s,1s,2s的周期性事件,并借此分别控制3组LED闪烁,
* 说 明:观察LED闪烁效果。
********************************************************************/
#include
#include "system.h" //包含基本的硬件描述信息
#include "altera_avalon_pio_regs.h" //包含基本的IO寄存器信息
#include "alt_types.h" //Altera定义的数据类型
#include "sys/alt_alarm.h" //系统时钟服务头文件
#define LEDCON 0xff
#define nticks_1 25
#define nticks_2 100
static alt_alarm alarm_1,alarm_2,alarm_3; //按调用API函数规定定义的变量
static unsigned char led = 0xff;
alt_u32 my_alarm_callback1 (void* context) //回调函数—产生0.5s
{
led^=0x07; //操作对IO低3位,低电平有效
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led);
return nticks_1; //2HZ(0.5s)
}
alt_u32 my_alarm_callback2 (void* context)
{
led^=0x18; //操作对IO中间2位,低电平有效
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led);
return alt_ticks_per_second(); //调试结果等于50 1HZ
}
alt_u32 my_alarm_callback3 (void* context)
{
led^=0xE0; //操作对IO高3位,低电平有效
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led); //操作IO口
return nticks_2; //0.5HZ(2s)
}
void InitPIO(void)
{
/* LED_PIO为输出,其余输入 */
IOWR_ALTERA_AVALON_PIO_DIRECTION(LED_PIO_BASE, LEDCON);
/* 禁止所有PIO中断 */
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(LED_PIO_BASE, 0x00);
/* 清清边沿捕获寄存器 */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(LED_PIO_BASE, 0x00);
}
int main()
{
InitPIO();
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0xff); //灭LED
printf("test alarm...\n"); //打印提示信息
printf("alt_ticks_per_second() is %ld",alt_ticks_per_second());
if (alt_alarm_start ( //启动系统时钟服务
&alarm_1, //alt_alarm类型变量
nticks_1, //等待时间
my_alarm_callback1, //回调的alarm函数
NULL) < 0 //向alarm函数传递的形参,可以为NULL
)
{
printf ("No system clock available\n");
}
if (alt_alarm_start (&alarm_2,alt_ticks_per_second() //启动系统时钟服务
,my_alarm_callback2,NULL) < 0)
{
printf ("No system clock available\n");
}
if (alt_alarm_start (&alarm_3,nticks_2 //启动系统时钟服务
,my_alarm_callback3,NULL) < 0)
{
printf ("No system clock available\n");
}
while(1); //等待时钟事件发生
return 0;
}
文章评论(0条评论)
登录后参与讨论