初级会员

- 积分
- 191
- 金钱
- 191
- 注册时间
- 2019-5-5
- 在线时间
- 49 小时
|
1金钱
近来要用一块407zgt6板子实现照相机功能,这块板子称为a板,a板自带9341的屏幕。手里有正点原子的407zgt6核心板,屏幕也是9341.问题来了,因为正点原子的板子RS接A6,a板的接A0,所以信心满满的把正点原子照相机例程的#define LCD_BASE ((uint32_t)(0x6C000000|0x0000007e))改为#define LCD_BASE ((uint32_t)(0x6C000000)),烧进去一调试发现屏幕id都读不出来,一直是0.这就开始开始折腾了,试着把address setup和hold date setup都改大还是不行。研究了两天也没有结果。于是又想到用stm32cube来配置一下试试。在生成的工程中添加#define LCD_BASE ((uint32_t)(0x6C000000)) 等语句,下载到a板调试还是读id失败。于是在程序中把LCD_BASE 改为#define LCD_BASE ((uint32_t)(0x6C000000|0x0000007e)),下载到正点原子的407核心板上实验结果也是读id失败。id读出来0xff。接下来就不知道怎么回事了,百度了好久没有收获。看到一个帖子说要开mpu,什么保护单元,要不然定义的外部地址不会生效,可是在stm32cube中找不到可以设置的地方,于是将整点的例程打开,把程序停在读id的地方,打开keil的peripherals,选择core peripherals下边的memory protect unit(MPU),把当前的状态截图。然后在打开cube生成的程序,同样停在读id的位置,再打开mpu对比发现两个程序状态是完全一样的,看来不是这里的问题。这就郁闷了。笨方法,两个程序停在读id的地方,然后在keil中观察fsmc的各个寄存器是否一致。此时发现BTBR4的值不同,很兴奋,觉得找到为题所在了,结果却很打脸,这个寄存器中,数值不同1是因为,cube中配置是我用的address setup holdtime date setup是cube默认的最大值,我的想法是数值大一点,读取速度慢一点,获取兼容性更好一点,等以后可以正常使用了在优化。还有就是原子的例程中 FSMC_ReadWriteTim.CLKDivision=0; FSMC_ReadWriteTim.DataLatency=0; FSMC_ReadWriteTim.BusTurnAroundDuration=0;这三相因为没有用到所以没有赋值,而cube默认的最大值。于是我首先在调试中,在读id位置停下程序,然后把BTBR4的值改为和原子的一样,再读id还是不对。然后不死心的把原子的没有初始化的变量重新赋值,发现还是可以正常使用,然后把cube例程改为和原子的一样还是不能读id。到这里我已经没招可用了。心灰意冷中还把两个程序中液晶用到的fsmc的引脚一个一个对照了一遍,配置完全一样,但是就是读id为0xff。又在本论坛发现读id之前有的程序加上一句LCD_WriteReg(0x0000,0x0001);我加上后还是失败,不过id变成读出来就是0xd3d3.主要部分程序如下,看看那位大神来指导一下
typedef struct
{
volatile uint16_t LCD_REG;
volatile uint16_t LCD_RAM;
} LCD_TypeDef;
#define LCD_BASE ((uint32_t)(0x6C000000|0x0000007e))
#define LCD ((LCD_TypeDef *) LCD_BASE)
void LCD_WR_REG(volatile uint16_t regval)
{
regval=regval;
LCD->LCD_REG=regval;
}
void LCD_WR_DATA(volatile uint16_t data)
{
data=data; //ê1óÃ-O2óÅ»ˉμÄê±oò,±ØDë2åèëμÄÑóê±
LCD->LCD_RAM=data;
}
uint16_t LCD_RD_DATA(void)
{
volatile uint16_t ram; //·àÖ1±»óÅ»ˉ
ram=LCD->LCD_RAM;
return ram;
}
以上代码从原子代码中复制过来的没有改动
/* FSMC initialization function */
static void MX_FSMC_Init(void)
{
FSMC_NORSRAM_TimingTypeDef Timing;
FSMC_NORSRAM_TimingTypeDef ExtTiming;
/** Perform the SRAM4 memory initialization sequence
*/
hsram4.Instance = FSMC_NORSRAM_DEVICE;
hsram4.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
/* hsram4.Init */
hsram4.Init.NSBank = FSMC_NORSRAM_BANK4;
hsram4.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
hsram4.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
hsram4.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
hsram4.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
hsram4.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
hsram4.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
hsram4.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
hsram4.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
hsram4.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
hsram4.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE;
hsram4.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
hsram4.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
hsram4.Init.PageSize = FSMC_PAGE_SIZE_NONE;
/* Timing */
Timing.AddressSetupTime =15;
Timing.AddressHoldTime = 0;
Timing.DataSetupTime = 60;
Timing.BusTurnAroundDuration =0;// 15;
Timing.CLKDivision = 0;//16;
Timing.DataLatency = 0;//17;
Timing.AccessMode = FSMC_ACCESS_MODE_A;
/* ExtTiming */
ExtTiming.AddressSetupTime = 9;//15;
ExtTiming.AddressHoldTime = 0;
ExtTiming.DataSetupTime = 8;//255;
ExtTiming.BusTurnAroundDuration = 0;
ExtTiming.CLKDivision = 0;//16;
ExtTiming.DataLatency = 0;//17;
ExtTiming.AccessMode = FSMC_ACCESS_MODE_A;
if (HAL_SRAM_Init(&hsram4, &Timing, &ExtTiming) != HAL_OK)
{
Error_Handler( );
}
}、这是cube生成的fsmc初始化,俩便有些参数做过调整实验,也没有效果。
static void HAL_FSMC_MspInit(void){
/* USER CODE BEGIN FSMC_MspInit 0 */
/* USER CODE END FSMC_MspInit 0 */
GPIO_InitTypeDef GPIO_InitStruct;
if (FSMC_Initialized) {
return;
}
FSMC_Initialized = 1;
/* Peripheral clock enable */
__HAL_RCC_FSMC_CLK_ENABLE();
/** FSMC GPIO Configuration
PF0 ------> FSMC_A0
PE7 ------> FSMC_D4
PE8 ------> FSMC_D5
PE9 ------> FSMC_D6
PE10 ------> FSMC_D7
PE11 ------> FSMC_D8
PE12 ------> FSMC_D9
PE13 ------> FSMC_D10
PE14 ------> FSMC_D11
PE15 ------> FSMC_D12
PD8 ------> FSMC_D13
PD9 ------> FSMC_D14
PD10 ------> FSMC_D15
PD14 ------> FSMC_D0
PD15 ------> FSMC_D1
PD0 ------> FSMC_D2
PD1 ------> FSMC_D3
PD4 ------> FSMC_NOE
PD5 ------> FSMC_NWE
PG12 ------> FSMC_NE4
*/
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4
|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
/* USER CODE BEGIN FSMC_MspInit 1 */
/* USER CODE END FSMC_MspInit 1 */
}这是fsmc的io初始化,我在里边把A0 A6都使能位地址线了。
现在已经没有思路往下进行了,fsmc的io,fsmc的配置寄存器已经和正点原子例程中完全相同了,就是读不出来id,各位帮忙看看吧,感激不尽!
|
-
|