2236|3

47

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

串口空闲中断不能清理问题-已解决 [复制链接]

USART_ClearITPendingBit( UART4, USART_IT_IDLE);

这个用法是错误的! 

 

/**
  * [url=home.php?mod=space&uid=159083]@brief[/url] Clears the USARTx's interrupt pending bits.
  * @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_IT: specifies the interrupt pending bit to clear.
  *   This parameter can be one of the following values:
  *     [url=home.php?mod=space&uid=1238002]@arg[/url] USART_IT_CTS:  CTS change interrupt (not available for UART4 and UART5)
  *     @arg USART_IT_LBD:  LIN Break detection interrupt
  *     @arg USART_IT_TC:   Transmission complete interrupt. 
  *     @arg USART_IT_RXNE: Receive Data register not empty interrupt.
  *   
  * @note
  *   - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun 
  *     error) and IDLE (Idle line detected) pending bits are cleared by 
  *     software sequence: a read operation to USART_SR register 
  *     (USART_GetITStatus()) followed by a read operation to USART_DR register 
  *     (USART_ReceiveData()).
  *   - RXNE pending bit can be also cleared by a read to the USART_DR register 
  *     (USART_ReceiveData()).
  *   - TC pending bit can be also cleared by software sequence: a read 
  *     operation to USART_SR register (USART_GetITStatus()) followed by a write 
  *     operation to USART_DR register (USART_SendData()).
  *   - TXE pending bit is cleared only by a write to the USART_DR register 
  *     (USART_SendData()).
  * @retval None
  */
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT)

从一下的库函数注释来开,这个函数可供清除的中断源 只有

 USART_IT_CTS:  CTS change interrupt (not available for UART4 and UART5)
 USART_IT_LBD:  LIN Break detection interrupt
 USART_IT_TC:   Transmission complete interrupt. 
 USART_IT_RXNE: Receive Data register not empty interrupt.

 

而清除PE、FE、NE、ORE、IDLE需要读取 SR 与 DR寄存器

 

以下为正确的串口中断处理

void UART4_IRQHandler(void)
{
	u8 res;
	if(USART_GetITStatus(UART4,USART_IT_RXNE)) 
	{		
		res = USART_ReceiveData(UART4);
		uart4Buff[uart4rs++] = res;
		if(uart4rs >= sizeof(uart4Buff))
			uart4rs = 0;
	}
	else if(USART_GetITStatus(UART4, USART_IT_IDLE))
	{
		res = UART4->SR;
		res = UART4->DR;
	}
}

积累错误...

 

此帖出自stm32/stm8论坛

最新回复

谢谢分享。   详情 回复 发表于 2021-6-25 11:42

赞赏

1

查看全部赞赏

点赞(1) 关注
 

回复
举报

1942

帖子

3

TA的资源

版主

沙发
 

感谢分享经验!

此帖出自stm32/stm8论坛
 
 

回复

2万

帖子

74

TA的资源

管理员

板凳
 

谢谢分享。

此帖出自stm32/stm8论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

4
 

谢谢分享。

此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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