原创 SOPC之软件编程学习--系统时钟API函数应用

2012-6-20 00:41 2044 17 17 分类: FPGA/CPLD

利用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条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /2 下一条