找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

1

主题

4

帖子

-1万

积分

未知游客(0)

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

EDA365欢迎您!

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

x
#include "system.h"
9 w+ q! R7 L8 n* V4 ~5 O% i9 e; s#include "alt_types.h"
# v2 u. s% a1 m) W7 p, s#include "altera_avalon_pio_regs.h". I0 M6 a- g4 ~: \" q
#include "sys/alt_irq.h"
: l3 |1 n* l3 J' ~, {$ g% d5 m1 X& \1 P  j8 [' M# Y' d& {
volatile int edge_capture;
' P- K0 z: Z. ^6 m8 K# M; n- c3 K8 g% gvolatile int data_reset = 0;
* D1 X/ f/ P  R' v3 ]: Q6 q//中断服务程序,向设备发送1024个数据8 A9 h0 X/ y$ e; `
static void trans_data_to_lpc(void *context)
: a- Y. W) W  b{! d5 j+ s: }8 `' v4 U
    int i = 0;6 X7 m+ R' @0 M
    int j = 0;
* o% y3 E1 Y2 }% o    alt_u8 data_to_lpc;& _! D3 w1 h5 ^4 ~% I  B' `7 Z9 v
    alt_u8 data_trans_req;+ g- R0 a+ x' P, [* |
    volatile int *edge_capture_ptr;: k* `6 v, @4 z7 d
   
" Y8 S' a. d$ d    alt_irq_disable(PIO_LPC_DATA_REQ_IRQ);
( z, e% y) u1 \2 P7 R7 x$ y   
8 ^) W$ M) B% {# Q  n    data_to_lpc = data_reset++;; N& ?  h+ i% Z) Z3 \9 j
    data_trans_req = 0x00;, D8 S& y/ D, V/ ^
    edge_capture_ptr = (volatile int *)context;
( A' w/ `$ K- _6 R! h    # [/ Z: M: V, N
    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_TO_LPC_SYN_CLR_BASE, 0x00); // clear syn_clr;
) w- H: h3 R! p    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_TO_LPC_SYN_CLR_BASE, 0xFF); // set syn_clr;
, ^5 r" ]) W" l* n% X! e    IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0xFF); // set irq, start data trans;
% q% H( v% `! s! h   
/ Y  j( M5 b1 O( b8 ]6 X    for(i=0; i<1024; i++)
# A7 O4 Y" W1 O5 D* |    {
) Z; B" O) A3 M, p) [% j        data_to_lpc++;
( `- A! `, ~1 M% o) t2 I6 H        IOWR_ALTERA_AVALON_PIO_DATA(PIO_DATA_TO_LPC_BASE, data_to_lpc); // write data4 T8 ]; G$ z5 m* x+ U9 B, V
        data_trans_req = ~data_trans_req;
$ z' D; }, l2 j# _3 p        IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_REQ_TO_LPC_BASE, data_trans_req); // set or clear req;
0 n2 i' J4 _7 u        while(IORD_ALTERA_AVALON_PIO_DATA(PIO_COM_SIGNAL_BASE))& R+ u) O  d: c( E. Z
        {
, [2 b7 w6 r, N0 Q8 T7 ?            j++;0 Q' P( T" U# v4 X
            if(j>10000000). O, B% c. L; u0 {3 L6 b1 ?+ U
            {
$ {8 x8 {2 L( `% i4 Q                IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0x00); // clear irq, complete data trans;5 `) A9 `6 f6 C8 U/ Z: W3 s/ Z
                alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);. f- `: R" M( d8 ]
                return; // time out;
  T% R* f6 W; U' ~            }
& \! o" h. m: d) b0 I% u: ]( A3 G        } // wait lpc recieve data complete;5 t1 U; Z/ k5 b& @: E
    }
( W1 i" a0 B5 s. l    IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0x00); // clear irq, complete data trans;  % ~9 Z" w% e& E
    alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);
0 }9 J6 z, v$ r/ P# p& y    " D: ^8 {( F! v. D1 e
    return;
0 D* |/ f! u3 V}
8 M# a& _0 N/ M
, Q5 g6 s- @3 X* h* l# _3 I7 Zint main()
- O5 \5 K& W( Z' t{
* F8 S  D" q% M4 q& A8 ?5 y3 D- |    alt_u8 led = 0xF;   , h' d0 ~: d& I
   
% W% s7 }/ w6 ~( @7 A3 I) \0 \# J    int i = 0;9 h' H6 w* g4 e* V% ]( \! d) ^) P
    void *edge_capture_ptr = (void *)&edge_capture;9 e) A' m' O: y" @& J" u- ~
    //====Init====  3 h/ S5 _6 P; U# E1 m* r& Z
    alt_irq_init(PIO_LPC_DATA_REQ_IRQ);! `: f$ a% y2 m4 z
    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_REQ_TO_LPC_BASE, 0x00);
( U7 v2 Q: y  A& H/ e6 a    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LPC_DATA_REQ_BASE, 0x01); // Enable LSB interrupt;
' o7 S/ l2 [0 H! l6 e    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LPC_DATA_REQ_BASE, 0x00); // Reset the edge capture register;
" T/ c! I$ z4 a    alt_irq_register(PIO_LPC_DATA_REQ_IRQ, edge_capture_ptr, trans_data_to_lpc); // Register the interrupt handler;8 B- n5 k' K* {! a+ W! \& z
    alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);* U" K4 D: ~7 Y2 p8 l5 ^8 h6 Z# z3 B' U
    //============
2 w0 I+ o/ S6 x    while(1): `4 \" s. n6 X/ R7 H& Q
    {
( y3 |- W) W" n4 s$ [9 e        IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);//led闪烁- Z* G  C) i7 d
        led = ~led;       f' t' n5 E( m+ Z& X: H0 J
        i = 0;
1 p% Q! Y% X$ z" F: Z1 x" m, h, L; E        while(i<100000000)( @3 v/ U8 g. K; o# T2 W
            i++;
5 a' l9 @8 g1 ~  N" @0 q    }
! ~7 M& x  \) i  B    return 0;
6 \$ ?- _% P2 E4 K- K0 T! a}
分享到:  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-23 21:25 , Processed in 0.058359 second(s), 32 queries , Gzip On.

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

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

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