news 2026/9/3 8:29:07

状态机菜单项目到CLion+HAL库移植

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
状态机菜单项目到CLion+HAL库移植

介绍

本文以 STM32 标准库编写的 OLED 菜单模块为例,介绍如何将其移植至 HAL 库,并完成 CLion 开发环境的工程搭建、编译、下载与调试配置。

本次移植旨在将原有标准库工程转换为基于HAL库的工程架构,以便后续集成串口、ADC、DMA、SPI、I²C 等外设。借助CubeMX自动生成初始化代码,可减少底层配置工作,使开发重点更多地放在应用逻辑的实现上。

江协科技OLED模块(标准库)的移植

1.4个文件的实现均改为HAL库实现,这里列举几项:

void OLED_W_SCL(uint8_t BitValue) { /*根据BitValue的值,将SCL置高电平或者低电平*/ //GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)BitValue); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, BitValue); /*如果单片机速度过快,可在此添加适量延时,以避免超出I2C通信的最大速度*/ //... } /** * 函 数:OLED写SDA高低电平 * 参 数:要写入SDA的电平值,范围:0/1 * 返 回 值:无 * 说 明:当上层函数需要写SDA时,此函数会被调用 * 用户需要根据参数传入的值,将SDA置为高电平或者低电平 * 当参数传入0时,置SDA为低电平,当参数传入1时,置SDA为高电平 */ void OLED_W_SDA(uint8_t BitValue) { /*根据BitValue的值,将SDA置高电平或者低电平*/ //GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)BitValue); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, BitValue); /*如果单片机速度过快,可在此添加适量延时,以避免超出I2C通信的最大速度*/ //... }

2.创建目录HardWare/OLED,将实现后的代码复制到该目录下:

3.这里要注意将新加入的目录、c/h文件加入到CMakeList中(关键一步):

让编译器找到.h文件:加入新建的目录

# Add include paths target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE # Add user defined include paths HardWare/OLED )

让编译器编译.c文件:这一步一般自动完成

# Create an executable object type add_executable(${CMAKE_PROJECT_NAME} HardWare/OLED/OLED.c HardWare/OLED/OLED.h HardWare/OLED/OLED_Data.c HardWare/OLED/OLED_Data.h)

4.配置OPENOCD路径,编译烧录执行测试(main中)。

/* USER CODE BEGIN WHILE */ OLED_Printf(0,0,OLED_8X16,"this is a test"); OLED_Update(); while (1)

执行成功,如图。

同时,Cube MX中的配置如图:

本文提供了移植后的OLED模块(HAL版本)作为配套资源,不包含菜单功能。读者可直接下载,并作为基于HAL库开发OLED驱动的模板使用。

OLED的移植(参考OLED模块)

创建文件Key.h,Key.c并改为替换标准库函数为HAL库函数,举个例子:

#define KEY_UP GPIO_PIN_11 #define KEY_DOWN GPIO_PIN_1 #define KEY_ENTER GPIO_PIN_6 #define KEY_BACK GPIO_PIN_4
void Key_Init() { /* 开启 GPIO 时钟 */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /* GPIO 初始化结构体 */ GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 配置 PB1、PB11 */ GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* 配置 PA4、PA6 */ GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); }

创建目录System,创建Menus文件,这两个文件可以直接复制过去,不涉及标准库函数。

最后编写main.c文件,将定义的宏和全局变量等复制到对应位置:

/* USER CODE BEGIN PV */ static State state1 = menu_main;//初始状态为一级菜单 /* USER CODE END PV */

编译执行,成功。

Cube MX中的配置如图,这里PB6和PB7不通过Output输出高低电平,GND和VCC直接连接面包板:

资源绑定为OLED基本模块,菜单模块就不提供了。如果有不同见解可以在评论区讨论!

引用声明

本文中 OLED 驱动模块的原始代码参考并引用自江协科技 STM32 教程中的 OLED 驱动程序,其原作者版权归江协科技及原作者所有。

本文仅以学习、研究和技术交流为目的,对原有驱动进行了HAL 库移植、代码适配、接口调整及工程结构优化。涉及 HAL 接口替换、CubeMX 工程适配、CLion/CMake 配置及相关说明均为本人整理与实践所得。

若本文涉及的原始代码内容与原作者版权存在冲突,请联系本人,我将第一时间进行修改或删除。

本文重点介绍的是STM32 标准库 OLED 驱动迁移至 HAL 库的思路与实现过程,并非原创 OLED 驱动教程。如需学习 OLED 驱动原理及原始实现,建议阅读江协科技的相关课程或资料。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 8:29:02

从Billie Eilish专辑看数据驱动下的音乐产品矩阵运营

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 8:28:49

Matlab多视角三维重建实战:从图像采集到网格生成

简介:本资源是一套面向本科及硕士阶段图像处理与计算机视觉教学科研的多视角三维重建实践方案,基于Matlab实现从图像匹配、基础矩阵估计、相机位姿恢复到稀疏点云三角化与光束法平差的完整流程。压缩包共95个文件,含62张多视角标定图像&#…

作者头像 李华
网站建设 2026/9/3 8:28:29

空调选购指南:从能效比到舒适性,揭秘真正省电的三大核心

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 8:27:55

海迅软件层板托孔位调整:从三排到一排的拆单实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 8:25:45

C#调用GTS运动控制器DLL实现工业自动化上位机开发全解析

简介:本资源是面向自动化控制领域C#开发工程师的GTS系列运动控制器实战编程套件,聚焦工业机器人、精密装配线等场景下的多轴同步、电子凸轮与轨迹插补等高阶运动控制需求。压缩包共849个文件,含154个C#源码(.cs)、32个…

作者头像 李华
网站建设 2026/9/3 8:23:36

工业齿轮缺陷检测:基于YOLOv8的小数据集训练与部署实战

简介:本资源为面向工业视觉检测与机器学习初学者的齿轮缺陷识别专用数据集,适用于目标检测模型训练与算法验证场景。数据集包含544张高清齿轮图像,涵盖broken、hole、large_gear、small_gear、text1、text2共6类关键目标,总计2093…

作者头像 李华