4891|18

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MSP430F1系列单片机,串口中断问题 [复制链接]

MSP430F149单片机,中断发送函数
   
    我理解的发送过程是这样的,大家先看下这样理解对不对?:首先,代码设置中断标志,UTXIFG1 = 1,程序进入发送中断函数发送一个字节,发送完毕后,MCU自动复位UTXIFG1 = 0, 然后退出中断函数。
    也就是说,设置一次UTXIFG1,只能发送一个字节的数据,发送完毕后,UTXIFG1被复位,没办法再次触发发送中断。想要让MCU发送一串数据帧,就必须不停的设置UTXIFG1 = 1。
    如果上面的理解正确的话,那么我想要一直发送数据,但只想设置一次UTXIFG1 = 1.直到我在中断函数中设置了UTXIFG1 = 0,才不再次进入中断函数进行发送。
    两个问题:1,我的理解正不正确?
              2,如果正确,我怎么才能达到设置一次UTXIFG1就能连续发送?
    在线等,谢谢了。

最新回复

假设波特率是10000,传送一个数据1个起始位1个停止位,8个数据位,外加其他一些可能的比如奇偶校验或者空闲为之类的,就算传送一个字节需要10位吧。这样在1W的波特率下传送完一个字节也要1MS,即便是10W的波特也是100us才能发完一个字节,也就是两次字节到达的时间在10W的波特率下的间隔也要100us,对于8Mhz下的430,如果你的ISR100us还没执行完一段中断的话,那只能说明你的ISR有问题。所以,一般情况下,你说的在执行中断的时候又发生接受中断的情况是不可能发生的。  详情 回复 发表于 2010-1-12 08:01
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
一般的发送中断过程是这样的:发送缓冲区为空是,发生发送中断事件。预先填充一个发送缓冲区,然后打开发送中断,在发送中断中判断发送的长度,当发送长度等于缓冲区中数据长度时,关闭发送中断。
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的理解第一段正确,第二段错误
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
设置中断标志后进入中断,然而你在中断里又有发送数据这个再次出发中断标志的操作,所以中断会被出发两次,虽然推出中断后会硬件会取消中断标志,但是因为你在第一次设置中断标志后未清除的时候又来一次中断,CPU会记住这次中断然后再你推出后马上再次进入中断,就这样又是进入了不停反复中断里自我再次产生中断的情况。
所以你在中断外设置一次会连续发送下去。
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

5
 
你理解的不对
发送中断应该是发送完成之后 才能进入发送中断的,接收也是这样,接受完了 就进入接收中断,去读取缓冲区中的数据

中断标志不用设定,那个是硬件设定的,你不用管的


一直发送数据的话,就在发送中断服务程序中,就往发送数据寄存器中写数据就可以了

楼主,一般发送不用中断的,接收用中断 呵呵
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
串口(UART或者USART),一般都是直接发送,只有接受采用中断或者轮询(就是查询)的处理方式。

所以楼主想实现一直发送,就只需要在初始化430的USART后(IO配置和波特率配置),然后就可以一直发送你所想发送的数据,此时430会自己处理其他工作。

另外接受时,一般只有接受到数据,才会触发中断,进入中断处理函数,首先清除中断标志位,然后把对应的数据寄存器里的数据读出来,此时缓冲区为空,就可以退出中断,等到下一次又接受到数据,便会再次进入中断处理函数,进行相应的处理。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 3 楼 qwe5628197 的回复:
设置中断标志后进入中断,然而你在中断里又有发送数据这个再次出发中断标志的操作,所以中断会被出发两次,虽然推出中断后会硬件会取消中断标志,但是因为你在第一次设置中断标志后未清除的时候又来一次中断,CPU会记住这次中断然后再你推出后马上再次进入中断,就这样又是进入了不停反复中断里自我再次产生中断的情况。
所以你在中断外设置一次会连续发送下去。

  感觉就是你说的那样。还有一个问题。
  中断接收呢?我的理解是:接收缓存接收到数据,MCU触发中断,在中断函数里,把缓存里的数据读取后,MCU消除中断标志。
   我的理解对不对?如果对的话,我就有个疑问了,如果我在中断函数里,第一句代码就是读取缓存里的值,在这个时候,接收的中断标志会立刻被MCU复位吧?那么复位之后,如果又有信息发过来,接收中断标志又要被置位吧?而这个时候我可能还在接收中断函数里处理上一个接收到的数据。
  那么接收中断就会这样一直被触发下去吗?直到发送方没有数据发过来?MCU最大的记录中断次数是多少?有没有办法解决这样的情况?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 5 楼 kyzf 的回复:
