论坛元老
 
- 积分
- 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的先后顺序和作用范围搞反了,我以为是中断在先,实际上中断在后的
|
|