OpenEdv-开源电子网

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

关于USART_ClearFlag的问题

[复制链接]

16

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-8-25
在线时间
22 小时
发表于 2016-8-30 14:48:37 | 显示全部楼层 |阅读模式
我今天看程序,对于USART_ClearFlag()库函数有点疑问。
按照程序中的意思,这个函数可以清楚标志位USART_FLAG_TXE,但是手册中写的是TXE只能硬件置位与清楚,也就是不能软件操作。这个到底是什么意思呢?请懂的大神回答,谢谢
捕获.PNG
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-8-25
在线时间
22 小时
 楼主| 发表于 2016-8-30 14:50:40 | 显示全部楼层
这个函数就是对SR寄存器操作的啊
回复 支持 反对

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-8-30 15:23:35 | 显示全部楼层
本帖最后由 kingnike 于 2016-8-30 15:34 编辑

硬件清除TXE的前提是往DR寄存器写新的数据。如果没有写,那不得你自己清啊
活到老,学到老。
回复 支持 反对

使用道具 举报

16

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-8-25
在线时间
22 小时
 楼主| 发表于 2016-8-30 15:43:34 | 显示全部楼层
"清零TXE位总是通过对数据寄存器的写操作完成的",也就是说,不能通过软件对TXE清零,不是么?
回复 支持 反对

使用道具 举报

16

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-8-25
在线时间
22 小时
 楼主| 发表于 2016-8-30 15:44:07 | 显示全部楼层
kingnike 发表于 2016-8-30 15:23
硬件清除TXE的前提是往DR寄存器写新的数据。如果没有写,那不得你自己清啊


"清零TXE位总是通过对数据寄存器的写操作完成的",也就是说,不能通过软件对TXE清零,不是么?
回复 支持 反对

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-8-30 16:18:01 | 显示全部楼层
本帖最后由 kingnike 于 2016-8-30 16:19 编辑
宁柠檬 发表于 2016-8-30 15:44
"清零TXE位总是通过对数据寄存器的写操作完成的",也就是说,不能通过软件对TXE清零,不是么?

我又去翻了一下库函数,你这个函数在哪儿看的。IS_USART_FLAG()这个宏只在getFlag函数中调用,clearFlag函数中调用的是IS_USART_CLEAR_FLAG()。我把我这边的clearFlag函数贴出来你瞧瞧。

[mw_shl_code=applescript,true]/**
  * @brief  Clears the USARTx's pending flags.
  * @param  USARTx: Select the USART or the UART peripheral.
  *   This parameter can be one of the following values:
  *   USART1, USART2, USART3, UART4 or UART5.
  * @param  USART_FLAG: specifies the flag to clear.
  *   This parameter can be any combination of the following values:
  *     @arg USART_FLAG_CTS:  CTS Change flag (not available for UART4 and UART5).
  *     @arg USART_FLAG_LBD:  LIN Break detection flag.
  *     @arg USART_FLAG_TC:   Transmission Complete flag.
  *     @arg USART_FLAG_RXNE: Receive data register not empty flag.
  *   
  * @note
  *   - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun
  *     error) and IDLE (Idle line detected) flags are cleared by software
  *     sequence: a read operation to USART_SR register (USART_GetFlagStatus())
  *     followed by a read operation to USART_DR register (USART_ReceiveData()).
  *   - RXNE flag can be also cleared by a read to the USART_DR register
  *     (USART_ReceiveData()).
  *   - TC flag can be also cleared by software sequence: a read operation to
  *     USART_SR register (USART_GetFlagStatus()) followed by a write operation
  *     to USART_DR register (USART_SendData()).
  *   - TXE flag is cleared only by a write to the USART_DR register
  *     (USART_SendData()).
  * @retval None
  */
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_CLEAR_FLAG(USART_FLAG));
  /* The CTS flag is not available for UART4 and UART5 */
  if ((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS)
  {
    assert_param(IS_USART_123_PERIPH(USARTx));
  }
   
  USARTx->SR = (uint16_t)~USART_FLAG;
}[/mw_shl_code]
活到老,学到老。
回复 支持 反对

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-8-30 16:20:03 | 显示全部楼层
另外你看下这个函数头部的注释说明,形参里面根本没有TXE好吗
活到老,学到老。
回复 支持 反对

使用道具 举报

16

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-8-25
在线时间
22 小时
 楼主| 发表于 2016-8-30 16:23:53 | 显示全部楼层
E:\
回复 支持 反对

使用道具 举报

16

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-8-25
在线时间
22 小时
 楼主| 发表于 2016-8-30 16:24:35 | 显示全部楼层
kingnike 发表于 2016-8-30 16:18
我又去翻了一下库函数,你这个函数在哪儿看的。IS_USART_FLAG()这个宏只在getFlag函数中调用,clearFlag ...

就是这个啊
捕获.PNG
回复 支持 反对

使用道具 举报

16

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-8-25
在线时间
22 小时
 楼主| 发表于 2016-8-30 16:28:40 | 显示全部楼层
本帖最后由 宁柠檬 于 2016-8-30 16:32 编辑
kingnike 发表于 2016-8-30 16:20
另外你看下这个函数头部的注释说明,形参里面根本没有TXE好吗

这个这个
1.PNG
回复 支持 反对

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-8-30 17:01:33 | 显示全部楼层
照库函数的说明,你这个代码根本就不对,虽然能编译通过。
USART_ClearFlag(USART1,USART_FLAG_TXE);这句话没有意义,形参非法。
我想问下,你这代码是自己写的还是第三方的还是开发板上的?请看一下官方ST的库函数。
另外能把USART_ClearFlag这个函数代码完整的贴上来吗????
活到老,学到老。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 05:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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