OpenEdv-开源电子网

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

[求助]关于清除串口 USARTx->SR 寄存器标志位的疑惑

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-6-13
在线时间
2 小时
发表于 2016-6-13 17:26:13 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 惨绿青年 于 2016-6-13 17:37 编辑

小弟这几天开始学习stm32,在阅读 USART 清除标志位的代码的时候无法理解为什么清除标志位的代码是

USARTx->SR = (uint16_t)~USART_FLAG;

比如我想要清除TXE标志位,那代码不就变成了

#define USART_FLAG_TXE     ((uint16_t)0x0080)
USARTx->SR = (uint16_t)~USART_FLAG_TXE;

这样TXE位确实是清零了,可是其它位的状态不就都被置1了吗?
我觉得增加一个按位与运算符比较合适:

USARTx->SR &= (uint16_t)~USART_FLAG_TXE;

请问是我哪里理解错了吗?

在此先谢谢各位。我尝试过搜索但并没有搜到相同的问题,所以只有来向各位请教了!

*************************************************************************************
此处附上 stm32f10x_usart.c 中 USART_ClearFlag 的代码及注释

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;
}

/**
  * @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
  */

最佳答案

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

是这样,很多标记位,只能硬件置一,软件写一是没有效果的,但是可以软件写0清楚
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-13 17:26:14 | 显示全部楼层
惨绿青年 发表于 2016-6-13 17:48
我好像自己把问题解决了,不知道对否,请各位看看:

经过查阅手册,发现USART_SR寄存器如图:

是这样,很多标记位,只能硬件置一,软件写一是没有效果的,但是可以软件写0清楚
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-6-13
在线时间
2 小时
 楼主| 发表于 2016-6-13 17:48:39 | 显示全部楼层
我好像自己把问题解决了,不知道对否,请各位看看:

经过查阅手册,发现USART_SR寄存器如图:

当中仅有9、8、6、5位可写,并且只能写0,因此置零某一位时只要将某位赋值为0,其它位赋值为1并不会影响其它位原本的状态。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-6-13
在线时间
2 小时
 楼主| 发表于 2016-6-14 17:31:28 | 显示全部楼层
憨厚诚实大叔 发表于 2016-6-13 18:14
是这样,很多标记位,只能硬件置一,软件写一是没有效果的,但是可以软件写0清楚

多谢指教!我也自己实验过了,确实只能写0,写1无效。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 18:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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