不含stm32 底层的代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
MyStm32Code/IOC/429_README.md

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 修改

  1. FATFS/target 目录, 添加 nand_diskio.c nand_diskio.h
  2. FATFS/APP/fatfs.h 引入 nand_diskio.h
  3. 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:
  1. ffcong.h 磁盘数量定义 #define _VOLUMES 1

  2. 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 ,原因暂未查

lvgl