【嵌入式】 点亮一个led灯

文章讲述了在STM32微控制器中,如何通过HAL库对PC8到PC15的LED引脚进行初始化配置,以及利用PD2作为锁存器控制端口进行操作。在初始化时,LED引脚设置为高电平,锁存器控制端口设为低电平。通过LED_Disp函数,根据传入的低八位参数dsLED,对高八位进行操作以控制16位LED的状态,实现点亮和熄灭特定LED的功能。
摘要由CSDN通过智能技术生成

 从原理图上可以看led用了PC8~PC15,PD2是锁存器的控制端口,先使能这些端口。

(PC8~PC15低电平使能,所以初始化设计成高电平;PD2高电平使能,所以初始化设计成低电平)

 

在文件夹新建一个文件夹bsp,把led.c和led.h保存至bsp

打开魔术棒保存bsp的路径

 mian.h新增代码:

#define uchar unsigned char  //定义uchar uint
#define uint unsigned int

led.h代码:

#ifndef _LED_H
#define _LED_H
#include"main.h"
void LED_Disp(uchar dsLED);

#endif

led.c代码:

#include"led.h"


void LED_Disp(uchar dsLED)
{
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//将GPIO的所有LED引脚置高电平
	  HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//将锁存器打卡,引脚置高电平
	  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

  因为我们在传入参数dsLED,默认给的是低八位,而实际起作用的是高八位(假设共16位),故将dsLED<<8。

 

mian.c新增代码:

#include "led.h"                  //包含LED的头文件

int main(void)
{
  /* 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 */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

 
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
		 LED_Disp(0x01);//点亮第一个灯
		HAL_Delay(500);//延时500毫秒
		LED_Disp(0x00);
		HAL_Delay(500);
		
  }
  /* USER CODE END 3 */
}