串口(UART或者USART),一般都是直接发送,只有接受采用中断或者轮询(就是查询)的处理方式。

所以楼主想实现一直发送,就只需要在初始化430的USART后(IO配置和波特率配置),然后就可以一直发送你所想发送的数据,此时430会自己处理其他工作。

另外接受时,一般只有接受到数据,才会触发中断,进入中断处理函数,首先清除中断标志位,然后把对应的数据寄存器里的数据读出来,此时缓冲区为空,就可以退出中断,等到下一次又接受到数据,便会再次进入中断处理函数,进行相应的处理。


进入中断处理函数,首先清除中断标志位?
为什么呢?430不是在退出中断函数前自动清除中断标志位吗?
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
楼主可以好好这篇文章,另外去书店或图书馆弄本430单片机的书看看,就会弄得很明白啦。

MSP430单片机串行通讯模块

串行异步通讯模块
   在MSP430系列产品中,每一款型号都能实现串行通讯的功能,在MSP430F1X11系列中,可以用定时器A和软件编程结合实现串行通讯功能。而在其它系列产品中都带有硬件的串行通讯模块USART;另外,MSP430F14X系列产品中还带了两个串行通讯模块。而在MSP430F15X,F16X系列中USART0还可以实现IIC总线通讯。在UART模块中带有UART串行异步通讯和SPI同步通讯硬件资源。


   图是USART模块结构图,从下图可以看出USART模块分别由波特率部分:波特率发生器,串行通讯接收/发送控制寄存器。
接收部分,发送部分,端口IO部分。
   
  串行异步通讯的特点:
    1-异步通讯模式,包括线路空闲/地址位通信协议。
    2-有两个单独的移位寄存器,输入/输出移位寄存器(如下图)。
    3-传输7位或8位数据,可采用奇偶或无校验。
    4-可编程实现波特率调整。
    5-分别发,收单独中断。
    6-有效地检测到起始位实现从低功耗唤醒。
    7-状态标志检测错误或者地址位。

   串行同步通讯(SPI)的特点:  
    1-动持3线/4线的SPI通讯。
    2-支持主机模式与从机模式。
    3-收发有单独的缓冲器,移位寄存器。
    4-收发有单独的中断。
    5-时钟极性和相位可编程。
    6-主机模式的时钟频率可编程。
    7-7位/8位字符长度。

有关USART的详细应有原理,建议初学者参考清华大学出版社的<>。

串行异步通讯应用例程
//*******************************************
//MSP430F149串口行实验程序
//P3.4为发送,P3.5为接收
//晶体使32768HZ.
//程序描述:利用串口调试软件;向串口发送一个字符,MSP430单片机接收到后从低功耗中唤醒.并将收接缓冲区的字符再发送到//电脑上的调试软件中.单片机发送完后又进入低功耗状态.
//*******************************************

#include

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停止WDT

UCTL0 = CHAR;             // 设串口控制寄存器,设为8位字符格式

UTCTL0 = SSEL0;           // 设串口控制寄存器所使用的时钟,选择UCLK = ACLK

UBR00 = 0x0D;             // 波特率设置32k/2400 - 13.65
UBR10 = 0x00;            

