高级会员

- 积分
- 833
- 金钱
- 833
- 注册时间
- 2019-12-17
- 在线时间
- 157 小时
|
发表于 2020-9-8 18:09:33
|
显示全部楼层
用软件定时器和硬件定时器都可以
DATA_cnt1 = DMA_GetCurrDataCounter(DMA1_Channel5); //获取dma搬运数据长度
if (DATA_cnt1 != USART_BUFF_MAX)//比较是否等于设置长度如果不等于表示已经开始接收数据
{
static u16 DATA_cnt2 = 0;//保存上一次查询长度
static u8 delay_cnt = 0;
if (DATA_cnt1 != DATA_cnt2)//比较本次长度是否等于上次长度
{
DATA_cnt2 = DATA_cnt1;//长度发生变化保存新的长度
delay_cnt = 0;//清零即计时
}
else
{
if (delay_cnt++>2)//如果长度没有变化计时加一
{//如果3毫秒接收数据长度没有发生改变认为数据接收完成,这个时间跟据你自己情况调节
delay_cnt = 0;
U1_Read_L = USART_BUFF_MAX - DATA_cnt2;//记录数据长度
DATA_cnt2 = USART_BUFF_MAX;//数据长度重置
DMA_Cmd(DMA1_Channel5, DISABLE);
//设置传输数据长度
DMA_SetCurrDataCounter(DMA1_Channel5, USART_BUFF_MAX);
//打开DMA
DMA_Cmd(DMA1_Channel5, ENABLE);
UART1_DATA_FLAG = 1;//标记数据接收完成,退出中断后在主程序中处理
}
}
} |
|