news 2026/4/16 12:32:22

单片机实现的工厂模式

作者头像

张小明

前端开发工程师

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/4/11 15:09:29

一文说清MOSFET工作原理:开关模式基础认知

深入浅出MOSFET:从零理解开关模式下的核心原理与实战设计你有没有遇到过这样的问题:用MCU控制一个电机,明明代码写对了,可MOSFET一上电就发热甚至烧毁?或者在做DC-DC电源时,效率怎么都提不上去,…

作者头像 李华
网站建设 2026/4/13 21:51:36

设计模式学习(11) 23-9 组合模式

文章目录0.个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析(JDK中的组合模式实现)0.个人感悟 组合模式的应用场景比较专,适合树状嵌套场景&…

作者头像 李华
网站建设 2026/4/11 2:02:36

ARM Compiler 5.06目标文件格式解析:ELF结构全面讲解

深入ARM编译器的“黑盒”:从目标文件看ELF如何塑造嵌入式系统 你有没有遇到过这样的场景? 代码明明编译通过,链接时却报出 multiple definition of init_system ;或者固件烧录后跑飞,调试器显示PC指针跳到了一片空…

作者头像 李华
网站建设 2026/4/2 3:40:55

探索大数据领域Kafka的分布式架构优势

探索大数据领域Kafka的分布式架构优势 关键词:Kafka、分布式架构、消息队列、高吞吐量、分区副本、消费者组、大数据处理 摘要:在大数据时代,如何高效处理海量实时数据流是企业的核心挑战之一。Apache Kafka凭借其卓越的分布式架构设计,成为了全球Top 500科技公司首选的流数…

作者头像 李华
网站建设 2026/4/14 2:03:14

PCB布线规则设计:硬件布局与电气性能的深度剖析

PCB布线的艺术:从布局到电气性能的实战进阶你有没有遇到过这样的情况?电路原理图明明“天衣无缝”,元器件选型也堪称完美,可一上电测试,信号波形却像心电图一样跳动不止;千兆以太网频繁丢包、高速DDR内存时…

作者头像 李华
网站建设 2026/4/16 9:18:52

SMBus与电源管理芯片通信机制:深度剖析

深入理解SMBus与电源管理芯片的通信机制:从协议到实战你有没有遇到过这样的情况——系统上电后,CPU就是不启动?或者设备在休眠唤醒时频繁死机?排查到最后发现,问题竟然出在电源时序错乱。而更让人头疼的是,…

作者头像 李华