首先打开STM32CubeMX基于开发板方式新建项目,找到STM32H503。本次主要测试SPI接口功能。使能SPI1,因为只需要发送数据,这里就设置了只发送模式。
OLED接线:
OLED_D0------PB3 //SCK
OLED_D1------PB5 //MOSI
OLED_RST--- -PB0 //复位
OLED_DC------PB10 //命令/数据选择
OLED_CS------PA8 //CS片选
如下图所示,设置GPIO模式。
SPI分频频率不要太高了。


最终SPI配置


下面开始移植OLED库,使用的是SSD1306驱动。之前也在其他平台移植过,所以本次移植很快就成功了。
移植主要实现SPI读写命令和数据函数。
void ssd1306_Reset(void)
{
// CS = High (not selected)
HAL_GPIO_WritePin(SSD1306_CS_Port, SSD1306_CS_Pin, GPIO_PIN_SET);
// Reset the OLED
HAL_GPIO_WritePin(SSD1306_Reset_Port, SSD1306_Reset_Pin, GPIO_PIN_RESET);
ssd1306_mdelay(10);
HAL_GPIO_WritePin(SSD1306_Reset_Port, SSD1306_Reset_Pin, GPIO_PIN_SET);
ssd1306_mdelay(10);
}
// Send a byte to the command register
void ssd1306_WriteCommand(uint8_t byte)
{
HAL_GPIO_WritePin(SSD1306_CS_Port, SSD1306_CS_Pin, GPIO_PIN_RESET); // select OLED
HAL_GPIO_WritePin(SSD1306_DC_Port, SSD1306_DC_Pin, GPIO_PIN_RESET); // command
HAL_SPI_Transmit(&SSD1306_SPI_PORT, (uint8_t *) &byte, 1, HAL_MAX_DELAY);
HAL_GPIO_WritePin(SSD1306_CS_Port, SSD1306_CS_Pin, GPIO_PIN_SET); // un-select OLED
}
// Send data
void ssd1306_WriteData(uint8_t* buffer, size_t buff_size)
{
HAL_GPIO_WritePin(SSD1306_CS_Port, SSD1306_CS_Pin, GPIO_PIN_RESET); // select OLED
HAL_GPIO_WritePin(SSD1306_DC_Port, SSD1306_DC_Pin, GPIO_PIN_SET); // data
HAL_SPI_Transmit(&SSD1306_SPI_PORT, buffer, buff_size, HAL_MAX_DELAY);
HAL_GPIO_WritePin(SSD1306_CS_Port, SSD1306_CS_Pin, GPIO_PIN_SET); // un-select OLED
}
下面看看oled显示效果吧


 


|
' m9 X' E- J5 R. V s0 k