打印
[STM32F1]

STM32F103 DMA问题

[复制链接]
5084|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
queenRan|  楼主 | 2014-6-11 16:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用DMA通过FSMC读NorFlash数据 传TFT屏,TFT显示不正常。不用DMA改用MCU读写,TFT显示正常。说明硬件是没有问题的,查了几天没想明白DMA设置有什么问题,大家有没有什么方法可以监控DMA传送的数据。
沙发
queenRan|  楼主 | 2014-6-11 16:20 | 只看该作者
先自己顶一个。
还有个问题,DMA一次最大传送是65536个,是指字节吗?
还是字节,半字,字都可以一次传65536个。

使用特权

评论回复
板凳
queenRan|  楼主 | 2014-6-11 17:22 | 只看该作者
我把NorFlash正常读取到一数据区Buffer0,用DMA读取NorFlash到另一数据区Buffer1,
发现数据Buffer0[0]=0x11AA,Buffer0[1]=0x19CA,Buffer0[2]=0x11CA,
        Buffer1[0]=0x00AA,Buffer0[1]=0x0011,Buffer0[2]=0x00CA,Buffer1[3]=0x0019,Buffer0[4]=0x00CA,Buffer0[52]=0x0011
说明DMA读到的是字节数据,我设置明明是半字传送的,难道还有其他地方没有设置正确。

设置如下
/*******************************************************************************
* Function Name  : FSMC_DMA_Init
* 功能:初始化FSMC的DMA
* 参数:PeripheralBaseAddr外设地址,即图片存储地址
                BufferSize为DMA传输数据量
*******************************************************************************/
extern void  DMA_NVICConfig(void);
void FSMC_DMA_Init(INT32U PeripheralBaseAddr,INT32U BufferSize)
{
        DMA_InitTypeDef DMA_InitStructure;
        /* DMA channel6 configuration */
        DMA_DeInit(DMA1_Channel6);
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(PeripheralBaseAddr+Bank1_NOR2_ADDR);
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DMABuff;//(u32)TFT_DateBaseADDR;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = BufferSize;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
//        DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_Byte;
//        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
        DMA_Init(DMA1_Channel6, &DMA_InitStructure);
        //允许发送完成中断
        DMA_NVICConfig();
}

使用特权

评论回复
地板
airwill| | 2014-6-11 22:34 | 只看该作者
是传输次数, 字节,半字,字都可以一次传65536个。

从你的buffer 的数据看, DMA 读的是字节. 应该是你的 norflash 是8位字节接口的问题.

使用特权

评论回复
5
queenRan|  楼主 | 2014-6-12 08:43 | 只看该作者
airwill 发表于 2014-6-11 22:34
是传输次数, 字节,半字,字都可以一次传65536个。

从你的buffer 的数据看, DMA 读的是字节. 应该是你的 n ...

NorFlash是16位的,我不用DMA读,而直接用FSMC读取,就是16位的,所以硬件接口是没有问题的。
我这两个Buffer读取是这样的
       //直接FSMC读取NorFlash送TFT屏
        for(tmp=0;tmp<ROW*COL;tmp++)
        {
                hs =  *(INT16U *) (Bank1_NOR2_ADDR+PictureAddr+tmp*2);
//                TFT2_WD_DAT(*(INT16U *) (Bank1_NOR2_ADDR+PictureAddr+tmp*2));
                TFT2_WD_DAT(hs);
                if(tmp < 1000) {DMABuff1[tmp]=hs;}
        }
        // DMA读取NorFlash送Buffer
        FSMC_DMA_Init(PictureAddr,(1000));
        DMA_Cmd(DMA1_Channel6, ENABLE);       
        Systime_Count = 0;                         TFTDMADateComplete = 0;
        while(0!=DMA_GetCurrDataCounter(DMA1_Channel6) && Systime_Count<10000);

使用特权

评论回复
6
queenRan|  楼主 | 2014-6-12 10:30 | 只看该作者
找到问题了,是这里设置不对了

        DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_HalfWord; //这里应该用DMA_PeripheralDataSize_HalfWord才对
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

使用特权

评论回复
7
想做大牛的小马| | 2014-6-12 10:32 | 只看该作者
queenRan 发表于 2014-6-12 10:30
找到问题了,是这里设置不对了

        DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_ ...

DMA_MemoryDataSize_HalfWord
DMA_PeripheralDataSize_HalfWord 这两个宏对应的值还不一样?分别多少啊

使用特权

评论回复
8
queenRan|  楼主 | 2014-6-12 13:20 | 只看该作者
想做大牛的小马 发表于 2014-6-12 10:32
DMA_MemoryDataSize_HalfWord
DMA_PeripheralDataSize_HalfWord 这两个宏对应的值还不一样?分别多少啊[e ...


/* DMA peripheral data size --------------------------------------------------*/
#define DMA_PeripheralDataSize_Byte        ((u32)0x00000000)
#define DMA_PeripheralDataSize_HalfWord    ((u32)0x00000100)
#define DMA_PeripheralDataSize_Word        ((u32)0x00000200)

#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PeripheralDataSize_Byte) || \
                                           ((SIZE) == DMA_PeripheralDataSize_HalfWord) || \
                                           ((SIZE) == DMA_PeripheralDataSize_Word))

/* DMA memory data size ------------------------------------------------------*/
#define DMA_MemoryDataSize_Byte            ((u32)0x00000000)
#define DMA_MemoryDataSize_HalfWord        ((u32)0x00000400)
#define DMA_MemoryDataSize_Word            ((u32)0x00000800)

#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MemoryDataSize_Byte) || \
                                       ((SIZE) == DMA_MemoryDataSize_HalfWord) || \
                                       ((SIZE) == DMA_MemoryDataSize_Word))

/* DMA circular/normal mode --------------------------------------------------*/

不一样的,之前是用字节的,所以两边可以一样,改成16位后没注意看。。
查了好几天,开始还以为硬件问题。。

使用特权

评论回复
9
想做大牛的小马| | 2014-6-12 14:04 | 只看该作者
queenRan 发表于 2014-6-12 13:20
/* DMA peripheral data size --------------------------------------------------*/
#define DMA_Peri ...

我原以为halfWord都是2,然后你移位到寄存器里面的呢。。。。
对应上就好了( ⊙o⊙ )哇,都能看到接收buf里有几乎正确的数据,就不用太紧张啦

使用特权

评论回复
10
zhweei| | 2015-4-3 10:36 | 只看该作者
呵呵,这种小错误很容易犯,又很难检查出来啊!还是启用宏USE_FULL_ASSERT进行参数检查才好啊!

使用特权

评论回复
11
kathmandu| | 2016-4-6 17:52 | 只看该作者
queenRan 发表于 2014-6-12 10:30
找到问题了,是这里设置不对了

        DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_ ...

太感谢了!居然完全一样的问题。发现103的Cube完全不可信啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

42

帖子

1

粉丝