STM32中USART的DMA 实现
时间:12-03
来源:互联网
点击:
LED1_ON;//一个标记
Buf_Ok=FALSE;//操作了准备好的数据
if((addr%4096)==0) //跨越一个扇区,则需要先刷除
{
SST25SectorErase(addr);
sector_count++;
}
if(Free_Buf_No==BUF_NO1)
SST25Write(addr,USART1_DMA_Buf1,512);
else
SST25Write(addr,USART1_DMA_Buf2,512);
addr+=512;
Timer1=5000;//时间重置
LED1_OFF;
}
//检测超时开了定时器
if(Timer1==0)//五秒内没准备好的数据
{
//获取长度
len=512-DMA_GetCurrDataCounter(DMA1_Channel5);
//写入最后数据
if(Free_Buf_No==BUF_NO1)
SST25Write(addr,USART1_DMA_Buf2,len);
else
SST25Write(addr,USART1_DMA_Buf1,len);
addr+=len;
break;
}
}
Buf_Ok=FALSE;//操作了准备好的数据
if((addr%4096)==0) //跨越一个扇区,则需要先刷除
{
SST25SectorErase(addr);
sector_count++;
}
if(Free_Buf_No==BUF_NO1)
SST25Write(addr,USART1_DMA_Buf1,512);
else
SST25Write(addr,USART1_DMA_Buf2,512);
addr+=512;
Timer1=5000;//时间重置
LED1_OFF;
}
//检测超时开了定时器
if(Timer1==0)//五秒内没准备好的数据
{
//获取长度
len=512-DMA_GetCurrDataCounter(DMA1_Channel5);
//写入最后数据
if(Free_Buf_No==BUF_NO1)
SST25Write(addr,USART1_DMA_Buf2,len);
else
SST25Write(addr,USART1_DMA_Buf1,len);
addr+=len;
break;
}
}
还是很简单的。
有一点比较困扰 就是 FlagStatus标志位 与 ITStatus中断标志位 的区别。 其实就 DMA 来说 DMA_IT值 与 DMA_FLAG值 是一样的
甚至2者值的获取 都是读 DMA ISR register 的值 清除也是设置 DMA_IFCR 寄存器来清除的所以貌似没有区别.........同理这个问题在别的中断也存在但我还不可保证 IT 与FLAG 的值总是相同的这个存在也许是为了兼容但一定有其意义务必不可混用即使有时用错也正确.....
STM32USARTDM 相关文章:
- 实现STM32中USART的DMA(11-20)
- STM32的USART DMA传输(转)(11-19)
- STM32的USART使用DMA--操作(11-13)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)