打印
[技术问题解答]

请问MAPS-K64在进行串口通信时如何调用中断?

[复制链接]
楼主: elephy
手机看帖
扫描二维码
随时随地手机跟帖
21
elephy 发表于 2015-11-27 16:41
还是不是很行,我要是想直接用中断要怎么用?
我在MK64F12.h里找到UART0-5的中断向量表了,要是想用fsl_i ...

那你就直接写中断服务函数吧,不用KSDK里面带的中断函数,你自己写一个,然后连接到中断向量表中,这样操作要方便很多。

使用特权

评论回复
22
elephy|  楼主 | 2015-11-27 17:22 | 只看该作者
奥德赛 发表于 2015-11-27 16:55
这个飞思卡尔的中断例程看着很简单的,但是我用的也有问题

道友用的哪个中断例程?

使用特权

评论回复
23
FSL_TICS_ZJJ| | 2015-11-27 17:24 | 只看该作者
elephy 发表于 2015-11-27 17:22
道友用的哪个中断例程?

这样,回头有空,我帮你添加个UART的中断服务函数进去,让你调用好了。
你自己也先研究下UART的模块以及寄存器,reference manual中的相关章节好好看下。

使用特权

评论回复
24
elephy|  楼主 | 2015-11-27 17:25 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-27 17:14
那你就直接写中断服务函数吧,不用KSDK里面带的中断函数,你自己写一个,然后连接到中断向量表中,这样操 ...

中断服务函数要怎么写,有没有什么东西可以参考的么?

使用特权

评论回复
25
elephy|  楼主 | 2015-11-27 17:27 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-27 17:24
这样,回头有空,我帮你添加个UART的中断服务函数进去,让你调用好了。
你自己也先研究下UART的模块以及 ...

好好好,多谢多谢!麻烦了!

使用特权

评论回复
26
IversonCar| | 2015-11-28 15:06 | 只看该作者
用串口中断之前为什么要先取出D寄存器是什么意思啊

使用特权

评论回复
27
奥德赛| | 2015-11-29 21:09 | 只看该作者
IversonCar 发表于 2015-11-28 15:06
用串口中断之前为什么要先取出D寄存器是什么意思啊

这个是要先清除rx和tx缓存

使用特权

评论回复
28
FSL_TICS_ZJJ| | 2015-11-30 16:51 | 只看该作者
elephy 发表于 2015-11-27 17:25
中断服务函数要怎么写,有没有什么东西可以参考的么?

楼主你好!
现在和你讲讲如何添加中断服务函数:
1.使能接收中断
UART_BWR_C2_RIE(UART0, 1U);
2.添加中断服务函数
static volatile unsigned char c;
void UART0_RX_TX_IRQHandler(void)
{
  //  UART_DRV_IRQHandler(0);
  if (UART0_S1&UART_S1_RDRF_MASK)
  {
    c = UART0_D;

  }
}
具体中断服务函数的名字,在startup_MK64F12.s中向量表中定义了。
比如,UART1就是UART1_RX_TX_IRQHandler
UART2就是UART2_RX_TX_IRQHandler
其他一样。
你把代码加进去之后,可以debug下,如果接收数据了,UART0_S1&UART_S1_RDRF_MASK 这个条件会成立。然后就是取数据,分析数据。

使用特权

评论回复
29
elephy|  楼主 | 2015-11-30 19:27 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-30 16:51
楼主你好!
现在和你讲讲如何添加中断服务函数:
1.使能接收中断

1)这个中断服务函数我应该放在哪里?
2)现在是说我把中断服务函数放到该放的地方,然后在hello_world.c里加上UART_BWR_C2_RIE(UART0, 1U);之后,UART0在取数据时就自动进中断了对么?

使用特权

评论回复
30
elephy|  楼主 | 2015-11-30 19:53 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-30 16:51
楼主你好!
现在和你讲讲如何添加中断服务函数:
1.使能接收中断

我把你写的这个中断服务函数替换了它原来fsl_uart_irq.c里面的,它原来里面就是你这里注释掉的那句,然后在hello_world.c里使能接收终端debug后报no definition for UART_BWR_C2_RIE

使用特权

评论回复
31
FSL_TICS_ZJJ| | 2015-12-1 10:37 | 只看该作者
elephy 发表于 2015-11-30 19:27
1)这个中断服务函数我应该放在哪里?
2)现在是说我把中断服务函数放到该放的地方,然后在hello_world.c ...