int dsi_panel_set_backlight(struct dsi_panel panel, u32 bl_lvl) { int rc = 0; struct dsi_backlight_config bl = &panel->bl_config; if (panel->host_config.ext_bridge_mode) return 0; DSI_DEBUG("backlight type:%d lvl:%d\n", bl->type, bl_lvl); switch (bl->type) { case DSI_BACKLIGHT_WLED: rc = backlight_device_set_brightness(bl->raw_bd, bl_lvl); break; case DSI_BACKLIGHT_DCS: rc = dsi_panel_update_backlight(panel, bl_lvl); break; case DSI_BACKLIGHT_EXTERNAL: rc = lcd_bl_set_led_brightness(bl_lvl); //pr_err("dsi set bias brightness: %d\n", bl_lvl); rc = lcd_bias_set_led_brightness(bl_lvl); //pr_err("dsi set brightness: %d\n", bl_lvl); break; case DSI_BACKLIGHT_PWM: rc = dsi_panel_update_pwm_backlight(panel, bl_lvl); break; default: DSI_ERR("Backlight type(%d) not supported\n", bl->type); rc = -ENOTSUPP; } return rc; } int lcd_bl_set_led_brightness(int value)//for set bringhtness { dev_warn(&lcd_bl_i2c_client->dev, "lcm 8866 bl = %d\n", value); if (value < 0) { dev_warn(&lcd_bl_i2c_client->dev, "value=%d\n", value); return 0; } if (value > 0) { lcd_bl_write_byte(KTZ8866_DISP_BB_LSB, value & 0x07);// lsb lcd_bl_write_byte(KTZ8866_DISP_BB_MSB, (value >> 3) & 0xFF);// msb lcd_bl_write_byte(KTZ8866_DISP_BL_ENABLE, 0x4F); / BL enabled and Current sink 1/2/3/4 enabled;/ } else { lcd_bl_write_byte(KTZ8866_DISP_BB_LSB, 0x00);// lsb lcd_bl_write_byte(KTZ8866_DISP_BB_MSB, 0x00);// msb lcd_bl_write_byte(KTZ8866_DISP_BL_ENABLE, 0x00); /* BL enabled and Current sink 1/2/3/4 disabled;/ } return 0; } int lcd_bias_set_led_brightness(int value)//for set bringhtness { dev_warn(&lcd_bl_bias_i2c_client->dev, "lcm 8866 bl = %d\n", value); if (value < 0) { dev_warn(&lcd_bl_bias_i2c_client->dev, "invalid value=%d\n", value); return 0; } if (value > 0) { lcd_bl_bias_write_byte(KTZ8866_DISP_BB_LSB, value & 0x07);// lsb lcd_bl_bias_write_byte(KTZ8866_DISP_BB_MSB, (value >> 3) & 0xFF);// msb lcd_bl_bias_write_byte(KTZ8866_DISP_BL_ENABLE, 0x4F); / BL enabled and Current sink 1/2/3/4 enabled;/ } else { lcd_bl_bias_write_byte(KTZ8866_DISP_BB_LSB, 0x00);// lsb lcd_bl_bias_write_byte(KTZ8866_DISP_BB_MSB, 0x00);// msb lcd_bl_bias_write_byte(KTZ8866_DISP_BL_ENABLE, 0x00); / BL enabled and Current sink 1/2/3/4 disabled;*/ } return 0; } dsi_panel_set_backlight、lcd_bl_set_led_brightness和lcd_bias_set_led_brightness源码如上,帮忙用工作队列的方式,同时实现在case DSI_BACKLIGHT_EXTERNAL:下并发执行lcd_bl_set_led_brightness和lcd_bias_set_led_brightness两个函数
最新发布
06-07
好的,我可以为您提供一个使用工作队列来实现并发执行`lcd_bl_set_led_brightness`和`lcd_bias_set_led_brightness`的示例代码。具体实现方法如下: 1. 定义一个工作结构体`struct work_struct`,并在其中传递参数。 ``` struct backlight_work { struct work_struct work; struct i2c_client *lcd_bl_i2c_client; struct i2c_client *lcd_bl_bias_i2c_client; int value; }; ``` 2. 定义工作队列。 ``` static struct workqueue_struct *bl_workqueue; ``` 3. 在`dsi_panel_set_backlight`函数中,将`lcd_bl_set_led_brightness`和`lcd_bias_set_led_brightness`函数的调用封装成一个工作任务,并将任务推入工作队列。 ``` case DSI_BACKLIGHT_EXTERNAL: { struct backlight_work *bl_work; bl_work = kzalloc(sizeof(*bl_work), GFP_KERNEL); if (!bl_work) return -ENOMEM; INIT_WORK(&bl_work->work, backlight_worker); bl_work->lcd_bl_i2c_client = lcd_bl_i2c_client; bl_work->lcd_bl_bias_i2c_client = lcd_bl_bias_i2c_client; bl_work->value = bl_lvl; queue_work(bl_workqueue, &bl_work->work); break; } ``` 4. 在`backlight_worker`函数中,实现`lcd_bl_set_led_brightness`和`lcd_bias_set_led_brightness`函数的并发执行。 ``` static void backlight_worker(struct work_struct *work) { struct backlight_work *bl_work = container_of(work, struct backlight_work, work); int value = bl_work->value; if (value < 0) { dev_warn(&bl_work->lcd_bl_i2c_client->dev, "invalid value=%d\n", value); } else if (value > 0) { lcd_bl_write_byte(KTZ8866_DISP_BB_LSB, value & 0x07); lcd_bl_write_byte(KTZ8866_DISP_BB_MSB, (value >> 3) & 0xFF); lcd_bl_write_byte(KTZ8866_DISP_BL_ENABLE, 0x4F); lcd_bl_bias_write_byte(KTZ8866_DISP_BB_LSB, value & 0x07); lcd_bl_bias_write_byte(KTZ8866_DISP_BB_MSB, (value >> 3) & 0xFF); lcd_bl_bias_write_byte(KTZ8866_DISP_BL_ENABLE, 0x4F); } else { lcd_bl_write_byte(KTZ8866_DISP_BB_LSB, 0x00); lcd_bl_write_byte(KTZ8866_DISP_BB_MSB, 0x00); lcd_bl_write_byte(KTZ8866_DISP_BL_ENABLE, 0x00); lcd_bl_bias_write_byte(KTZ8866_DISP_BB_LSB, 0x00); lcd_bl_bias_write_byte(KTZ8866_DISP_BB_MSB, 0x00); lcd_bl_bias_write_byte(KTZ8866_DISP_BL_ENABLE, 0x00); } kfree(bl_work); } ``` 这样,当`dsi_panel_set_backlight`函数中调用`lcd_bl_set_led_brightness`和`lcd_bias_set_led_brightness`时,会将其封装成一个工作任务并推入工作队列中,`backlight_worker`函数实现这两个函数的并发执行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值