在sysbios下,uart中断收发数据,程序无法进入中断 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8990|回复: 4
打印 上一主题 下一主题

在sysbios下,uart中断收发数据,程序无法进入中断

[复制链接]

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
跳转到指定楼层
楼主
发表于 2014-12-1 14:52:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
; C5 F7 G& J) G, x% b* N7 @// 发送缓存  S9 d' Z% O# ^, A' k
char Send[] = "UART1 test......\n\r";( L  L, o( J3 c& o- ^  |$ w
2 N2 @2 n% v2 R0 g' u
extern void UARTconfig()5 p' k$ e" M( w! n, X
{
8 W1 ?  J' a0 P; s* B //使能Uart1
1 d1 A' f. `, K4 c7 z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
3 R+ q* T7 |, Y4 D( ~
  E  B1 W; F# V. W$ {! Q // 使能 UART1禁用流控
: M- k/ |) U# u1 ]( g UARTPinMuxSetup(1, 0);
, N  o' o% e7 H3 u! m" X+ |$ C
: v$ b1 v1 X$ Z // 波特率 115200 数据位 8 停止位 1 无校验位0 z5 y" m. V2 ?* D
  UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ H  \& [8 V2 o. b
5 ]6 Y6 j- {5 F* Z- ~/ O
  // 使能 UART1$ D+ m, U1 f+ c4 n: |& b; t
UARTEnable(SOC_UART_1_REGS);5 Q) Y$ ]( ]9 z+ H: X. `
  // 使能接收 / 发送 FIFO6 R4 |) y# z/ D) Q# p" T# r
  UARTFIFOEnable(SOC_UART_1_REGS);; g- E+ R$ J2 T2 T5 R
  // 设置 FIFO 级别
" r3 g( U; a, g% I+ |. H    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
3 q4 a  X6 q# S  //Uart1中断使能
2 k) r- p! G* j0 |! |# i  unsigned int intFlags = 0;
+ b$ n: Q, U0 r  s# G  intFlags |= (UART_INT_LINE_STAT  |  \
( W2 R3 J* J+ V" O            UART_INT_TX_EMPTY |    \$ Y# `9 a. z$ Z+ i: T
            UART_INT_RXDATA_CTI);4 s5 O( `8 b6 ?% V# y5 D% Z) G9 {
            2 U/ g) s! [( |; l) B, e# e4 [
    UARTIntEnable(SOC_UART_1_REGS, intFlags);
1 w( H; ]; r3 G. W1 _: r}+ u2 ]7 `' ]+ I! M* F
//UART 中断服务函数
* B* T9 e2 n  H& B" Wvoid UARTIsr(UArg arg)
4 D6 H6 W2 ^4 E) g1 q( x* e{
& _. e( G' }- v  r+ {    static unsigned int length = sizeof(Send);
- N. K4 V. K( i* C  Q0 Q    static unsigned int count = 0;
  u+ W9 M+ }1 [( \    unsigned char rxData = 0;
2 w6 H3 ?' W% H    unsigned int int_id = 0;& e& X, K" {; ]& ~, P1 D& w% W
    // 确定中断源! `) k* w6 s3 M* J
    int_id = UARTIntStatus(SOC_UART_1_REGS);, [; y2 c$ B1 ^" ?
    // 清除 UART1 系统中断7 `: Q) o9 `0 ^' _4 ~8 M" {
    IntEventClear(SYS_INT_UART1_INT);
+ g4 _2 F4 o4 ?5 R9 Q    // 发送中断
7 P; i" {5 `3 }$ n6 D) r    if(UART_INTID_TX_EMPTY == int_id)
$ \+ P' h$ ?8 g5 x& N6 w3 I    {
1 z7 D6 w( ^) q% Y, C1 z; B        if(0 < length)
( Q1 t* c$ U0 Z- ]        {
# s7 y9 R. {* `6 z& \2 w            // 写一个字节到 THR
; O8 u, C4 I' C% c0 N) G' N            UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);9 W$ o# _9 {8 L7 u! v- l
            length--;) U$ A5 J1 {  k% Z
            count++;% ?/ O7 N: S, p/ q' V6 e. Q
        }7 C# L4 ~8 V; c% O* D: o6 J& ^
        if(0 == length)9 W5 B6 x8 I1 [0 f' J4 Q
        {) y0 l( D9 Y2 l2 h3 K% B
            // 禁用发送中断
! `7 v3 z# n( I/ A. m1 Q+ {) i            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
2 t7 F- J8 ~  S; _) R9 y9 L% f4 C        }+ H% u/ D1 _  g) s' ?
     }
9 [1 r7 P/ g  n6 m) \    // 接收中断
* a1 P8 r5 R: y4 t* ~    if(UART_INTID_RX_DATA == int_id)
: k7 ]% k$ c/ J* G! h8 j" x$ {7 c& T9 J    {
" M& A+ J! M$ U' S6 q' x        rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);' n$ ?7 j4 M, K
        UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);. u5 |5 Z5 i4 Z: ^, Y5 i+ V( Y
    }
, V3 L7 V8 M5 R3 c9 d    // 接收错误9 E' @1 j7 F+ b0 u6 c1 Q+ z2 n
    if(UART_INTID_RX_LINE_STAT == int_id)
8 |- ~  `$ ^( B2 }; _, p    {1 z$ x8 J0 w9 l3 \- ^
        while(UARTRxErrorGet(SOC_UART_1_REGS))0 ]* a) p# l" w" \
        {- a8 F) ?* z# q, i' B; D! A1 |% B
            // 从 RBR 读一个字节
1 i1 |% Z% K/ p            UARTCharGetNonBlocking(SOC_UART_1_REGS);
7 o( P/ V; Q4 p& r) P1 t8 z        }2 r9 K, {) `! Z
    }* O; Y, C; I& P! j' ^
    return;1 I" d; h5 z& g! |: A$ n
}
! D& |  G- F+ A$ WInt main()% e9 d9 h% _2 _1 [
{ * |$ b! I' ]& G- C% K% j( j& Q- \
UARTconfig();//uart 配置
6 T/ S2 n& _2 q    Error_Block eb;" ^+ ?6 {3 Y0 V; R) g. p
    System_printf("enter main()\n");% H. n% }+ A! o
    Error_init(&eb);1 X8 P3 `* M$ T2 P( P
    // 动态创建硬件中断
: _6 [7 a8 B! R2 v% N    Hwi_Handle hwi1;+ \+ d. L) i2 B9 I  x& x4 G
    Hwi_Params hwiParams;% b* `  N( `! ^4 B' X# R8 U7 w
    // 使用默认值初始化参数
, k  D' d) i: e$ Y$ c: R    Hwi_Params_init(&hwiParams);$ W5 _$ g6 [: C+ ^' M8 ~# V
    // 中断事件) B( ^3 P; L) o1 O. D" J! E
    hwiParams.eventId = SYS_INT_UART1_INT;
% i5 p7 v8 B" i2 W9 s    // 传递到中断服务函数的参数
7 J  I' e" w2 l- {+ @  J; U  J/ G/ V    hwiParams.arg = 0;( _( F6 X0 \$ |' r1 f
    // 不允许该中断自身嵌套2 r6 |/ b2 \, p
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
, a( a( ~4 i* x$ i9 n( R7 E    // 使能中断9 y; m( h7 q/ ~
    hwiParams.enableInt = true;
; e3 P. w, Q1 k. p/ U, H3 a    // 可屏蔽中断 4
' X- _( ~: |) c  x" i2 u    // 中断服务函数 hwiMain
3 J$ @( b* |% g    hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
0 P0 C( a3 F/ L. V2 q( [& `    if (hwi1 == NULL)
# k: w* Z+ B1 o' F" M        System_abort("Hwi1 create failed");
3 |3 ]# X/ N  n9 D    BIOS_start();    /* does not return */
1 Q) {2 @5 j, H4 z' j5 ^: u/ F1 u    return(0);
& A/ L! r& D! Q$ Z}
) P* W" w0 g$ ]8 P
7 T; a( g$ M, T4 L: x; ]2 O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2014-12-1 16:21:53 | 只看该作者
你是怎么判断没有进入中断服务函数的?
8 {/ ^* }: r6 l" \( X
回复 支持 反对

使用道具 举报

7

主题

13

帖子

95

积分

注册会员

Rank: 2

积分
95
板凳
 楼主| 发表于 2014-12-1 21:49:33 | 只看该作者
在中断服务函数里放置断点2 f+ p7 S: i. K# \0 ^
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
地板
发表于 2014-12-2 11:11:58 | 只看该作者
Greatwang 发表于 2014-12-1 21:49
! |) c3 n: o% ^2 O在中断服务函数里放置断点
$ L8 ~- }2 R% M. Q
参考 GPIO_KEY8 W) Z, K& V7 j' P) j' c% Y5 ?1 H5 v
回复 支持 反对

使用道具 举报

0

主题

6

帖子

115

积分

注册会员

Rank: 2

积分
115
5#
发表于 2016-8-1 21:05:07 | 只看该作者
请问你解决没,我现在也遇到这个问题了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-6-15 18:10 , Processed in 0.038179 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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