韩国人人都要当兵吗要验DMA吗

查看: 1094|回复: 10
DMA发送时不发CRC校验。。。。。很奇怪啊
主题帖子精华
高级会员, 积分 504, 距离下一级还需 496 积分
在线时间104 小时
[C] 纯文本查看 复制代码void MYDMA_Config( DMA_Channel_TypeDef *DMA_CHx,u32 paddr)
RCC-&AHBENR |= 1&&0;
//开启DMA1时钟
delay_ms(5);
//等待DMA时钟稳定
DMA_CHx-&CCR
= 0X; //复位
DMA_CHx-&CCR |= 1&&1;
//传输完成中断
DMA_CHx-&CCR |= 1&&4;
//从存储器读
DMA_CHx-&CCR |= 0&&5;
//普通模式
DMA_CHx-&CCR |= 0&&6;
//外设地址非增量模式
DMA_CHx-&CCR |= 1&&7;
//存储器增量模式
DMA_CHx-&CCR |= 0&&8;
//外设数据宽度为8位
DMA_CHx-&CCR |= 0&&10;
//存储器数据宽度8位
DMA_CHx-&CCR |= 1&&12;
//中等优先级
DMA_CHx-&CCR |= 0&&14;
//非存储器到存储器模式
DMA_CHx-&CPAR =
//DMA1 外设地址
DMA_CHx-&CCR
//USART DMA传输完成中断
void USART2_Init(u32 bound)
= ( (float)(36*1000000) ) / (bound*16);//得到USARTDIV
mantissa =
//得到整数部分
fraction = (temp-mantissa)*16; //得到小数部分
mantissa &&= 4;
mantissa +=
RCC-&APB2ENR |= 1&&2;
//使能PORTA口时钟
GPIOA-&CRL
&= 0XFFFF000F; //IO状态设置
GPIOA-&CRL
|= 0X00008B30; //IO状态设置
RCC-&APB1ENR |= 1&&17;
//使能串口时钟
RCC-&APB1RSTR |= 1&&17;
//复位串口3
RCC-&APB1RSTR &= ~(1&&17);//停止复位
USART2-&BRR
= // 波特率设置
USART2-&CR1 |= 0X340C;
USART2-&CR1 |= 1&&8;
//PE中断使能
USART2-&CR1 |= 1&&5;
//接收缓冲区非空中断使能
USART2-&CR3
MY_NVIC_Init(2,3,USART2_IRQChannel,2);//组2,最低优先级
USART2_TX_EN = 0;//默认为接收模式
void USART2_DMATransmit(u8 *mbdata,u8 mblen)
USART2_TX_EN = 1;
//设置为发送模式
DMA1_Channel7-&CCR
&= ~(1&&0);
DMA1_Channel7-&CMAR
DMA1_Channel7-&CNDTR =
DMA1_Channel7-&CCR
void DMA1_Channel7_IRQHandler(void)
if(DMA1-&ISR&0X)
USART2_TX_EN = 0;
USARTPARA.USART_RX_CNT[2] = 0;
DMA1-&IFCR|=1&&25;//清发送完成中断标志位
[C] 纯文本查看 复制代码
[C] 纯文本查看 复制代码以上是配置,下面是发送函数。当我使用DMA时串口监视发现并没有加上CRC,如果测试ex[2]的数据则不能接收到任何数据。发送函数如果使用原子的串口发送函数(非DMA)则有CRC。因此感觉是DMA原因,请大家帮帮忙
void Modbus_SendFrame(u8*data,u8 datalen,void(*Trans)(u8*data,u8 datalen))
u16 crc16 = 0xFFFF;
u8 ex[2]={0,0};
crc16 = CRC16Calculation(data,datalen);
data[datalen] = (u8)(crc16 & 0x00ff);
ex[0]=data[datalen];
datalen++;
data[datalen] = (u8)(crc16&&8);
datalen++;
ex[1]=data[datalen];
Trans(data,datalen);
以上是配置,下面是发送函数。当我使用DMA时串口监视发现并没有加上CRC,如果测试ex[2]的数据则不能接收到任何数据。发送函数如果使用原子的串口发送函数(非DMA)则有CRC。因此感觉是DMA原因,请大家帮帮忙
主题帖子精华
高级会员, 积分 504, 距离下一级还需 496 积分
在线时间104 小时
经测试发现不能发送少于2个字节的数据
对于数组ex[5]={1,2,3,4,5};只能发出去1,2,3,而4,5是发不出去的
主题帖子精华
高级会员, 积分 504, 距离下一级还需 496 积分
在线时间104 小时
如果改写程序,让程序一直发ex[5]={1,2,3,4,5};并且不使能DMA传输完成中断,则可以接收到全部数据。可知是中断“过早”,看配置,我明明是传输完成中断啊??????????????????????
主题帖子精华
高级会员, 积分 504, 距离下一级还需 496 积分
在线时间104 小时
配置USART 和DMA :DMA的中断不用开
准备发送的时候&&开485发&&配置好DMA&&开启USART的传输完成TC中断&&使能DMA&&=======等串口TC中断就行&&失能TC&&开485收
实测&&无误
发这个 &是因为 刚开始直接在DMA的发送完成中断里面去切换485的收发 &会导致最后的2个字节发布出去 &
& DMA的“发送完成中断”出现在 刚发送倒数第二个字节的起始位的地方 &这时候切换485 若接收端不是奇校验的话 将会误收到0xFF 最后第一肯定也出不去
网上大部分的解决办法的:①在DMA的TC中断里面 &加大于两个字节的延时 这是OK的 ②在DMA的TC中断里面 &开启USART的“发送完成中断” & 去USART的中断里面去处理 &这是OK的
我试了上面的第二个办法 OK的
认真看手册 &感觉完全可以利用TC的特点 &开启USART的DMA &开启DMA通道 &开启USART的TC中断 & 就试了一下 &是可以的
//-----尝试不开启DMA TC中断 &直接直观传输 &
void USART2_SendMsg(INT8U *msg,INT8U len)
& & & & SET_RS485_SEND; & & & & & & & &//高发送
& & & & DMA_ClearFlag(DMA1_FLAG_TC7); & & &//清DMA发送完成标志
& & & & USART_ClearITPendingBit(USART2,USART_IT_TC);
& & & & DMA_Cmd(DMA1_Channel7, DISABLE); & //停止DMA
& & & & DMA1_Channel7-&CMAR = (INT32U) & & & & & & & & & & & &//源地址
& & & & DMA1_Channel7-&CNDTR =//重设传输长度
& & & & USART_ITConfig(USART2,USART_IT_TC,ENABLE);
& & & & DMA_Cmd(DMA1_Channel7, ENABLE); & &//启动DMA
void USART2_IRQHandler(void)
& & & & /*
& & & & ...................
& & & & */
& & & & if(0x & (USART2-&SR))//(USART_GetITStatus(USART2,USART_IT_TC))
& & & & & & & & USART2-&SR &= ~0x;//USART_ClearITPendingBit(USART2,USART_IT_TC);
& & & & & & & & OSSemPost(Sem_Usart2Send); & & & & & & & &
& & & & & & & & SET_RS485_RECV; & & & & & & & & & & & &//发送完毕 改成接收状态
& & & & & & & & USART2-&CR1 &= ~0x;//USART_ITConfig(USART2,USART_IT_TC,DISABLE);
& & & & & & & & //OSIntExit();
& & & & & & & &
& & & & /*
& & & & ...................
& & & & */
主题帖子精华
高级会员, 积分 504, 距离下一级还需 496 积分
在线时间104 小时
不论使用TC中断还是在DMA的TC中断里设置延时发现最后两个字节《《《《《严重》》》》》误码!!!不知是什么原因。
主题帖子精华
高级会员, 积分 504, 距离下一级还需 496 积分
在线时间104 小时
13c3ecb6d_635.png (0 Bytes, 下载次数: 0)
22:54 上传
由上图可以看出在DMA TCIF里开启USART TC中断来判断传输是否完成是可以的,但是实际操作中发现最后两个字节超大误码率
PS:如果一直开USART TC中断是不是在DMA发送时一直占用串口CPU???
主题帖子精华
金钱114158
在线时间849 小时
主题帖子精华
高级会员, 积分 504, 距离下一级还需 496 积分
在线时间104 小时
我擦,竟然没人回!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
主题帖子精华
高级会员, 积分 504, 距离下一级还需 496 积分
在线时间104 小时
他妈的,不搞了!!!!
主题帖子精华
初级会员, 积分 82, 距离下一级还需 118 积分
在线时间17 小时
看的我笑起来了。。。
主题帖子精华
高级会员, 积分 504, 距离下一级还需 496 积分
在线时间104 小时
回复【10楼】小杰:
---------------------------------
才学单口,笑果不好,请担待
Powered by百度拇指医生
&&&普通咨询
您的网络环境存在异常,
请输入验证码
验证码输入错误,请重新输入实验六 串口DMA实验_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
实验六 串口DMA实验
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 台湾人都要当兵吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信