之前一直玩103,最近画了块板子F407Ve的,翻出1个之前的LCD,想很熟,代码大部分都是通过F407ZE的代码,东拼西凑,改来的
最终图片是显示出来了,但是被均分成了4小份显示出来了,例如:一张图240*320,变成了4张60*80的小图(不好意思,板子不在身边,发个示意图) www.JPG
然后就是各种线路排出,代码排查。快两个周了,还没找到问题
1. DMA将照片搬到u8、u16、u32数组,数据都没有问题(数据顺序),几乎可以排除DMA代码的问题
2. 如果将数组的数据,按照1个点1个点向LCD写,图片也没问题
3. 只有在通过DMA将数据通过FSMC搬到LCD时,结果就变成4张小图(有可能是数据错位,1分裂成4了)
所以个人怀疑是FSMC导致的,但是各种试解决不了


  1. 这是LCD地址
  2. #define TFTLCD_BASE   ((u32)(0x60000000 | 0x0001FFFE))  //Bank1.sector1 + A16
  3. #define TFTLCD                        ((TFTLCD_TypeDef *) TFTLCD_BASE)


  4. 这是FSMC复用部分配置
  5. GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,        GPIO_AF_FSMC);//PD0                FSMC_D2
  6.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,        GPIO_AF_FSMC);//PD1                FSMC_D3
  7.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,        GPIO_AF_FSMC);//PD4                                                        FSMC_NOE
  8.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,        GPIO_AF_FSMC);//PD5                                                        FSMC_NWE
  9.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,        GPIO_AF_FSMC);//PD8                FSMC_D13
  10.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,        GPIO_AF_FSMC);//PD9                FSMC_D14
  11.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);//PD10        FSMC_D15
  12.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);//PD14        FSMC_D0
  13.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//PD15        FSMC_D1

  14.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,        GPIO_AF_FSMC);//PE7                FSMC_D4
  15.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,        GPIO_AF_FSMC);//PE8                FSMC_D5
  16.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,        GPIO_AF_FSMC);//PE9                FSMC_D6
  17.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);//PE10        FSMC_D7
  18.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);//PE11        FSMC_D8
  19.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);//PE12        FSMC_D9
  20.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);//PE13        FSMC_D10
  21.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);//PE14        FSMC_D11
  22.   GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//PE15        FSMC_D12

  23.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource7, GPIO_AF_FSMC);//PD7                                                        FSMC_NE1
  24.   GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC);//PD11                                                FSMC_A16


  25. //这是FSMC关键部分的代码

  26.   NorsRamInit.FSMC_Bank        = FSMC_Bank1_NORSRAM1;// 存储块标号和区号        :这里我用的是NE1
  27.   NorsRamInit.FSMC_DataAddressMux         = FSMC_DataAddressMux_Disable; // 数据线与地址线是否复用        :不复用数据地址
  28.   NorsRamInit.FSMC_MemoryType = FSMC_MemoryType_SRAM;        // 外接存储器类型:FSMC_MemoryType_SRAM;  //SRAM   
  29.   NorsRamInit.FSMC_MemoryDataWidth= FSMC_MemoryDataWidth_16b;// 存储器数据宽度:16bit   
  30.   NorsRamInit.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;// 配置访问模式:启用或禁用闪存的突发访问模式,仅对同步突发闪存有效。不太理解!!!
  31.   NorsRamInit.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;// 等待信号极性
  32. NorsRamInit.FSMC_AsynchronousWait= FSMC_AsynchronousWait_Disable;
  33.   NorsRamInit.FSMC_WrapMode = FSMC_WrapMode_Disable;                                                           // 是否使用非对齐方式
  34.   NorsRamInit.FSMC_WaitSignalActive= FSMC_WaitSignalActive_BeforeWaitState;        // 等待信号什么时期产生
  35.   NorsRamInit.FSMC_WriteOperation= FSMC_WriteOperation_Enable;                                                // 存储器写使能
  36.   NorsRamInit.FSMC_WaitSignal= FSMC_WaitSignal_Disable;                                                   // 是否使用等待信号
  37.   NorsRamInit.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;                                                         // 读写使用不同的时序
  38.   NorsRamInit.FSMC_WriteBurst          = FSMC_WriteBurst_Disable;                                                         // 是否允许突发写操作
  39.   NorsRamInit.FSMC_ReadWriteTimingStruct = &ReadTiming;// 读写时序
  40.   NorsRamInit.FSMC_WriteTimingStruct  = &WriteTiming;          // 写时序
  41.   FSMC_NORSRAMInit(&NorsRamInit);                                                                                                                                                                                                  // 初始化FSMC配置
  42.   FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); // 使能BANK1


  43. // 初始化DAM配置
  44. void DMC_LLL(u32 L_PAdd,u32  PIne,u32 PLeng,          u32 L_MAdd,u32 MInc,u32 MLeng,   u32 L_BufferSize)
  45. {
  46.         DMA_InitTypeDef      DMA_InitStructure;
  47.           RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
  48.         DMA_DeInit(DMA2_Stream1);
  49.         while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}         //等待DMA2_Stream1可配置

  50.   //配置 DMA Stream
  51.   DMA_InitStructure.DMA_Channel  = DMA_Channel_1;   //DCMI_CH1
  52.   DMA_InitStructure.DMA_DIR  = DMA_DIR_PeripheralToMemory;        //外设到内存
  53.   DMA_InitStructure.DMA_BufferSize          = L_BufferSize;         //数据传输量

  54.         DMA_InitStructure.DMA_PeripheralBaseAddr  = L_PAdd; //外设地址:
  55.   DMA_InitStructure.DMA_PeripheralInc = PIne;         //外设非增量模式 DMA_PeripheralInc_Disable
  56.   DMA_InitStructure.DMA_PeripheralDataSize         = PLeng;         //外设数据长度:32bit                DMA_PeripheralDataSize_Word
  57.   DMA_InitStructure.DMA_PeripheralBurst                 = DMA_PeripheralBurst_Single;        //外设突发单次传输
  58.                
  59.   DMA_InitStructure.DMA_Memory0BaseAddr  = L_MAdd;         //内存地址 //(u32)&MAdd
  60.   DMA_InitStructure.DMA_MemoryInc          = MInc;                 //内存增量模式                DMA_MemoryInc
  61.   DMA_InitStructure.DMA_MemoryDataSize          = MLeng;         //内存数据长度
  62.   DMA_InitStructure.DMA_MemoryBurst  = DMA_MemoryBurst_Single;         //内存突发单次传输
  63.                
  64.   DMA_InitStructure.DMA_Mode  = DMA_Mode_Circular;         //使用循环模式(不停地传送,并非一行一行的传送)
  65.   DMA_InitStructure.DMA_Priority  = DMA_Priority_High;                                        //高优先级
  66.   DMA_InitStructure.DMA_FIFOMode  = DMA_FIFOMode_Enable;                                //FIFO模式        
  67.   DMA_InitStructure.DMA_FIFOThreshold  = DMA_FIFOThreshold_Full;                        //使用全FIFO
  68.       
  69.   DMA_Init(DMA2_Stream1, &DMA_InitStructure);         //初始化DMA Stream
  70. //DMA_ITConfig(DMA2_Stream1, DMA_IT_TC, ENABLE); //DMA发送完成中断使能函数