查看: 8940|回复: 26

[求助] KL43 LPUART接收数据时不能进中断函数,有遇到这种情况的吗...

[复制链接]

该用户从未签到

1

主题

13

帖子

0

新手上路

Rank: 1

积分
47
最后登录
2015-5-9
发表于 2015-3-10 11:17:24 | 显示全部楼层 |阅读模式
KL43 LPUART接收数据时不能进中断函数,但是我们试过发送数据时是可以进中断函数的。另外,接收数据时STAT寄存器中RDRF位始终未置1,可能是这个导致没有进中断。
21
RDRF
Receive Data Register Full Flag
RDRF is set when the receive buffer (LPUART_DATA) is full. To clear RDRF, read the LPUART_DATA
register.
A character that is in the process of being received does not cause a change in RDRF until the entire
character is received. Even if RDRF is set, the character will continue to be received until an overrun
condition occurs once the entire character is received.
0 Receive data buffer empty.
1 Receive data buffer full.

有遇到过这种情况的吗?

我知道答案 目前已有26人回答
回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-10 11:49:06 | 显示全部楼层
楼主是怎么配置的?
把配置代码或者工程发出来看看。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

13

帖子

0

新手上路

Rank: 1

积分
47
最后登录
2015-5-9
 楼主| 发表于 2015-3-10 13:43:00 | 显示全部楼层
void UART_Init(UART_InitTypeDef* UART_InitStruct) {
uint16_t sbr;
uint32_t osr;
static bool is_fitst_init = true;
/* param check */
assert_param(IS_UART_ALL_INSTANCE(UART_InitStruct->instance));
/* enable clock gate */
SIM->SCGC5 |= SIM_SCGC5_LPUART0_MASK;
/* clock source */
SIM->SOPT2 &= ~SIM_SOPT2_LPUART0SRC_MASK;
SIM->SOPT2 |= SIM_SOPT2_LPUART0SRC(1);  //use PLL/2 or FLL
#if 1
/* disable Tx Rx first */
UART_InstanceTable[UART_InitStruct->instance]->CTRL &=
   ~((LPUART_CTRL_TE_MASK) | (LPUART_CTRL_RE_MASK));
/* baud rate generation */
//    sbr = (uint16_t)((UART_InitStruct->srcClock)/((UART_InitStruct->baudrate)*16));
//    brfa = ((32*UART_InitStruct->srcClock)/((UART_InitStruct->baudrate)*16)) - 32*sbr;
osr = 4;
sbr = ((UART_InitStruct->srcClock) / ((UART_InitStruct->baudrate) * osr));
/* config baudrate */
//    UART_InstanceTable[UART_InitStruct->instance]->BDH |= UART_BDH_SBR(sbr>>8);
//    UART_InstanceTable[UART_InitStruct->instance]->BDL = UART_BDL_SBR(sbr);
//    UART_InstanceTable[UART_InitStruct->instance]->C4 |= UART_C4_BRFA(brfa);
UART_InstanceTable[UART_InitStruct->instance]->BAUD = LPUART_BAUD_OSR(
   osr - 1) | LPUART_BAUD_SBR(sbr);

/* parity */
switch (UART_InitStruct->parityMode) {
case kUART_ParityDisabled: /* standard N 8 N 1*/
  UART_InstanceTable[UART_InitStruct->instance]->CTRL &=
    ~LPUART_CTRL_PE_MASK;
  UART_InstanceTable[UART_InitStruct->instance]->CTRL &=
    ~LPUART_CTRL_M_MASK;
  break;
case kUART_ParityEven:/* 8 bit data + 1bit parity */
  UART_InstanceTable[UART_InitStruct->instance]->CTRL |=
    LPUART_CTRL_PE_MASK;
  UART_InstanceTable[UART_InitStruct->instance]->CTRL &=
    ~LPUART_CTRL_PT_MASK;
  break;
case kUART_ParityOdd:
  UART_InstanceTable[UART_InitStruct->instance]->CTRL |=
    LPUART_CTRL_PE_MASK;
  UART_InstanceTable[UART_InitStruct->instance]->CTRL |=
    LPUART_CTRL_PT_MASK;
  break;
default:
  break;
}
/* bit per char */
/* note: Freescale's bit size config in register are including parity bit! */
switch (UART_InitStruct->bitPerChar) {
case kUART_8BitsPerChar:
  if (UART_InstanceTable[UART_InitStruct->instance]->CTRL
    & LPUART_CTRL_PE_MASK) {
   /* parity is enabled it's actually 9bit*/
   UART_InstanceTable[UART_InitStruct->instance]->CTRL |=
     LPUART_CTRL_M_MASK;
   UART_InstanceTable[UART_InitStruct->instance]->BAUD &=
     ~LPUART_BAUD_M10_MASK;
  } else {
   UART_InstanceTable[UART_InitStruct->instance]->CTRL &=
     ~LPUART_CTRL_M_MASK;
   UART_InstanceTable[UART_InitStruct->instance]->BAUD &=
     ~LPUART_BAUD_M10_MASK;
  }
  break;
case kUART_9BitsPerChar:
  if (UART_InstanceTable[UART_InitStruct->instance]->CTRL
    & LPUART_CTRL_PE_MASK) {
   /* parity is enabled it's actually 10 bit*/
   UART_InstanceTable[UART_InitStruct->instance]->CTRL |=
     LPUART_CTRL_M_MASK;
   UART_InstanceTable[UART_InitStruct->instance]->BAUD |=
     LPUART_BAUD_M10_MASK;
  } else {
   UART_InstanceTable[UART_InitStruct->instance]->CTRL |=
     LPUART_CTRL_M_MASK;
   UART_InstanceTable[UART_InitStruct->instance]->BAUD &=
     ~LPUART_BAUD_M10_MASK;
  }
  break;
default:
  break;
}
UART_InstanceTable[UART_InitStruct->instance]->STAT &=
   ~LPUART_STAT_MSBF_MASK; /* LSB */
//使能中断
__set_PRIMASK(1);
UART_InstanceTable[UART_InitStruct->instance]->CTRL |= LPUART_CTRL_RIE_MASK;
if (UART_InitStruct->instance == 0) {
  NVIC_EnableIRQ(LPUART0_IRQn);
} else if (UART_InitStruct->instance == 1) {
  NVIC_EnableIRQ(LPUART1_IRQn);
}
__enable_irq();
/* enable Tx Rx */
UART_InstanceTable[UART_InitStruct->instance]->CTRL |=
   ((LPUART_CTRL_TE_MASK) | (LPUART_CTRL_RE_MASK));
#endif
/* link debug instance */
/* if it's first initalized ,link getc and putc to it */
if (is_fitst_init) {
  UART_DebugInstance = UART_InitStruct->instance;
}
is_fitst_init = false;
}
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

