OpenEdv-开源电子网

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

串口接收DMA方式,先进入串口中断判断帧头,再进入DMA,结果DMA接收的第一位老出错?

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
34
金钱
34
注册时间
2015-5-28
在线时间
1 小时
发表于 2015-6-5 15:55:17 | 显示全部楼层 |阅读模式
5金钱
串口接收DMA方式,先进入串口中断判断帧头,再进入DMA,结果DMA接收的第一位老出错?
求救原子哥

最佳答案

查看完整内容[请看2#楼]

问题解决了,串口接收中断了打开DMA后会把当前的值传到内存中的,而不是等到下一个值来了再传到内存中,比设想的多了一个值,所以才会出现那样的循环
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
34
金钱
34
注册时间
2015-5-28
在线时间
1 小时
 楼主| 发表于 2015-6-5 15:55:18 | 显示全部楼层
问题解决了,串口接收中断了打开DMA后会把当前的值传到内存中的,而不是等到下一个值来了再传到内存中,比设想的多了一个值,所以才会出现那样的循环
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
34
金钱
34
注册时间
2015-5-28
在线时间
1 小时
 楼主| 发表于 2015-6-5 16:27:32 | 显示全部楼层
[mw_shl_code=c,true]#if EN_USART1_RX //?????????????? void USART1_IRQHandler(void) //?®??1????·??????ò { u8 Res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //???????? { Res = USART_ReceiveData(USART1);//(USART1->DR); //???????????????? ????×??? 0xbd 0xdb USART_RX_BUF[USART_RX_STA]=Res ; USART_RX_STA++; if(USART_RX_STA == 2) { USART_RX_STA = 0; if((USART_RX_BUF[0] == 0xbd)&&(USART_RX_BUF[1] == 0xdb)) { MYDMA_Enable(); //?ò??DMA???? } else {} } } } #endif [/mw_shl_code]

[mw_shl_code=c,true]#include "dma.h" u8 ReceiveBuff[32]; u16 Roll ; u16 Pitch ; u16 Yaw; u16 sign; float ROLL_N ; float PITCH_N ; float YAW_N ; float volt3n ; DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; u16 DMA1_MEM_LEN;//±???DMA???????????????¤?? //DMA1???÷?¨?????? //???????????????????¨??,???????ù?????????é???????? //?????è->?????÷???? /8???????í?? /?????÷???????? //DMA?¨??DMA1_Channel5 ?®???????¨?? //cpar:???è???· //cmar:?????÷???· //cndtr:?????????? void MYDMA_Config(u32 cpar,u32 cmar,u16 cndtr) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //????DMA???? //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn; //?????????? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_DeInit(DMA1_Channel5); //??DMA???¨??5?????÷???è???±???? DMA1_MEM_LEN=cndtr; DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMA???èUSART_RX?ù???· DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMA?????ù???· DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //????????·??ò???????è????·????????? DMA_InitStructure.DMA_BufferSize = cndtr; //DMA?¨????DMA???????ó?? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //???è???·?????÷??±? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //???????·?????÷???? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //?????í????8?? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //?????í????8?? DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //?¤×÷?????????????? DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA?¨?? x???????????? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA?¨??x?????è?????????????????? DMA_Init(DMA1_Channel5, &DMA_InitStructure); //?ù??DMA_InitStruct?????¨????????????DMA???¨??USART1_Tx_DMA_Channel?ù±ê?????????÷ DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);//????DMA?????ê?ú?ú???? } //????????DMA???? void MYDMA_Enable(void) { DMA_Cmd(DMA1_Channel5, DISABLE ); //??±?USART1 TX DMA1 ?ù???????¨?? DMA_SetCurrDataCounter(DMA1_Channel5,DMA1_MEM_LEN);//DMA?¨????DMA???????ó?? 32Bit DMA_Cmd(DMA1_Channel5, ENABLE); //????USART1 RX DMA1 ?ù???????¨?? } [/mw_shl_code]

附上串口接收中断和DMA配置函数
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
34
金钱
34
注册时间
2015-5-28
在线时间
1 小时
 楼主| 发表于 2015-6-5 16:37:15 | 显示全部楼层
 现在的问题是,帧头在串口中断里能收到,0xbd 和0xdb,DMA里接收的数据第一位是一帧数据的最后一位,从第二位开始才是正确的顺序,第二次接收串口还是帧头在串口中断里能收到,0xbd 和0xdb,DMA里接收的数据是从倒数第三位开始,然后从第四位才是正确的数据
要发的数据:bd db  04 0e 00 07 00 23 02 5d 01 00 f0 04 00 f9 ff f7 ff 00 00 f8 ff 5b f5 ed 1b a3 26 00 00 7b 24 00
第一次收到:bd db  00 04 0e 00 07 00 23 02 5d 01 00 f0 04 00 f9 ff f7 ff 00 00 f8 ff 5b f5 ed 1b a3 26 00 00 7b 24
第二次收到:bd db 7b 24 00  04 0e 00 07 00 23 02 5d 01 00 f0 04 00 f9 ff f7 ff 00 00 f8 ff 5b f5 ed 1b a3 26 00 00
第三次收到:
bd db 00 00 7b 24 00  04 0e 00 07 00 23 02 5d 01 00 f0 04 00 f9 ff f7 ff 00 00 f8 ff 5b f5 ed 1b a3 26
。。。
其中bd db是串口中断里接收的,后面是DMA里接收的

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-5 23:40:56 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 11:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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