OpenEdv-开源电子网

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

SRAM通过DMA给LCD发数据,LCD显示不全

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2015-1-12
在线时间
0 小时
发表于 2015-1-16 16:08:18 | 显示全部楼层 |阅读模式
5金钱

1、用FSMC初始化了SRAM,在SRAM里放了一个480*320的u16数组,测试读写都没问题
2、用FSMC初始化了LCD的数据段,用寄存器直接改变LCD的显示也没问题
为了加快LCD刷新的速度,我尝试用DMA直接从SRAM里把数据取出来传给LCD,结果LCD仅仅改变最前面连续的一点屏幕,不知道问题出在哪里。
下面的代码都是参考STM32开发指南写的,本人是新手,请各位大神帮忙看看哪里有不对的地方...
-------------------------------------------------------------------------------------------------------------
FSMC初始化函数

[mw_shl_code=c,true]//FSMC初始化外部SRAM #define FSMC_BASE ((u32)(0x68000000)) [/mw_shl_code] [mw_shl_code=c,true]void FSMC_SRAM_init(void) { RCC->AHBENR |= 1<<8; //FSMC时钟使能 /* 地址线:GPIOF(0~5 . 12~15)、GPIOG(0~5)、GPIOD(11.12.13) | 总共19跟地址线 * 数据线:GPIOE(7~15)、GPIOD(0.1.8.9.10.14.15) | 总共16跟数据线 * 配置线:GPIOE(0.1)、GPIOD(4.5)、GPIOG(10) * 需要配置的IO口: * GPIOD(0/1/4/5/8-15) 12 * GPIOE(0/1/7-15) 11 * GPIOF(0-5/12-15) 10 * GPIOG(0-5/10) 7 */ RCC->APB2ENR |= 1<<5 | 1<<6 | 1<<7 | 1<<8; //将各个IO口置为复用推挽输出,配置前将寄存器清零 GPIOD->CRH &= 0x00000000; GPIOD->CRH |= 0xBBBBBBBB; GPIOD->CRL &= 0xFF00FF00; GPIOD->CRL |= 0x00BB00BB; GPIOE->CRH &= 0x00000000; GPIOE->CRH |= 0xBBBBBBBB; GPIOE->CRL &= 0x0FFFFF00; GPIOE->CRL |= 0xB00000BB; GPIOF->CRH &= 0x0000FFFF; GPIOF->CRH |= 0xBBBB0000; GPIOF->CRL &= 0xFF000000; GPIOF->CRL |= 0x00BBBBBB; GPIOG->CRH &= 0xFFFFF0FF; GPIOG->CRH |= 0x00000B00; GPIOG->CRL &= 0xFF000000; GPIOG->CRL |= 0x00BBBBBB; //寄存器清零 //Bank1共有NE1~4,每个端口都有一个BCR+TCR,所以共有8个寄存器 //使用的是NE3,即对应BTCR[4]、BTCR[5] FSMC_Bank1->BTCR[4] = 0x00000000; FSMC_Bank1->BTCR[5] = 0x00000000; FSMC_Bank1E->BWTR[4] = 0x00000000; //操作BCR寄存器 使用异步模式,模式A(读写共用一个时序寄存器) //BTCR[偶数]:BCR寄存器;BTCR[奇数]:BTR寄存器 FSMC_Bank1->BTCR[4] |= 1<< 14; FSMC_Bank1->BTCR[4] |= 1<< 12; //存储器写使能 FSMC_Bank1->BTCR[4] |= 1<< 4; //存储器数据宽度为16bit FSMC_Bank1->BTCR[4] |= 0<< 2; //操作BTR寄存器 FSMC_Bank1->BTCR[5] |= 0<<28; FSMC_Bank1->BTCR[5] |= 3<<8; //数据保存时间(DATAST) 为4个HCLK 4/72M = 55ns FSMC_Bank1->BTCR[5] |= 0<<4; //地址保持时间ADDHLD未用到 FSMC_Bank1->BTCR[5] |= 0<<0; //地址建立时间ADDSET为1个HCLK //闪存写时序寄存器 FSMC_Bank1E->BWTR[4] = 0xFFFFFFFF; //默认值 //使能BANK1区域3 FSMC_Bank1->BTCR[4] |= 1<<0; }[/mw_shl_code]
DMA初始化函数
[mw_shl_code=c,true]//配置DMA[/mw_shl_code] [mw_shl_code=c,true]extern u16 FlappyBird_Frame[320][480]; void DMA_Init(void) { //开启DMA1时钟 RCC->AHBENR |= 1<<1; //等待时钟稳定 _delay_ms(5); //设置DMA1的外设地址与存储器地址 DMA2_Channel5->CPAR = (u32)FlappyBird_Frame; DMA2_Channel5->CMAR =(u32)0X6C000800; //复位 DMA2_Channel5->CCR = 0x00000000; /* * * * * * *从存储器读 *普通模式 *外设地址非增量模式 *存储器增量模式 *外设数据宽度为8位 *存储器数据宽度为8位 *中等优先级 *非存储器到存储器模式 * * * * * * */ DMA2_Channel5->CCR |= 0<<4; DMA2_Channel5->CCR |= 0<<5; DMA2_Channel5->CCR |= 1<<6; DMA2_Channel5->CCR |= 0<<7; DMA2_Channel5->CCR |= 1<<8; DMA2_Channel5->CCR |= 1<<10; DMA2_Channel5->CCR |= 1<<12; DMA2_Channel5->CCR |= 1<<14; }[/mw_shl_code]
因为最近才转向硬件方向,功力十分有限,如果有哪位大神找到问题,麻烦详细讲解一下,多谢!
附效果图两张...

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-16 20:31:10 | 显示全部楼层
F103?
参考下我们战舰板综合实验SPB.c的相关代码
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 00:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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