最终图片是显示出来了,但是被均分成了4小份显示出来了,例如:一张图240*320,变成了4张60*80的小图(不好意思,板子不在身边,发个示意图)
然后就是各种线路排出,代码排查。快两个周了,还没找到问题
1. DMA将照片搬到u8、u16、u32数组,数据都没有问题(数据顺序),几乎可以排除DMA代码的问题
2. 如果将数组的数据,按照1个点1个点向LCD写,图片也没问题
3. 只有在通过DMA将数据通过FSMC搬到LCD时,结果就变成4张小图(有可能是数据错位,1分裂成4了)
所以个人怀疑是FSMC导致的,但是各种试解决不了
- 这是LCD地址
- #define TFTLCD_BASE ((u32)(0x60000000 | 0x0001FFFE)) //Bank1.sector1 + A16
- #define TFTLCD ((TFTLCD_TypeDef *) TFTLCD_BASE)
- 这是FSMC复用部分配置
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource0, GPIO_AF_FSMC);//PD0 FSMC_D2
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource1, GPIO_AF_FSMC);//PD1 FSMC_D3
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource4, GPIO_AF_FSMC);//PD4 FSMC_NOE
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource5, GPIO_AF_FSMC);//PD5 FSMC_NWE
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource8, GPIO_AF_FSMC);//PD8 FSMC_D13
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource9, GPIO_AF_FSMC);//PD9 FSMC_D14
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);//PD10 FSMC_D15
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);//PD14 FSMC_D0
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//PD15 FSMC_D1
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource7, GPIO_AF_FSMC);//PE7 FSMC_D4
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource8, GPIO_AF_FSMC);//PE8 FSMC_D5
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource9, GPIO_AF_FSMC);//PE9 FSMC_D6
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);//PE10 FSMC_D7
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);//PE11 FSMC_D8
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);//PE12 FSMC_D9
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);//PE13 FSMC_D10
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);//PE14 FSMC_D11
- GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//PE15 FSMC_D12
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource7, GPIO_AF_FSMC);//PD7 FSMC_NE1
- GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC);//PD11 FSMC_A16
- //这是FSMC关键部分的代码
- NorsRamInit.FSMC_Bank = FSMC_Bank1_NORSRAM1;// 存储块标号和区号 :这里我用的是NE1
- NorsRamInit.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 数据线与地址线是否复用 :不复用数据地址
- NorsRamInit.FSMC_MemoryType = FSMC_MemoryType_SRAM; // 外接存储器类型:FSMC_MemoryType_SRAM; //SRAM
- NorsRamInit.FSMC_MemoryDataWidth= FSMC_MemoryDataWidth_16b;// 存储器数据宽度:16bit
- NorsRamInit.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;// 配置访问模式:启用或禁用闪存的突发访问模式,仅对同步突发闪存有效。不太理解!!!
- NorsRamInit.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;// 等待信号极性
- NorsRamInit.FSMC_AsynchronousWait= FSMC_AsynchronousWait_Disable;
- NorsRamInit.FSMC_WrapMode = FSMC_WrapMode_Disable; // 是否使用非对齐方式
- NorsRamInit.FSMC_WaitSignalActive= FSMC_WaitSignalActive_BeforeWaitState; // 等待信号什么时期产生
- NorsRamInit.FSMC_WriteOperation= FSMC_WriteOperation_Enable; // 存储器写使能
- NorsRamInit.FSMC_WaitSignal= FSMC_WaitSignal_Disable; // 是否使用等待信号
- NorsRamInit.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
- NorsRamInit.FSMC_WriteBurst = FSMC_WriteBurst_Disable; // 是否允许突发写操作
- NorsRamInit.FSMC_ReadWriteTimingStruct = &ReadTiming;// 读写时序
- NorsRamInit.FSMC_WriteTimingStruct = &WriteTiming; // 写时序
- FSMC_NORSRAMInit(&NorsRamInit); // 初始化FSMC配置
- FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); // 使能BANK1
- // 初始化DAM配置
- void DMC_LLL(u32 L_PAdd,u32 PIne,u32 PLeng, u32 L_MAdd,u32 MInc,u32 MLeng, u32 L_BufferSize)
- {
- DMA_InitTypeDef DMA_InitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
- DMA_DeInit(DMA2_Stream1);
- while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){} //等待DMA2_Stream1可配置
- //配置 DMA Stream
- DMA_InitStructure.DMA_Channel = DMA_Channel_1; //DCMI_CH1
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //外设到内存
- DMA_InitStructure.DMA_BufferSize = L_BufferSize; //数据传输量
- DMA_InitStructure.DMA_PeripheralBaseAddr = L_PAdd; //外设地址:
- DMA_InitStructure.DMA_PeripheralInc = PIne; //外设非增量模式 DMA_PeripheralInc_Disable
- DMA_InitStructure.DMA_PeripheralDataSize = PLeng; //外设数据长度:32bit DMA_PeripheralDataSize_Word
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; //外设突发单次传输
-
- DMA_InitStructure.DMA_Memory0BaseAddr = L_MAdd; //内存地址 //(u32)&MAdd
- DMA_InitStructure.DMA_MemoryInc = MInc; //内存增量模式 DMA_MemoryInc
- DMA_InitStructure.DMA_MemoryDataSize = MLeng; //内存数据长度
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; //内存突发单次传输
-
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //使用循环模式(不停地传送,并非一行一行的传送)
- DMA_InitStructure.DMA_Priority = DMA_Priority_High; //高优先级
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; //FIFO模式
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; //使用全FIFO
-
- DMA_Init(DMA2_Stream1, &DMA_InitStructure); //初始化DMA Stream
- //DMA_ITConfig(DMA2_Stream1, DMA_IT_TC, ENABLE); //DMA发送完成中断使能函数