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

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

[复制链接]

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2013-10-10 17:43:44 | 显示全部楼层

回复:K60 串口发送中断的问题

回复第 6 楼 于2013-10-10 15:58:26发表:
回复第 5 楼 于2013-10-10 14:57:47发表:
回复第 4 楼 于2013-10-10 14:51:41发表:
回复第 2 楼 于2013-10-10 13:54:27发表:
 针对你的第一个问题,你可以在发送第十个字节数据后采用第二个方法清除TC标志。
第二个问题中提到设置完成后进入中断是自己手动修改TC值为1吗?但如下图所示,TC是不可写的.

 
 
 

1. 的确,我刚刚也是仔细看了一下手册,是要用第二种方法来清TC,但第二种方法(Queuing a preamble by clearing and then setting the C2[TE])我就是没有读懂,到底具体的操作是什么?能把语句写出来吗?
2.我的意思是我在初始化里面就开了发送完成中断(设置UART_C2),这个时候还没有往UART_D里面写数据,程序就直接跑到中断服务程序里面去了(TC实际已经被自动置1了)。这个现象正常吗?(我后来也详细研究了文档,发现的确是这样设计的。)
 
1.第二种方法的代码操作应该是先清零TE,跟着置位TE吧,You can have a try.
2.能告诉我文档中对没有往UART_D里面写数据,程序就直接跑到中断服务程序里的描述在那一页吗?
 
 

 

1. 我已经试过了,好像没用,清不掉TC。迫切希望正确答案!
2.. 在51.8.1里面,手册中提到“发送移位寄存器为空,TC就会指示1”。

 
Ok,第二种我这边也没试过,但是按照你最初的目的,你可以在发送完第十个数据后,清零TE就好啊,就像安建议的
上电设置后,进入中断,请问你有测试过吗?根据文档的叙述,好像要Transmit shift register 是清空的情况下吧,但是Transmit shift register是UART的内部结构啊,我在手册找到相应的寄存器啊!!
 
 
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

29

帖子

0

中级会员

Rank: 3Rank: 3

积分
217
最后登录
1970-1-1
发表于 2013-10-14 16:55:42 | 显示全部楼层

RE:K60 串口发送中断的问题

我的理解是这样的:根据手册中对TC的描述,只要transmitter是idle的状态,TC标志就会被置1,不管是刚上电还是transmit shift register为空的情况,它都会被置1,所以试图通过清中断的方式不让中断继续产生似乎是不可行的。
根据你描述的应用场景,我觉得可以这么设计:
(1)设计一个buffer(比如ring buffer,可以通过读和写指针的位置来判断buffer中是否有数据)用来存放你的数据帧。实现一个get_frame_data的函数用来从buffer中读取数据,如果读取不到数据就返回error;一个put_frame_data的函数用来向buffer中存放一个数据帧。
(2)实现一个1s的定时器,定时器中断用来实现每隔1秒钟向buffer中写一帧数据,并且在写完后调用一个串口的发送函数uart_tx_startup去发送数据,这个函数的功能就是打开TCIE。
(3)实现串口的TC中断处理函数,在其中调用get_frame_data去取数据并将其一字节一字节地送到UART上,直到返回error读取不到数据了,就将TCIE清零,关闭TC中断。
等到下一个定时器中断写好数据后就又开启TCIE发送下一帧数据了。如此循环往复即可。当然初始化是TCIE要清零禁止TC中断
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

47

帖子

0

注册会员

Rank: 2

积分
144
最后登录
1970-1-1
 楼主| 发表于 2013-10-14 20:18:44 | 显示全部楼层

回复:K60 串口发送中断的问题

