Arduion下使用stm32显示屏
Arduion挺好用的,stm32功能挺强大,arduion IDE也支持stm32了
手头有一块STM32F103VET的开发板,带2.4寸的TFT,显示屏使用ILI9325的驱动,触膜屏使用的是SPI接口, 但是arduion下没有对应的驱动; 只能自己改改了,如果你的板子的连线跟我的一样,你可以直接使用这个程序;或是只要稍修改下就能放到你自己中使用
显示屏-篇
Arduion下使用stm32可以参考:
http://bbs.mydigit.cn/read.php?tid=2168292
1.硬件连线:(不用管一般开发板上都已经连好了)LCD使用fsmc接口来实现;
FSMC_D0---FSMC_D15 和LCD 的DB1-DB8 DB10-DB17 相互连接
FSMC_A16(P58)作为LCD 的RS 选择(注意这里,将导致使用的地址不同,使用A16将导致我的基地址变为:0x60020000
2.软件-寄存器操作:(主要将寄存器的操作函数LCD_WR_REG,LCD_WR_CMD,LCD_WR_Data,LCD_WR_Data_8 (完成,和后面的FSMC初始化完成;后面的ILI9325的相关函数可直接复制原STM32中的函数)
//lcd_reg.h文件
#define Bank1_LCD_D ((uint32_t)0x60020000) //disp Data ADDR
#define Bank1_LCD_C ((uint32_t)0x60000000) //disp Reg ADDR
#define __IO volatile
void LCD_WR_REG(unsigned int index);
void LCD_WR_CMD(unsigned int index,unsigned int val);
void LCD_WR_Data(unsigned int val);
void LCD_WR_Data_8(unsigned int val);
//写寄存器地址函数
void LCD_WR_REG(unsigned int index)
{
*(__IO uint16_t *) (Bank1_LCD_C)= index;
}
//写寄存器数据函数
//输入:dbw 数据位数,1为16位,0为8位。
void LCD_WR_CMD(unsigned int index,unsigned int val)
{
*(__IO uint16_t *) (Bank1_LCD_C)= index;
*(__IO uint16_t *) (Bank1_LCD_D)= val;
}
unsigned int LCD_RD_data(void){
unsigned int a=0;
a=(*(__IO uint16_t *) (Bank1_LCD_D)); //Dummy
//a= *(__IO uint16_t *) (Bank1_LCD_D); //H
//a=a<<8;
a=*(__IO uint16_t *) (Bank1_LCD_D); //L
return(a);
}
//写16位数据函数
void LCD_WR_Data(unsigned int val)
{
*(__IO uint16_t *) (Bank1_LCD_D)= val;
}
void LCD_WR_Data_8(unsigned int val)
{
*(__IO uint16_t *) (Bank1_LCD_D)= val;
}
3.FSMC设置(可复制原STM32中触摸屏
void STM_FSMC_LCD_TimeSet(uint8_t _as, uint8_t _ds)
{
FSMC_NORSRAM_TimingTypeDef Timing;
GPIO_InitTypeDef GPIO_InitStruct;
/* USER CODE BEGIN FSMC_MspInit 0 */
/* USER CODE END FSMC_MspInit 0 */
if (FSMC_Initialized == 0) {
FSMC_Initialized = 1;
/* Peripheral clock enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_FSMC_CLK_ENABLE();
/** FSMC GPIO Configuration
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
PD13 ------> FSMC_A16
PD14 ------> FSMC_D0
PD15 ------> FSMC_D1
PD0 ------> FSMC_D2
PD1 ------> FSMC_D3
PD4 ------> FSMC_NOE
PD5 ------> FSMC_NWE
PD7 ------> FSMC_NE1
*/
//-----------------------------GPI0E===================================
GPIO_InitStruct.Pin = GPIO_PIN_0;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); //LCD BACKLIGHT
GPIO_InitStruct.Pin = GPIO_PIN_1;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); //LCD-RST
//-----------FMSC
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.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
//------------------------------GPIOD-------------------
GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_6 | GPIO_PIN_3;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); //LCD BACKLIGHT
/* NE1 configuration */
GPIO_InitStruct.Pin = GPIO_PIN_7;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); //RS
//-----------FMSC
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1 |GPIO_PIN_4|GPIO_PIN_5
|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
//====================================SET*************************
digitalWrite(PD7 | PD14 | PD15 | PD0 | PD1, HIGH);
digitalWrite(PE7 | PE8 | PE9 | PE10, HIGH);
digitalWrite(PE0 | PE1, LOW);
digitalWrite(PD4|PD5, HIGH);
//GPIO_SetBits(GPIOD, GPIO_Pin_7); //CS=1
//GPIO_SetBits(GPIOD, GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_0 | GPIO_Pin_1); //�?�?
//GPIO_SetBits(GPIOE, GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10); //�?�?
//GPIO_ResetBits(GPIOE, GPIO_Pin_0);
//GPIO_ResetBits(GPIOE, GPIO_Pin_1); //RESET=0
//GPIO_SetBits(GPIOD, GPIO_Pin_4); //RD=1
//GPIO_SetBits(GPIOD, GPIO_Pin_5); //WR=1
// GPIO_SetBits(GPIOD, GPIO_Pin_13); //LIGHT
//GPIO_SetBits(GPIOD, GPIO_Pin_11); //RS
}
/** Perform the SRAM1 memory initialization sequence
*/
fsmcLcdHandle.Instance = FSMC_NORSRAM_DEVICE;
fsmcLcdHandle.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
/* fsmcLcdHandle.Init */
fsmcLcdHandle.Init.NSBank = FSMC_NORSRAM_BANK1;
fsmcLcdHandle.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
fsmcLcdHandle.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
fsmcLcdHandle.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
fsmcLcdHandle.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
fsmcLcdHandle.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
fsmcLcdHandle.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
fsmcLcdHandle.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
fsmcLcdHandle.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
fsmcLcdHandle.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
fsmcLcdHandle.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
fsmcLcdHandle.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
fsmcLcdHandle.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
/* Timing LCD device configuration
*SPFD5420A
*AddressSetupTime 10 ns
*DataSetupTime 25 ns
*/
//for spfd5420, other must fixed!
Timing.AddressSetupTime = _as/14; // 14ns(1/72M)*1(HCLK) = 14ns
Timing.AddressHoldTime = 0; // FSMC_ACCESS_MODE_A unused
Timing.DataSetupTime = _ds/14; // 14ns(1/72M)*2(HCLK) = 28ns
Timing.BusTurnAroundDuration = 0;
Timing.CLKDivision = 0;
Timing.DataLatency = 0;
Timing.AccessMode = FSMC_ACCESS_MODE_A;
/* ExtTiming */
if (HAL_SRAM_Init(&fsmcLcdHandle, &Timing, NULL) != HAL_OK)
{
// _Error_Handler(__FILE__, __LINE__);
}
/** Disconnect NADV
*/
__HAL_AFIO_FSMCNADV_DISCONNECTED();
}
4.IL9325的初始化、清屏、画点(上面的寄存器函数完成后,可直接复制stm32未例中的il9325的代码)
正常情况下就可以显示了
代码地址:https://download.csdn.net/download/qq_39239990/10637937