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]
因为最近才转向硬件方向,功力十分有限,如果有哪位大神找到问题,麻烦详细讲解一下,多谢!
附效果图两张...
|