回复第 12 楼 于2013-10-14 16:55:42发表:
我的理解是这样的:根据手册中对TC的描述,只要transmitter是idle的状态,TC标志就会被置1,不管是刚上电还是transmit shift register为空的情况,它都会被置1,所以试图通过清中断的方式不让中断继续产生似乎是不可行的。
根据你描述的应用场景,我觉得可以这么设计:
(1)设计一个buffer(比如ring buffer,可以通过读和写指针的位置来判断buffer中是否有数据)用来存放你的数据帧。实现一个get_frame_data的函数用来从buffer中读取数据,如果读取不到数据就返回error;一个put_frame_data的函数用来向buffer中存放一个数据帧。
(2)实现一个1s的定时器,定时器中断用来实现每隔1秒钟向buffer中写一帧数据,并且在写完后调用一个串口的发送函数uart_tx_startup去发送数据,这个函数的功能就是打开TCIE。
(3)实现串口的TC中断处理函数,在其中调用get_frame_data去取数据并将其一字节一字节地送到UART上,直到返回error读取不到数据了,就将TCIE清零,关闭TC中断。
等到下一个定时器中断写好数据后就又开启TCIE发送下一帧数据了。如此循环往复即可。当然初始化是TCIE要清零禁止TC中断
 
我最终实现的方法跟你的叙述基本一样,十分感谢!
 
其实我提这个问题重点不在最终如何解决,而是发现该ARM这里与其他处理器不同,不能用常规的清中断方式来阻止程序反复进中断。
 
 
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

29

帖子

0

中级会员

Rank: 3Rank: 3

积分
217
最后登录
1970-1-1
发表于 2013-10-16 07:45:30 | 显示全部楼层

RE:K60 串口发送中断的问题

不知道你说的可以通过清中断来阻止程序反复进中断的处理器是哪一类,我的印象中貌似好多处理器对串口中断的处理都和这个类似。比如标准的ns16550的中断,也是有一个UTHR empty的中断,如果发送寄存器为空就会进中断,清掉IIR中的相应标志位也不会阻止下一次中断。而且软件处理流程好像都和这个差不多,会从buffer中取数据,如果发现buffer为空,就会把UTHR empty中断禁止。下次发数据时再打开中断。好像不能通过清中断的方法来阻止这个中断的产生。
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

47

帖子

0

注册会员

Rank: 2

积分
144
最后登录
1970-1-1
 楼主| 发表于 2013-10-16 15:28:16 | 显示全部楼层

回复:K60 串口发送中断的问题

回复第 14 楼 于2013-10-16 07:45:30发表:
不知道你说的可以通过清中断来阻止程序反复进中断的处理器是哪一类,我的印象中貌似好多处理器对串口中断的处理都和这个类似。比如标准的ns16550的中断,也是有一个UTHR empty的中断,如果发送寄存器为空就会进中断,清掉IIR中的相应标志位也不会阻止下一次中断。而且软件处理流程好像都和这个差不多,会从buffer中取数据,如果发现buffer为空,就会把UTHR empty中断禁止。下次发数据时再打开中断。好像不能通过清中断的方法来阻止这个中断的产生。 

首先说一下我用的大多数都是TC这种中断(发送完成),发送寄存器为empty这种中断我用得比较少,以下是我用TC这种中断的情况。
TI的C2000,M3,STM8,STM32,atmel,dsPIC等等,都是进串口中断后,手工清掉发送完成中断标志或者是系统自清,然后不会反复再进中断,除非再完成一个新的字节发送才会进中断。而K60这种需要采用关中断的方式阻止反复进中断的模式,我还真是第一次碰到。大家可以把自己用过的处理器都拿出来说说。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

29

帖子

0

中级会员

Rank: 3Rank: 3

积分
217
最后登录
1970-1-1
发表于 2013-10-17 16:19:21 | 显示全部楼层

RE:K60 串口发送中断的问题

哦,明白了,那大概是咱们用的芯片不太一样的问题。我没太接触过您说的几类芯片,我用过的厂家不多,PowerPC的8548,8349,P1020...,e300和e500系列的芯片大多和ns16550兼容,所以用的也是发送寄存器空中断;ARM9,ARM11和cortexA系列的也都是芯片厂家提供的串口IP,不过大多也是ARM提供的PrimeCell的核,TXINT也是空中断,所以我就误以为大多数都是这样的设计了,多谢您的告知。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-19 20:16 , Processed in 0.091142 second(s), 25 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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