/********************************************************* * 函数名:BSP_LCD_Init() * 描述 : * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **********************************************************/ void BSP_LCD_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; FMC_NORSRAM_TimingTypeDef FMC_NORSRAM_TimingWrite; //写时序 FMC_NORSRAM_TimingTypeDef FMC_NORSRAM_TimingRead; //读时序 __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟 GPIO_InitStruct.Pin=GPIO_PIN_5; //PB5,背光控制 GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出 GPIO_InitStruct.Pull=GPIO_PULLUP; //上拉 GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; //高速 HAL_GPIO_Init(GPIOB,&GPIO_InitStruct); BSP_LCD_MPU_Config(); SRAM_Handle.Instance=FMC_NORSRAM_DEVICE; SRAM_Handle.Extended=FMC_NORSRAM_EXTENDED_DEVICE; SRAM_Handle.Init.NSBank=FMC_NORSRAM_BANK1; //使用NE1 SRAM_Handle.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE; //不复用数据线 SRAM_Handle.Init.MemoryType=FMC_MEMORY_TYPE_SRAM; //SRAM SRAM_Handle.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_16; //16位数据宽度 SRAM_Handle.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE; //存储器写使能 SRAM_Handle.Init.ExtendedMode=FMC_EXTENDED_MODE_ENABLE; //读写使用不一样的时序 //FSMC读时序控制寄存器 FMC_NORSRAM_TimingRead.AddressSetupTime=15; //地址创建时间(ADDSET)为15个HCLK 1/216M=4.6ns*15=69ns FMC_NORSRAM_TimingRead.AddressHoldTime=0x00; FMC_NORSRAM_TimingRead.DataSetupTime=80; //数据保存时间(DATAST)为85个HCLK =4.6*80=368ns FMC_NORSRAM_TimingRead.AccessMode=FMC_ACCESS_MODE_A; //模式A //FSMC写时序控制寄存器 FMC_NORSRAM_TimingWrite.AddressSetupTime=15; //地址创建时间(ADDSET)为15个HCLK=69ns FMC_NORSRAM_TimingWrite.AddressHoldTime=0x00; FMC_NORSRAM_TimingWrite.DataSetupTime=15; //数据保存时间(DATAST)为4.6ns*15个HCLK=69ns FMC_NORSRAM_TimingWrite.AccessMode=FMC_ACCESS_MODE_A; //模式A HAL_SRAM_Init(&SRAM_Handle,&FMC_NORSRAM_TimingRead,&FMC_NORSRAM_TimingWrite); delay_ms(50); // delay 50 ms BSP_LCD_InitID(); //芯片指令初始化; BSP_LCD_Display_Dir(0); //默认为竖屏 BSP_LCD_BL_LED(1); //点亮背光 BSP_LCD_Clear(RED); //清屏 }
/********************************************************* * 函数名:BSP_LCD_Fast_DrawPoint(u16 x,u16 y,u32 color) * 描述 :将X,Y坐标的颜色,设置成color所表示的颜色值; * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **********************************************************/ void BSP_LCD_Fast_DrawPoint(u16 x,u16 y,u32 color) { if(BSP_LCD_InitStructure.id==0X5310) { BSP_LCD_WR_REG(BSP_LCD_InitStructure.setxcmd); BSP_LCD_WR_DATA(x>>8); BSP_LCD_WR_DATA(x&0XFF); BSP_LCD_WR_REG(BSP_LCD_InitStructure.setycmd); BSP_LCD_WR_DATA(y>>8); BSP_LCD_WR_DATA(y&0XFF); } BSP_LCD->LCD_REG=BSP_LCD_InitStructure.gramcmd; BSP_LCD->LCD_RAM=color; }
/********************************************************* * 函数名:BSP_LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u32 color) * 描述 :在指定区域内填充成指定的color颜色, (sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1); * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **********************************************************/ void BSP_LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u32 color) { u16 i,j; u16 xlen=0; xlen=ex-sx+1; for(i=sy;i<=ey;i++) { BSP_LCD_SetCursor(sx,i); //设置光标位置 BSP_LCD_WriteRAM_Prepare(); //开始写入GRAM for(j=0;j<xlen;j++) BSP_LCD->LCD_RAM=color; //显示颜色 } }
/********************************************************* * 函数名:BSP_LCD_ReadPoint(u16 x,u16 y) * 描述 :读取X,Y坐标的颜色,并返回; * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **********************************************************/ u32 BSP_LCD_ReadPoint(u16 x,u16 y) { u16 r=0,g=0,b=0; if(x>=BSP_LCD_InitStructure.width||y>=BSP_LCD_InitStructure.height) return 0; //超过了范围,直接返回 BSP_LCD_SetCursor(x,y); if(BSP_LCD_InitStructure.id==0X5310) BSP_LCD_WR_REG(0X2E);// 发送读GRAM指令 r=BSP_LCD_RD_DATA(); //dummy Read __NOP();__NOP();__NOP(); //NT35510要分2次读出 r=BSP_LCD_RD_DATA(); //实际坐标颜色 __NOP();__NOP();__NOP(); b=BSP_LCD_RD_DATA(); g=r&0XFF; //对于9341/5310/5510,第一次读取的是RG的值,R在前,G在后,各占8位 g<<=8; return (((r>>11)<<11)|((g>>10)<<5)|(b>>11)); //ILI9341/NT35310/NT35510须要公式转换一下 }