OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4227|回复: 0

485中断接收,485DMA发送问题,请教!!!

[复制链接]

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
发表于 2015-5-2 10:17:22 | 显示全部楼层 |阅读模式
5金钱
        我是用的STM32F103,485串口中断接收控制指令,然后解析,再通过485DMA返回数据,现在出现的问题是:485DMA返回的数据在字符串的首位和末位都会加0x00,比如应该返回:0x01,0x41,0xC0,0x10。结果返回的数据为:0x00,0x01,0x41,0xC0,0x10,0x00。不知道哪地方出问题了,如果用232DMA返回的话就不会出现这个问题,贴出代码,请原子哥和各位大神看看咋解决。
      串口配置:
[mw_shl_code=c,true] USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; //打开串口的收发功能 /* 配置USART2,用于接收云控命令 */ USART_Init(USART3, &USART_InitStructure); /* 打开串口2接收中断 */ USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); /* 使能USART2的DMA的发送请求 */ USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE); /* 使能串口2 */ USART_Cmd(USART3, ENABLE);[/mw_shl_code]
     DMA配置:
[mw_shl_code=c,true] DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(USART3->DR)); DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)UART2.SendBuf; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 0x00; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /* 配置DMA1_2 */ DMA_Init(DMA1_Channel2, &DMA_InitStructure); DMA_ClearFlag(DMA1_IT_TC2); /* 使能DMA1_2发送完成中断 */ /* 使能DMA1_2,用于发送摄像机命令 */ DMA_Cmd(DMA1_Channel2, ENABLE); DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);[/mw_shl_code]

      串口接收中断:
[mw_shl_code=c,true]void USART3_IRQHandler(void) { if(SET == USART_GetITStatus(USART3, USART_IT_RXNE)) { Command_Receive(); } USART_ClearITPendingBit(USART3,USART_IT_RXNE); }[/mw_shl_code]
    DMA发送:
[mw_shl_code=c,true] GPIO_SetBits(GPIOA, GPIO_Pin_8); delay_us(100); DMA_Cmd(DMA1_Channel2, DISABLE); DMA1_Channel2->CMAR = (uint32_t)UART2.SendBuf; DMA1_Channel2->CNDTR=UART2.SendDataLen; DMA_Cmd(DMA1_Channel2, ENABLE);[/mw_shl_code]
    串口发送完成中断:
   
[mw_shl_code=c,true]void DMA1_Channel2_IRQHandler(void) { if(DMA_GetFlagStatus(DMA1_FLAG_TC2) != RESET ) { DMA_ClearFlag(DMA1_FLAG_TC2); USART_ITConfig(USART3,USART_IT_TC,ENABLE); } DMA_ClearITPendingBit(DMA1_IT_TE2); DMA_Cmd(DMA1_Channel2, DISABLE); while(RESET == USART_GetITStatus(USART3, USART_IT_TC)) { } delay_us(100); USART_ClearITPendingBit(USART3,USART_IT_TC); USART_ITConfig(USART3,USART_IT_TC,DISABLE); GPIO_ResetBits(GPIOA, GPIO_Pin_8); }[/mw_shl_code]




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 22:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表