用stm32f103c8t6点亮0.96寸oled屏hal库
时间: 2025-01-05 10:33:11 浏览: 9
### 使用 STM32F103C8T6 和 HAL 库点亮 0.96 寸 OLED 屏幕
#### 初始化配置
为了使 STM32F103C8T6 微控制器能够成功驱动 0.96 英寸 OLED 显示屏,需完成如下初始化设置:
- **硬件连接**
硬件连接应按照指定方式布置。GND 接到电源地;VCC 连接到电源正极(电压范围为 3 至 5.5V)。对于 I2C 通信模式下的 SCL 和 SDA 引脚,则分别对应 PB6 和 PB7[^3]。
- **CubeMX 配置**
在 CubeMX 中选择合适的外设并进行必要的参数设定。具体操作包括但不限于启用 GPIO 及 I2C 外设功能,并确保 I2C 的时钟频率满足需求。此外还需开启中断服务函数以便处理可能发生的错误情况。
- **软件环境搭建**
安装好开发工具链之后,创建一个新的工程文件夹用于存放源码及相关资源文件。接着导入官方提供的 SSD1306 库来简化对 OLED 屏的操作过程[^1]。
#### 示例代码
下面给出一段利用 HAL 库实现基本图形绘制功能的 C 语言程序片段作为参考:
```c
#include "main.h"
#include "ssd1306.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
int main(void){
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
ssd1306_Init(SSD1306_SWITCHCAPVCC); // 初始化OLED屏幕
while (1) {
ssd1306_Fill(Black); // 清除屏幕
ssd1306_SetCursor(0, 0);
ssd1306_WriteString("Hello", Font_11x18, White); // 打印字符串
ssd1306_UpdateScreen(); // 更新显示内容
HAL_Delay(1000); // 延迟一秒
}
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void){
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){
Error_Handler();
}
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){
Error_Handler();
}
}
```
此段代码实现了最基本的初始化工作以及向屏幕上打印 “Hello” 字样的逻辑[^2]。
阅读全文