|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2013-5-20 16:19:11
|
显示全部楼层
why800 发表于 2013-5-18 19:29 ![](static/image/common/back.gif)
+1
楼主按这位仁兄的方法改吧。很好用,就是还要注意开串口发送完成中断前,要清除这个中断。否则还是丢 ...
感谢楼上提供的资料,现在已经测试通过了,现在把测试通过的中断函数部分代码贴出来,我用的是串口3,写的不好的地方欢迎大家拍砖
/*******************************************************************************
**函数名称:void USART3_IRQHandler(void)
**函数功能:串口3发送中断
**输入参数:无
**返回值: 无
*******************************************************************************/
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_TC) != RESET) //串口发送中断
{
USART_ITConfig(USART3, USART_IT_TC, DISABLE); //禁止发送中断
/* Clear USART3 TC pending bit */
USART_ClearFlag(USART3, USART_FLAG_TC);
//USART_ClearITPendingBit(USART3, USART_IT_TC); //清除发送中断标志位
SP485_RXD_ENABLE; //当发送完成后,控制485接收使能
/*
* 当启动DMA发送结束,将g_ucDmaSendUsart3_Flag置为使能,表明可以再次启动数据发送
*/
g_ucDmaSendUsart3_Flag = DMA_SNED_ENANBLE_FLAG;
}
}
/**********************************************************************************
**函数名称:void DMA1_Channel2_IRQHandler(void)
**函数功能:串口3 DMA方式发送中断
**输入参数:无
**返回参数:无
**函数调用:中断函数
**********************************************************************************/
void DMA1_Channel2_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC2) != RESET) //DMA通道2传输完成,即发送数据完毕
{
DMA_ClearFlag(DMA1_FLAG_TC2); //清除标志位
DMA_Cmd(DMA1_Channel2,DISABLE); //关闭DMA
/*
* 当启动DMA发送结束,将g_ucDmaSendUsart3_Flag置为使能,表明可以再次启动数据发送
*/
//g_ucDmaSendUsart3_Flag = DMA_SNED_ENANBLE_FLAG;
//Delay_ms(2); //延时2MS,确保数据完全发送.
//SP485_RXD_ENABLE; //当发送完成后,控制485接收使能
USART_ClearFlag(USART3, USART_FLAG_TC); //这个地方需要特别注意,STM32官方给出的例子中没有这一句,不加的话容易造成数据丢失
//USART_ClearITPendingBit(USART3, USART_IT_TC); //清除发送中断标志位
USART_ITConfig(USART3, USART_IT_TC, ENABLE); //使能发送中断
}
DMA_ClearITPendingBit(DMA1_IT_TC2); //清除DMA通道2传输完成标志位
}
|
|