UMCTL0 = 0x6D;            // 波特率调整器设置

ME1 |= UTXE0 + URXE0;     // 模块允许寄存器设置,使能USART0 TXD/RXD

IE1 |= URXIE0;            // 中断允许寄存器设置,接收中断允许

P3SEL |= 0x30;            // 将P3.4,5使用外围模块 = USART0 TXD/RXD
P3DIR |= 0x10;            // 将P3.4设为输出(发),P3.5默认为输入(收)

_EINT();                  // 全局中断使能

// Mainloop
for (;;)
{
LPM3;                           // 进入LPM3模式,等待字符接收.

while ((IFG1 & UTXIFG0) == 0);  // USART0发送UTXIFG0=1,表示UTXBUF准备好发送一下字符

TXBUF0 = RXBUF0;                // 将收到缓冲区字符送发送区
}
}

//串口接收中断,退出LPM3模式.
#pragma vector=USART0RX_VECTOR
__interrupt void usart0_rx (void)
{
  LPM3_EXIT;
}

//*****************************************
//例程结束
 
 
 

回复

3

帖子

0

TA的资源

禁止访问

10
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 7 楼 kongfo1019 的回复:
引用 5 楼 kyzf 的回复:
串口(UART或者USART),一般都是直接发送,只有接受采用中断或者轮询(就是查询)的处理方式。

所以楼主想实现一直发送,就只需要在初始化430的USART后(IO配置和波特率配置),然后就可以一直发送你所想发送的数据,此时430会自己处理其他工作。

另外接受时,一般只有接受到数据,才会触发中断,进入中断处理函数,首先清除中断标志位,然后把对应的数据寄存器里的数据读出来,此时缓冲区为空,就可以退出中断,等到下一次又接受到数据,便会再次进入中断处理函数,进行相应的处理。


进入中断处理函数,首先清除中断标志位?
为什么呢?430不是在退出中断函数前自动清除中断标志位吗?


一般的单片机是进入中断后,首先清除中断标志位,当然有些MCU是最后清除,只要在退出中断处理函数前清除就OK; 这样做是避免反复被中断、
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
  还有一个问题。
  中断接收。我的理解是:接收缓存接收到数据,MCU触发中断,在中断函数里,把缓存里的数据读取后,MCU消除中断标志。
  我的理解对不对?如果对的话,我就有个疑问了,如果我在中断函数里,第一句代码就是读取缓存里的值,在这个时候,接收的中断标志会立刻被MCU复位吧?那么复位之后,如果又有信息发过来,接收中断标志又要被置位吧?而这个时候我可能还在接收中断函数里处理上一个接收到的数据。
  那么接收中断就会这样一直被触发下去吗?直到发送方没有数据发过来?MCU最大的记录中断次数是多少?有没有办法解决这样的情况
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

13
 
引用 6 楼 kongfo1019 的回复:
引用 3 楼 qwe5628197 的回复:
设置中断标志后进入中断,然而你在中断里又有发送数据这个再次出发中断标志的操作,所以中断会被出发两次,虽然推出中断后会硬件会取消中断标志,但是因为你在第一次设置中断标志后未清除的时候又来一次中断,CPU会记住这次中断然后再你推出后马上再次进入中断,就这样又是进入了不停反复中断里自我再次产生中断的情况。
所以你在中断外设置一次会连续发送下去。

? 感觉就是你说的那样。还有一个问题。
? 中断接收呢?我的理解是:接收缓存接收到数据,MCU触发中断,在中断函数里,把缓存里的数据读取后,MCU消除中断标志。
? 我的理解对不对?如果对的话,我就有个疑问了,如果我在中断函数里,第一句代码就是读取缓存里的值,在这个时候,接收的中断标志会立刻被MCU复位吧?那么复位之后,如果又有信息发过来,接收中断标志又要被置位吧?而这个时候我可能还在接收中断函数里处理上一个接收到的数据。
? 那么接收中断就会这样一直被触发下去吗?直到发送方没有数据发过来?MCU最大的记录中断次数是多少?有没有办法解决这样的情况?

