STM32F103 驱动SPI的OLED屏

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)是一种同步串行通信协议,用于短距离的高速数据传输。它通过四根线进行通信:

  1. SCK(Serial Clock):时钟信号,由主设备提供。
  2. MISO(Master In Slave Out):主设备接收数据的线。
  3. MOSI(Master Out Slave In):主设备发送数据的线。
  4. CS(Chip Select):选择目标设备,通常低电平激活。

OLED屏通过SPI协议与STM32F103C8T6通信,主设备(STM32)通过这些引脚与屏幕交换数据,控制其显示内容。

2. 软件设计

2.1 开发环境

  • 开发工具:STM32CubeMX、Keil uVision 5
  • 下载工具:ST-Link V2(用于将程序烧录到STM32开发板)
  • 固件库:STM32Cube HAL库

2.2 STM32CubeMX配置

  1. 打开STM32CubeMX,选择STM32F103C8T6芯片。
  2. 配置时钟、GPIO、SPI等外设:
    • 配置PA5为SPI时钟(SCK)。
    • 配置PA6为SPI数据输入(MISO)。
    • 配置PA7为SPI数据输出(MOSI)。
    • 配置PA4为SPI片选(CS)。
  3. 生成代码并打开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);  // 选择OLED
    HAL_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);  // 选择OLED
    HAL_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 注释

  1. SPI初始化:通过HAL_SPI_Init初始化SPI硬件,设置为主模式,数据传输位宽8位。
  2. OLED初始化:配置OLED屏幕的各种参数,如时钟分频、显示偏移、输出比等。
  3. 发送命令/数据:通过SPI总线发送命令或数据来控制OLED屏幕的显示内容。

4. 下载工具

使用ST-Link V2将程序烧录到STM32F103C8T6开发板。连接ST-Link V2与开发板的调试接口,然后通过Keil的下载功能将程序烧录到MCU。

5. 结语

本博客介绍了如何使用STM32F103C8T6最小系统开发板和HAL固件库,通过SPI协议驱动OLED显示屏。通过详细的硬件连接、SPI协议原理、软件设计和示例代码,您可以轻松实现基本的OLED显示功能。

posted @   jeikerxiao  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示