当前位置: 首页 > news >正文

C 语言面向对象风格封装的经典技巧(STM32F4 标准库实现)

1. 头文件led_interface.h(接口定义,与平台无关)

#ifndef__LED_INTERFACE_H#define__LED_INTERFACE_Htypedefstruct{void(*init)(void);void(*on)(void);void(*off)(void);void(*toggle)(void);}LED_Ops;LED_OpsLED_Create(void);#endif

2. 实现文件led_f4.c(STM32F4 标准库实现)

#include"led_interface.h"#include"stm32f4xx.h"// F4 标准外设库主头文件/* --------------------- 硬件配置(更换硬件时只改这里)--------------------- */#defineLED_PORTGPIOB#defineLED_PINGPIO_Pin_5#defineLED_PORT_CLKRCC_AHB1Periph_GPIOB// F4 使用 AHB1 总线时钟#defineLED_ON_LEVELBit_RESET// 低电平点亮(Bit_RESET = 0)#defineLED_OFF_LEVELBit_SET// 高电平熄灭/* 前向声明所有静态函数 */staticvoidhw_init(void);staticvoidhw_on(void);staticvoidhw_off(void);staticvoidhw_toggle(void);/* --------------------- 内部实现函数(static,对外不可见)--------------------- */staticvoidhw_init(void){GPIO_InitTypeDef GPIO_InitStructure;// 使能 GPIO 时钟(F4 使用 RCC_AHB1PeriphClockCmd)RCC_AHB1PeriphClockCmd(LED_PORT_CLK,ENABLE);// 配置 GPIO 为推挽输出,速度 50MHz(F4 速度可选 2MHz/25MHz/50MHz/100MHz)GPIO_InitStructure.GPIO_Pin=LED_PIN;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;// 推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;GPIO_Init(LED_PORT,&GPIO_InitStructure);// 初始熄灭hw_off();}staticvoidhw_on(void){GPIO_WriteBit(LED_PORT,LED_PIN,LED_ON_LEVEL);}staticvoidhw_off(void){GPIO_WriteBit(LED_PORT,LED_PIN,LED_OFF_LEVEL);}staticvoidhw_toggle(void){// 读取当前输出电平,然后翻转BitAction current=(BitAction)GPIO_ReadOutputDataBit(LED_PORT,LED_PIN);GPIO_WriteBit(LED_PORT,LED_PIN,(BitAction)(1-current));}/* --------------------- 工厂函数 ---------------------- */LED_OpsLED_Create(void){LED_Ops ops;ops.init=hw_init;ops.on=hw_on;ops.off=hw_off;ops.toggle=hw_toggle;returnops;}

3. 使用示例(main.c,与平台无关)

#include"led_interface.h"voiddelay(uint32_tcount){while(count--);}intmain(void){LED_Ops led=LED_Create();led.init();while(1){led.on();delay(500000);led.off();delay(500000);}}

4. 关键修改说明(F1 → F4)

项目STM32F1 标准库STM32F4 标准库
时钟使能函数RCC_APB2PeriphClockCmdRCC_AHB1PeriphClockCmd
时钟宏RCC_APB2Periph_GPIOBRCC_AHB1Periph_GPIOB
GPIO 初始化结构体成员GPIO_ModeGPIO_Speed增加GPIO_OType(输出类型)、GPIO_PuPd(上下拉)
输出模式GPIO_Mode_Out_PPGPIO_Mode_OUT+GPIO_OType_PP
速度宏GPIO_Speed_50MHzGPIO_Speed_50MHz(F4 还支持 100MHz)
读写位函数GPIO_WriteBit/GPIO_ReadOutputDataBit相同(兼容)
电平值Bit_RESET/Bit_SET相同

5. 如需 HAL 库版本(更简洁)

如果您的 F4 项目使用 HAL 库,替换实现如下(头文件相同):

