NIOS II 系统定时器,定时器
0赞
发表于 2015/7/3 12:30:38
阅读(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