12
返回列表 发新帖
楼主: cuimeng1987

[已解决] K60 串口中断问题(已解决)

[复制链接]

该用户从未签到

35

主题

508

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2167
最后登录
1970-1-1
发表于 2013-3-21 15:49:27 | 显示全部楼层

RE:K60 串口中断问题(正解)

在UART中断服务程序中需要清掉UART Status Register 1 (UARTx_S1) [RDRF] bit。否则会再次进入UART中断服务程序。清除UARTx_S1 [RDRF]位的办法:读取S1寄存器的值,再读出UARTx_D寄存器的数值。
例程如下:
/* Read and save the S1 value */
status = UART_S1_REG(channel);

/* Check to see if the rx full flag is set */
if (status & UART_S1_RDRF_MASK)
{
/* Read data register to clear the flag */
temp = UART_D_REG(channel);
}
祝顺利。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

178

帖子

0

高级会员

Rank: 4

积分
825
最后登录
1970-1-1
发表于 2013-3-26 21:05:58 | 显示全部楼层

RE:K60 串口中断问题(正解)

可以用DMA传输,缓存定义两个或多个,长度为字符串最大长度,这样在运行中就会发生DMA done的中断即收到的字符串为最大长度的情况,或者发生UART的idle中断,即收到的字符串小于最大长度的情况,不管发生哪个中断,在中断里进行DMA缓存的切换,把收到数据的缓存放入消息队列,并通知上层应用处理。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

13

帖子

0

新手上路

Rank: 1

积分
30
最后登录
1970-1-1
 楼主| 发表于 2013-5-29 22:48:00 | 显示全部楼层

回复:K60 串口中断问题(已解决)

回复第 12 楼 于2013-03-26 21:05:58发表:
可以用DMA传输,缓存定义两个或多个,长度为字符串最大长度,这样在运行中就会发生DMA done的中断即收到的字符串为最大长度的情况,或者发生UART的idle中断,即收到的字符串小于最大长度的情况,不管发生哪个中断,在中断里进行DMA缓存的切换,把收到数据的缓存放入消息队列,并通知上层应用处理。
 
请问有没有DMA的使用的实例呢?有参考容易理解
 
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

47

帖子

0

注册会员

Rank: 2

积分
144
最后登录
1970-1-1
发表于 2013-10-9 19:46:09 | 显示全部楼层

回复:K60 串口中断问题(已解决)

回复第 11 楼 于2013-03-21 15:49:27发表:
在UART中断服务程序中需要清掉UART Status Register 1 (UARTx_S1) [RDRF] bit。否则会再次进入UART中断服务程序。清除UARTx_S1 [RDRF]位的办法:读取S1寄存器的值,再读出UARTx_D寄存器的数值。
例程如下:
/* Read and save the S1 value */
status = UART_S1_REG(channel);

/* Check to see if the rx full flag is set */
if (status & UART_S1_RDRF_MASK)
{
/* Read data register to clear the flag */
temp = UART_D_REG(channel);
}
祝顺利。
 

请问如何清Uart发送中断?
按手册应该是:先读取S1寄存器的值,再往UARTx_D寄存器写数值。
这样的话,就会又发一个字节出去,我的本意是发送最后一个字节后,就发送结束了,这时应该把中断清掉,不然会反复进中断。
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2013-10-11 15:00:08 | 显示全部楼层

回复:K60 串口中断问题(已解决)

回复第 14 楼 于2013-10-09 19:46:09发表:
回复第 11 楼 于2013-03-21 15:49:27发表:
在UART中断服务程序中需要清掉UART Status Register 1 (UARTx_S1) [RDRF] bit。否则会再次进入UART中断服务程序。清除UARTx_S1 [RDRF]位的办法:读取S1寄存器的值,再读出UARTx_D寄存器的数值。
例程如下:
/* Read and save the S1 value */
status = UART_S1_REG(channel);

/* Check to see if the rx full flag is set */
if (status & UART_S1_RDRF_MASK)
{
/* Read data register to clear the flag */
temp = UART_D_REG(channel);
}
祝顺利。
 

请问如何清Uart发送中断?
按手册应该是:先读取S1寄存器的值,再往UARTx_D寄存器写数值。
这样的话,就会又发一个字节出去,我的本意是发送最后一个字节后,就发送结束了,这时应该把中断清掉,不然会反复进中断。
你可以在往UARTx_D寄存器写数值之前,把C2[TE]清零看看!!
 
 
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-20 05:05 , Processed in 0.090486 second(s), 24 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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