单独调试定时器时,中断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
#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