找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

1

主题

4

帖子

-1万

积分

未知游客(0)

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

EDA365欢迎您!

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

x
#include "system.h"/ P% B: R; C. J4 [# P  H
#include "alt_types.h"
& R' |3 X8 s( h% d0 y) I1 p#include "altera_avalon_pio_regs.h"# Y  o/ |8 r2 B8 {* R0 G
#include "sys/alt_irq.h") r$ a, K' w& \# x' W
6 J( E& X' E1 F* V0 _( L% b' P
volatile int edge_capture;; Q8 e/ v% x' }6 w# m# U3 m1 N* o
volatile int data_reset = 0;
2 y, h3 s, a: f! ^$ \8 d$ }: Q//中断服务程序,向设备发送1024个数据; x5 j/ w' Z7 {/ V
static void trans_data_to_lpc(void *context)' |3 J' D( l( H5 q2 a1 p2 x- x0 Y$ B" q
{1 _. m7 k6 Y, `9 n
    int i = 0;
; ~8 D% p4 d1 _' U" e# K& W; O    int j = 0;
9 N) U1 m- H1 U    alt_u8 data_to_lpc;
2 ?) J- Z( v& L    alt_u8 data_trans_req;& _" Q8 E: G8 Y0 d7 o) o# e
    volatile int *edge_capture_ptr;" m  e; K' g8 z2 J3 ]0 }2 F7 b
   
+ _* T4 c& a% [. B% \7 _+ G    alt_irq_disable(PIO_LPC_DATA_REQ_IRQ);
0 O8 m8 ?* n; {! k   
% _: p& E' e( c: c0 K    data_to_lpc = data_reset++;! Z: X8 G4 z6 _0 L- Z
    data_trans_req = 0x00;2 Y' Y7 Y% v: d1 `0 ?! J4 _$ ?0 Q! K7 A
    edge_capture_ptr = (volatile int *)context;
2 Y% B2 Y! F( J- D, i   
! T" ?5 \7 ^' Y) G    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_TO_LPC_SYN_CLR_BASE, 0x00); // clear syn_clr;
3 @9 M8 r: c: i+ p; ?2 J    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_TO_LPC_SYN_CLR_BASE, 0xFF); // set syn_clr;
: D$ a& b3 A! h9 v6 L    IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0xFF); // set irq, start data trans;
) O# k3 B2 e' i4 Z1 j0 Y# Q      j$ ~. L5 x* W; `  B9 F
    for(i=0; i<1024; i++)+ @: `7 V9 D) N4 ]( U# U
    {$ ~3 c" s; B6 w5 {4 r- i
        data_to_lpc++;( q5 f. ], M7 q4 b- C" g
        IOWR_ALTERA_AVALON_PIO_DATA(PIO_DATA_TO_LPC_BASE, data_to_lpc); // write data  w7 R9 Q( I7 U; h
        data_trans_req = ~data_trans_req;. w" e; r* g7 ^6 I/ F% x+ a
        IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_REQ_TO_LPC_BASE, data_trans_req); // set or clear req;
* x* f" X% I  B' V2 s        while(IORD_ALTERA_AVALON_PIO_DATA(PIO_COM_SIGNAL_BASE))
6 d4 f1 f3 z6 R5 u3 D$ D        {
; ?* Y1 k+ e# |            j++;7 y6 `& c1 R) r( B
            if(j>10000000)
) {! R) |- a" U            {, Z' o0 d" S( }1 I" K3 {2 W
                IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0x00); // clear irq, complete data trans;) o+ V: d# G! ^5 D% g5 y
                alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);2 z" u9 d8 l& x; w6 `. l. R5 M, @+ q2 E
                return; // time out;) q0 O' w' N, h2 ^- x
            }
! o( I/ v" X/ Q  _        } // wait lpc recieve data complete;" n) w# B  X' x% Y
    }
  h( J# P5 {% a8 t( g! h9 N# Y    IOWR_ALTERA_AVALON_PIO_DATA(PIO_IRQ_TO_LPC_BASE, 0x00); // clear irq, complete data trans;  
0 F. l6 c0 X/ N0 M% W    alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);! c5 {/ Y* F3 N
    # y8 V& ~: \- F9 _
    return; / x* R4 }; D6 X8 H
}3 s" J' {+ i* @

9 B! ?4 A2 _4 Z' g6 H8 ^7 rint main(); q) ?8 _3 T0 D( Z
{
. F  b9 z7 i/ a7 q! c    alt_u8 led = 0xF;   ' D; o' B) X( H# u0 x0 a0 D
    / p' h- [- Z* Y7 [! N9 ]: x
    int i = 0;
& d! \* A" J2 e7 g    void *edge_capture_ptr = (void *)&edge_capture;
6 f& N6 f& h. }( e' _: w    //====Init====  7 }' j8 Y  z# v9 d% u; N8 T6 ^
    alt_irq_init(PIO_LPC_DATA_REQ_IRQ);
& |! ~0 @7 L- j1 H) W    IOWR_ALTERA_AVALON_PIO_DATA(PIO_TRANS_REQ_TO_LPC_BASE, 0x00);
6 U+ f/ z) U' a& ?& l7 r' h    IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LPC_DATA_REQ_BASE, 0x01); // Enable LSB interrupt;( X, ^* b+ w8 a4 V7 V# P8 F
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LPC_DATA_REQ_BASE, 0x00); // Reset the edge capture register;
- r% \- I# J  b4 t% Q    alt_irq_register(PIO_LPC_DATA_REQ_IRQ, edge_capture_ptr, trans_data_to_lpc); // Register the interrupt handler;6 U7 P% h, X& ~4 Z4 M
    alt_irq_enable(PIO_LPC_DATA_REQ_IRQ);. b6 g0 j. o: M  f% W9 M
    //============
6 c+ {/ B! D& }' O& X, y    while(1)" \, s7 h, b# p) Q! Z& n
    {. `& T, y7 y" d7 L+ e
        IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);//led闪烁
3 ~7 A! a! t! P$ o* o% z, i        led = ~led;     * ^2 R0 I, a( q0 E$ Y
        i = 0;; h. u5 L( B; h2 b6 b  s' x
        while(i<100000000)$ |; j1 M/ G% u; E; ]4 @
            i++;
1 b6 Z5 u/ t0 r& `    }' i% U0 H# u! a
    return 0;
. l# w8 V  D! F5 E$ }6 I}
分享到:  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:53 , Processed in 0.054874 second(s), 33 queries , Gzip On.

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

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

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