OpenEdv-开源电子网

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

用DMA配合FSMC从双口RAM里取数据遇到问题

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-6-2
在线时间
0 小时
发表于 2014-6-2 09:15:42 | 显示全部楼层 |阅读模式
5金钱
最近在做一个项目,需要用stm32从一个双口RAM CY7C027V-25AI里取数据,然后再显示到液晶上。思路是想用DMA配合FSMC去读那个双口RAM。但是发现一个问题。在连上JTAG之后,点debug,点全速运行,有时候可以顺利地跑整个程序。但有时候却会卡在while(!DMA_GetFlagStatus(DMA1_FLAG_TC3)); 运行不下去。如果拔掉JTAG,重新上电,每次程序都会卡住。在重新手动复位之后,又正常了,程序可以顺利跑下去。

关于FSMC和DMA设置的代码如下:
[mw_shl_code=c,true]void FSMC_SRAM_Configuration(void) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef SRAM_TIMING; GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF|RCC_APB2Periph_AFIO, ENABLE); /*-- GPIO Configuration ------------------------------------------------------*/ /* SRAM Data lines configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_3|GPIO_Pin_6|GPIO_Pin_8 | GPIO_Pin_9 |GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOE, &GPIO_InitStructure); /* SRAM Address lines configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 ;//| GPIO_Pin_5; GPIO_Init(GPIOG, &GPIO_InitStructure); /* NOE and NWE configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5; GPIO_Init(GPIOD, &GPIO_InitStructure); /* NE1 configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_Init(GPIOD, &GPIO_InitStructure); /* NBL0, NBL1 configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_Init(GPIOE, &GPIO_InitStructure); /*-- FSMC Configuration ------------------------------------------------------*/ SRAM_TIMING.FSMC_AddressSetupTime = 0; SRAM_TIMING.FSMC_AddressHoldTime = 0; SRAM_TIMING.FSMC_DataSetupTime = 2; SRAM_TIMING.FSMC_BusTurnAroundDuration = 0; SRAM_TIMING.FSMC_CLKDivision = 0; SRAM_TIMING.FSMC_DataLatency = 0; SRAM_TIMING.FSMC_AccessMode = FSMC_AccessMode_A; FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &SRAM_TIMING; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &SRAM_TIMING; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); /* Enable FSMC Bank1_SRAM Bank */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); }[/mw_shl_code]


[mw_shl_code=c,true]void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); DMA_DeInit(DMA1_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(Bank1_SRAM1_ADDR+0x10); DMA_InitStructure.DMA_MemoryBaseAddr = (u32)LcdData; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = DISPLAY_NUMBER*CHANNEL_NUMBER; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_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_Channel3, &DMA_InitStructure); }[/mw_shl_code]
在取数据时,自己写的函数如下:
[mw_shl_code=c,true]void DataAcquisition(void) { DMA_Configuration(); DMA_Cmd(DMA1_Channel3, ENABLE); while(!DMA_GetFlagStatus(DMA1_FLAG_TC3)); DMA_ClearFlag(DMA1_FLAG_TC3); }[/mw_shl_code]

程序就是卡在DataAcquisition()函数里的 while(!DMA_GetFlagStatus(DMA1_FLAG_TC3));这句话上。

请大家帮忙看看问题出在哪里?已经卡了好几天了,搞了半天也没搞明白怎么回事。。。谢谢大家!







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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-6-2
在线时间
0 小时
 楼主| 发表于 2014-6-9 20:18:41 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥!查了几天问题查出来了。因为我现在这个项目的程序是按照之前老版本的程序改的,当时的程序用的函数库比较老,重新安装了老版本的keil,用了老版本的库,问题就解决了。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-6-2
在线时间
0 小时
 楼主| 发表于 2014-6-9 20:24:19 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
但是出现了一个新的问题。

现在编译程序的时候,链接时有错误

.\obj\RailDetect.axf: error: L6787U: Region table handler '_scatterload_null ' needed by entry for RW_IRAM1 was not found

注:
我程序里面用到了printf 把float型转换成字符串。 在设置里勾选了MicroLIB 之后,编译程序就出现了上面的问题。

如果不勾选MicroLIB,编译就可以通过,但是把程序下载到板子之后,拔掉JTAG, 再上电,程序不跑。

请教一下原子哥这是什么原因?谢谢!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-9 22:32:40 | 显示全部楼层
回复【4楼】qxliuxin:
---------------------------------
不需要勾选micro lib
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-4-28
在线时间
0 小时
发表于 2014-12-12 10:41:15 | 显示全部楼层
最近也在做stm32读取双口ram的项目,fsmc挂双口ram会影响tft显示,希望楼主探讨下,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 02:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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