18 KiB
SDRAM Cubemx分配的IO和 BSP一致
野火429的操作
Cubemx SDRAM1 4bank 13 16bit 16-enabled
PC0 FMC_SDNWE n/a Alternate Function Push Pull
PD0 FMC_D2 n/a Alternate Function Push Pull PD1 FMC_D3 n/a Alternate Function Push Pull PD8 FMC_D13 n/a Alternate Function Push Pull PD9 FMC_D14 n/a Alternate Function Push Pull PD10 FMC_D15 n/a Alternate Function Push Pull PD14 FMC_D0 n/a Alternate Function Push Pull PD15 FMC_D1 n/a Alternate Function Push Pull
PE0 FMC_NBL0 n/a Alternate Function Push Pull PE1 FMC_NBL1 n/a Alternate Function Push Pull PE7 FMC_D4 n/a Alternate Function Push Pull PE8 FMC_D5 n/a Alternate Function Push Pull PE9 FMC_D6 n/a Alternate Function Push Pull PE10 FMC_D7 n/a Alternate Function Push Pull PE11 FMC_D8 n/a Alternate Function Push Pull PE12 FMC_D9 n/a Alternate Function Push Pull PE13 FMC_D10 n/a Alternate Function Push Pull PE14 FMC_D11 n/a Alternate Function Push Pull PE15 FMC_D12 n/a Alternate Function Push Pull
PF0 FMC_A0 n/a Alternate Function Push Pull PF1 FMC_A1 n/a Alternate Function Push Pull PF2 FMC_A2 n/a Alternate Function Push Pull PF3 FMC_A3 n/a Alternate Function Push Pull PF4 FMC_A4 n/a Alternate Function Push Pull PF5 FMC_A5 n/a Alternate Function Push Pull
PF11 FMC_SDNRAS n/a Alternate Function Push Pull PF12 FMC_A6 n/a Alternate Function Push Pull PF13 FMC_A7 n/a Alternate Function Push Pull PF14 FMC_A8 n/a Alternate Function Push Pull PF15 FMC_A9 n/a Alternate Function Push Pull
PG0 FMC_A10 n/a Alternate Function Push Pull PG1 FMC_A11 n/a Alternate Function Push Pull
PG2 FMC_A12 n/a Alternate Function Push Pull PG4 FMC_BA0 n/a Alternate Function Push Pull PG5 FMC_BA1 n/a Alternate Function Push Pull PG8 FMC_SDCLK n/a Alternate Function Push Pull PG15 FMC_SDNCAS n/a Alternate Function Push Pull
PH6 FMC_SDNE1 n/a Alternate Function Push Pull PH7 FMC_SDCKE1 n/a Alternate Function Push Pull
左对齐 | Port | Port_pin ---> Fmc_pin |
---|---|---|
FMC_A0_GPIO_PORT | GPIOF | PF0 ------> FMC_A0 |
FMC_A1_GPIO_PORT | GPIOF | PF1 ------> FMC_A1 |
FMC_A2_GPIO_PORT | GPIOF | |
FMC_A3_GPIO_PORT | GPIOF | PF3 ------> FMC_A3 |
FMC_A4_GPIO_PORT | GPIOF | PF4 ------> FMC_A4 |
FMC_A5_GPIO_PORT | GPIOF | PF5 ------> FMC_A5 |
FMC_A6_GPIO_PORT | GPIOF | PF12 ------> FMC_A6 |
FMC_A7_GPIO_PORT | GPIOF | PF13 ------> FMC_A7 |
FMC_A8_GPIO_PORT | GPIOF | PF14 ------> FMC_A8 |
FMC_A9_GPIO_PORT | GPIOF | PF15 ------> FMC_A9 |
FMC_A10_GPIO_PORT | GPIOG | PG0 ------> FMC_A10 |
FMC_A11_GPIO_PORT | GPIOG | PG1 ------> FMC_A11 |
FMC_A12_GPIO_PORT | GPIOG | PG2 ------> FMC_A12 |
FMC_D0_GPIO_PORT | GPIOD | PD14 ------> FMC_D0 |
FMC_D1_GPIO_PORT | GPIOD | PD15 ------> FMC_D1 |
FMC_D2_GPIO_PORT | GPIOD | PD0 ------> FMC_D2 |
FMC_D3_GPIO_PORT | GPIOD | PD1 ------> FMC_D3 |
FMC_D4_GPIO_PORT | GPIOE | PE7 ------> FMC_D4 |
FMC_D5_GPIO_PORT | GPIOE | PE8 ------> FMC_D5 |
FMC_D6_GPIO_PORT | GPIOE | PE9 ------> FMC_D6 |
FMC_D7_GPIO_PORT | GPIOE | PE10 ------> FMC_D7 |
FMC_D8_GPIO_PORT | GPIOE | PE11 ------> FMC_D8 |
FMC_D9_GPIO_PORT | GPIOE | PE12 ------> FMC_D9 |
FMC_D10_GPIO_PORT | GPIOE | PE13 ------> FMC_D10 |
FMC_D11_GPIO_PORT | GPIOE | PE14 ------> FMC_D11 |
FMC_D12_GPIO_PORT | GPIOE | PE15 ------> FMC_D12 |
FMC_D13_GPIO_PORT | GPIOD | PD8 ------> FMC_D13 |
FMC_D14_GPIO_PORT | GPIOD | PD9 ------> FMC_D14 |
FMC_D15_GPIO_PORT | GPIOD | PD10 ------> FMC_D15 |
FMC_CS_GPIO_PORT | GPIOH | PH6 ------> FMC_SDNE1 CS |
FMC_BA0_GPIO_PORT | GPIOG | PG4 ------> FMC_BA0 |
FMC_BA1_GPIO_PORT | GPIOG | PG5 ------> FMC_BA1 |
FMC_WE_GPIO_PORT | GPIOC | *PC0 ------> FMC_SDNWE WE |
FMC_RAS_GPIO_PORT | GPIOF | PF11 ------> FMC_SDNRAS |
FMC_CAS_GPIO_PORT | GPIOG | PG15 ------> FMC_SDNCAS |
FMC_CLK_GPIO_PORT | GPIOG | PG8 ------> FMC_SDCLK |
FMC_CKE_GPIO_PORT | GPIOH | PH7 ------> FMC_SDCKE1 |
FMC_UDQM_GPIO_PORT | GPIOE | PE0 ------> FMC_NBL0 UDQM |
FMC_LDQM_GPIO_PORT | GPIOE | PE1 ------> FMC_NBL1 LDQM |
nandflash
由于公用数据线
Cubemx 启用Nandflash2, 无法设置参数
自己 bsp_nand, 重新设置参数初始化 控制 IO, 需要自己初始化
// IO : PB13 R/B, PG9 CE, PD4 PD5 PD11 PD12 static void HAL_NAND_MspInit_Control_IO(NAND_HandleTypeDef *hnand)
Malloc
内存分配 FTL 可能用到
需要设置 LD
.sdram (NOLOAD) :
{
. = ALIGN(4);
_sdram_begin = .;
*(.sdram)
*(.sdram*)
. = ALIGN(4);
_sdram_end = .;
} >SDRAM
.sdrammap (NOLOAD) :
{
. = ALIGN(4);
__sdrammap_begin = .;
*(.sdrammap)
*(.sdrammap*)
. = ALIGN(4);
__sdrammap_end = .;
} >SDRAMMAP
FTL
直接整合到 nand Flash? 直接分配系统内存,就2-3k大小
DMA2D启用
ARGB8888
LTDC
只能选 RGB565 屏rgb888 16.7 兼容 rgb565 touch GT911
Cubemx 改不了hbp vbp 的值,需重新初始化去修改
每层的格式为 ARGB8888
****Cubemx 的配置如下, 只有RGB565的配置, 没有RGB888需要的IO配置 ****
添加背光 D7 LTDC_BL
LTDC_B4 PG12 -- PI4 , cubemx 改 PI4 LTDC_B4
|LTDC_R0 |LTDC_R1 |LTDC_R2
|H2 |H3 |H8
|LTDC_G0 |LTDC_G1 |
|E5 |E6 |
|LTDC_B0 |LTDC_B1 |LTDC_B2
E4 G12 D6 (D6 可能被 NAND2 的Nowait 占用)
所有IO 推挽 上拉 VeryHigh
LTDC GPIO Configuration PI9 ------> LTDC_VSYNC PI10 ------> LTDC_HSYNC PF10 ------> LTDC_DE PA3 ------> LTDC_B5 PB0 ------> LTDC_R3 PB1 ------> LTDC_R6 PG6 ------> LTDC_R7 PG7 ------> LTDC_CLK PC7 ------> LTDC_G6 PA11 ------> LTDC_R4 PA12 ------> LTDC_R5 PH13 ------> LTDC_G2 PH15 ------> LTDC_G4 PI0 ------> LTDC_G5 PI2 ------> LTDC_G7 PG10 ------> LTDC_G3 PG11 ------> LTDC_B3 PG12 ------> LTDC_B4 PB8 ------> LTDC_B6 PB9 ------> LTDC_B7
PI9 PI10 PI0 PI2
PF10
PA3 PA11 PA12
PB0 PB1 PB8 PB9
PG6 PG7 PG11 PG10 PG12
PC7
PH13 PH15
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_0|GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF9_LTDC;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF9_LTDC;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
基本参考正点原子,原子的hsw 这些的定义有些问题
GT911 驱动
可以参考下野火的 ,有软件IIC 有硬件IIC。 但是野火的软件IIC 有点问题
硬件iic 可以设置一个值,让前端去轮询, 轮询到执行 Scan 获得坐标
可以参考
https://blog.csdn.net/weixin_38411122/article/details/129241223
https://github.com/oy2n/stm32cube-gt911-dma
touch 可以识别到触点了
字体 中文 图片
Display_char 有点问题
nandFlash NorFlash USB虚拟U盘
spiFlash 分区, 配置写入分区 自己定义在FATFS目录下的文件, 没有被编译 需要改写 user 文件
FATFS 修改
- FATFS/target 目录, 添加 nand_diskio.c nand_diskio.h
- FATFS/APP/fatfs.h 引入 nand_diskio.h
- FATFS.c MX_FATFS_Init 修改 引入驱动 引入flash Driver的定义
uint8_t retUSER; /* Return value for USER */
char USERPath[4]; /* USER logical drive path */
FATFS USERFatFS; /* File system object for USER logical drive */
FIL USERFile; /* File object for USER */
头文件 extern 出去,供外部引用
在 MX_FATFS_Init 初始化
void MX_FATFS_Init(void)
{
/*## FatFS: Link the SD driver ###########################*/
retSD = FATFS_LinkDriver(&SD_Driver, SDPath);
/*## FatFS: Link the USER driver ###########################*/
retUSER = FATFS_LinkDriver(&USER_Driver, USERPath);
}
FATFS_LinkDriver 来自 Middlewares/Third_Party/FatFs/ff_gen_drv.c
SDPATH UserPath 含有lun 信息, 即盘符 0: 1:
-
ffcong.h 磁盘数量定义 #define _VOLUMES 1
-
Middlewares/Third_Party/FatFs/
添加文件
extern uint8_t retNAND; /* Return value for USER */ extern char NANDPath[4]; /* USER logical drive path */ extern FATFS NANDFatFS; /* File system object for USER logical drive */ extern FIL NANDFile; /* File object for USER */
nand_diskio.h/.c
DSTATUS SPIFlash_initialize (BYTE pdrv);
DSTATUS SPIFlash_status (BYTE pdrv);
DRESULT SPIFlash_read (BYTE pdrv, BYTE *buff, DWORD sector, UINT count);
#if _USE_WRITE == 1
DRESULT SPIFlash_write (BYTE pdrv, const BYTE *buff, DWORD sector, UINT count);
#endif /* _USE_WRITE == 1 */
#if _USE_IOCTL == 1
DRESULT SPIFlash_ioctl (BYTE pdrv, BYTE cmd, void *buff);
#endif /* _USE_IOCTL == 1 */
Diskio_drvTypeDef SPIFlash_Driver =
{
SPIFlash_initialize,
SPIFlash_status,
SPIFlash_read,
#if _USE_WRITE
SPIFlash_write,
#endif /* _USE_WRITE == 1 */
#if _USE_IOCTL == 1
SPIFlash_ioctl,
#endif /* _USE_IOCTL == 1 */
};
DSTATUS SPIFlash_initialize (BYTE pdrv )
{
Stat = STA_NOINIT;
return Stat;
}
DSTATUS SPIFlash_status (BYTE pdrv )
{
Stat = STA_NOINIT;
return Stat;
}
DRESULT SPIFlash_read (BYTE pdrv, BYTE *buff, DWORD sector, UINT count )
{
return RES_OK;
}
#if _USE_WRITE == 1
DRESULT SPIFlash_write (BYTE pdrv, const BYTE *buff, DWORD sector,UINT count)
{
return RES_OK;
}
#endif
#if _USE_IOCTL == 1
DRESULT SPIFlash_ioctl (BYTE pdrv, BYTE cmd, void *buff )
{
DRESULT res = RES_ERROR;
return res;
}
#endif
前面调用 spiflash
FATFS fs; /* FatFs文件系统对象 */
FIL fnew; /* 文件对象 */
FRESULT res_flash; /* 文件操作结果 */
UINT fnum; /* 文件成功读写数量 */
BYTE ReadBuffer[1024]={0}; /* 读缓冲区 */
BYTE WriteBuffer[] = "这是一个测试程序\r\n";
// /* 挂载外部flash */
res_flash = f_mount(&fs,"0:",1);
log_i(" mout res %d \r\n",res_flash);
// /* 如果没有文件系统就格式化创建创建文件系统 */
if(res_flash == FR_NO_FILESYSTEM)
{
log_i("fmount no file system");
/* 格式化 */
res_flash=f_mkfs("0:",FM_ANY,0,MyBuffer,4096); // FM_ANY 不能为0
log_i(" mkfs %d \r\n",res_flash);
if(res_flash == FR_OK)
{
/* 格式化后,先取消挂载 */
res_flash = f_mount(NULL,"0:",1);
/* 重新挂载 */
res_flash = f_mount(&fs,"0:",1);
log_i("fmount OK.. %d", res_flash);
}
else
{
/* 红灯常亮 */
log_i(" format failure ...res : %d ",res_flash);
}
/* 绿灯常亮 */
// HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, 0);
}
else if(res_flash != FR_OK)
{
/* 红灯常亮 */
log_i("fmount failure");
}
/* 打开文件,如果没有文件就创建 */
res_flash = f_open(&fnew, "0:FatFs.txt", FA_CREATE_ALWAYS | FA_WRITE );
log_i(" f_open %d \r\n",res_flash);
if ( res_flash == FR_OK )
{
/* 将指定存储区内容写入到文件内 */
res_flash = f_write(&fnew,WriteBuffer,sizeof(WriteBuffer),&fnum);
log_i(" f_write %d \r\n",res_flash);
if(res_flash == FR_OK)
{
/* 蓝灯亮 */
log_i("write file success ... ");
}
else
{
/* 不再读写,关闭文件 */
f_close(&fnew);
/* 红灯常亮 */
log_i("write file failure");
}
/* 不再读写,关闭文件 */
f_close(&fnew);
}
else
{
log_i("write file failure ..... ");
}
NANDFLASH 调用FTL的初始化和读写扇区的函数
FATFS fs; /* FatFs文件系统对象 */
FIL fnew; /* 文件对象 */
FRESULT res_flash; /* 文件操作结果 */
UINT fnum; /* 文件成功读写数量 */
BYTE ReadBuffer[1024]={0}; /* 读缓冲区 */
BYTE WriteBuffer[] = "这是一个测试程序\r\n";
// /* 挂载外部flash */
res_flash = f_mount( &fs,"1:",1);
// log_i(" mount res %08X \r\n",NAND_ReadID());
log_i(" mount res %d \r\n", res_flash);
// /* 如果没有文件系统就格式化创建创建文件系统 */
if(res_flash == FR_NO_FILESYSTEM)
{
log_i("fmount no file system");
/* 格式化 */
res_flash=f_mkfs("1:",FM_ANY,0,MyBuffer,_MIN_SS); // FM_ANY 不能为0
if(res_flash == FR_OK)
{
log_i(" mkfs format ok ! " );
// 格式化后,先取消挂载 /
res_flash = f_mount(NULL,"1:",1);
// 重新挂载
res_flash = f_mount(&fs,"1:",1);
log_i("fmount OK.. %d", res_flash);
}
else
{
log_i(" format failure .... %d ",res_flash);
}
}
else if(res_flash != FR_OK)
{
// 红灯常亮
log_i("fmount failure");
}
/* 打开文件,如果没有文件就创建 */
res_flash = f_open(&fnew, "1:FatFs.txt", FA_CREATE_ALWAYS | FA_WRITE );
log_i(" f_open %d \r\n",res_flash);
if ( res_flash == FR_OK )
{
/* 将指定存储区内容写入到文件内 */
res_flash = f_write(&fnew,WriteBuffer,sizeof(WriteBuffer),&fnum);
log_i(" f_write %d \r\n",res_flash);
if(res_flash == FR_OK)
{
/* 蓝灯亮 */
log_i("write file success ... ");
}
else
{
/* 不再读写,关闭文件 */
f_close(&fnew);
/* 红灯常亮 */
log_i("write file failure");
}
/* 不再读写,关闭文件 */
f_close(&fnew);
}
else
{
log_i("write file failure ..... ");
}
USB 虚拟U盘的修改
/USB_DEVICE/App/usbd_storage_if.h /USB_DEVICE/App/usbd_storage_if.c
HS FS 修改盘大小的参数, 读写盘的参数
MX_USB_DEVICE_Init()放任务中
spiFLASH 需要考虑总的扇区的偏离 nandflash 无需去考虑扇区的偏离
#define STORAGE_LUN_NBR 2
#define SPIFLASH_BLK_NBR 0x1700 // 5888*4096 23M, 扣除7M 25M, 扣2M文件系统
#define SPIFLASH_BLK_SIZ 0x1000
#define NANDFLASH_BLK_NBR 0x800000 // 有效扇区? 有效block 952*2048= 0x1DC000, *4 = 0x770000,
#define NANDFLASH_BLK_SIZ 0x0200 // page大小 0x800 2048 byte,还是Sector大小 512 0x200
以上 Flash 只有5.73M ,原因暂未查