找回密码
 注册
关于网站域名变更的通知
查看: 1476|回复: 3
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include "system.h"
/ n3 i+ Q8 r4 }0 ~  f7 c#include "alt_types.h"3 P' W. _' B1 C& s: X
#include "altera_avalon_pio_regs.h"0 k  q. t/ Z4 B5 i6 S/ H2 E6 Z
#include "sys/alt_irq.h"
9 Y+ n3 _# I- ~6 G% v+ \# P5 m2 t! y3 {8 v
volatile int edge_capture;
" b: o( f% R5 f# i; Q# ~4 q" @volatile int data_reset = 0;
/ M/ ^* o3 ?* r- \# J//中断服务程序,向设备发送1024个数据
: e5 P# B/ x: g$ Cstatic void trans_data_to_lpc(void *context)! k) F; `! S1 y: M0 p3 e1 i0 S
{, b- |+ u' t) M, x2 ]% \: o9 f
    int i = 0;; s8 N/ e: @1 S3 [$ f
    int j = 0;
! R8 T& P' O/ {    alt_u8 data_to_lpc;1 H  G3 W7 ]3 s" v+ ^2 x
    alt_u8 data_trans_req;' x- b+ w# t. R) c4 h1 E
    volatile int *edge_capture_ptr;$ M+ V) \" s8 f; p/ G' T3 ^5 C
    0 j5 v5 ^; n; {$ D1 ^9 Y
    alt_irq_disable(PIO_LPC_DATA_REQ_IRQ);
- `3 C# U: F' V    ; u3 ^, J7 z, Q# Y
    data_to_lpc = data_reset++;/ p6 G9 T& \* {
    data_trans_req = 0x00;) \' U! _+ a* M& V5 J5 G! R
    edge_capture_ptr = (volatile int *)context;
$ v, v7 h5 e0 h  g# {& x, a% Y    ' C0 ~* O4 d# a) m+ D
    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_TO_LPC_SYN_CLR_BASE, 0x00); // clear syn_clr;2 Y2 H: X: ^6 m9 r8 s3 m7 Y
    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_TO_LPC_SYN_CLR_BASE, 0xFF); // set syn_clr;4 h2 `4 m0 U: _+ g* F+ ^* o
    IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0xFF); // set irq, start data trans;
3 u4 r. l. R( U6 O- G    : o, a' y4 S* I+ I+ ~& k
    for(i=0; i<1024; i++)
% ?- j1 z% m. E8 c7 W- X    {$ M. D7 F2 A; l4 d" I
        data_to_lpc++;
# k' u: J) [6 K8 R        IOWR_ALTERA_AVALON_PIO_DATA(PIO_DATA_TO_LPC_BASE, data_to_lpc); // write data
: n: a- E" D1 e5 G: w        data_trans_req = ~data_trans_req;2 [8 K9 p) r3 H3 c* N5 _+ ~9 B
        IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_REQ_TO_LPC_BASE, data_trans_req); // set or clear req;
1 T5 \3 G1 N: i  W% A% B        while(IORD_ALTERA_AVALON_PIO_DATA(PIO_COM_SIGNAL_BASE))
* R: k" \; W3 N8 ^        {! y; L2 x0 d$ K5 \, L8 G2 R6 O
            j++;
4 Q) S3 A# z2 e* S, h            if(j>10000000)
: a: ?" B" K: u  S& j' T- h$ E            {
9 m; f9 v  b1 G( v                IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0x00); // clear irq, complete data trans;: T! n/ W' ]1 z* b8 L% R4 b1 d$ s
                alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);! W  `0 T  d  M) B" u$ B( _
                return; // time out;
4 I/ W3 {1 M% a3 J            }! V$ E, c& `; W5 |
        } // wait lpc recieve data complete;
% Y& E# {% z7 `2 Q" W    }
" H8 K: _& F0 }3 h    IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0x00); // clear irq, complete data trans;  $ M- j) I4 f$ e% ]  Z
    alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);
  `( p' s8 I7 G   
; g$ V) S. Y: F; d7 E+ R. \    return; 4 M0 [3 G& Y! L* `6 Q0 R
}
: y0 y1 h6 j  B6 z# p7 c6 m7 w* ?7 w- K" B' Q7 e/ S$ e" A, V! w
int main()
0 {  c& t. B" {{
1 n4 d0 H- _; b; M" g    alt_u8 led = 0xF;   ( F9 B& |0 u2 `. o1 {. w. g, n
    - z: V3 |. _! r4 Y
    int i = 0;5 Y8 [/ T" n/ y5 B0 K1 l; |
    void *edge_capture_ptr = (void *)&edge_capture;$ ?) [+ _. E. K) C* N
    //====Init====  $ c0 H) B; T4 J8 O% I
    alt_irq_init(PIO_LPC_DATA_REQ_IRQ);  q3 S8 K  U& Y: ]
    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_REQ_TO_LPC_BASE, 0x00);
+ d6 E5 x- c1 K. e; O+ M- g6 T    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LPC_DATA_REQ_BASE, 0x01); // Enable LSB interrupt;
8 o7 z1 W8 t9 W% c    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LPC_DATA_REQ_BASE, 0x00); // Reset the edge capture register;# K8 ]; a: q6 o2 O; Y6 X
    alt_irq_register(PIO_LPC_DATA_REQ_IRQ, edge_capture_ptr, trans_data_to_lpc); // Register the interrupt handler;
! e9 ?% ^: Y  I+ A0 Q( D( D    alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);
& Q& l9 o) o8 k+ A    //============) |6 `- ?% v$ x8 s! Y
    while(1)
% h( n5 B( I5 s# A) U1 H5 k4 X    {
1 \0 G# P# z  j0 ^/ j- }        IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);//led闪烁: w+ N/ M/ b; i
        led = ~led;     
7 Z/ n5 c# e/ N        i = 0;
3 i0 z% l0 ~# i0 w  k0 }        while(i<100000000)
& B' E* h- K9 ]+ c1 t- H4 r: E            i++;% h  ^/ |: i4 t6 V6 u7 ~
    }' {* r' F+ C, ?/ ^* _: Y: c
    return 0;  C. y3 w+ e# p1 `8 d. ]: B* k
}

该用户从未签到

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

说明

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

该用户从未签到

3#
发表于 2008-12-9 22:10 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-19 10:57 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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