OpenEdv-开源电子网

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

DMA 串口接收到内存数组 2次数据一样怎么办,第3次又不一样

[复制链接]

10

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2014-10-22
在线时间
135 小时
发表于 2016-6-12 08:59:49 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 I is alun 于 2016-6-12 12:06 编辑

[mw_shl_code=c,true]#include "sys.h"
#include "usart.h"               
#include "delay.h"       
#include "led.h"
#include "exti.h"
#include "timer.h"
#include "24cxx.h"
#include "dma.h"


//Mini STM32开发板范例代码16
//IIC 实验
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
u8  USART_RX_BUF_1[3700]={0};
int i=0;
u32 temp;
//要写入到24c02的字符串数组
int main(void)
{               

        int count=0;
                                float distance_averge=0;
                                u16 j=0,k0=0,k1=0,angle_count=0;         
                                float distance=0,angle=0,min_distance=10000,min_distance_to_angle=0        ;
                                Stm32_Clock_Init(9);//系统时钟设置
                                delay_init(72);                //延时初始化
                        //        TIM4_PWM_Init(2000,719);                         //预分配1000。PWM频率=72M/(720)=100khz,周期20ms       
                                delay_ms(3000);//中点初始化3秒内完成上电自检,自检完成后PWM波正常控制
                                       
        uart_init(36,115200); //串口1初始化
                               
                                MYDMA_Config(DMA1_Channel6,(u32)(&USART2->DR),(u32)USART_RX_BUF_1,sizeof(USART_RX_BUF_1));//配置DMA通道1
                                MYDMA_Enable(DMA1_Channel6);//开启DMA通道6
                                LED_Init();                  
                                LED0=1;
                  
                               
                                while(1)
                        {
                        i=0;
                        while(i++<3700)
         USART_RX_BUF_1=0;
                               
      printf("DMA START:\r\n");
       

       
               
                        min_distance=10000,min_distance_to_angle=0;
                       
                               

                       
                         while((USART2->SR&0x40)==0);
                       
                        //发送SCAN命令
                        USART2->DR=0xA5;
                        while((USART2->SR&0x40)==0);
                        USART2->DR=0x20;
                        while((USART2->SR&0x40)==0);
                        USART2->CR3|=1<<6;  //使能串口2的DMA接收
                                 
       
                               
                  delay_ms(1800);
                       
                       
                        while(1)
                        {

                                if(DMA1->ISR&(1<<21)); //传输完成了
                                {
                                  
                                  USART2->CR3&=~(1<<6);  //禁止串口2的DMA接收
                                       
          DMA1->IFCR|=1<<21;//清除完成中断标志
                                        break;
                                }
                                printf("CNDTR:%d\r\n",DMA1_Channel6->CNDTR);
                               
                        }
               
                  
                        MYDMA_Enable(DMA1_Channel6);//开启DMA通道6
                 
                       
                       
                        //发送stop指令
                        USART2->DR=0xA5;
                        while((USART2->SR&0x40)==0);
                        USART2->DR=0x25;
                        while((USART2->SR&0x40)==0);
               
                       
               




                       
       
               

                       
               
                //                printf("angle    distance\r\n");

                        //        printf("A");
                                //找到1圈激光数据的起始数据点

                                                for(k0=8;k0<3600;k0++)
                                                {
                                                        if(((k0-6)%5==1)&&(USART_RX_BUF_1[k0]%2==1))
                                                        {
                                                                break;
                                                        }
                                                }
                                                //找到1圈激光数据的终止数据点
                                                for(k1=k0+1;k1<3600;k1++)
                                                {
                                                        if(((k1-6)%5==1)&&(USART_RX_BUF_1[k1]%2==1))
                                                        {
                                                                break;
                                                        }
                                                }
                                               
                                                for(j=k0;j<k1;j=j+5)
                                                {

                                                                angle=(float)(USART_RX_BUF_1[j+2]*128+(USART_RX_BUF_1[j+1]-1)/2)/64;
                                                                distance=(float)(USART_RX_BUF_1[j+4]*256+USART_RX_BUF_1[j+3])/4;
                                                                if(distance!=0)
                                                                {
                                                                        angle_count++;
                                                                        //printf("%f  ,%f\r\n ",angle,distance);       
                                                                }
                                                                if((angle>=0 && angle<2)||(angle>=358 && angle<360))
                                                                {
                                                                                count++;
                                                                                distance_averge+=distance;
                                                        //                        printf("%f  ,%f\r\n ",angle,distance);// 打印0度和360度左右的角度和距离,也就是正前方的信息
                                                                }                                                                               
                                                }
                                                if(count==0) distance_averge=0;
                                                else distance_averge/=count;
                                                printf("count:%d ,distance_averge:%f \r\n ",count,distance_averge);


                               
                               
                               

               
                    if(distance_averge<300) TIM4->CCR4=130;
                                if(distance_averge>320) TIM4->CCR4=170;
                                if(distance_averge>=300&&distance_averge<=320) TIM4->CCR4=150;
                                //printf("最短距离:%f,相应角度:%f,有效角度个数:%d\r\n",min_distance,min_distance_to_angle,angle_count);
                                angle_count=0;
                                distance_averge=0;
        count=0;
                                LED0=!LED0;
                                printf("DMA END:\r\n");
}

}






















[/mw_shl_code]数据有变化,但是应该是1次一变,咋这么奇葩,第1次和第2次一样,第3次和第4次一样,第1次和第3次又不一样
1.JPG

最佳答案

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

解决了,大循环加串口初始化,不是很懂原理,但问题得到解决
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2014-10-22
在线时间
135 小时
 楼主| 发表于 2016-6-12 08:59:50 | 显示全部楼层
解决了,大循环加串口初始化,不是很懂原理,但问题得到解决
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13122
金钱
13122
注册时间
2012-11-26
在线时间
3813 小时
发表于 2016-6-12 09:03:21 | 显示全部楼层
什么意思?你是不是只有一个buff,开两个buff,轮流收吧
回复

使用道具 举报

10

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2014-10-22
在线时间
135 小时
 楼主| 发表于 2016-6-12 09:04:32 | 显示全部楼层
jermy_z 发表于 2016-6-12 09:03
什么意思?你是不是只有一个buff,开两个buff,轮流收吧

对啊,只有1个buff啊,1个buff不行吗
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-6-12 11:59:06 | 显示全部楼层
你发送端如果没问题的话
估计是你的中断问题  不知道你用的什么完成中断

你用完buff清了试试


我很喜欢楼主的头像
回复

使用道具 举报

10

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2014-10-22
在线时间
135 小时
 楼主| 发表于 2016-6-12 12:05:41 | 显示全部楼层
止天 发表于 2016-6-12 11:59
你发送端如果没问题的话
估计是你的中断问题  不知道你用的什么完成中断

串口DMA要啥中断
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 14:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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