news 2026/6/15 14:10:20

单片机实现的工厂模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单片机实现的工厂模式

工厂模式是抽象出来,使得对象的方法不依赖于具体实现。按照专业术语来说有个做依赖倒置原则,即高层模块不应依赖于低层模块,二者应依赖于抽象。抽象不应依赖于细节,细节应依赖于抽象。
以最简单的LED灯为例,我们可以将IO抽象出来

.文件

ypedefstructDRV_GPIO_Type{GPIO_TypeDef*GPIOx;uint32_tGPIO_PIN;//操作uint8_taction;//动作void(*Init)(conststructDRV_GPIO_Type*);void(*On)(structDRV_GPIO_Type*);void(*Off)(structDRV_GPIO_Type*);uint8_t(*ReadPin)(structDRV_GPIO_Type*);void(*Toggle)(structDRV_GPIO_Type*);}DRV_GPIO_T;externDRV_GPIO_T gtDrv_R_LED;externDRV_GPIO_T gtDrv_Y_LED;voidDrv_GPIO_ON(DRV_GPIO_T*pDrv);voidDrv_GPIO_OFF(DRV_GPIO_T*pDrv);uint8_tDrv_GPIO_ReadPin(DRV_GPIO_T*pDrv);voidDrv_GPIO_Toggle(DRV_GPIO_T*pDrv);

.c文件

#include"drv_io.h"/* 实例化LED灯 红灯 */DRV_GPIO_T gtDrv_R_LED={.GPIOx=LED1_GPIO_PORT,.GPIO_PIN=LED1_GPIO_PIN,.On=Drv_GPIO_OFF,.Off=Drv_GPIO_ON,.ReadPin=Drv_GPIO_ReadPin,.Toggle=Drv_GPIO_Toggle,};/* 实例化 LED灯 黄灯*/DRV_GPIO_T gtDrv_Y_LED={.GPIOx=LED0_GPIO_PORT,.GPIO_PIN=LED0_GPIO_PIN,.action=0,.On=Drv_GPIO_OFF,.Off=Drv_GPIO_ON,.ReadPin=Drv_GPIO_ReadPin,.Toggle=Drv_GPIO_Toggle,};/** * @brief IO口输出高电平 * @param pDrv :IO口的结构体指针 * * @retval none */voidDrv_GPIO_ON(DRV_GPIO_T*pDrv){//GPIO_SetBits(pDrv->GPIOx, pDrv->GPIO_PIN);HAL_GPIO_WritePin(pDrv->GPIOx,pDrv->GPIO_PIN,GPIO_PIN_SET);pDrv->action=1;}/** * @brief IO口输出低电平 * @param pDrv :IO口的结构体指针 * * @retval none */voidDrv_GPIO_OFF(DRV_GPIO_T*pDrv){//GPIO_ResetBits(pDrv->GPIOx, pDrv->GPIO_PIN);HAL_GPIO_WritePin(pDrv->GPIOx,pDrv->GPIO_PIN,GPIO_PIN_RESET);pDrv->action=0;}/** * @brief IO口翻转 * @param pDrv :IO口的结构体指针 * * @retval none */voidDrv_GPIO_Toggle(DRV_GPIO_T*pDrv){HAL_GPIO_TogglePin(pDrv->GPIOx,pDrv->GPIO_PIN);}/** * @brief 读取IO口的电平 * @param pDrv :IO口的结构体指针 * * @retval lRet Bit_SET 或者 Bit_RESET */uint8_tDrv_GPIO_ReadPin(DRV_GPIO_T*pDrv){uint8_tlRet;//lRet = GPIO_ReadInputDataBit(pDrv->GPIOx, pDrv->GPIO_PIN);lRet=HAL_GPIO_ReadPin(pDrv->GPIOx,pDrv->GPIO_PIN);returnlRet;}

测试实现

***@brief The application entry point.*@retvalint*/intmain(void){int16_ti=0;/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit */EventRecorderInitialize(EventRecordAll,1U);EventRecorderStart();/* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 *//* 配置通道 0,上行配置*/// SEGGER_RTT_ConfigUpBuffer(0, "RTTUP", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);// /* 配置通道 0,下行配置*/// SEGGER_RTT_ConfigDownBuffer(0, "RTTDOWN", NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP);// SEGGER_RTT_SetTerminal(0);led_init();// multiTimerInstall(PlatformTicksGetFunc);//// multiTimerStart(&timer1, 500, LED_Task_callback, NULL);// multiTimerStart(&timer2, 100, KeyScan_Task_callback, NULL);// multiTimerStart(&timer3, 1000, DataProcess_Task_callback, NULL);// multiTimerStart(&timer4, 2000, Display_Task_callback, NULL);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */gtDrv_R_LED.On(&gtDrv_R_LED);gtDrv_Y_LED.On(&gtDrv_Y_LED);HAL_Delay(500);gtDrv_R_LED.Off(&gtDrv_R_LED);gtDrv_Y_LED.Off(&gtDrv_Y_LED);HAL_Delay(500);}/* USER CODE END 3 */}

可以看到2个LED等确实亮灭了。

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

vivado除法器ip核界面功能详解:入门级全面讲解

Vivado除法器IP核深度解析:从界面操作到实战避坑在FPGA设计中,我们每天都在和加法、乘法打交道。但一旦遇到除法运算,很多新手立刻头大——为什么?因为硬件实现除法远不像软件里写个a/b那么简单。如果你正在用Xilinx的Vivado做项目…

作者头像 李华
网站建设 2026/6/15 9:37:18

电机驱动电路设计:工业应用操作指南

电机驱动电路设计:从原理到工业实战的深度指南在一条自动化产线上,一台传送带突然停机,现场排查发现是驱动模块烧毁。工程师打开外壳,看到MOSFET炸裂、PCB焦黑——这并非个例。据统计,在工业电机系统故障中&#xff0c…

作者头像 李华
网站建设 2026/6/15 9:35:36

[特殊字符]_压力测试与性能调优的完整指南[20260111170735]

作为一名经历过无数次压力测试的工程师,我深知压力测试在性能调优中的重要性。压力测试不仅是验证系统性能的必要手段,更是发现性能瓶颈和优化方向的关键工具。今天我要分享的是基于真实项目经验的压力测试与性能调优完整指南。 💡 压力测试…

作者头像 李华
网站建设 2026/6/15 9:34:57

基于multisim仿真电路图的放大器设计:入门必看

从零开始学放大器设计:用Multisim把理论变现实你有没有过这样的经历?翻开模电课本,满屏的“虚短”“虚断”让你一头雾水;想动手搭个放大电路,结果一通电就冒烟——电阻接反了、电源极性搞错了、运放直接烧了……既心疼…

作者头像 李华
网站建设 2026/6/15 17:16:00

libusb跨平台工控应用:实战部署案例

libusb实战:如何用一个库打通工控设备的Windows与Linux通信链路? 在工厂车间的一角,一台手持式PLC调试器正通过USB线连接着现场的控制柜。工程师插上设备,软件瞬间识别并开始读取参数——整个过程无需安装驱动、不弹权限警告&…

作者头像 李华
网站建设 2026/6/15 13:19:09

图解说明主流LED灯珠品牌参数对比

如何选对LED灯珠?主流品牌深度对比与实战选型指南你有没有遇到过这样的情况:设计一款灯具时,明明参数表上看起来差不多的几款LED灯珠,实际点亮后却一个“通透自然”,另一个“发灰偏色”;或者项目量产半年后…

作者头像 李华