tag 标签: 系统时钟服务程序

相关博文
  • 热度 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; }