单片机实现的工厂模式

工厂模式是抽象出来,使得对象的方法不依赖于具体实现。按照专业术语来说有个做依赖倒置原则,即高层模块不应依赖于低层模块,二者应依赖于抽象。抽象不应依赖于细节,细节应依赖于抽象。

以最简单的LED灯为例,我们可以将IO抽象出来

.文件

c 复制代码
ypedef struct DRV_GPIO_Type
{
	 GPIO_TypeDef  *GPIOx;  
   uint32_t GPIO_PIN;     
   //操作
	uint8_t  action;  //动作
   void (*Init)(const struct DRV_GPIO_Type*);       
   void (*On)(struct DRV_GPIO_Type*); 
   void (*Off)(struct DRV_GPIO_Type*); 
   uint8_t (*ReadPin)(struct DRV_GPIO_Type*); 	
	 void (*Toggle)(struct DRV_GPIO_Type*); 	
}DRV_GPIO_T;



extern DRV_GPIO_T   gtDrv_R_LED;
extern DRV_GPIO_T   gtDrv_Y_LED;



void Drv_GPIO_ON(DRV_GPIO_T *pDrv);
void Drv_GPIO_OFF(DRV_GPIO_T *pDrv);
uint8_t Drv_GPIO_ReadPin(DRV_GPIO_T *pDrv);
void Drv_GPIO_Toggle(DRV_GPIO_T *pDrv);

.c文件

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
 */
void Drv_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
 */
void Drv_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
 */
void Drv_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_t Drv_GPIO_ReadPin(DRV_GPIO_T *pDrv)
{
	uint8_t lRet ;
	
   //lRet = GPIO_ReadInputDataBit(pDrv->GPIOx, pDrv->GPIO_PIN);
	lRet = HAL_GPIO_ReadPin(pDrv->GPIOx, pDrv->GPIO_PIN);

	return lRet;
}

测试实现

c 复制代码
**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
	int16_t i = 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等确实亮灭了。

相关推荐
小僧景贤4 小时前
单片机全方位调试实战指南:串口/RTT/逻辑分析仪/示波器/内核排错分层避坑教程
单片机·嵌入式硬件·物联网
LeoZY_8 小时前
LinkScope 使用笔记:基于 OpenOCD 的通用硬件芯片调试助手
笔记·单片机·嵌入式硬件·开源软件
星空真迷人10 小时前
嵌入式鸿蒙并非精简版,核心究竟是什么?
stm32·单片机·嵌入式硬件·物联网·华为·harmonyos·iot
iCxhust10 小时前
8088单板机VScode集成开发环境使用方法二(汇编版)
汇编·单片机·微机原理·8088单板机
2301_8014349812 小时前
STM32F407移植TinyUSB
stm32·单片机·嵌入式硬件
国产HT1621B12 小时前
YL4056 NTC 外围电阻 R3/R4 计算:从公式推导到工程选型
科技·单片机·嵌入式硬件
czhaii14 小时前
STC32G144K246 Ai8052单片机外设和功能
单片机·硬件工程
唔好理总之好犀利14 小时前
TVS管分析:MKS烧保险丝异常分析
stm32·单片机·嵌入式硬件
芯片设计-曾工1 天前
当精准脉冲遇上清晰视界——CH2205E模块与YL1621的“黄金搭档“
驱动开发·stm32·单片机·51单片机·硬件工程
LCG元1 天前
STM32 硬件 SPI + DMA 驱动 OLED 显示屏(SSD1306):从原理到 112fps 高速刷新全流程
stm32·单片机·嵌入式硬件