热度 17
2012-6-20 00:41
2041 次阅读|
0 个评论
利用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; }