本帖最后由 hpdell 于 2012-12-14 10:13 编辑
参考stm32f1xx的帖子修改而来,望多多指教
在此感谢感谢!!!11
http://www.amobbs.com/forum.php? ... C%E5%8F%91%E9%80%81
顺便请教下,我想用DMA发送一个字符或者多个字符时,调试没有成功,请大仙们指点指点一下!
此工程文件不含固件库,使用者需要自己增加固件库,固件库与本工程文件放同一目录就可以了,路径请自行修改!!
//USART1使用DMA接收数据中断服务程序, DMA接收完成中断
void DMA2_Stream5_IRQHandler(void)
{
/* Test on DMA Stream Transfer Complete interrupt */
if(DMA_GetITStatus(DMA2_Stream5, DMA_IT_TCIF5)) //此处是我增加,不然单片机会不停的发送数据给pc机
{
DMA_ClearITPendingBit(DMA2_Stream5,DMA_IT_TCIF5);
DMA_ClearITPendingBit(DMA2_Stream5,DMA_IT_TEIF5);
DMA_Cmd(DMA2_Stream5, DISABLE); //关闭DMA,防止处理其间有数据
DMA2_Stream5->NDTR = RECAVEMAXCOUNT; //重装填
DMA_Cmd(DMA2_Stream5, ENABLE); //处理完,重开DMA
}
}
//USART1使用DMA发数据中断服务程序
void DMA2_Stream7_IRQHandler(void)
{
if(DMA_GetITStatus(DMA2_Stream7, DMA_IT_TCIF7) != RESET)
{
DMA_ClearITPendingBit(DMA2_Stream7,DMA_IT_TCIF7);
DMA_ClearITPendingBit(DMA2_Stream7,DMA_IT_TEIF7);
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
DMA_Cmd(DMA2_Stream7, DISABLE); //关闭DMA
USART1_TxFinish = 1; //置DMA传输完成
}
}
工程文件:
V26-DMA2_Stream5.zip
(76.78 KB, 下载次数: 151)
2012-12-14 10:04 上传
点击文件名下载附件
你都不知道你接收的数据长度是多少,怎么用DMA完成中断?DMA是完成你设定数量的传输之后触发传输完成中断的。
用总线空闲中断+DMA,DMA缓冲区长度设置成大于最大接收数据长度,单片机接收完一帧数据后,总线恢复空闲状态,进入空闲中断,读DMA剩余传输数量可以获得接收数据的长度。这样接收到一帧数据,单片机只中断了一次,而且是实时响应的。
我看你的程序里面用的是DMA传输完成,你如何保证你的实时性?
接收数据长度未知确实是这样。谢谢。
需要补充下,因为我这用的RS485通讯,数据长度在通讯帧的前几个字节,因此可以看做都是已知的。
其实,我想知道的是,在知道待接收数据长度的情况下,使用空闲中断的优势。再次谢谢!
不好意思,俺其实是个路过打酱油的,楼主不知跑哪了。
对你的回答,再次表示感谢。
An Idle character is interpreted as an entire frame of “1”s followed by the start bit of the next
frame which contains data (The number of “1” ‘s will include the number of stop bits)。
在线路为全"1"(空闲)之后出现一个"start bit"才判定是IDLE;
这样的话 需要发送方 发送一个空闲帧 DAM才能起作用 ! 不知我的理解是否有问题?
不是的,你理解错了
一帧数据发送完成之后,发送端Tx返回空闲状态,也就是高电平
STM32会检测这个高电平的时间,超过一定时间就认为是总线空闲
发送端不需要额外的处理,只要保证两帧不是连在一起就行了,这个我用电脑发送验证过的,而且还是USB转串口。
一周热门 更多>