STM32F103C8T6 最小系统开发板驱动SPI OLED屏
1. 硬件设计
1.1 最小系统开发板
STM32F103C8T6是一个基于ARM Cortex-M3内核的32位微控制器,适合用于各种嵌入式应用。最小系统开发板将包括STM32F103C8T6芯片、基本电源和调试接口。为了驱动SPI协议的OLED显示屏,需要连接以下引脚:
STM32F103C8T6 引脚 | OLED屏引脚 | 描述 |
---|---|---|
PA5 | SCK | SPI时钟线 |
PA6 | MISO | SPI数据输入线 |
PA7 | MOSI | SPI数据输出线 |
PA4 | CS | SPI片选线 |
GND | GND | 地线 |
3.3V | VCC | 电源线 |
1.2 SPI协议原理
SPI(Serial Peripheral Interface)是一种同步串行通信协议,用于短距离的高速数据传输。它通过四根线进行通信:
- SCK(Serial Clock):时钟信号,由主设备提供。
- MISO(Master In Slave Out):主设备接收数据的线。
- MOSI(Master Out Slave In):主设备发送数据的线。
- CS(Chip Select):选择目标设备,通常低电平激活。
OLED屏通过SPI协议与STM32F103C8T6通信,主设备(STM32)通过这些引脚与屏幕交换数据,控制其显示内容。
2. 软件设计
2.1 开发环境
- 开发工具:STM32CubeMX、Keil uVision 5
- 下载工具:ST-Link V2(用于将程序烧录到STM32开发板)
- 固件库:STM32Cube HAL库
2.2 STM32CubeMX配置
- 打开STM32CubeMX,选择STM32F103C8T6芯片。
- 配置时钟、GPIO、SPI等外设:
- 配置PA5为SPI时钟(SCK)。
- 配置PA6为SPI数据输入(MISO)。
- 配置PA7为SPI数据输出(MOSI)。
- 配置PA4为SPI片选(CS)。
- 生成代码并打开Keil uVision 5。
2.3 驱动OLED屏的步骤
2.3.1 初始化SPI
在main.c
中,使用HAL库函数初始化SPI:
/* SPI初始化代码 */
SPI_HandleTypeDef hspi1;void SPI_Init(void)
{hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_8BIT;hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 10;HAL_SPI_Init(&hspi1);
}
2.3.2 OLED显示初始化
接下来,定义OLED屏幕的初始化命令并通过SPI发送。OLED通常使用128x64分辨率,初始化代码如下:
/* OLED屏初始化命令 */
void OLED_Init(void)
{OLED_SendCommand(0xAE); // 关闭显示OLED_SendCommand(0xD5); // 设置时钟分频OLED_SendCommand(0x80); // 设置时钟分频值OLED_SendCommand(0xA8); // 设置多重输出比OLED_SendCommand(0x3F); // 设置输出比OLED_SendCommand(0xD3); // 设置显示偏移OLED_SendCommand(0x00); // 设置偏移值OLED_SendCommand(0x40); // 设置显示开始行OLED_SendCommand(0xA1); // 水平翻转OLED_SendCommand(0xC8); // 垂直翻转OLED_SendCommand(0xDA); // 设置COM引脚硬件配置OLED_SendCommand(0x12); // 设置硬件配置值OLED_SendCommand(0x81); // 设置对比度控制OLED_SendCommand(0x7F); // 设置对比度值OLED_SendCommand(0xA4); // 输出正常显示OLED_SendCommand(0xA6); // 设置正常显示模式OLED_SendCommand(0xAF); // 打开显示
}
2.3.3 发送命令和数据
为了通过SPI发送命令和数据,需要定义一个发送函数:
void OLED_SendCommand(uint8_t command)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 选择OLEDHAL_SPI_Transmit(&hspi1, &command, 1, HAL_MAX_DELAY);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 取消选择
}void OLED_SendData(uint8_t data)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 选择OLEDHAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 取消选择
}
3. 示例代码
3.1 完整示例
#include "stm32f1xx_hal.h"
#include "main.h"SPI_HandleTypeDef hspi1;void SPI_Init(void);
void OLED_Init(void);
void OLED_SendCommand(uint8_t command);
void OLED_SendData(uint8_t data);int main(void)
{HAL_Init();SPI_Init();OLED_Init();while (1){OLED_SendData(0xFF); // 发送数据以点亮OLED屏幕HAL_Delay(500);OLED_SendData(0x00); // 发送数据以关闭OLED屏幕HAL_Delay(500);}
}
3.2 注释
- SPI初始化:通过
HAL_SPI_Init
初始化SPI硬件,设置为主模式,数据传输位宽8位。 - OLED初始化:配置OLED屏幕的各种参数,如时钟分频、显示偏移、输出比等。
- 发送命令/数据:通过SPI总线发送命令或数据来控制OLED屏幕的显示内容。
4. 下载工具
使用ST-Link V2将程序烧录到STM32F103C8T6开发板。连接ST-Link V2与开发板的调试接口,然后通过Keil的下载功能将程序烧录到MCU。
5. 结语
本博客介绍了如何使用STM32F103C8T6最小系统开发板和HAL固件库,通过SPI协议驱动OLED显示屏。通过详细的硬件连接、SPI协议原理、软件设计和示例代码,您可以轻松实现基本的OLED显示功能。