OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1867|回复: 4

串口通信实验

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2018-2-10
在线时间
2 小时
发表于 2018-2-17 11:21:14 | 显示全部楼层 |阅读模式
4金钱
求助——————请问各位
USART_GetITStatus ()函数获取的发送完成中断标志位
USART_IT_TC


和USART_ GetFlagStatus()获取的发送完成标志位
USART_FLAG_TC


有什么区别  ?前者可以代替后者使用吗?

最佳答案

查看完整内容[请看2#楼]

USART_FLAG_TC和USART_IT_TC应该是可以替换的,但是要考虑USART_IT_TC受USART_FLAG_TC驱动是不是有条件限制的(比如只有使能了中断,USART_IT_TC才会受USART_FLAG_TC驱动之类)。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-2-17 11:21:15 | 显示全部楼层
USART_FLAG_TC和USART_IT_TC应该是可以替换的,但是要考虑USART_IT_TC受USART_FLAG_TC驱动是不是有条件限制的(比如只有使能了中断,USART_IT_TC才会受USART_FLAG_TC驱动之类)。
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-2-17 13:34:16 | 显示全部楼层
我并不知道你说的 两个标志位有什么区别,但是 很明显,你需要使用寄存器方式来开发了,因为寄存器开发你可以查参考手册,非常容易就知道两个标志位什么作用。
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-2-17 15:53:49 | 显示全部楼层
我找了个串口项目,查找到了LZ说的两个标志的偏移如下:
#define USART_IT_TC                          ((uint16_t)0x0626)
#define USART_FLAG_TC                        ((uint16_t)0x0040)

很明显这两个标志的偏移对应不同的寄存器,作用应该也应该不一样的,除非有某个外设寄存器总容量为0x0626 - 0x0040,否则他们两个应该不会是同一个寄存器,既然ST认为需要设计两个寄存器,那么他们的作用就应该不一样。

找一下参考手册看下具体作用吧
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-2-17 16:28:24 | 显示全部楼层
本帖最后由 mack13013 于 2018-2-17 16:30 编辑

我又帮你查看了一下参考手册,
USART_ GetFlagStatus()获取USART_FLAG_TC标志状态,实际上是读取USART_SR的TC位,关于该位的解释如下:
[mw_shl_code=c,true]/*
位 6 TC:发送完成 (Transmission complete)
如果已完成对包含数据的帧的发送并且 TXE 置 1,则该位由硬件置 1。如果 USART_CR1 寄存
器中 TCIE = 1,则会生成中断。该位由软件序列清零(读取 USART_SR 寄存器,然后写入
USART_DR 寄存器)。TC 位也可以通过向该位写入‘0’来清零。建议仅在多缓冲区通信
时使用此清零序列。
0:传送未完成
1:传送已完成
*/[/mw_shl_code]

USART_GetITStatus()获取USART_IT_TC是获取中断标记,参考手册就不去查了,直接贴一段USART_GetITStatus()的注释
[mw_shl_code=c,true]/**
  * @brief  Checks whether the specified USART interrupt has occurred or not.
  * @param  USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or
  *         UART peripheral.
  * @param  USART_IT: specifies the USART interrupt source to check.
  *          This parameter can be one of the following values:
  *            @arg USART_IT_CTS:  CTS change interrupt (not available for UART4 and UART5)
  *            @arg USART_IT_LBD:  LIN Break detection interrupt
  *            @arg USART_IT_TXE:  Transmit Data Register empty interrupt
  *            @arg USART_IT_TC:   Transmission complete interrupt
  *            @arg USART_IT_RXNE: Receive Data register not empty interrupt
  *            @arg USART_IT_IDLE: Idle line detection interrupt
  *            @arg USART_IT_ORE_RX : OverRun Error interrupt if the RXNEIE bit is set
  *            @arg USART_IT_ORE_ER : OverRun Error interrupt if the EIE bit is set  
  *            @arg USART_IT_NE:   Noise Error interrupt
  *            @arg USART_IT_FE:   Framing Error interrupt
  *            @arg USART_IT_PE:   Parity Error interrupt
  * @retval The new state of USART_IT (SET or RESET).
  */[/mw_shl_code]




我大概知道LZ的意思了,你想用中断寄存器的完成标记位替换状态寄存器的完成标记位,对吗?
可以肯定的是,是可以做这样的替换的,甚至在外设上USART_FLAG_TC都有可能是由USART_IT_TC驱动的,
但是有很多问题,我没做过类似替换,所以要你自己去实验具体的问题,我能想到的问题大概有下面几个:
1、两个标志位读取权限和时效是不是一样的
2、有一些寄存器对其读取是有联带动作的(比如某些位读取一次后,该位的状态不再有效),LZ说的这两个标志位是不是有同样的问题
3、可靠性或者有效性,比如某些状态下(不一定是本例,只是借此说明可能出现的情况)USART_IT_TC有效了,但是驱动最后的流向并没有使USART_FLAG_TC有效,而是其他标志有效
...

可以肯定的是USART_IT_TC功能更多的,但是没有特殊需求的话,不建议替换。

补充:
呃,很抱歉,我好像把USART_FLAG_TC和USART_IT_TC的先后顺序和作用范围搞反了,我以为是中断在先,实际上中断在后的



回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 09:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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