找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 967|回复: 3
打印 上一主题 下一主题

大家帮我看看这段中断程序

[复制链接]

1

主题

4

帖子

-1万

积分

未知游客(0)

积分
-11996
跳转到指定楼层
1#
发表于 2008-12-3 20:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
#include "system.h". |' V6 U) i  T* X7 \/ z
#include "alt_types.h"
/ F" E1 U9 j$ V7 R2 i+ r#include "altera_avalon_pio_regs.h"4 k1 X1 e3 u4 B4 E2 S
#include "sys/alt_irq.h"
* s& O3 q$ c( j* H3 `( a% d; }$ P4 V. N' r- m& W4 f% c: q/ I% C
volatile int edge_capture;  o! g2 P4 v: n
volatile int data_reset = 0;
7 u% ~# W$ y3 A1 A) i//中断服务程序,向设备发送1024个数据" N3 P( f$ N* p% [" @
static void trans_data_to_lpc(void *context)
) ]2 s. f. y: e, u, Z1 l2 P( s! t{2 h' N/ L7 j/ ?; |
    int i = 0;
8 w4 n0 s8 }6 F- W    int j = 0;
1 l4 G  R/ v: ]3 X$ r: n    alt_u8 data_to_lpc;, L) n# T3 W& O
    alt_u8 data_trans_req;/ n, x/ `  i# f+ @4 V7 u
    volatile int *edge_capture_ptr;
+ s0 G; w7 D  x! W8 o    4 g, i% {0 D; S! h; [4 r
    alt_irq_disable(PIO_LPC_DATA_REQ_IRQ);
6 n( V1 g, l: z. B" r   
+ [/ k* k4 Z) d  k  g* }& D" A    data_to_lpc = data_reset++;
, S! f7 u7 [) g9 P4 m3 i9 r# A    data_trans_req = 0x00;
, N3 f/ b1 b% I, A$ {5 \. Z    edge_capture_ptr = (volatile int *)context;
; |0 j2 K" h; I( q' `    6 X. O) T7 {' G$ `  f4 ]1 w
    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_TO_LPC_SYN_CLR_BASE, 0x00); // clear syn_clr;
/ X5 H3 X. d% |1 m4 D2 U    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_TO_LPC_SYN_CLR_BASE, 0xFF); // set syn_clr;
+ i. H; f  f) @, m$ {& w# W9 s    IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0xFF); // set irq, start data trans;
% d( f2 b8 s9 W8 f0 g; V    - k3 A$ S  C. ~' M
    for(i=0; i<1024; i++)
+ n/ P2 U0 `1 G& k8 P: N$ Q. z    {
" y7 V+ y! M) ?        data_to_lpc++;
# m- N5 l/ i, E5 t        IOWR_ALTERA_AVALON_PIO_DATA(PIO_DATA_TO_LPC_BASE, data_to_lpc); // write data
+ D& ^+ ^: S( v" Q        data_trans_req = ~data_trans_req;
/ b/ h- i/ R* J2 ~9 ^9 v        IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_REQ_TO_LPC_BASE, data_trans_req); // set or clear req;& m& v5 c# S# Q9 H; z2 b0 O
        while(IORD_ALTERA_AVALON_PIO_DATA(PIO_COM_SIGNAL_BASE))( P0 G# {/ ]& T4 q" T
        {
) C; Q5 L4 }4 `) t) Y            j++;; d( t' b9 u% `# D7 D
            if(j>10000000)4 M! _1 w  v8 f3 G
            {) ~, O, K3 e9 x6 \7 T
                IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0x00); // clear irq, complete data trans;1 G! m% P5 }8 ?( {0 {
                alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);. f$ E5 G  a  w2 r. l! |
                return; // time out;* m7 k" |5 C- \8 L& f) F0 J* J( l8 D
            }8 m6 [/ P  [! R6 s# `& q! ^
        } // wait lpc recieve data complete;. x3 e& l& e6 G. m; h
    }0 O, ?( l  m5 w* H9 K" V6 u
    IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0x00); // clear irq, complete data trans;  & O$ N$ ^+ r% A; V# Q
    alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);2 Z5 h: B! _% I
    4 A, p' @: D1 ^( Q/ \8 q
    return;
6 ]0 }1 f7 W# U' |" h}
# g3 e: Y& G4 H' C9 w- r& g5 t% p- `' P9 S* y) d
int main()* \5 G+ V- z7 F1 ^6 [- x
{; ^# N3 ?+ x& c. o. p9 i+ y
    alt_u8 led = 0xF;   
- N4 Q! z5 S8 A( f# @( O   
: t$ @/ t4 j, R7 q$ a    int i = 0;
* P5 f2 g  H( e& P1 U* b5 a/ S    void *edge_capture_ptr = (void *)&edge_capture;& E$ W1 G* e" J- x* g& t2 X* G
    //====Init====  % m2 w# Z- t. h
    alt_irq_init(PIO_LPC_DATA_REQ_IRQ);
$ h2 M5 |4 h  T) f' l    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_REQ_TO_LPC_BASE, 0x00);
% }* W* J2 D0 B! [    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LPC_DATA_REQ_BASE, 0x01); // Enable LSB interrupt;
( o7 i$ J( F3 R1 v    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LPC_DATA_REQ_BASE, 0x00); // Reset the edge capture register;
. ~, V" ~4 a! g2 v% C/ s    alt_irq_register(PIO_LPC_DATA_REQ_IRQ, edge_capture_ptr, trans_data_to_lpc); // Register the interrupt handler;
, k; n. T& ?  _3 o7 `    alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);  a7 Y% P7 U3 J: u- y  Z
    //============" G6 @! _6 O$ w) N
    while(1)0 l9 |) t3 }% v( Z* o; s, M/ h
    {& J+ T4 h; _/ s5 b
        IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);//led闪烁8 h! E/ Y& U, a# f6 E3 d+ O
        led = ~led;     ) b$ n4 v$ h6 u. R$ |
        i = 0;
8 E$ f! g3 b: w. }' A        while(i<100000000)6 ]1 d6 `/ |, u6 g% @
            i++;
4 Z7 }0 u1 d$ l* P    }1 s, o1 X4 z% T& t
    return 0;
7 W6 |! H; m+ c% u- x}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

1

主题

4

帖子

-1万

积分

未知游客(0)

积分
-11996
2#
 楼主| 发表于 2008-12-3 20:47 | 只看该作者

说明

中断服务程序是在中断产生的时候向设备发送1024个数据,然后返回继续LED闪烁,现在设备可以连续的从niosii获取数据,可是程序始终无法返回,在不获取数据的时候,无法继续闪烁led,这是怎么回事啊?谢谢!!

5

主题

59

帖子

-1万

积分

未知游客(0)

积分
-11981
3#
发表于 2008-12-9 22:10 | 只看该作者
设断点试试

4

主题

204

帖子

-1万

积分

未知游客(0)

积分
-11837
4#
发表于 2009-3-17 14:45 | 只看该作者
中断一般不要做那么多东西吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-2-24 01:35 , Processed in 0.055875 second(s), 32 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表