13

帖子

0

新手上路

Rank: 1

积分
47
最后登录
2015-5-9
 楼主| 发表于 2015-3-10 13:49:14 | 显示全部楼层
另外,补充一下,我们是通过MCU和GPRS通信,我们量过GPRS的发送端是发了数据的,但是MCU接收端没有接收到数据,不知道是什么原因,请各位大神赐教。。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-10 14:15:17 | 显示全部楼层
huchengkang 发表于 2015-3-10 13:49
另外,补充一下,我们是通过MCU和GPRS通信,我们量过GPRS的发送端是发了数据的,但是MCU接收端没有接收到数 ...

你有没有用串口助手发送试过?
还有你GPRS发出来的数据,波特率什么的都对吗?
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-10 14:26:27 | 显示全部楼层
本帖最后由 FSL_TICS_ZJJ 于 2015-3-10 14:30 编辑

另外,你可以参考下我们的官方例程,有一个关于KL43的LPUART代码。
[url=https://www.freescale.co
m/files/32bit/software/FRDM-KL43Z-SC-BAREMETAL.exe?WT_TYPE=Lab%20and%20Test%20Software&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=exe&WT_ASSET=Downloads&fileExt=.exe]下载链接[/url]
另外,你代码里面的接收中断使能配置了没有?
没有看到你置位RIE。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

13

帖子

0

新手上路

Rank: 1

积分
47
最后登录
2015-5-9
 楼主| 发表于 2015-3-10 14:39:20 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-3-10 14:26
另外,你可以参考下我们的官方例程,有一个关于KL43的LPUART代码。
下载链接
另外,你代码里面的接收中断使 ...

1.GPRS发出来的数据,波特率是对的。
2.你指的是在PC端用串口助手给MCU发数据吗?这个我们也想过,但是PC端是RS232信号,MCU是TTL信号,我们没法将RS232转成TTL信号,所以没法试。
3.这个官方例程我们有,但是keil工程编译不过,主要错误是:
..\..\..\..\src\cpu\device.h(40): error:  #5: cannot open source input file "core_cm0.h": No such file or directory
                #include "core_cm0.h"

以上的问题请问你有遇到过吗?
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

13

帖子

0

新手上路

Rank: 1

积分
47
最后登录
2015-5-9
 楼主| 发表于 2015-3-10 14:43:27 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-3-10 14:26
另外,你可以参考下我们的官方例程,有一个关于KL43的LPUART代码。
下载链接
另外,你代码里面的接收中断使 ...

上面附上的初始化代码里有:
UART_InstanceTable[UART_InitStruct->instance]->CTRL |= LPUART_CTRL_RIE_MASK;

麻烦再帮忙看看有没什么问题。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-10 14:46:09 | 显示全部楼层
huchengkang 发表于 2015-3-10 14:39
1.GPRS发出来的数据,波特率是对的。
2.你指的是在PC端用串口助手给MCU发数据吗?这个我们也想过,但是PC ...

1.jpg
看看,core_cm0.h的路径,你找找你相关KEIL安装的路径有没有这个文件。

回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-10 15:10:47 | 显示全部楼层
huchengkang 发表于 2015-3-10 14:43
上面附上的初始化代码里有:
UART_InstanceTable->CTRL |= LPUART_CTRL_RIE_MASK;

你能debug吗?
把几个寄存器的debug数据都给我看看呢。
因为我现在手上没有KL43的板子,所以没法帮你调试。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-22 20:56 , Processed in 0.105558 second(s), 31 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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