napoleonlijun

NIOS II 系统定时器,定时器

0
阅读(3451)

用nios在调飞控

 

单独调试定时器时,中断ok,

单独调试timestamp,ok,

结合在一起,两者都不正常工作了。

思路:timer中断换成系统计时器中断,问题来了,

中断进入了,可是不是我要的1ms中断一次啊

我的代码如下:

static alt_u16 led_cnt =0; //led 0.5s闪烁 alt_u32 my_alarm_callback (void* context)
{
    led_cnt = (led_cnt <500) ? (led_cnt+1) : 0; if(led_cnt==500)
        IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xf0); else IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x0f); return SYSTICK;
} void Myalarm_Init() //系统定时器初始化 {
    alt_alarm alarm; if(alt_alarm_start(&alarm,SYSTICK,my_alarm_callback,NULL) < 0)
    {
        printf("Error: No system clock available\n");
    } else {
        printf("Success: System clock available\n"); //printf("alt_ticks_per_second : %ld \n",alt_ticks_per_second()); }
}
 
led死活只有一个状态啊!!!!!!!!!!!!!!!!!

于是查看nios handbook,测试代码如下

#include <stdio.h>
#include "system.h" //#include "sys/alt_timestamp.h" #include "sys/alt_irq.h" #include "sys/alt_alarm.h" alt_u8 alarm_rang=0;

alt_u32 my_alarm_callback (void* context)
{ /* This function is called once per second */ alarm_rang = 1; return alt_ticks_per_second(); // return value is the time when the next alarm will occur } int main()
{ static alt_alarm alarm; int seconds_passed=0;
  printf("Timer Example code\n"); // start the alarm to go off once per second if (alt_alarm_start (&alarm,  alt_ticks_per_second(),  my_alarm_callback, NULL) < 0)
  {
      printf ("No system clock available\n");
  } while(1) if(alarm_rang==1)
      {
          printf("%d ",++seconds_passed);
          alarm_rang=0;
      } return 0;
}
 
 
运行:恍然大悟!!!!!!!!alarm是1s中断一次啊!!!!!!!!!!
难怪我led只有一个状态!!!!!!!!!!!!!!!!!!!
于是思路来了,我能不能修改alarm的时间呢。 
打开alarm.h,其中有非常重要的一个注解 
 
/* 
 * alt_alarm_start() can be called by an application/driver in order to register
 * a function for periodic callback at the system clock frequency. Be aware that
 * this callback is likely to occur in interrupt context. 
 */
 

于是,继续查看,有一个结构体
typedef struct alt_alarm_s alt_alarm;
好家伙!没猜错的话,结构体里面应该可以修改相关参数,继续往下看
struct alt_alarm_s
{
  alt_llist llist;       /* linked list */
  alt_u32 time;          /* time in system ticks of the callback */
  alt_u32 (*callback) (void* context); /* callback function. The return 
                          * value is the period for the next callback; where 
                          * zero indicates that the alarm should be removed 
                          * from the list. 
                          */
  alt_u8 rollover;       /* set when desired alarm time + current time causes
                            overflow, to prevent premature alarm */
  void* context;         /* Argument for the callback */
}; 
终于出现了!
  alt_u32 time;          /* time in system ticks of the callback */
这个可以初始化呀。。。
于是。。。。。在主函数里面添加了这么一句
alarm.time = 100000; 
编译运行,没有效果啊!是不是打开的方式不对???
 
再查看有什么纰漏
问题还真被我发现了,handbook提供的例程,是1s 
(alt_alarm_start (&alarm,  alt_ticks_per_second(),  my_alarm_callback, NULL)
其中 
alt_ticks_per_second(),printf查看数据
我的个亲娘,1000啊!也就是1s啊!!!这下知道怎么修改了
#define SYSTICK 51 (alt_alarm_start (&alarm,SYSTICK,  my_alarm_callback, NULL)
这个好了,标准的1ms