你把fsl_uart_irq.c直接去掉,然后把中断函数直接放到main程序中就行了。
在main中不会报UART_BWR_C2_RIE无定义,无定义主要是没有头文件定义导致的。

使用特权

评论回复
32
FSL_TICS_ZJJ| | 2015-12-1 10:38 | 只看该作者
elephy 发表于 2015-11-30 19:27
1)这个中断服务函数我应该放在哪里?
2)现在是说我把中断服务函数放到该放的地方,然后在hello_world.c ...

把中断函数放到main之前,然后在main中串口初始化之后使能接收中断,你在中断服务函数中加个断点,一旦接收到数据,就会进入中断服务函数。

使用特权

评论回复
33
elephy|  楼主 | 2015-12-1 13:50 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-12-1 10:38
把中断函数放到main之前,然后在main中串口初始化之后使能接收中断,你在中断服务函数中加个断点,一旦接 ...

我把本身的irq已经remove了,并且把你写的中断函数放到main函数之前,都没问题,然后这个使能不管放在哪里都会报这样一个错,是为什么?

111.png (67.41 KB )

111.png

使用特权

评论回复
34
FSL_TICS_ZJJ| | 2015-12-1 14:34 | 只看该作者
elephy 发表于 2015-12-1 13:50
我把本身的irq已经remove了,并且把你写的中断函数放到main函数之前,都没问题,然后这个使能不管放在哪 ...

不好意思,
UART_BWR_C2_RIE(UART0, 1U);
这句我是用的KSDK1.3.0里面的一个头文件了。
你这样吧,直接寄存器控制:
比如UART0,就是: UART0_C2|=UART_C2_RIE_MASK;
其他UART直接修改符号就行了。

使用特权

评论回复
35
elephy|  楼主 | 2015-12-1 14:38 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-12-1 14:34
不好意思,
UART_BWR_C2_RIE(UART0, 1U);
这句我是用的KSDK1.3.0里面的一个头文件了。

好的,但是有一个问题,把系统本身的irq删了之后,在debug时send函数被卡住了,好像跟那个被删的有关系,这该怎么办?

使用特权

评论回复
36
FSL_TICS_ZJJ| | 2015-12-1 14:59 | 只看该作者
elephy 发表于 2015-12-1 14:38
好的,但是有一个问题,把系统本身的irq删了之后,在debug时send函数被卡住了,好像跟那个被删的有关系, ...

是有些关系,你把那个irq源文件不要删除,然后把里面的void UART0_RX_TX_IRQHandler(void)函数定义给屏蔽掉。
我就是这样做的,irq源文件没有删掉。

使用特权

评论回复
37
elephy|  楼主 | 2015-12-1 15:07 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-12-1 14:59
是有些关系,你把那个irq源文件不要删除,然后把里面的void UART0_RX_TX_IRQHandler(void)函数定义给屏蔽 ...

可是 在send时还是会跳到你定义的void UART0_RX_TX_IRQHandler(void)中,然后无限循环出不来了,而且我有个疑问,
if (UART0_S1&UART_S1_RDRF_MASK)
  {
    c = UART0_D;

  }
这一句话的意义是什么?

使用特权

评论回复
38
elephy|  楼主 | 2015-12-2 11:10 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-12-1 14:59
是有些关系,你把那个irq源文件不要删除,然后把里面的void UART0_RX_TX_IRQHandler(void)函数定义给屏蔽 ...

请问这个问题还有什么解决的方法么?

使用特权

评论回复
39
FSL_TICS_ZJJ| | 2015-12-4 10:49 | 只看该作者
elephy 发表于 2015-12-1 15:07
可是 在send时还是会跳到你定义的void UART0_RX_TX_IRQHandler(void)中,然后无限循环出不来了,而且我有 ...

不会无限循环的,是因为你发送的时候,也进入中断了,这个中断向量表是发送与接收统一的中断。
如果你要接收,只管判断接收标志就可以了。

使用特权

评论回复
40
FSL_TICS_ZJJ| | 2015-12-4 10:50 | 只看该作者
elephy 发表于 2015-12-1 15:07
可是 在send时还是会跳到你定义的void UART0_RX_TX_IRQHandler(void)中,然后无限循环出不来了,而且我有 ...

这句代码就是判断是否接收到数据,接收到数据,把数据取出来。
你可以配合参考手册中的寄存器看下就知道了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则