接受中断标志在推出ISR后由MCU复位,如果像你说的是在读取后就复位的话会引起中断程序的自我嵌套,在硬件上这是不可能发生的。MCU最大记录中断次数是多少这个没有意思,因为正常应用的情况下你不应该让单片机产生这种情况,解决的办法就是使中断程序尽可能的占用CPU时间短,或者降低波特率或者提高CPU频率或者发送方两次数据发送间隔不要太短。总之通讯的两方在频率匹配上应当合适,这个要看实际应用
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
头有点晕,可能有些地方说错了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 13 楼 qwe5628197 的回复:
头有点晕,可能有些地方说错了。

朋友这你句话才让我头晕
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 14 楼 kongfo1019 的回复:
引用 13 楼 qwe5628197 的回复:
头有点晕,可能有些地方说错了。

朋友这你句话才让我头晕

尽信书不如无书,别人说的未必都一定是对的,作为学习你用于参考最好,然后用自己的知识去评估别人的评价。
430进入中断后关闭全局总中断,退出后重开启,你可以在中断里EINT,然后CPU会立刻响应第二次的接受中断。但是数据多了堆栈会爆。
有什么疑问建议还是自己去试验。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 15 楼 qwe5628197 的回复:
引用 14 楼 kongfo1019 的回复:
引用 13 楼 qwe5628197 的回复:
头有点晕,可能有些地方说错了。

朋友这你句话才让我头晕

尽信书不如无书,别人说的未必都一定是对的,作为学习你用于参考最好,然后用自己的知识去评估别人的评价。
430进入中断后关闭全局总中断,退出后重开启,你可以在中断里EINT,然后CPU会立刻响应第二次的接受中断。但是数据多了堆栈会爆。
有什么疑问建议还是自己去试验。

谢谢
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

18
 
引用 15 楼 qwe5628197 的回复:
引用 14 楼 kongfo1019 的回复:
引用 13 楼 qwe5628197 的回复:
头有点晕,可能有些地方说错了。

朋友这你句话才让我头晕

尽信书不如无书,别人说的未必都一定是对的,作为学习你用于参考最好,然后用自己的知识去评估别人的评价。
430进入中断后关闭全局总中断,退出后重开启,你可以在中断里EINT,然后CPU会立刻响应第二次的接受中断。但是数据多了堆栈会爆。
有什么疑问建议还是自己去试验。


楼上说得好啊!
关键是针对问题,找到解决的思路,然后针对这些思路,去实践,这才是最好的解决故障的办法。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 16 楼 kongfo1019 的回复:
引用 15 楼 qwe5628197 的回复:
引用 14 楼 kongfo1019 的回复:
引用 13 楼 qwe5628197 的回复:
头有点晕,可能有些地方说错了。

朋友这你句话才让我头晕

尽信书不如无书,别人说的未必都一定是对的,作为学习你用于参考最好,然后用自己的知识去评估别人的评价。
430进入中断后关闭全局总中断,退出后重开启,你可以在中断里EINT,然后CPU会立刻响应第二次的接受中断。但是数据多了堆栈会爆。
有什么疑问建议还是自己去试验。

谢谢

假设波特率是10000,传送一个数据1个起始位1个停止位,8个数据位,外加其他一些可能的比如奇偶校验或者空闲为之类的,就算传送一个字节需要10位吧。这样在1W的波特率下传送完一个字节也要1MS,即便是10W的波特也是100us才能发完一个字节,也就是两次字节到达的时间在10W的波特率下的间隔也要100us,对于8Mhz下的430,如果你的ISR100us还没执行完一段中断的话,那只能说明你的ISR有问题。所以,一般情况下,你说的在执行中断的时候又发生接受中断的情况是不可能发生的。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表