前言
最近做一个小项目,用到了串口2-匿名上位机V7调参,大概情况就是使用定时器、串口(DMA)实现,串口(DMA)发送放在了定时器里面(需要着重注意下,这里说使用了定时器发送,一会会提到)
一、不使用DMA发送
for (i=0;i<cnt;i++)
{
USART_SendData(USART2,data[i]);
//for(int j=0;j<1000;j++);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
}
以上就是相关代码,但注意一个问题!前面说了是在定时器中发送,如果使用while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET); 的话,程序会跑死!而如果把这段代码换成注释掉的延时的话,就没有问题咧!
如果想使用 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET); 的话,可以放在主函数的while(1) 循环中。
二、使用DMA发送
if( DMA_GetFlagStatus( DMA1_FLAG_TC7) == SET)//准备完成
{
//注意:DMA初始化中,方向为DMA_DIR_PeripheralDST,存储器和外设的datasize都是字节!DMA模式设置为normal
DMA_Cmd(DMA1_Channel7, DISABLE); //关闭DMA
DMA_ClearFlag(DMA1_FLAG_TC7); //轻触标志位
DMA1_Channel7->CNDTR=data_long; //DMA_SetCurrDataCounter(); 设置发送的buffer_size
DMA1_Channel7->CMAR=(u32)(data); //存储器地址
DMA1_Channel7->CPAR=(u32)(&USART2->DR); //外设地址
DMA_Cmd(DMA1_Channel7, ENABLE); //开启DMA
}
以上就是使用DMA发送过程