STM32学习——中断方式下的发送数据

博客讲述了利用中断发送USART数据的经历。起初采用在主函数发送字符、中断代码精简的思路,出现问题,如不加延时变量无法自加、发送完成标志位不及时置位等。后参考他人方法,在中断里进行发送,利用USART_SendData()触发TC中断持续发送直至最后一字节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用中断接收数据较为简单,但利用中断去发送数据弄了半天才搞定。。。

注:在设置USART的控制寄存器的TE位时,会发送一个空闲帧,于是便会进入中断。

错误的做法

本来的思路是中断里的代码尽可能地少,发送字符放在主函数中,类似这样

while(1)
{
	USART_SendData(DEBUG_USARTx,Buf[j]);
	//Delay(0xfffff);
	if(j>=5)
		break;
}

然而。。。要是不加Delay延时j就无法在中断服务函数中自加,通过调试,发现调用USART_SendData(),发送完成标志位TC并不是马上置位,该函数只是将数据送入数据寄存器DR,并不代表发送完毕,所以就会乱套。。。而且加了Delay后还会在最后发送一个H,惊了。。。

改进方法

参考了别人的方法,在中断里进行发送
1.利用USART_SendData()触发TC中断,然后在中断中一直发送,直到最后一个字节

//发送函数
void uart_senddata(u8* ptr)
{
	ptrdata=ptr;
	
	USART_ClearFlag(USART1, USART_FLAG_TC);	//如果不加的话可能会丢失第一个字节
	
	USART_SendData(USART1, *(ptrdata++));	//触发TC中断
}

//中断服务函数中的部分代码
	if(USART_GetITStatus(DEBUG_USARTx,USART_IT_TC)!=RESET)
	{
		if((*ptrdata)=='\0')
			USART_ClearFlag(USART1, USART_FLAG_TC);
		else
		{
			USART_SendData(DEBUG_USARTx,*ptrdata++);
		}
	}

参考的那些博客不太看得懂,调试的结果也比较神奇。。。暂且先这样吧,能用就行。。。

Reference:https://blog.youkuaiyun.com/kevinhg/article/details/40085971

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值