// led_f4_hal.c#include"led_interface.h"#include"stm32f4xx_hal.h"#defineLED_PORTGPIOB#defineLED_PINGPIO_PIN_5#defineLED_PORT_CLK_EN__HAL_RCC_GPIOB_CLK_ENABLE()#defineLED_ON_LEVELGPIO_PIN_RESET#defineLED_OFF_LEVELGPIO_PIN_SETstaticvoidhw_init(void){GPIO_InitTypeDef GPIO_InitStruct={0};LED_PORT_CLK_EN;GPIO_InitStruct.Pin=LED_PIN;GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull=GPIO_NOPULL;GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(LED_PORT,&GPIO_InitStruct);hw_off();}staticvoidhw_on(void){HAL_GPIO_WritePin(LED_PORT,LED_PIN,LED_ON_LEVEL);}staticvoidhw_off(void){HAL_GPIO_WritePin(LED_PORT,LED_PIN,LED_OFF_LEVEL);}staticvoidhw_toggle(void){HAL_GPIO_TogglePin(LED_PORT,LED_PIN);}LED_OpsLED_Create(void){LED_Ops ops={hw_init,hw_on,hw_off,hw_toggle};returnops;}

以上代码保持了您原有的“函数装进结构体,结构体装进函数”设计模式,更换硬件时只需修改led_f4.c中的宏定义和底层函数,上层代码无需改动。

http://www.jsqmd.com/news/638998/

相关文章:

  • LSB隐写术的克星:RS分析原理图解与实战避坑指南
  • 3分钟搞定网易云音乐插件管理:BetterNCM Installer完整指南
  • 2026年口碑好的视觉点胶机/精密视觉点胶机/喷射阀视觉点胶机行业内口碑厂家推荐 - 行业平台推荐
  • 洛谷-算法1-6-二分查找与二分答案2
  • 如何高效批量下载微博相册高清图片?Python多线程工具全解析
  • YOLO12模型在Web应用中的实时目标检测实现
  • 高效解锁QQ音乐加密音频:qmc-decoder完整技术指南
  • mysql之日志篇
  • 基于Simulink的单相电压二重化逆变电路谐波抑制仿真分析
  • 2026年靠谱的316不锈钢扎带/阶梯式不锈钢扎带厂家综合实力参考(2025) - 品牌宣传支持者
  • 从零构建个人图像搜索引擎:轻松管理海量图片的智能方案
  • 【YOLOv11】013、YOLOv11模型推理:单张图像、视频流、批量推理的实现
  • 【ROS2】SLAM建图成功,但是导航失败,加载地图报错Timed out waiting for transform from base_link to map to become availabl
  • 爱了 | 这篇单细胞多组学文章,全部代码,以及16G处理后的数据,都分享了,非常好复现,照着做就行
  • 深入解析Modbus ASCII协议:从帧结构到LRC校验实战
  • 大语言模型驱动的知识图谱构建与检索增强生成(GraphRAG):技术原理与GitHub生态最佳实践分析
  • 如何解锁《鸣潮》120帧:WaveTools终极优化指南
  • 有实力的养发加盟品牌企业盘点,哪家口碑更好 - mypinpai
  • 3个技巧让Ryzen性能提升40%:SMUDebugTool硬件调试实战指南
  • 低成本ROS小车传感器融合实战:用MPU6050和模拟里程计搞定robot_pose_ekf
  • 别让模拟器骗了你!OpenHarmony跨平台开发中,x86和ARM架构的实战避坑指南(以RN/Flutter为例)
  • ScriptGen Modern Studio 实战:从创意到完整剧本,AI辅助创作全流程解析
  • 从概率视角解析Logistic回归中的交叉熵损失函数
  • 如何快速激活Windows和Office:KMS_VL_ALL_AIO智能激活工具完整指南
  • 口碑好的净化工程公司分享,辰熙净化工程靠谱吗一起探寻 - myqiye
  • AS7173 芯片资料·,typec转DP 8k60互转方案
  • Topit:Mac窗口置顶神器,让你的多任务效率提升40%
  • Noto字体:告别豆腐块,让全球文字都完美显示
  • 前端微前端架构:别再把所有代码都放在一个仓库里了
  • 双NPN三极管恒流源电路设计与性能优化