void glcd_init_device(void) { /* STM32CubeMX generated code must be called elsewhere*/ #if defined(GLCD_CONTROLLER_ST7565R) /* Initialization for ST7565R controller */ /* Make sure chip is de-selected by default */ GLCD_DESELECT(); glcd_reset(); glcd_ST7565R_init(); #else #error "Controller not supported by STM32F10x" #endif }
void glcd_init(void) { #if defined(GLCD_CONTROLLER_PCD8544) /* Set pin directions */ /* * Set up SPI for AVR8 * Note: AVR's SS pin must be set to output, regardless of whether we * actually use it. This is a requirement of SPI mster mode. */ sbi(DDR(AVR_SS_PORT),AVR_SS_PIN); /* * Set MOSI, Master SS, SCK to output (otherwise SPI won't work) * Must be done even if native SS pin not used */ sbi(DDR(CONTROLLER_MOSI_PORT),CONTROLLER_MOSI_PIN); sbi(DDR(CONTROLLER_SS_PORT),CONTROLLER_SS_PIN); sbi(DDR(CONTROLLER_SCK_PORT),CONTROLLER_SCK_PIN); /* Set SS, DC and RST pins to output */ sbi( DDR(CONTROLLER_SS_PORT), CONTROLLER_SS_PIN ); sbi( DDR(CONTROLLER_DC_PORT), CONTROLLER_DC_PIN ); sbi( DDR(CONTROLLER_RST_PORT), CONTROLLER_RST_PIN ); /* Deselect LCD */ GLCD_DESELECT(); /* * Max allowed SPI clock is 4 MHz from datasheet. * Enable SPI, set master mode and clock rate to /4 (4MHz with F_CPU=8MHz) */ SPCR = (1<<SPE)|(1<<MSTR); SPSR = 0; glcd_PCD8544_init(); /* Select screen buffer */ glcd_select_screen(glcd_buffer,&glcd_bbox); /* Clear screen, we are now ready to go */ glcd_clear(); #elif defined(GLCD_CONTROLLER_ST7565R) /* Set up GPIO directions */ /* * Set up SPI for AVR8 * Note: AVR's SS pin must be set to output, regardless of whether we * actually use it. This is a requirement of SPI mster mode. */ sbi(DDR(AVR_SS_PORT),AVR_SS_PIN); /* Set SCK and MOSI as output */ sbi(DDR(CONTROLLER_SCK_PORT),CONTROLLER_SCK_PIN); sbi(DDR(CONTROLLER_MOSI_PORT),CONTROLLER_MOSI_PIN); /* * Set MISO as input with pullup. This needs to be set for * SPI to work, even though we never use or read it. */ cbi(DDR(CONTROLLER_MISO_PORT),CONTROLLER_MISO_PIN); // B3 MISO as input sbi(CONTROLLER_MISO_PORT,CONTROLLER_MISO_PIN); /* Set pin to controller SS as output */ sbi(DDR(CONTROLLER_SS_PORT),CONTROLLER_SS_PIN); // A5 /* Set LCD A0 pin as output */ sbi(DDR(CONTROLLER_A0_PORT),CONTROLLER_A0_PIN); // A6 /* Init SS pin high (i.e LCD deselected) */ sbi(CONTROLLER_SS_PORT,CONTROLLER_SS_PIN); /* Deselect LCD */ GLCD_DESELECT(); /* MSB first, double speed, SPI mode 0 */ SPCR = (1<<SPE) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA); sbi(SPSR,SPI2X); /* Enable interrupts */ sei(); delay_ms(30); /* Example in datasheet does this (20ms) */ glcd_ST7565R_init(); glcd_all_on(); delay_ms(500); glcd_normal(); glcd_set_start_line(0); glcd_clear_now(); glcd_select_screen(glcd_buffer,&glcd_bbox); glcd_clear(); #else #error "Controller not supported" #endif /* GLCD_CONTROLLER_* */ }
void glcd_init(void) { /* Initialization of device */ /* Declare GPIO and SPI init structures */ GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; /* Configuring CS, DC (A0) and RST pin */ /* Peripheral clock init. */ RCC_AHB1PeriphClockCmd(CONTROLLER_SPI_DC_RCC | CONTROLLER_SPI_SS_RCC | \ CONTROLLER_SPI_RST_RCC, ENABLE); /* CS pin */ GPIO_InitStructure.GPIO_Pin = CONTROLLER_SPI_SS_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_Init(CONTROLLER_SPI_SS_PORT, &GPIO_InitStructure); /* DC (A0) pin */ GPIO_InitStructure.GPIO_Pin = CONTROLLER_SPI_DC_PIN; GPIO_Init(CONTROLLER_SPI_DC_PORT, &GPIO_InitStructure); /* RST pin */ GPIO_InitStructure.GPIO_Pin = CONTROLLER_SPI_RST_PIN; GPIO_Init(CONTROLLER_SPI_RST_PORT, &GPIO_InitStructure); /* Make sure chip is de-selected by default */ GLCD_DESELECT(); /* * Configuring SPI: */ /* Enable the SPI clock */ SPIx_CLK_INIT(SPIx_CLK, ENABLE); /* Enable SPI GPIO clocks */ RCC_AHB1PeriphClockCmd(SPIx_SCK_GPIO_CLK | SPIx_MOSI_GPIO_CLK, ENABLE); /* Connect SPI pins to the corresponding alternate function */ GPIO_PinAFConfig(SPIx_SCK_GPIO_PORT, SPIx_SCK_SOURCE, SPIx_SCK_AF); GPIO_PinAFConfig(SPIx_MOSI_GPIO_PORT, SPIx_MOSI_SOURCE, SPIx_MOSI_AF); // GPIO_PinAFConfig(SPIx_MISO_GPIO_PORT, SPIx_MISO_SOURCE, SPIx_MISO_AF); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; /* SPI SCK pin configuration */ GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN; GPIO_Init(SPIx_SCK_GPIO_PORT, &GPIO_InitStructure); /* SPI MOSI pin configuration */ GPIO_InitStructure.GPIO_Pin = SPIx_MOSI_PIN; GPIO_Init(SPIx_MOSI_GPIO_PORT, &GPIO_InitStructure); #if 0 GPIO_InitStructure.GPIO_Pin = SPIx_MISO_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_Init(SPIx_MISO_GPIO_PORT, &GPIO_InitStructure); #endif /* SPI configuration */ SPI_I2S_DeInit(SPIx); SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; /* Clock set to 8MHz */ SPI_InitStructure.SPI_BaudRatePrescaler = SPIx_PRESCALLER; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Init(SPIx, &SPI_InitStructure); /* Enable the SPI peripheral */ SPI_Cmd(SPIx, ENABLE); RCC_AHB1PeriphClockCmd(LCD_LED_GPIO_RCC, ENABLE); GPIO_InitStructure.GPIO_Pin = LCD_LED_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init(LCD_LED_PORT, &GPIO_InitStructure); #if defined(GLCD_CONTROLLER_PCD8544) /* Initialisation sequence of controller */ glcd_PCD8544_init(); #elif defined(GLCD_CONTROLLER_ST7565R) glcd_reset(); glcd_enable_backlight(ENABLE); glcd_ST7565R_init(); #else #error "Controller not supported by STM32F0xx" #endif }