DMA 在声明变量的时候 会进入死循环

2019-07-21 02:57发布

这个问题我也搞不通 ,放在是花费了我半天的时间才找出来,我也不知道为什么编译器没有报错,问题如下:
在声明如下的数组的时候 ,必须要将声明放在main函数的外面,如果放在里面就会出现死循环:我也不知道是不是语法的问题,但是编译器就是没有报错,真是让人摸不着头脑:
u8 SendBuff[SEND_BUF_SIZE];        //发送数据缓冲区
const u8 TEXT_TO_SEND[]={"ALIENTEK WarShip STM32F1 DMA 串口实验"};         

就是上面的着两段程序,你可以把原子哥的程序中的这两段代码放在main函数中声明,编译的时候也不会报错,但是下载进开发板的时候就会进入死循环,原因现在我也不知道,希望哪位大神看见这个帖子的话可以给我这个小白一点指导,先谢谢啦!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
gongzq666
2019-07-21 21:16
brucewoo 发表于 2019-4-12 20:18
你没有贴出完整的程序,无法进一步判断。
而且,你既然用到DMA,那么是在main函数中打开DMA传输,还是在 ...

源地址和目标地肯定是正确的,因为我在知道了这个问题以后就只是将正点原子的例程的这两个声明的位置放在了main函数里面,其他的我都没有动过,还有就是在进入死循环以后,连LCD屏的ID都没有办法在串口上打印出来,这个在一开始的时候就进行了死循环,并不是说我底下的程序有毛病,然后导致程序进入死循环的。[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"                           
#include "lcd.h"
#include "key.h"
#include "dma.h"          
//ALIENTEK战舰STM32开发板 实验22
//DMA 实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司  

#define SEND_BUF_SIZE 8200        //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.

//u8 SendBuff[SEND_BUF_SIZE];        //发送数据缓冲区
//const u8 TEXT_TO_SEND[]={"ALIENTEK WarShip STM32F1 DMA 串口实验"};         

int main(void)
{

u8 SendBuff[SEND_BUF_SIZE];        //发送数据缓冲区
const u8 TEXT_TO_SEND[]={"ALIENTEK WarShip STM32F1 DMA 串口实验"};         
       
        u16 i;
        u8 t=0;
        u8 j,mask=0;
        float pro=0;                        //进度
        Stm32_Clock_Init(9);        //系统时钟设置
        uart_init(72,115200);        //串口初始化为115200
        delay_init(72);                            //延时初始化
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();                                   //初始化LCD        
        KEY_Init();                                //按键初始化                        
        MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)SendBuff,SEND_BUF_SIZE);//DMA1通道4,外设为串口1,存储器为SendBuff,长度SEND_BUF_SIZE.
        POINT_COLOR=RED;//设置字体为红 {MOD}
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");       
        LCD_ShowString(30,70,200,16,16,"DMA TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/15");       
        LCD_ShowString(30,130,200,16,16,"KEY0:Start");
        //显示提示信息       
        j=sizeof(TEXT_TO_SEND);          
        for(i=0;i<SEND_BUF_SIZE;i++)//填充数据到SendBuff
    {
                if(t>=j)//加入换行符
                {
                        if(mask)
                        {
                                SendBuff=0x0a;
                                t=0;
                        }else
                        {
                                SendBuff=0x0d;
                                mask++;
                        }       
                }else//复制TEXT_TO_SEND语句
                {
                        mask=0;
                        SendBuff=TEXT_TO_SEND[t];
                        t++;
                }              
    }                 
        POINT_COLOR=BLUE;//设置字体为蓝 {MOD}          
        i=0;
        while(1)
        {
                t=KEY_Scan(0);
                if(t==KEY0_PRES)//KEY0按下
                {
                        LCD_ShowString(30,150,200,16,16,"Start Transimit....");
                        LCD_ShowString(30,170,200,16,16,"   %");//显示百分号
                        printf(" DMA DATA: ");             
                    USART1->CR3=1<<7;           //使能串口1的DMA发送      
                        MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输!          
                    //等待DMA传输完成,此时我们来做另外一些事,点灯
                    //实际应用中,传输数据期间,可以执行另外的任务
                    while(1)
                    {
                                if(DMA1->ISR&(1<<13))//等待通道4传输完成
                                {
                                        DMA1->IFCR|=1<<13;//清除通道4传输完成标志
                                        break;
                        }
                                pro=DMA1_Channel4->CNDTR;//得到当前还剩余多少个数据
                                pro=1-pro/SEND_BUF_SIZE;//得到百分比          
                                pro*=100;      //扩大100倍
                                LCD_ShowNum(30,170,pro,3,16);          
                    }                            
                        LCD_ShowNum(30,170,100,3,16);//显示100%          
                        LCD_ShowString(30,150,200,16,16,"Transimit Finished!");//提示传送完成
                }
                i++;
                delay_ms(10);
                if(i==20)
                {
                        LED0=!LED0;//提示系统正在运行       
                        i=0;
                }                  
        }
}


[/mw_shl_code]


其他的地方我没有改动 ,就是声明的着两句位置发生了变化而已,您能看出什么端倪吗??还请指点。谢谢

一周热门 更多>