STM32
直播中

王燕

7年用户 1752经验值
私信 关注
[问答]

FSMC模拟8080刷OLED从F1移植到F4后无法使用怎么解决?

1、STM32F103ZET6上配置的FSMC模拟8080用于刷新OLED(256*64),使用正常;2、移植至STM32F412RET6后无法使用,时钟、复用、FSMC均已配置,使用NE4、A0,配置写入命令地址为0x6C00000,写入数据地址为0x6C000001;错误现象为:①屏幕显示现象为雪花屏②用逻辑分析仪测得D0-D3数据线无信号输出,仅有高电平。配置已检查过多遍,麻烦各位给一些思路解决一下这个问题,感谢!
代码如下:
/**                        RS(DC)——A0——PC3                RD——FSMC_NOE——PC5*                        WR——FSMC_NWE——PC2        D0——FSMC_D0——PB14*                        D1——FSMC_D1——PC6         D2——FSMC_D2——PC11*                        D3——FSMC_D3——PC12        D4——FSMC_D4——PA2*                        D5——FSMC_D5——PA3                D6——FSMC_D6——PA4*                        D7——FSMC_D7——PA5         CS——FSMC_NE4——PC4*                        RESET——PB13*//*******************************************************************************@name    :InitOLED@brief   :按键初始化@param   :None@return  :None*******************************************************************************/void InitOLED (void){        GPIO_InitTypeDef GPIO_InitStructure;               /*GPIOA、B、C时钟使能*/        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);               /*WR、RS、CS、RD、D1、D2、D3推挽复用输出*/        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_11|GPIO_Pin_12;        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;        GPIO_Init(GPIOC,  GPIO_InitStructure);               /*D0推挽复用输出*/        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;        GPIO_Init(GPIOB,  GPIO_InitStructure);               /*D4、D5、D6、D7推挽复用输出*/        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;        GPIO_Init(GPIOA,  GPIO_InitStructure);               GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_FSMC);        GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_FSMC);        GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_FSMC);        GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_FSMC);        GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_FSMC);        GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_FSMC);        GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_FSMC);        GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_FSMC);        GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_FSMC);        GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_FSMC);        GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_FSMC);        GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_FSMC);               /*RESET推挽输出*/        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13;        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;        GPIO_Init(GPIOB,  GPIO_InitStructure);                      InitFSMC();}void InitFSMC(void){        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;        FSMC_NORSRAMtimingInitTypeDef  readWriteTiming;        FSMC_NORSRAMTimingInitTypeDef  writeTiming;               /*FSMC时钟使能*/        RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);               /*读时序设置*/        readWriteTiming.FSMC_AddressSetupTime = 0x01;        readWriteTiming.FSMC_AddressHoldTime = 0x00;        readWriteTiming.FSMC_DataSetupTime = 0x02;        readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;        readWriteTiming.FSMC_CLKDivision = 0x00;        readWriteTiming.FSMC_DataLatency = 0x00;        readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;        /*写时序设置*/        writeTiming.FSMC_AddressSetupTime = 0x01;        writeTiming.FSMC_AddressHoldTime = 0x00;                       writeTiming.FSMC_DataSetupTime = 0x02;        writeTiming.FSMC_BusTurnAroundDuration = 0x00;        writeTiming.FSMC_CLKDivision = 0x00;        writeTiming.FSMC_DataLatency = 0x00;        writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;        FSMC_NORSRAMInitStructure.FSMC_Bank                  = FSMC_Bank1_NORSRAM4;                 //使用NE4        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux        = FSMC_DataAddressMux_Disable;         //不复用数据地址        FSMC_NORSRAMInitStructure.FSMC_MemoryType            = FSMC_MemoryType_SRAM;                // FSMC_MemoryType_SRAM;          FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth       = FSMC_MemoryDataWidth_8b;             //存储器数据宽度为8bit           FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Disable;        // FSMC_BurstAccessMode_Disable;        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_Low;        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait      = FSMC_AsynchronousWait_Disable;        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_Enable;             //读写使用不同的时序        FSMC_NORSRAMInitStructure.FSMC_WriteBurst            = FSMC_WriteBurst_Disable;        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct =  readWriteTiming;                     //读写时序        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct     =  writeTiming;                         //写时序        FSMC_NORSRAMInit( FSMC_NORSRAMInitStructure);                                                //初始化FSMC配置        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);                                                //使能BANK1}/*******************************************************************************@name    :Write_cmd@brief   :SPI写入命令函数@param   :None@return  :None*******************************************************************************/void Write_cmd(u8 data){        data=data;        * (__IO u8 *)(FSMC_ADDR_CMD) = data;}/*******************************************************************************@name    :Write_Data@brief   :SPI写入数据函数@param   :None@return  :None*******************************************************************************/void Write_Data(u8 data){        data=data;        * (__IO u8 *)(FSMC_ADDR_DATA) = data;}#define FSMC_ADDR_DATA            ((u32) 0x6C000000 | (1<<0))#define FSMC_ADDR_CMD                 ((u32) 0x6C000000)


回帖(1)

王芳

2024-3-19 17:56:01
但以下是一些常见的问题和解决思路,您可以尝试一下:

1. 确保FSMC时钟源配置正确:如果您的代码中没有提供时钟配置的部分,可以确保FSMC时钟源配置为HCLK时钟,并且对应的GPIO时钟也已经配置。

2. 确保FSMC引脚配置正确:请再次检查你的引脚配置,确保D0-D3引脚配置为AF推挽输出模式,并且使用GPIO_Init函数进行了正确的初始化。

3. 确保写入地址的配置正确:请确保写入命令和数据的地址是正确的,以免写入到错误的地址上。

4. 确保正确发送命令和数据:请检查你的写入函数,确保命令和数据是按照正确的时序和顺序发送的。

5. 根据你的描述,你的屏幕显示现象为雪花屏,可以尝试增加一个延迟函数,看是否能够解决。因为可能是数据发送速度过快导致的问题,增加延迟可以测试一下。

6. 对比F1和F4的FSMC配置:再次对比你的F1和F4的FSMC配置,确保配置没有遗漏或错误。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分